首页
社区
课程
招聘
代码乱序变形引擎的设计思路
2009-4-22 20:07 25415

代码乱序变形引擎的设计思路

2009-4-22 20:07
25415
不会写文章,不过还是写了一篇,有人有兴趣可以照着山寨,我玩腻了.
另外免得无bin无真相,带个bin和map.

摘一段

软件保护里面很重要的一块就是对程序代码进行乱序变形,而对于一个通用的保护工具来说,面对的程序是不可预计的,什么样的程序都可能碰到,如何才能保证乱而不挂?本文介绍一个代码乱序、变形引擎的设计思路,与之相关的基础知识请读者自行学习,本文不再赘述。
代码乱序和代码变形是两回事,一个是代码分布上的混乱,把一段连续的指令打乱,当中用跳转连起来,这样的东西,叫做乱序。而变形,是指把一条指令A变成A’或者A’+B等等,它完成的功能一样,这其中可以对指令进行模板变形,也可以对任意指令进行堆栈、EFLAGS和目标寄存器和地址的混淆。
而作为一个完善的引擎,单独任何一个方面都是拿不出手的,原因很简单,只乱序,别人可以把无条件跳转直接去掉,把地址一转换,甚至可以静态打回原形。而代码变形,由于改变了指令长度,就必须对指令进行搬家,本来一条指令两个字节,变形了变成6个,不但这条指令放不下,就算放个跳转,也只能放一个短跳,如果在附近找不到空间放新指令,那么只能放一个5字节的跳转,那么下面的代码都要搬家,光光搬下面的还不行,如果上面有往下的跳转,或者是一个小循环,那么整个代码都要搬家。这段变完了,发现这一大段代码放不下怎么办?单独变形显然不可行,所以变形必须要依赖于乱序,而乱序又离不开变形。

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

上传的附件:
收藏
点赞7
打赏
分享
最新回复 (44)
雪    币: 7300
活跃值: (3758)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
海风月影 22 2009-4-22 20:09
2
0
我居然是第一个。。
雪    币: 82
活跃值: (10)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
Nooby 5 2009-4-22 20:19
3
0
你刷新按得太快了。
雪    币: 192
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
沙加 1 2009-4-22 20:23
4
0
我是来膜拜的!
雪    币: 105
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
你猜 2009-4-22 20:40
5
0
123456
雪    币: 7852
活跃值: (2306)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
option 2009-4-22 20:43
6
0
6louzhanwei
雪    币: 334
活跃值: (17)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
likunkun 1 2009-4-22 21:04
7
0
先支持,后拜读....
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
fool 2009-4-22 21:34
8
0
下了看看,支持
雪    币: 360
活跃值: (77)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
popeylj 6 2009-4-22 22:17
9
0
占楼学习
雪    币: 494
活跃值: (629)
能力值: ( LV9,RANK:1210 )
在线值:
发帖
回帖
粉丝
softworm 30 2009-4-22 22:35
10
0
例子加壳了看不见啊

是否改变了原程序的结构? 既然使用了map文件估计是做了的
雪    币: 82
活跃值: (10)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
Nooby 5 2009-4-22 22:38
11
0
例子的壳没有改变代码段, 401000处是一个MD5,直接bp就可以.
雪    币: 494
活跃值: (629)
能力值: ( LV9,RANK:1210 )
在线值:
发帖
回帖
粉丝
softworm 30 2009-4-22 22:41
12
0
我也在玩这个,没有搞完.用mistfall直接搞原来的代码,不是壳,因为不能保证反汇编的正确性,只能做成个玩具,过段时间也贴个样本

象这样的代码,反汇编不好做:

.text:00402728                 and     eax, 3
.text:0040272B                 add     ecx, eax
.text:0040272D                 jmp     dword ptr ds:(loc_40273C+4)[eax*4]
.text:0040272D
.text:00402734 ; ---------------------------------------------------------------------------
.text:00402734
.text:00402734 loc_402734:                             ; CODE XREF: _memcpy+46j
.text:00402734                 jmp     dword ptr ds:TrailUp0_0[ecx*4]
.text:00402734
.text:00402734 ; ---------------------------------------------------------------------------
.text:0040273B                 align 4
.text:0040273B _memcpy         endp
.text:0040273B
.text:0040273C
.text:0040273C loc_40273C:                             ; CODE XREF: _memcpy+31j
.text:0040273C                                         ; LeadUp1_0+1Ej
.text:0040273C                                         ; LeadUp2_0+18j
.text:0040273C                                         ; LeadUp3_0+Ej
.text:0040273C                                         ; DATA XREF: _memcpy+4Dr
.text:0040273C                 jmp     ds:UnwindUpVec_0[ecx*4]

我是想直接变换原程序的代码段,可惜反汇编是个致命问题,只能凑合玩玩.

