首页
社区
课程
招聘
[旧帖] 关于编写API HOOK中查找INT和IAT表的问题 0.00雪花
发表于: 2010-7-3 18:30 3471

[旧帖] 关于编写API HOOK中查找INT和IAT表的问题 0.00雪花

2010-7-3 18:30
3471
我最近学习PE格式和输入表,就想编一个最简单的HOOK MessageBoxW函数的程序。我的思路是这样的:

1、首先找到每个DLL的IID。这里根据《加密与解密(第三版)》上面的PE结构和输入表那里,先读入PE的物理偏移,再读入输入表的RVA,然后根据RVA和基址读取到每个DLL的IID。

2、然后根据IID里面Name一项找到目标模块,然后读取IID的OriginalFirstThunk和FirstThunk这两项,分别对应函数的名称和函数的地址,其中函数名称要忽略前面的Hint。

3、分别根据OriginalFirstThunk找到目标函数名MessageBoxW,然后根据目标函数名在数组中的相对位置(数组下标),在FirstThunk的数组里找到相应的存储 函数地址 的地方。

4、最后把新函数的地址写到 存储函数地址的地方。完成对函数的Hook。

现在我写了两个版本,其中之一是HOOK自己程序的MessageBoxW,也就是在进程内部修改;第二个是一个DLL,通过其他DLL注入工具把这个DLL注入到其他进程(测试用的是notepad.exe)进程,然后hook掉notepad.exe的MessageBoxW函数。

第一个程序也就是自己修改的经测试没有问题,可以hook到MessageBoxW,但是第二个也就是注入DLL的程序我在第3步有了问题。我根据数组下标读到的函数名和函数地址不匹配,也就是说比如从OriginalFirstThunk开始读到第n个是XXX函数的名称,但从FirstThunk开始读到的第n个就是YYY函数的地址。

我用LoadPE和OD分析了一下,发现系统notepad.exe的函数名称数组貌似不是线性排列的(?)从OriginalFirstThunk指向的地址开始,数组先往后走,然后走到一半又返回到上一个DLL的函数结束的后面开始走,然后又返回来到中断的地方继续走(这是对照LoadPE中的函数表来看的)?(蓝色部分是推测)。这样就导致了函数地址和函数名称不能线性匹配。

现在我不明白的是OriginalFirstThunk中的函数名称是如何跟FirstThunk中的函数地址相对应起来的,这样给我获取函数地址和该写函数的地方造成了很大的困难。因此求这个问题的解释。

附上我两个程序的VC源码和notepad.exe,以及一个小工具inject.exe用于把Dll注入到任意进程,用法内附。注入后dll会在当前目录下生成flog.txt,是dll的工作纪录,可见源码。

诚心诚心求教。请大牛们赐教,就算解决不了也可以说说想法。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//