菜鸟一只,最近一直在学PE,刚学的往节表空白区添加代码,就想水个贴,然后算是总结一下,大牛就别看了,太菜……
用的软件是WinHex,OD,Petools,跟vs2013,感染的软件是本地的记事本notepad.exe
这是很简单的一个感染,在打开程序之前加上弹窗。先执行我们的弹窗,之后再执行软件自身的代码。
步骤如下:
1,用OD随便打开一个软件,BP MessageBoxA,去断点窗口,查看MessageBox的地址,我的地址是77d507ea ,而MessageBox需要四个参数,在反汇编窗口可以看到它的硬编码为6A 00 6A 00 6A 00 6A 00 E8 Address;
2,E8 ,E9 是硬编码的 Call 和JMP,程序在硬盘中存储的方式。这是我写的一个获取这两个硬编码的测试代码:
但是这个地方E8 之后的地址并不是准确的跳转地址,含有一定的计算关系,计算公式为:
X = 想要跳转的地址 - E8运行时的地址+5;
3,这个时候就可以用WinHex在代码区的空白处添加代码。 首先用PEtools打开notepad,查看第一个节表的信息,跟SectionAlignment和FileAlignment的大小(因为最后改的代码的地址必须是ImageBuffer的时候的地址,所以一定要看文件对齐跟内存对齐),找到第一个节表也就是代码区节表的信息找到VirtualSize跟PointerTORawData来确定代码区的尾部,看下代码区剩余的空间大小是不是可以添加我们的代码。
准备工作做完可以开始添加代码,根据第一步构造的ShellCode 我们添加的代码的格式为:
6A 00 6A 00 6A 00 6A 00 E8 __ __ __ __ E9 __ __ __ __空白处是需要我们计算的地址 E9的原因是返回原始的OEP 不能影响程序本来的执行顺序。
现在开始计算地址,因为需要在的是运行状态的达到我们感染的目的,所以地址必须是按照运行状态的计算,首先计算E8 之后的Address 而这个时候E8的地址是需要计算出程序在ImageBuffer中的地址:
计算方式为: E8运行状态的地址 = E8此时地址+ImageBase + SectionAlignment-FileAlignment
之后根据公式 X = 想要跳转的地址 - E8的地址+5;
计算出来 在我的电脑上是76 D4 80 8D
既E8 8D 80 D4 76。现在再计算E9 以后的地址,同样是根据公式 X = 想要跳转的地址 - E8的地址+5;
为 E9运行状态的地址 = E9此时地址+ImageBase + SectionAlignment-FileAlignment
此时的X就是 X= 原始的
OEP - E9运行时
的地址+5这个地方的目的是执行完之后调到原始OEP
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)