ADVobfuscator开源项目分析

一、代码混淆的定义

代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行

二、ADVobfuscator简介

ADVobfuscator演示如何使用C ++ 11/14语言在编译时生成混淆代码,而无需使用任何外部工具,也无需修改编译器。 所提出的技术仅仅依靠ISO标准化的C ++ 11/14。 它还展示了如何引入某种形式的随机性来生成多态代码,并给出了一些具体的例子,如字符串文字的加密和使用有限状态机的调用混淆。


三、ADVobfuscator实例分析

1.     字符串混淆

将要混淆的字符串作为定义的宏的参数。项目提供了两种方式来混淆字符串。

 

第一种,声明和使用在同一阶段:

OBFUSCATED宏先对该字符串的每个字符按照生成的随机数进行加密,对字符串进行了替代(保证每个字符串加密使用了不同的密钥,否则,一个简单地逆向工程解密就可以破解所有的字符串),然后解密该加密后的字符串,还原成原来的字符串。

 

第二种,声明和使用在不同阶段:

DEF_OBFUSCATED宏通过同样的方法对字符串进行加密,赋值给auto类型的变量,使用的时候再解密该变量来达到目的。

 

效果:

通过 strings 命令来查看编译生成的程序,只能看到一个明文字符串

 

2.     函数混淆

对函数的调用通过有限状态机来实现,增加了逆向工程的复杂性。

该实例为有无返回值的两种函数提供了不同的宏来混淆。

由上图可以看到,通过有限状态机的方式来调用函数的同时,把函数的字符串参数也进行了混淆。

该混淆方式的原理是,实现一个有限状态机,将要调用的函数作为最后的处理事件,通过5次状态的转移,最终也实现了函数调用,并返回结果。

该开源项目只是做了一个原理展示,将函数调用直接放在了状态机的最后,真正要用到工程中,需要将函数调用放在状态机的某个状态中,并且通过特定的计算或事件去触发调用它。

 

3.     条件(调试检测)混淆

该功能原理与函数调用混淆大致一样,只是在此基础上增加了条件判断。

该实例的目的是将代码中重要的函数进行条件混淆,这里的条件判断为是否处于debug模式下。如果检测到处于debug模式下,则不会执行函数调用(混淆的方式调用),这样保护了某些比较重要的函数不能轻松地被逆向工程破解。

可以看到,OBFUSCATED_CALL_P0宏的参数为条件和函数。

 

总结

ADVobfuscator是用于C++项目的代码混淆工具,对于大型项目需要手动改变对字符串的声明和对函数的调用等,工程量比较大(代码级的混淆都是这样,需要将源码替换为混淆的方式)。如需要应用在wine上,直接移植不太可能(大量运用了C++中特有的模板,库等),需要重新创建服务于C语言的项目,可以借鉴该开源项目的原理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章