给软件添加代码

一. 代码节空白区域添加代码

1. 根据SizeOfRawData - VirtualAddress的值来判断剩余空间是否足以添加代码

2. 根据SizeOfRawData + PointerToRawData来到空余部分

3. 将汇编指令转为硬编码:此处添加的代码是MessageBox,可以通过OD(走下角命令 bp MessageBoxA)来查看MessageBox的地址。

6a 00 6a 00 6a 00 6a 00 e8 00 00 00 00 e9 00 00 00 00

push 6a
call   e8
jmp  e9

目标地址 = 下一行地址(运行时的地址) + 硬编码(命令后的地址)

call :761a1060 - (01caad + 400000) = 75D8 45B3
000193BE + 400000 = 4193be 目标地址 (EIP地址 + ImageBase)
41cab2 下一行地址
jmp :FFFF C90C‬ 硬编码

4. 改EIP

此时不用加上ImageBase

 

二. 任意节空白区添加代码

注意:在DOS后面是不可以直接作为程序入口添加硬编码的。

其他内容基本同上。

 

三. 增加节

需要修改的数据

1. 添加一个新的节(可以copy一份)

2. 在新增节后面 填充一个节大小的000

3. 修改PE头中节的数量

4. 修改sizeOfImage的大小

5. 再原有数据的最后,新增一个节的数据(内存对齐的整数倍).

6. 修正新增节表的属性

 

如果在最后一个节表以及40字节的空白区域之后不足以有四十个字节的空间(等长的0结构)添加一个节表,那么可以考虑将标准PE头到节表移动到DOS头结束的位置,即40H。注意复制粘贴的时候需要选中相同的行数。之后将节表末尾的数据清零即可。

 

四. 扩大节

如果SizeOfHeaders的空间不足以添加一个节表,那么就可以选择扩大最后一个节。
 

1. 修改SizeOfImage :SizeOfImage += Ex    
    
2. 将最后一个节的SizeOfRawData和VirtualSize改成N    
    
    SizeOfRawData = VirtualSize = N    
    
    N = (SizeOfRawData或者VirtualSize 内存对齐后的值) + Ex    

 

五. 合并节

合并节可以节省几个节表的空间,从而可以在剩余的位置添加新节表。

1. VirtualAddress和PointerToRawData两个起点位置不用修改。

2. SizeOfRawData = VirtualSize = SizeOfImage - VirtualAddress 或 (最后一个节的VirtualAddress + SizeOfRawData、VirtualSize中较大的那一个)。

3. 将第一个节的属性改为包含所有节的属性

4. 修改节的数量为1 :NumOfSection = 1

 

你可能感兴趣的:(逆向)