我的带驱动的OD没在家里的机器上(XP Sp3)试过,OllyIce过不了你的壳呵呵.
雪    币: 82
活跃值: (10)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
Nooby 5 2009-4-22 22:46
13
0
跳转表的我是直接放弃的,VC的可以,Delphi的给我MAP我也不能保证稳定.
雪    币: 494
活跃值: (629)
能力值: ( LV9,RANK:1210 )
在线值:
发帖
回帖
粉丝
softworm 30 2009-4-22 22:50
14
0
我上面列的代码就是VC6生成的,我也用了map文件,反汇编不能保证,mistfall也就大打折扣了.

如果能直接变换原程序的代码段就太爽了,即使脱壳也没有干净代码,就象刘涛涛的扭曲.

我不清楚他是怎么做的,看他的文章似乎是从obj得到asm做的,难道直接处理的asm文件?
出来的结果还是obj。如果直接处理二进制文件,用mistfall可以做出更强的东西,比如抽代码,
可以把原始代码占用的空间真正拿掉,大大增加修复的难度
雪    币: 82
活跃值: (10)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
Nooby 5 2009-4-22 22:55
15
0
我现在的做法只从可靠的入口搜索函数,类似于IDA的启发式.
可以直接跳过这种表,当成不可重塑的指令,放弃这段代码.毕竟这样的情况是少数.

ltt是分析obj的,可以利用link生成代码,我是直接分析bin的,提供map是方便给人找入口的.壳处理的时候是不需要的,原地方的空间可以用来放bytecode,也可以放代码,不过真正用起来就会发现其实空间很有限,因为乱序的时候必须考虑最大指令长度,最后很零散,利用率很低.
雪    币: 494
活跃值: (629)
能力值: ( LV9,RANK:1210 )
在线值:
发帖
回帖
粉丝
softworm 30 2009-4-22 23:01
16
0
那段代码是memcpy里的,不清楚为什么编译器会生成这样的代码,z0mbie举过这个例子,问题在于40272D 的jmp跳到指令中间了,显然实际上是不会的,eax不会为0。

不过我没有实际跟过这段代码。
雪    币: 494
活跃值: (629)
能力值: ( LV9,RANK:1210 )
在线值:
发帖
回帖
粉丝
softworm 30 2009-4-22 23:10
17
0
我就是想把原地方干掉,不留空间。比如抽走的代码,原始IAT占的空间,或者jmp [iat] -> E9
之类的,把空间压缩掉,修复者只能自己另外找地方重建这些东西。

有的程序可以处理,反汇编失败就只有放弃了。
雪    币: 82
活跃值: (10)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
Nooby 5 2009-4-22 23:27
18
0
程序里肯定有分析不了的地方的,比如函数未必都是retn结尾.这个时候map pdb都帮不上忙.

如果要全挪,可能工作量比还原还大..
雪    币: 137
活跃值: (305)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
stoy 2009-4-22 23:32
19
0
好东西
雪    币: 494
活跃值: (629)
能力值: ( LV9,RANK:1210 )
在线值:
发帖
回帖
粉丝
softworm 30 2009-4-22 23:43
20
0
Nooby可能没明白我的意思,我现在做的不是壳,就是个直接变形原代码的工具。 我说压掉空间,只是说如果在这基础上做壳,可以做出比较强的功能。

用mistfall引擎,不用关心函数起止的问题,可以随便挪动代码位置,只要建立好代码之间及PE文件头的参考关系就行。

真正的问题还是反汇编,用mistfall要求正确地识别出所有的代码和数据。这几乎是做不到的,有map稍好点,所以注定是个玩具。原来在某篇文章上对这引擎评价很高,说是感染若干样本无一失败,我觉得很奇怪。看他的代码应该成功率不高才对,况且病毒还没有map的帮助。

做不出实用的东西,做个玩具自己玩也行啊。
雪    币: 82
活跃值: (10)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
Nooby 5 2009-4-23 01:15
21
0
大概明白了,以后有机会可以放个bin研究一下.
雪    币: 263
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
太虚伪了 1 2009-4-23 08:44
22
0
把sm引出来了,只能说神作
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gkend 2009-4-23 09:27
23
0
区分代码和数据的确没有什么办法,就是目前最好的反汇编IDA也需要人工干预。借助于重定位表也只能区分一部分数据(如跳转表)。幸好中、高级语言除非内联汇编外一般很少有代码、数据混合编程。
再说代码乱序变形引擎,个人觉得在防代码分析、防破解方面没有什么作用,老实说现在谁还完全靠静态分析?一般都是一边调式一边动态分析,那么什么乱序、变形都无法阻止分析,更无法防止破解,只是增加一点难度而已。
建议nooby有时间写代码乱序、变形引擎不如写VM引擎。相对来说,VM拥有更高的强度。
雪    币: 263
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
太虚伪了 1 2009-4-23 09:31
24
0
你还真是无知啊
没办法
jr无知是正常的
雪    币: 82
活跃值: (10)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
Nooby 5 2009-4-23 09:32
25
0
1.我无视VM。
2.你如果觉得VM足够强,怎么不叫老毛子把1.8降到1.2,速度还快些。

另外,这个文章大概你没看,整个过程就是兼容VM的,不多说了,cj时间到,不谈技术了。
游客
登录 | 注册 方可回帖
返回