type
TMExit=procedure(Int:Integer);var
Hook:HHook;procedure MExitProcess;
begin
MessageBox(0,'','',MB_OK);
end;procedure HookApi;
var
MExit:TMExit;
D1,D2,D3:DWORD;
begin
MExit:=GetProcAddress(GetModuleHandle('kernel32.dll'),'ExitProcess');
Windows.VirtualProtect(@MExit,5,PAGE_READWRITE,D1);
WriteProcessMemory(GetCurrentProcess,@Mexit,@MExitProcess,5,D2);
end;function HookProc(Int:Integer;WParam:WParam;LParam:Lparam):LRESULT;STDCALL;
begin
HookApi;
Windows.CallNextHookEx(Hook,Int,Wparam,Lparam);
end;procedure SetHook;   
begin
SetWindowsHookEx(Wh_GetMessage,@HookProc,Hinstance,0);
end;exports
SetHook;
//这个是我自己写的hookapi代码,我不是很 明白WriteProcessMemory这个函数的使用特别是第3个参数,
这个dll运行后,打开任务管理器,任务管理器出错,内存不能为write什么的,请高手搞定,不要叫我去看什么MSDN,这个我看不明白
否则就不会发什么贴子了

解决方案 »

  1.   

       这个程序只写了一半哦。你取得了函数ExitProcess的地址,使用WriteProcessMemory函数改变了函数指针,使得的程序在调用kernel32.dll中的ExitProcess函数时转向了你自己写的MExitProcess函数。但是你的MExitProcess函数执行完了确没有把指针还给原来的ExitProcess,当然就出错了。记得写这种程序时要小心又小心,你已经在修改windows的内核了,把指针还给ExitProcess再试下。
        老实说我没有修改过ExitProcess这个函数,不知道这个函数是否可以真的钩住,不是所有的函数都能钩住的,建议你用VirtualProtectEx,VirtualQueryEx检查进程中的内存地址是否可操作。APIHOOK有2种方式,你用的是其中一种,这个方法在2000以上操作系统很容易使用,95/98上就很麻烦(95/98的系统DLL全是系统保护的,除非你自己提升自己的程序进入ring 0模式,这样也可以在95/98系统下使用)。
        
      

  2.   

       这个程序只写了一半哦。你取得了函数ExitProcess的地址,使用WriteProcessMemory函数改变了函数指针,使得的程序在调用kernel32.dll中的ExitProcess函数时转向了你自己写的MExitProcess函数。但是你的MExitProcess函数执行完了确没有把指针还给原来的ExitProcess,当然就出错了。记得写这种程序时要小心又小心,你已经在修改windows的内核了,把指针还给ExitProcess再试下。
        老实说我没有修改过ExitProcess这个函数,不知道这个函数是否可以真的钩住,不是所有的函数都能钩住的,建议你用VirtualProtectEx,VirtualQueryEx检查进程中的内存地址是否可操作。APIHOOK有2种方式,你用的是其中一种,这个方法在2000以上操作系统很容易使用,95/98上就很麻烦(95/98的系统DLL全是系统保护的,除非你自己提升自己的程序进入ring 0模式,这样也可以在95/98系统下使用)。
        
      

  3.   

    WriteProcessMemory(句柄, 地址, 写入的内容, 字节数, 最后个参数不知道干什么的);
    好象是这样的吧。我也不是很了解。
      

  4.   

    那我如何调用原来的ExitProcess函数呢?