计算器显示中文数字HookLet

注入DLL.dll到计算器程序

找到导入表描述,在FirstThunk中把user32.dll文件中导出函数地址改为自己的DLL.dll导出函数的地址

计算器点击数字调用的函数为SetWindowText

注入方式有两种,CreateRemoteThread远程线程,SetWindowHookEx全局钩子

提权,开启UAC 管理员身份运行

可以在项目右键属性,链接器,清单文件,打开UAC运行级别即可

image-20230118225323796

这里使用远程线程注入,填写动态库的完整路径申请内存,在对方进程中开启新的线程,得到LoadLibrary地址,执行LoadLibrary加载自己的动态库

得到自己动态库的完整路径

得到PID

申请虚拟内存

将路径写入虚拟内存

启动线程

从目标进程中的user32模块导出表中获取SetWindowText函数地址

获得进程中第一个模块Taskmgr.exe地址

定位到导入表描述

该模块是加载状态的,因此定位到FirstThunk,里面已经变为真正的函数地址,判断是否为空

定位到模块名

比较得到与我们要感染的模块相同,此时ImageImportDescriptor指针指向的FirstThunk即为对应模块

image-20230119001522337

获取user32导出表中SetWindowText函数地址

定位FirstThunk指向的IMAGE_THUNK_DATA,此处就是函数的地址

遍历这部分IAT表,ImageThunkData->u1.Function与获取到的地址进行比较

IAT表不可写,修改内存属性

API函数入口地址改成我们构造的函数的地址。函数的实际地址是函数指针名加jmp指令E9后的数字再加5

导入表卸载

image-20230119005641578

修改内存包含属性

将修改过的地址改为原本的地址