大家好
我在做Detours库的hook。我将各种函数的原型,替换函数什么的全部写在dll中,然后通过DetourCreateProcessWithDllA函数将某一个软件打开的同时注入我的dll。我只需要获得打开的软件调用的api的序列就行了。
现在有这么几个问题。
首先是函数的不识别。比如IsBadReadPtr函数,我和别的函数一样将它原型,替换函数都写好,结果报出这么一个错误。
cannot convert from '' to 'int (__stdcall *)(const void *,unsigned long)'
dll里面是这么声明的。
BOOL (_stdcall *SysIsBadReadPtr)(
CONST VOID *lp, // memory address
UINT_PTR ucb // size of block
)=IsBadReadPtr;
BOOL _stdcall HookIsBadReadPtr(
CONST VOID *lp, // memory address
UINT_PTR ucb // size of block
)
{
fprintf(p,"IsBadReadPtr\n");
// SysMessageBox(NULL,"IsBadReadPtr","Hook",MB_OK);
return SysIsBadReadPtr(lp,ucb);
}
第二个问题是我得到的api序列过长,有些api名称重复出现次数太多。有一些比如"CloseHandle","TranslateMessage","PeekMessage"的api名称大片出现。我怀疑是我自己的程序调用的api的序列也在里面。怎么样子区分呢?有这样的一段伪代码
YourHook(){
check = TlsGetValue(xxxx);
if(check == TRUE)
Jmp to Real Function;
TlsSetValue(xxxx, TRUE)
MessageBox(yyyy);
TlsSetValue(xxxx, FALSE)
}
这个Value怎么设定?如何判断当前调用的api是要检测的软件的还是我自己的程序的?
第三个问题是我的api名字和参数是硬编码进去的,就像上面那段代码里的fprintf,听说有可以不用硬编码的方式,请教高手。
先谢谢大家。我在线等待回复。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课