内嵌补丁(洞穴代码)

Posted mayfly-nymph

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内嵌补丁(洞穴代码)相关的知识,希望对你有一定的参考价值。

测试文件:https://www.lanzous.com/i5o5fhg

 1.准备

典型的运行时压缩(或者加密代码),是EP代码先将加密的OEP代码解密,再跳转到OEP处。而若要修改被加密的内容,可以在EP解密代码之后,JMP跳转目标改为“洞穴代码”(此时的代码已被解密),再跳转到OEP。

 

打开测试文件

技术图片

技术图片

 

2.OD调试

技术图片

查找所有字符串之后,未找到所需要的字符串。进入

00401001 |. E8 E3000000 call 004010E9

技术图片 

继续进入

004010EF |. E8 A7FFFFFF call 0040109B

 

2.1 解密地址

技术图片

 

通过上图我们可以看到,4010F5区域被解密的两次,即被加密的两次。目前我们还不清楚,被加密的内容是是什么,但我们可以写出解密的结构

解密区域 解密起始地址 长度 XOR值
B 4010F5 0x154 0x44
A 401007 0x7f 0x7
B 4010F5 0x154 0x11

 

2.2 原OEP跳转

进入

004010B6 |. E8 7EFFFFFF call 00401039

 技术图片

 

跳转OEP

技术图片

 

CTRL + A分析代码

 

技术图片

方框内为DialogBoxParamA() API的五个参数,第四个参数用来指出Dialog Box Procedure的地址,入栈顺序和传参顺序相反,因此第四个参数值为DlgProc=004010F5,进入API内(转到4010F5),有我们需要修改的字符串。

技术图片

 

3. 制作补丁

3.1 空区域查找

这时候,找到文件的空白区域,打入我们的补丁代码,将解密后jmp地址跳转到补丁地址,再跳转到OEP地址。

使用PEView打开测试文件,查看第一个节区

技术图片

 

得到,第一个节区虽然文件大小为400,但是加载到内存的大小只有280,因此我们可以归纳在文件中使用的区域有400~67f,未使用区域680~800;内存中使用区域401000~40127f,未使用区域401280~401FFF

(虽然内存大小为280,但并不意味实际节区的内存大小为280,而要以Section Alignment的倍数扩展(此处为1000),所以内存地址VA范围在401000~401FFF)

 

技术图片

 

转到OD内存中地址

技术图片

技术图片

 

3.2 制作补丁代码

将补丁代码写入到空白区域,并将我们修改的字符写入到ds:[si]中

00401280   > \\B9 13000000   mov ecx,0x15
00401285   .  BE A8124000   mov esi,unpa4.004012A8                   ;  ASCII "successful unpackme!"
0040128A   .  BF 23114000   mov edi,unpa4.00401123                   ;  ASCII "You must patch this NAG !!!"
0040128F   .  F3:A4         rep movs byte ptr es:[edi],byte ptr ds:[>
00401291   .  B9 10000000   mov ecx,0x12
00401296   .  BE C8124000   mov esi,unpa4.004012C8                   ;  ASCII "I unpack!hkmayfly"
0040129B   .  BF 0A114000   mov edi,unpa4.0040110A                   ;  ASCII "You must unpack me !!!"
004012A0   .  F3:A4         rep movs byte ptr es:[edi],byte ptr ds:[>
004012A2   .^ E9 77FFFFFF   jmp unpa4.0040121E

技术图片

 

这实际上就是两段将ds:[si]的字符存入es:[si]的代码

 

4. 解密文件数据

4.1 修改原跳转EOP地址

之后我们再到原来跳转OEP的地方,将jmp地址改为401280

技术图片

从内存地址401083看,这里是XOR 0x7 A区域的加密区域。因此修改命令之后,我们还需要到文件地址400+83=483处,对483~485进行解密保存

技术图片

 

 

E9  XOR 7 = EE

F8  XOR 7 = FF

01  XOR 7 = 06

E9 F8 01 --> EE FF 06

 

5.完成补丁

这样就完成了对整个程序的内嵌补丁。

技术图片

技术图片

以上是关于内嵌补丁(洞穴代码)的主要内容,如果未能解决你的问题,请参考以下文章

内嵌补丁练习

java中内嵌浏览器怎么用

CSSCSS 层叠样式表 ② ( CSS 引入方式 - 内嵌样式 )

app内嵌h5页面:前端与原生语言的配合

h5内嵌到小程序左滑会刷新页面吗

块元素和内嵌元素