逆向工程核心原理之第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头可知,程序的EP1000

加上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,需要对0802xor操作,得到0f 05ee保持不变

对保存的文件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的整数进行的