首页
社区
课程
招聘
[原创]c/c++反混淆方法
发表于: 2019-1-29 22:56 15763

[原创]c/c++反混淆方法

2019-1-29 22:56
15763

记需要反混淆的函数为output=obf-function(input)

反混淆的思路,首先标记输入的变量记为input-symbol,通过Taint跟踪改变量的流向,并提取与该输入变量input-symbol和输出变量output-symbol有关的所有表达式exprs。再将exprs转化为Arybo表达式,然后再将其转化为LLVM-IR指令的形式。最后使用llvm编译器-o3选项对llvm-ir指令做编译优化,生成可执行文件。

提取binary文件中PT_LOAD段,将其加载到模拟器内存中。

其中ctx = TritonContext(),用于获取一个Triton实例对象,用于动态分析。

binary文件中的导入符号hook处理(具体可以看makeRelocation()),确保模拟执行时能够正常执行所需的API函数,如:printf,memcpy,rand,strtoul等,即使用python语法来实现这些API函数。用于后面模拟器执行。

hookingHandler,从名字可以知道,这个函数用于处理之前被hook的函数。

###a 这里假设程序只有一条执行路径
即程序不会根据输入值input-symbol的不同而执行不同的分支。
则此时,全局变量paths[0]中得到与之相关的所有表达式。
使用下面代码,将所有表达式保存到文件中,其中pathNumber=0

使用Arybo开源项目中tritonexprs2arybo()方法,将exprs中所所有表达式转化为arybo表达式;以及使用tritonast2arybo()获取输入变量input-symbol
最后使用to_llvm_function将其转化为llvm-ir指令,再recompile将这些ir指令重新编译生成可执行文件。

流程如下:

流程如下,直接在代码里面解释,这代码里面假设程序只有两条可能的路径会走。

结果如图1,图2,图3所示。其中图1为原程序编译后使用ida打开看到的控制流程图;图2为使用相关混淆方法对源程序做混淆处理后编译生成的可执行文件,再使用ida打开看到的控制流程图;图3为使用本文方法对混淆后可执行文件做反混淆处理后得到的新的可执行文件,再使用ida打开看到的控制流程图。虽然反混淆后程序的控制流图跟原程序有所不同,但执行结果是一致的。
原程序CFG
[图1] 原程序控制流程图

混淆后程序CFG
[图2] 混淆后程序控制流程图

反混淆后程序CFG
[图3] 反混淆后程序控制流程图

我只是解读搬运工,有兴趣读者可以直接下载该开源项目,点击链接
当然,该方法仍存在一定程度上的局限性,还无法做到通用。有什么问题可留言。

 
 
 

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 5
支持
分享
打赏 + 2.00雪花
打赏次数 2 雪花 + 2.00
 
赞赏  kanxue   +1.00 2019/02/01 春节快乐
赞赏  kanxue   +1.00 2019/02/01 感谢分享~
最新回复 (20)
雪    币: 29
活跃值: (295)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2019-1-30 00:05
0
雪    币: 3425
活跃值: (1479)
能力值: ( LV9,RANK:320 )
在线值:
发帖
回帖
粉丝
3
Taint Analysis(污点分析)、Symbolic Execution(符号执行),学术界研究较多,比较注重理论,在实践上有很多限制,类似代码混淆反混淆、虚拟机保护还原等还是要基于编译器或反编译器的中端IR进行控制流/数据流分析
2019-1-30 00:49
2
雪    币: 26
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
不懂
2019-1-30 07:52
0
雪    币: 26205
活跃值: (63302)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
5
感谢分享!
2019-1-30 09:39
0
雪    币: 3190
活跃值: (1816)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不谈应用场景的还原都是耍(刷)流氓(量)。
2019-1-30 10:00
0
雪    币: 53
活跃值: (106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
用来搞搞简单的crackeme还行
2019-1-30 10:35
0
雪    币: 6573
活跃值: (3893)
能力值: (RANK:200 )
在线值:
发帖
回帖
粉丝
8
感谢分享!
2019-1-30 10:39
0
雪    币: 355
活跃值: (637)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
9
vasthao Taint Analysis(污点分析)、Symbolic Execution(符号执行),学术界研究较多,比较注重理论,在实践上有很多限制,类似代码混淆反混淆、虚拟机保护还原等还是要基于编译器或反编 ...
这里只是抛砖引玉,希望业界能有更完善的反混淆方案被提出来。
2019-1-30 11:51
0
雪    币: 107
活跃值: (1693)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
10
Triton不支持arm。
2019-1-30 12:18
0
雪    币: 2719
活跃值: (1595)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11
感谢分享啊
2019-1-30 14:57
0
雪    币: 3712
活跃值: (1401)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
12
Tigress这种源码保护做的很强
2019-1-30 15:32
0
雪    币: 3907
活跃值: (5817)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
13
不谈应用场景的还原都是耍(刷)流氓(量)。
2019-1-30 15:36
0
雪    币: 355
活跃值: (637)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
14
Zkeleven 用来搞搞简单的crackeme还行
其实不只能用来搞简单的crackme,其他相对复杂点的程序也是可以的,只是需要人工参与并且需要一些工作量。它这个思路对于反控制流混淆确实说得通。
2019-1-30 22:53
0
雪    币: 916
活跃值: (3434)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
15
Triton不支持arm+1
2019-1-30 23:52
0
雪    币: 123
活跃值: (1675)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
看不懂,但依然感谢分享。
2019-1-31 10:34
0
雪    币: 143
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
17
感谢分享
2019-3-16 23:07
0
雪    币: 83
活跃值: (1087)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
18
感谢分享 如果用来还原vmp  不知道效果好不好 谁尝试过  另外有没有c语言调用的框架 类似Tigress_protection的
2019-3-19 10:07
0
雪    币: 83
活跃值: (1087)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
19
你这篇文章主要是利用 污点分析 来去除混淆  还有的利用符号执行去掉混淆  那么能利用Z3约束求解去掉混淆吗  另外这些方法能去掉乱序吗 不太懂 我想研究一下 哪位大佬提点一下
2019-3-19 10:20
0
雪    币: 3836
活跃值: (4142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
葫芦娃 Triton不支持arm+1
现在 支持了
2022-8-16 17:39
0
雪    币: 116
活跃值: (1012)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
实在是高
2024-3-14 18:45
0
游客
登录 | 注册 方可回帖
返回
//