-
-
[原创]软件保护壳专题 - 代码替换引擎的构建
-
发表于:
2009-8-28 16:23
12252
-
代码替换引擎的构建
<目录>
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.开始替换
原理就是以上所写的,这里直接给出一份比较稳定的代码。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)