首页
社区
课程
招聘
[旧帖] [求助]求教高手,delphi 中通过钩子给GDI32.dll -> TextOutW 失败 0.00雪花
发表于: 2008-2-1 16:50 3894

[旧帖] [求助]求教高手,delphi 中通过钩子给GDI32.dll -> TextOutW 失败 0.00雪花

2008-2-1 16:50
3894
请各位大侠帮忙,我现在急需给GDI32.dll -> TextOutW 下钩子
网上找到的钩子代码如下

调用 HOOKAPI('GDI32.dll','TextOutW',@MytextOutW);
但是始终没有钩下来,请高手帮忙看看一下

function HOOKAPI(lpModuleName : PChar; lpApiName : PChar; pCallbackFunc : Pointer) : dword;
var
  pImportDesc: PIMAGE_IMPORT_DESCRIPTOR;
  pNtHdr : PImageNtHeaders;
  dwModuleBase : DWORD;
  pDosHdr : PImageDosHeader;
  pCode: ^Pointer;
  pProtoFill : Pointer;
  dwLoaded : DWORD;
  dwPeOffset : DWORD;
  dwOld : DWORD;
  bYesNo : Boolean;
  dwAdz : dword;
begin
  dwLoaded := LoadLibrary(lpModuleName);
  pProtoFill := GetProcAddress(dwLoaded, lpApiName);
  dwModuleBase := GetModuleHandle(nil);
  pDosHdr := PImageDosHeader(dwModuleBase);
  dwPeOffset := pDosHdr^._lfanew;
  pNtHdr := Pointer(dword(pDosHdr) - dwPeOffset);
  //第一次的版本
  pImportDesc := Pointer(dword(pDosHdr) + pNtHdr.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);

  bYesNo := FALSE;
  while pImportDesc^.Name <> 0 do
  begin
    pCode := Pointer(dword(pDosHdr) + pImportDesc^.FirstThunk);
    while pCode^ <> nil do
    begin
      if (pCode^ = pProtoFill) then
      begin
       VirtualProtect(pCode, 4, PAGE_EXECUTE_READWRITE, @dwOld);
       dwAdz := dword(pCode^);
       bYesNo := TRUE;
       pCode^ := pCallbackFunc;
       Result := dwAdz;
      end;
      pCode := Pointer(dword(pCode) + 4);
    end;
    pImportDesc := Pointer(dword(pImportDesc) + 20);
  end;
  if (bYesNo = FALSE) then
  begin
    Result := 0;
  end else
  begin
    Result := dwAdz;
  end;
end;

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
这是个搜索IAT表然后替换对应API地址的函数,你看一下你要hook的API是否正常的在IAT表中。不过有时候即使IAT没有加密,可能也Hook不到的。FF15被改为E8了。
2008-2-1 17:37
0
游客
登录 | 注册 方可回帖
返回
//