下面这代码是HOOK API的代码,可是没有HOOK成功,请各位前辈指点迷津!谢谢!
procedure HookFunction(hFormModule:HMODULE; pStrFunctionModule,
                       pStrFunctionName:pchar; pNewFunction:Pointer);
var
    pid:PIMAGE_IMPORT_DESCRIPTOR;
    pThunk:PIMAGE_THUNK_DATA;
    uSize:ULONG;
    dllName:String;
    originalProc:FARPROC;
    memoryInfo:MEMORY_BASIC_INFORMATION;
    lpflOldProtect:Pointer;
begin
    pid:=PIMAGE_IMPORT_DESCRIPTOR(ImageDirectoryEntryToData(Pointer(hFormModule),
                                  True,IMAGE_DIRECTORY_ENTRY_IMPORT,uSize));
    if pid=nil then exit;
    while pid<>nil do begin
          dllName:=PChar(hFormModule+pid^.Name);
          if dllName=pStrFunctionModule then break;
          inc(pid);
    end;
    if pid^.Name=0 then exit;
    pThunk:=PIMAGE_THUNK_DATA(hFormModule+pid^.FirstThunk);
    originalProc:=GetProcAddress(GetModuleHandle(pStrFunctionModule),'MessageBoxA');
    while pThunk^.Function_<>0 do begin
          if pThunk^.Function_=DWORD(originalProc) then break;
          inc(pThunk^.Function_);
    end;
    VirtualQuery(@pThunk^.Function_,memoryInfo,SizeOf(memoryInfo));
    //if not VirtualProtect(@pThunk^.Function_,memoryInfo.RegionSize,PAGE_READWRITE,lpflOldProtect) then exit;
    pThunk^.Function_:=DWORD(pNewFunction);
    VirtualProtect(@pThunk^.Function_,memoryInfo.RegionSize,PAGE_READWRITE,lpflOldProtect);
end;这代码是调用HOOK的代码。
procedure TForm1.Button1Click(Sender: TObject);
begin
     HookFunction(hInstance,'user32.dll','MessageBoxA',@MessageBoxB);
     MessageBoxA(0,'xx','xx',mb_ok);
end;

解决方案 »

  1.   

    比较地址较为可靠...具体写法参考JCL中的jvDebugHandle,里面的东西很强大...
      

  2.   

    这个代码实现你是从C抄的吧?
    以下是几个问题
    1.dll名称判断,没有处理大小写统一的问题,并且你的判断跳出完全反了
    if dllName=pStrFunctionModule then break;
    改为if StrIComp(dllName,pStrFunctionModule)=0 then break;2.Inc(xx)问题,编译器可能会引发失误,最好给予明确指示。
    inc(pid);
    改成 Inc(DWORD(pid), SizeOf( IMAGE_IMPORT_DESCRIPTOR ));inc(pThunk^.Function_)这个完全错了,应该使用pThunk
    改成 Inc(DWORD(pThunk), SizeOf(IMAGE_THUNK_DATA));3.如果dll是本地钩子,直接WriteProcessMemory,不需要在目标进程开虚拟内存。如果是CreateRemoteThread方式注入,那么你的方法是可以的。不过,360啥的,可是会报警的哦。
    坐等接分
      

  3.   

    前辈果然高人,看了前辈的回帖真是让我油生敬意。太感谢前辈你了。
    还有一个地方错了,就是
    while pThunk^.Function_<>0 do begin
    应该改为while pThunk<>nil do begin再次感谢前辈。
      

  4.   

    请前辈再到这里接分:http://topic.csdn.net/u/20101016/13/fe53f356-0a3a-43cc-b043-35670839088a.html
    这个问题我开了两帖。