首页
社区
课程
招聘
[原创]c++实现的一种代码膨胀变形壳
发表于: 2017-12-29 21:24 21505

[原创]c++实现的一种代码膨胀变形壳

2017-12-29 21:24
21505

主要实现3个功能:

1.代码膨胀

2.代码变形

3.对地址常量包括字符串常量进行加密


代码膨胀:

代码膨胀无非就是指令等价替换,不过这里没条指令最好能有多个膨胀规则,这样会加大还原难度。

原始程序大小为6kb,经过5次混淆后,大小变为66kb.


混淆前代码:



混淆后代码:



从上图会发现有大量的垃圾代码生成。


1.有分支跳转改成无分支跳转。

在逆向分析时主要是通过条件跳转来确定函数的流程,根据跳转的目标地址来确定这是一个分支还是一个循环。如果将所有条件跳转改成无分支跳转,那么程序只有在动态执行时,才能确定流程。这大大提高了逆向分析的难度。另外,ida在进行还原伪c代码时,遇到无分支跳转,会进行截断,导致后面指令无法还原伪c代码。这对靠f5吃饭的人说就gameover了。因为此时已经控制了代码流程, 如果在后面加一些垃圾指令,会导致后面的代码全部识别错乱,只有运行时才确定要跳到哪个位置。


另外对 jmp imm, call imm和call [imm](一般这种间接call都是api调用) 也改成无分支跳转。

本来没打算对这类指令进行处理,但是发现效果还挺好,干脆就加上吧。因为jmp imm也可以作为判断分支或者循环的依据,而call也是一个比较关键的指令,尤其是call api,在逆向分析时,通过观察api的前后代码来确定代码到底在干嘛。这样一处理,你静态分析时看不到任何条件跳转,看不到任何call调用(除了call reg,当然了,静态分析你也看不出来call reg)。


另外对条件跳转和call这类指令的下一条指令加一些垃圾代码,会导致后面的整段指令识别错误。也会给别人留下个坑,比如一般人想步过这个函数调用,会在函数的下一条指令地址处下断点,但这条指令实际上永远不会执行。


实现思路:

1.将跳转目标地址保存到一个地址数组表里面,在建一个索引表记录地址表的索引,在对索引进行随机加密。运行时根据条件码得到正确的索引表地址,在对索引进行解密,得到正确的目标地址偏移。

代码变形前:




[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 10
支持
分享
最新回复 (59)
雪    币: 79
活跃值: (1494)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
代码已上传
2017-12-29 21:36
0
雪    币: 4889
活跃值: (2275)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
下来学习学习,谢谢分享。
2017-12-29 21:43
0
雪    币: 153
活跃值: (181)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
666
2017-12-29 21:48
0
雪    币: 181
活跃值: (621)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
可以可以
2017-12-29 21:49
0
雪    币: 133
活跃值: (233)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
之前只见到这样的bin,现在看到代码了,谢谢分享
2017-12-29 22:50
0
雪    币: 1392
活跃值: (5177)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
7
有论文支撑吗?假如每一条指令都是等价靠人工生成,那知道了对应的规则就可以还原。跳转表同理
2017-12-29 22:57
0
雪    币: 79
活跃值: (1494)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
IamHuskar 有论文支撑吗?假如每一条指令都是等价靠人工生成,那知道了对应的规则就可以还原。跳转表同理
你可以去看看  itunes的代码变形,实际上也是通过数组计算索引,在jmp寄存器,但是你只知道一个流程,另一个流程也是需要解密获取,此时你是将代码还原成jmp还是什么,但这是不对的。
2017-12-29 23:09
0
雪    币: 79
活跃值: (1494)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
IamHuskar 有论文支撑吗?假如每一条指令都是等价靠人工生成,那知道了对应的规则就可以还原。跳转表同理
我这只是根据itunes的代码变形写的,也就刚写成形,也是为了偷懒,你看明白了可以自己慢慢整。
2017-12-29 23:15
0
雪    币: 440
活跃值: (1163)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
支持一下,看看怎么怎么实现的
2017-12-29 23:55
0
雪    币: 79
活跃值: (1494)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
11
淡淡的荧光 我这只是根据itunes的代码变形写的,也就刚写成形,也是为了偷懒,你看明白了可以自己慢慢整。
举个例子,原始码:call  imm;  cmp,eax,2  ;jz  imm;      变形后:call  imm;  offset=addrarry[eax];  ecx=base+offset;  jmp  ecx;  地址表存放的目标地址偏移和下一条指令偏移都是随机分配的,你知道特征了,你准备还原成什么样了
2017-12-30 10:04
0
雪    币: 302
活跃值: (246)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
12
你在我心中真是越来越帅了
2017-12-30 18:44
0
雪    币: 3003
活跃值: (479)
能力值: ( LV15,RANK:1395 )
在线值:
发帖
回帖
粉丝
13
如果能加上VM就更好了
2018-1-2 16:51
0
雪    币: 1176
活跃值: (1264)
能力值: ( LV12,RANK:380 )
在线值:
发帖
回帖
粉丝
14
代码膨胀其实可以自己构造好垃圾指令做个lib随意调用.......  主要就是pass  F5党  这样子基本pass一大部分人了  .
2018-1-2 17:14
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
2018-1-3 04:49
0
雪    币: 3
活跃值: (39)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
谢谢
2018-1-3 10:25
0
雪    币: 113
活跃值: (76)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
17
淡淡的荧光 代码已上传
缺“PEReloc.cpp”文件,编译有错
2018-1-3 19:41
0
雪    币: 56
活跃值: (1513)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
直接上VM即可
2018-1-3 21:23
0
雪    币: 300
活跃值: (2477)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
mark
2018-1-4 14:14
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
Vm  也被还原了
2018-1-7 22:56
0
雪    币: 9
活跃值: (180)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
21
谢谢分享
2018-1-8 21:30
0
雪    币: 39
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
淡淡的荧光 代码已上传
缺少文?
2018-1-9 09:44
0
雪    币: 79
活跃值: (1494)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
23
allh 缺少文?
没有少文件,少的2个文件没用到,去掉就好了
2018-1-9 09:47
0
雪    币: 17
活跃值: (105)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
立总666
2018-1-10 18:14
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
立总啊666
2018-1-10 18:36
0
游客
登录 | 注册 方可回帖
返回
//