修改IAT,HOOK API遇到的问题.

lzr4304061988012 2009-04-06 01:26:27
我学习windows核心编程中的方法,通过修改PE文件的导入地址表的方法来Hook API,在一个DLL文件中用一个类封装了方法,之后
设全局钩子注入其他进程.调试DLL时发现如下地方有错:



//当hCallMod这个是模块MFC42LOG.DLL时就会有问题,其他模块没问题.

IMAGE_DOS_HEADER * pDosHeader = (IMAGE_DOS_HEADER *)hCallMod;

IMAGE_OPTIONAL_HEADER * pOptHeader = (IMAGE_OPTIONAL_HEADER *)
((BYTE *)hCallMod + pDosHeader->e_lfanew + 24 );

IMAGE_IMPORT_DESCRIPTOR * pImport = (IMAGE_IMPORT_DESCRIPTOR *)
((BYTE *)hCallMod +
pOptHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);


while( pImport->Name )
{
char * pszModName = (char *)((BYTE *)hCallMod + pImport->Name);//调试到这里时pszModName=0X61BEFFF,分明是有值,为什么说expression cannot be envaluted

DWORD dwError = GetLastError();//这里返回998:内存分配访问无效.

if(lstrcmpi(pszModName,pDestModName)==0)//程序死在这里,原因就是pszModName的问题;
break;
pImport++;
}

...全文
118 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzr4304061988012 2009-04-06
  • 打赏
  • 举报
回复
好吧,结了。
cnzdgs 2009-04-06
  • 打赏
  • 举报
回复
你所说的“无法解决线程同步问题”具体是指什么情况?是指修改代码期间其它线程调用被Hook的函数吗?这种冲突貌似是不存在的,如果担心这种情况发生,可以先把其它线程都挂起,Hook完后再恢复。
lzr4304061988012 2009-04-06
  • 打赏
  • 举报
回复
你们说的是这个方法是用机器码直接覆写吗?我试过,的确我一次就通过了,很方便,但是书上说无法解决线程同步问题,希望详细告知.
gyk120 2009-04-06
  • 打赏
  • 举报
回复
指针出错了……
改导入表需要定位,麻烦,不如传统的陷阱式API HOOK……
好像现在换了个新名词叫detour……
cnzdgs 2009-04-06
  • 打赏
  • 举报
回复
指针指向的地址无效时也不能读取,不一定只有NULL才会出错。
修改IAT的方法很多情况无法应用,建议改成detours的方法来Hook。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