首页
社区
课程
招聘
[原创]软件保护壳专题 - 代码替换引擎的构建
发表于: 2009-8-28 16:23 12244

[原创]软件保护壳专题 - 代码替换引擎的构建

2009-8-28 16:23
12244

代码替换引擎的构建
<目录>
0.<什么是替换>
1.<替换的步骤>
2.<代码流程图的构建>
3.<与乱序的结合>
4.<开始替换>
5.<替换的BUG>
6.<鸡肋or NOT~~~>

正文 Loading...

<正文>
0.什么是替换
   代码替换每个使用过壳的人应该都不会陌生,把指定内存替换成用户指定的代码。但是你尝试过编写
自动替换吗?把正常代码的地方搬运到其他地点。然后自动在原先处加上花指令。这样且不说达到了变形
的效果。也使Cracker在F8与F7之间徘徊。如果没有一个完美的Anti-Debuger的技巧。我们在R3下所用做
到的极限就是消耗Cracker的耐心。

1.替换的步骤
   0.构建代码流程图
   1.找到两个JMP/CALL/JCC之间的代码段,这个代码段符合以下要求,长度要大于等于5个字节(以便放置
   跳转指令)这段指令没有其他跳转跳入(如果能排除动态跳转最好,但是不太可能,这也是产生不能修复的
   BUG的原因)
   1-x.找到的这个代码段可以不忽略有其他跳转跳入
   2.添加一个新节以便储存这些被替换的代码。
   3.遍历这个结构,把要替换的代码段搬运到新的空间,在新的空间末尾添加一个跳入原先代码段结束的
   地址。
   4.将原先的代码块的首5个字节添加一个JMP跳入到搬运后的地址。并填充同样长度的花指令。
   5.将这个代码块除了首5个字节其余字节以花指令填充。
   5-x.将这个代码块其余的字节,如果大于等于5个字节长度,添加JMP指令以便指向与这个JMP次序相等的
   原先指令的位置。
   原先代码序列:     现在代码序列:       搬运后的地址:
   A                 JMP N_A             N_A
   B                 JMP N_B             N_B
   C                 JMP N_C             N_C
   D                 JMP N_D             N_D
   JMP类指令-J       JMP类指令-J         JMP JMP类指令-J
   替换后成以上结构
   这个替换的意义在于防止动态跳转跳入到替换后的代码块中间的位置。由于没有适当的跳入到正确的
   指令位置引发的错误。不过还是不能完全防止此类错误发生因为每块代码不可能完全是以5字节指令对齐
   也许会出现以下状况
   替换后的代码序列:
   JMP N_A
   JMP N_B
   JMP N_C
   BUG_JMP:
   .... 不足5字节的任意数据 ....
   JMP类指令-J
   如果在代码段的其他位置以动态跳转的形式跳入到BUG_JMP就会发生错误。(偏移类我们可以通过过滤
   的手段来筛选掉)。
   6.检查搬运空间的长度是否还足够放置更多的代码块。
   
要说明的是也可以加入随机手段来控制来进行替换。

2.代码流程图的构建
   这份代码在专题的 《代码乱序引擎的构建》中已经给出。由于替换引擎也需要它的支持。代码就到上一节
   看吧。

3.与乱序的结合
   代码替换生成的全是偏移类跳转为什么不和上一节中的代码乱序结合呢?这样的组合产生的东西是很奇妙的
   在加上随机率的变化。一定会让Cracker很头疼。

4.开始替换
   原理就是以上所写的,这里直接给出一份比较稳定的代码。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 8
支持
分享
最新回复 (7)
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
2
做沙发学习~~~~~~~~~~~
2009-8-28 16:28
0
雪    币: 179
活跃值: (26)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
哇,又来一篇。这么高的效率。继续学习。
2009-8-28 16:31
0
雪    币: 112
活跃值: (48)
能力值: ( LV9,RANK:320 )
在线值:
发帖
回帖
粉丝
4
顶起,,怎么不用asm写了?C这样的写看着晕晕乎乎的。。。。。。。。。真的不适合介绍壳的东西啊。。。。。。。。。。。。建议还是用asm
2009-8-29 21:07
0
雪    币: 546
活跃值: (1605)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
5
大哥,悠着点,别太玩命了。我前面的知识还没有消化呢。会消化不良的。
2009-8-29 21:16
0
雪    币: 284
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
太强大了 ,膜拜。。。玩命果然玩命啊
2009-8-29 23:13
0
雪    币: 25
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
支持一下玩命哥~
2009-8-30 21:21
0
雪    币: 124
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
学习壳专题一直到现在,一篇都没有落下。发现有很多方法都不通用,有很多限制。所以小弟有个想法,能不能将二进制代码转换成一种中间语言,然后再在中间语言的层次上进行代码的重构,这样不但可以解决代码替换的硬伤和jmp eax这种动态跳转的分析,而且可以更加随机的插入花指令
2009-12-10 19:56
0
游客
登录 | 注册 方可回帖
返回
//