下面这代码是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;
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.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啥的,可是会报警的哦。
坐等接分
还有一个地方错了,就是
while pThunk^.Function_<>0 do begin
应该改为while pThunk<>nil do begin再次感谢前辈。
这个问题我开了两帖。