逆向工程核心原理之第20章之利用空白区域
首先打开文件unpackme#1.aC.exe,分析其中的节区信息,如下:
对节区头中包含节区的内存展示:
文件RAW地址 |
内存RVA地址 |
|||
400 磁盘节区起始地址 |
|
1000 内存节区起始地址 |
||
..... ..... 800 |
280 |
text |
..... ..... 2000 |
400 |
..... A00 |
200 |
rdata |
..... 3000 |
138 |
...... C00 |
200 |
data |
...... 4000 |
2c |
...... 1400 |
800 |
pdata |
...... 4630 |
630 |
注意上面表格两边虽然格式上对齐,但是数值上是不一样的 |
从PE头可知,程序的EP是1000
加上imagebase的地址:
所以初始ep地址为: 1000 + 400000 = 401000,如下图:
首先展示内存结构,进过正面分析,我们知道第一节区的大致内存分布如下:
401000 ... 401006 |
400 ... 406 |
程序开始EP |
401007 ... 401085 |
407 ... 485 |
进行异或7操作 |
401086 ... 4010f4 |
486 ... 4f4 |
|
4010f5 ... 401248 |
4f5 ... 648 |
进行两次异或操作: 第一次异或44 第二次异或11 |
401249 |
649 |
Int3 |
40124a .. 40127f |
64a .. 67f |
进行异或17 |
401280 .. 402000 |
680 .. 800 |
这里为null |
我们将补丁代码放在第一节区的空白区域:
401290开始的位置
401290
mov ecx,10
mov esi,4012c0
mov edi,401123
rep movs byte ptr es:[edi], byte ptr ds:[esi]
mov ecx,17
mov esi,4012e0
mov edi,40110a
rep movs byte ptr es:[edi], byte ptr ds:[esi]
jmp 40121e
4012c0 ascii "use null text!",0
4012e0 ascii "unpacked use null text!"
在dump区域右键,选择edit选择select all
再次选择edit,选择copy all modifications to executable
保存文件为unpackme#1.aC_sum_1.exe
接下来需要寻找跳转点,下面这个是跳转到OEP的地方,如下
我们需要修改为我们???代码的起始地址401290
401083 - 401000 + 400 = 483
401290 - 401000 + 400 = 690
从483开始,原始数据为 EE 91 06 00 00
这里有个特别需要注意的地方,从486开始是没有进行xor操作的。
所以只对前3个字节做xor 07操作,得到e9 96 01,和上图中保持一致,
现在如果我们要跳转到新的地址401290,从内存中可以看到代码为
08020000,需要对0802做xor操作,得到0f 05,ee保持不变
对保存的文件unpackme#1.aC_sum_1.exe做如下修改
执行结果如下:
第二种方法,利用最后节区的空白区域
从文件unpackme#1.aC_sum.exe我们可以看到,最后节区的参数如下
2E 72 73 72 63 00 00 00
30 06 00 00 00 40 00 00 00 08 00 00 00 0C 00 00
00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 C0
所以考虑增加最后一个节区到内存的映射空间 从630 之后 再增加 部分空间
到680,用这部分空间来增加我们的补丁
Raw 630 + C00 = 1230
RVA = 630 + 4000 = 4630 + 400000 = 404630
我们在内存404630添加如下代码
404630
mov ecx,10
mov esi,404658
mov edi,401123
rep movs byte ptr es:[edi], byte ptr ds:[esi]
mov ecx,17
mov esi,404668
mov edi,40110a
rep movs byte ptr es:[edi], byte ptr ds:[esi]
jmp 40121e
404658 ascii "use null text!",0
404668 ascii "unpacked use null text!",0
在dump区域右键,选择edit选择select all
再次选择edit,选择copy all modifications to executable
保存文件为unpackme#1.aC_sum2.exe
现在需要把代码跳转到地址404630
所以 需要对a8 35 进行异或07操作得到 af 32,
下面需要修改unpackme#1.aC_sum2.exe文件,如下:
本来我们还准备修改最后一个节区的映射大小从630改为680,但是实际上发现不需要。
不修改也可以执行,因为内存映射是按照1000的整数进行的