内存注入之IAT Hook和Inline Hook综合程序

前面四篇博客讲述了PE结构的获取,IAT表的获取,IAT Hook技术,Inline Hook技术.这四个部分都是从本程序中分离出来的,所以很多地方需要手动查找一些地址之类的,现在将完整的程序提供上来
源码地址 : http://download.csdn.net/detail/enjoy5512/9539443
代码也可以在我的github上获取 https://github.com/whu-enjoy/IATHook.git 不过只有源码,没有测试程序,上面那个链接源码,程序,测试程序都有

注: 转载请注明来源 enjoy5512的博客 http://blog.csdn.net/enjoy5512

软件结构

数据结构

进程信息结构体
内存注入之IAT Hook和Inline Hook综合程序_第1张图片

IAT表项结构体

函数列表
内存注入之IAT Hook和Inline Hook综合程序_第2张图片

具体实现

模块一之进程信息获取

1) 获取调试权限

2) 获取进程快照
这里写图片描述

3) 获取第一个进程信息
这里写图片描述

4) 获取进程第一个模块信息
内存注入之IAT Hook和Inline Hook综合程序_第3张图片

5) 继续获取其他进程信息
内存注入之IAT Hook和Inline Hook综合程序_第4张图片

运行结果 :

内存注入之IAT Hook和Inline Hook综合程序_第5张图片

模块二之IAT表项获取

1) 循环遍历进程结构体链表,寻找与所给进程PID相同的进程结构体信息
内存注入之IAT Hook和Inline Hook综合程序_第6张图片

2) 获取进程调试权限
内存注入之IAT Hook和Inline Hook综合程序_第7张图片

3) 获取进程句柄

4) 手工计算IAT表地址
内存注入之IAT Hook和Inline Hook综合程序_第8张图片

5) 获取函数导入表结构体

6) 获取函数名列表信息
内存注入之IAT Hook和Inline Hook综合程序_第9张图片

7) 获取函数地址列表
内存注入之IAT Hook和Inline Hook综合程序_第10张图片

8) 获取导入dll文件名
内存注入之IAT Hook和Inline Hook综合程序_第11张图片

9) 循环获取IAT表项(具体看代码注释)

程序运行结果截图:

内存注入之IAT Hook和Inline Hook综合程序_第12张图片

模块三之IAT Hook

1) 编写shellcode
内存注入之IAT Hook和Inline Hook综合程序_第13张图片

2) 遍历IAT结构体链表,寻找需要Hook的函数的IAT表项结构体

3) 遍历IAT表,获取MessageBoxA的IAT表项结构体
内存注入之IAT Hook和Inline Hook综合程序_第14张图片

4) 遍历进程结构体链表,获取进程结构体信息
内存注入之IAT Hook和Inline Hook综合程序_第15张图片

5) 获取调试权限

6) 获取进程句柄
内存注入之IAT Hook和Inline Hook综合程序_第16张图片

7) 写入shellcode需要的数据
内存注入之IAT Hook和Inline Hook综合程序_第17张图片

8) 重定位shellcode中的数据地址

9) 写入shellcode
内存注入之IAT Hook和Inline Hook综合程序_第18张图片

10) 修改IAT表

程序运行结果截图 :

Hook之前IAT表

Hook之后IAT表,可以看到WinExec在IAT表中的地址被改了
内存注入之IAT Hook和Inline Hook综合程序_第19张图片

继续运行被测试程序,可以看到我的shellcode被成功运行了,且原函数也被正常执行
内存注入之IAT Hook和Inline Hook综合程序_第20张图片

模块四之Inline Hook

1) 编写shellcode

2) 遍历IAT结构体链表,寻找需要Hook的函数的IAT表项结构体

3) 遍历IAT表,获取MessageBoxA的IAT表项结构体
内存注入之IAT Hook和Inline Hook综合程序_第21张图片

4) 遍历进程结构体链表,获取进程结构体信息
内存注入之IAT Hook和Inline Hook综合程序_第22张图片

5) 获取调试权限

6) 获取进程句柄
内存注入之IAT Hook和Inline Hook综合程序_第23张图片

7) 获取所要hook的函数前五个字节,判断是否可以注入
内存注入之IAT Hook和Inline Hook综合程序_第24张图片

8) 写入数据
内存注入之IAT Hook和Inline Hook综合程序_第25张图片

9) 重定位shellcode的数据地址
内存注入之IAT Hook和Inline Hook综合程序_第26张图片

10) 先写入shellcode的前部分
内存注入之IAT Hook和Inline Hook综合程序_第27张图片

11) 将原函数前五字节替换成jmp shellcode
内存注入之IAT Hook和Inline Hook综合程序_第28张图片

12) 将jmp 原函数第六字节 写入shellcode最后五个字节
内存注入之IAT Hook和Inline Hook综合程序_第29张图片

程序运行截图

程序运行前IAT表

Inline Hook之后的IAT表,可以发现IAT表没改
内存注入之IAT Hook和Inline Hook综合程序_第30张图片

用Ollydbg查看WinExec函数实现的地方0x7C862585,可以看到头五个字节被改成jmp shellcode

调用WinExec之后成功执行我们的shellcode

查看shellcode,可以看到shellcode执行完后会jmp 回原函数第六字节
内存注入之IAT Hook和Inline Hook综合程序_第31张图片

可以看到我们的shellcode执行完后,原本的函数调用成功运行
内存注入之IAT Hook和Inline Hook综合程序_第32张图片

到此,四个模块全部做完了,相关源码在文章头部提供了,程序做的不是很好,仅作参考

你可能感兴趣的:(内存注入,IAT-Hook,Inline-Hoo,进程列表获取,PE结构获取)