السلام عليكم ،
هناك مثال من قبل الاخ محمد في منتدى دلفي حول عمل هوك للدالة TerminateProcess ،
حاولت ان احوله الى لغة السي لكن تواجهني بعض المشاكل ،،
لذا ارجو المساعدة من اصحاب العلم ،،
هذا ما فعلت ..
FARPROC hook;
struct T6Bytes
{
BYTE P;
FARPROC addr;
BYTE R;
} OldBytes, NewBytes;
unsigned long i;
BOOL NewFun(
HANDLE hProcess, UINT uExitCode )
{
if((MessageBox(0,"Are You Sure ??" , "Close",MB_YESNO)== IDYES ))
{
WriteProcessMemory(GetCurrentProcess(), &hook, &OldBytes, sizeof(NewBytes), &i);
TerminateProcess(GetCurrentProcess(),0); }
/****************************/////////////////////////////////////
هنا في السطر الذي في الاعلى وحسب مثال الاخ محمد ، يتم استدعاء الدالة البديلة وهي hook ، لكن عند استخدامها يظهر error ، هذه الدالة .. الاخ محمد عرفها بطريقة لا اعرف ما يقابلها في لغة سي ،، هذا قوله :
أي لتعريفها في Delphi مثلا بإسم جديد HookeD تكون من الشكل:
Var
HookeD: function(hProcess: THandle; uExitCode: UINT): BOOL; stdcall;
*/////////////////////////////////////////////////////////////////////////////////////
return TRUE;
}
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE , LPSTR , int )
{
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1),
0, (DLGPROC) DlgProc );
return 0;
}
LRESULT CALLBACK DlgProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HMODULE h = GetModuleHandle("kernel32.dll");
if(h == NULL)
h = LoadLibrary("kernel32.dll");
hook = GetProcAddress(h, "TerminateProcess");
switch(message)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
switch(wParam)
{
case IDC_HOOK :
if(ReadProcessMemory(GetCurrentProcess(), hook, &OldBytes, sizeof(OldBytes), &i)) {
NewBytes.P = 0x68;
NewBytes.R = 0xC3;
NewBytes.addr = (FARPROC)NewFun;
WriteProcessMemory(NULL, hook, &NewBytes, sizeof(NewBytes), &i);
}
return TRUE;
case IDC_TERM:
TerminateProcess(GetCurrentProcess(),0);
return TRUE;
}
return TRUE ;
}
return FALSE;
}جزاكم الله خيرا
،،،،،،،،،،،،،،،،
