180921(计算器中显示字)

通过DLL注入实现IAT钩取的技术。较为好实现,但是如果目标API不在目标进程IAT中,就无法使用该技术.(动态加载dll=凉凉)

为了确认需要钩取的API,可以使用PEView查看导入的API,然后对API进行文档查询.

查询发现计算器的SetWIndowTextW()、SetDlgItemTextW()比较引人注目(???),而后者又调用了前者,所以我们假设只要钩取前者就OK.

(API后面跟的是W就是说是宽字符(Wide character)版本.若后面跟的是A则是ASCII码字符版本。宽字符说的是Unicode码。)
XySher
跟着流程查看栈窗口。
XySher
覆写时要逆序进行。每个Unicode中的汉字占2个字节
XySher
程序开始时,PE装载器会将user32.SetWindowTextW()API地址记录到该地址(01001110),该地址是IAT区域。

而我们钩取IAT过后,将IAT保存的API起始地址变为用户函数的起始地址。

像这样,先向目标进程注入用户DLL,然后在进程的IAT区域中更改4个字节大小的地址,就可以轻松钩取指定API。这种技术也称为IAT钩取技术。

练习实例
XySher
诶这次居然成了 舒服
XySher
...下载下来的是原版 难免 难免.

在实际操作中,必须先确定提供API的DLL已经正常加载到相应进程,如果相应API在钩取前尚未被加载,则应该先调用LoadLibrary()API加载它。

把数字和中文进行1:1的对应可以不加任何修改地使用原缓冲区。

在IAT中查找到user23.dll对应的IID后,在IAT中查找SetWindowTextW API的位置,然后修改其中内容,从而实现对API的钩取。
MySetWindowTextW()函数主要有2个功能,它首先将阿拉伯数字转换为中文数字(字符串),然后调用原来的user32.SetWindowTextW()API。

隐藏进程
全局钩取(Global Hooking),能钩取所有进程。
修改API代码(Code Patch)实现API钩取。