代码混淆(code obfuscation)是指将计算机程序的代码,转换成一种功能上等价,所谓功能上的等价是指其在变换前后功能相同或相近。其解释如下:程序P经过混淆变换为P‘,若P没有结束或错误结束,那么P’也不能结束或错误结束;而且P‘程序的结果应与程序P具有相同的输出。否则P’不是P的有效的混淆。
目前对于混淆的分类,普遍是以Collberg 的理论为基础,分为布局混淆(layout obfuscation)、数据混淆(data obfuscation)、控制混淆(control obfuscation)和预防混淆(preventive obfuscation)这四种类型。
1. 布局混淆
布局混淆是指删除或者混淆软件源代码或者中间代码中与执行无关的辅助文本信息,增加攻击者阅读和理解代码的难度。软件源代码中的注释文本、调试信息可以直接删除,用不到的方法和类等代码或数据结构也可以删除,这样即可以使攻击者难以理解代码的语义,也可以减小软件体积,提高软件装载和执行的效率。软件代码中的常量名、变量名、类名和方法名等标识符的命名规则和字面意义有利于攻击者对代码的理解,布局混淆通过混淆这些标识符增加攻击者对软件代码理解的难度。标识符混淆的方法有多种,例如哈希函数命名、标识符交换和重载归纳等。哈希函数命名是简单地将原来标识符的字符串替换成该字符串的哈希值,这样标识符的字符串就与软件代码不相关了;标识符交换是指先收集软件代码中所有的标识符字符串,然后再随机地分配给不同的标识符,该方法不易被攻击者察觉;重载归纳是指利用高级编程语言命名规则中的一些特点,例如在不同的命名空间中变量名可以相同,使软件中不同的标识符尽量使用相同的字符串,增加攻击者对软件源代码的理解难度。布局混淆是最简单的混淆方法,它不改变软件的代码和执行过程。
2. 数据混淆
数据混淆是修改程序中的数据域,而对代码段不作处理。常用的数据混淆方式有合并变量、分割变量、数组重组、字符串加密等。
合并变量是将几个变量合并为一个数据,原来的每个变量占据其中一个区域,类似于一个大的数据结构。分割变量则是将一个变量分割为两个变量,对分割前后提供一种映射关系,将对一个变量的操作转化为对分割后两个变量的操作。
数组重组有数组的分割、合并、折叠和平滑等几种方式。分割是将一个数组分成2个或多个相同维度的数组;合并则相反;折叠是增加数组的维数;平滑则是相反。
在ELF文件中,全局变量和常量字符串存放在数据段中,反汇编工具可以轻易查找到字符串与代码之间的引用关系。在软件破解中,通过一些字符串提示可以很方便的找到代码关键语句,从而破解软件。字符串加密则可以对这些明显的字符串进行加密存储,在需要时再进行解密。
3. 控制混淆
控制混淆也称流程混淆,它是改变程序的执行流程,从而打断逆向分析人员的跟踪思路,达到保护软件的目的。一般采用的技术有插入指令、伪装条件语句、断点等。伪装条件语句是当程序顺序执行从A到B,混淆后在A和B之间加入条件判断,使A执行完后输出TRUE或FALSE,但不论怎么输出,B一定会执行。
控制混淆采用比较多的还有模糊谓词、内嵌外联、打破顺序等方法。
模糊谓词是利用消息不对称的原理,在加入模糊谓词时其值对混淆者是已知的,而对反混淆者却很难推知。所以加入后将干扰反汇编者对值的分析。模糊谓词的使用一般是插入一些死的或不相关的代码(bogus code),或者是插入在循环或分支语句中,打断程序执行流程。
内嵌(in-line)是将一小段程序嵌入到被调用的每一个程序点,外联(out-line)是将没有任何逻辑联系的一段代码抽象成一段可被多次调用的程序。
打破顺序是指打破程序的局部相关性。由于程序员往往倾向于把相关代码放在一起,通过打破顺序改变程序空间结构,将加大破解者的思维跳跃。
4. 预防混淆
预防混淆一般是针对专用的反编译器设计的,目的就是预防被这类反编译器反编译。他是利用特定的反编译器或反混淆器的弱点进行专门设计。预防混淆对于特定的反编译器非常有效,所以在使用时要综合利用各种反编译器的特点进行设计。
android如何防止被反编译获取私钥
可以尝试以下措施:1、使用代码混淆:通过使用代码混淆工具,如ProGuard,可以混淆和压缩应用程序的源代码,使其难以被反编译和理解。2、加固和加密私钥:可以考虑使用加密功能将私钥存储在应用程序的安全存储区域,如Android密钥库(KeyStore)。3、动态生成密钥:可以在程序运行时动态生成私钥,并及时销毁和重新...
android如何做到防止反编译,保护自己的资源图片?拜托了各位谢谢_百度知 ...
1.进行源码保护检测。检测DEX文件保护,查看DEX文件是否做了保护,避免法分子反编译得到程序源码,从而杜绝恶意插入广告、恶意植入扣费代码等行为,保证用户体验以及APP的功能完整。2.源码混淆保护检测。该项目主要用来弥补程序开发人员利用混淆源码做程序的漏洞,因为混淆源码作为一种常见的基础保护措施,并不严...
android 怎么防止dex反编译
防止Android apk被反编译的方法:1、判断apk签名是否与原版签名是否一致。2、代码混淆,将混淆的级别设置高点,混淆出来以后代码全部变乱。3、使用NDK编程,将核心算法用c\/c++来编写,打包成so库供java层调用。
怎样防止Android apk被反编译,用什么加密方法来保护dex源码文件不被注 ...
1、混淆java代码。增加无用代码,或者重命名,使反编译后的源代码难于看懂。2、关键代码使用jni调用本地代码,用c或c++编写,相对于class文件,so相对比较难于反编译。 需要开发者熟悉如何写c或c++代码。3、如果自身时间或者技术有局限的话,现在国内有第三方加密平台。最近有家叫做 爱加密的非常活跃建...
android apk怎么防止反编译
没有好的方式,只能混淆apk,防止反编译后很容易被破解
Android APP的破解技术有哪些?如何防止反编译?
APKtool(一种反编译工具)可轻易将其轻松破解,再配合其他各种工具基本可以做到:源码暴露(代码混淆也几乎起不到任何安全作用)、资源文件裸奔、主配文件可任意修改、核心SO库暴露、暴力破解恶意利用等。部分大公司会对其应用APK包进行防二次打包和防APKtool破解,但其代码都是写在JAVA层,另外APKtool的可...
如何防止android代码被反编译
关键算法通过NDK 实现并生成动态库, 用jni 与android 进行数据交互,这样就是在牛逼的程序员也反编译不了你的核心算法和接口
Android项目里如何混淆自己打的jar包或者防止被反编译?
我们打出的apk是混淆的,根本原因是这样的。1、代码编译成class文件2、代码打成jar包3、混淆jar包4、用jar包生成classes.dex5、resources.ap_6、生成apk以及签名只不过工具帮我们一次性全做了,如果你要写批处理来做,就要按上面的步骤来做了。 到eoeAndroid网站查看回答详情>> ...
如何防止安卓apk被篡改破解
1、据统计现在中国的独立APP数量已逼近50万,APP开发市场日渐火热,而打包党通过破解、反编译APK,插入广告或收费代码等不法手段来获取巨额利润。Android APK被篡改的主要原因是开发者在防止Android APK篡改、反编译方面重视不够或者技术不完善。由于Android系统的开放性,再加之,业内常用的防止APK篡改、反...
Android APP的破解技术有哪些?如何防止反编译
b、c等这样的名称。但是仍然可以进行反编译。后来又尝试使用360加固保对APK进行加固保护,发现原有的代码程序被隐藏起来了,没法再进行反编译工作。所以作为移动应用开发者,适当了解一些破解和反编译工作有利于保护自己的应用安全。如果不防患于未然,一旦出现盗版情况,那么你的APP很可能从此被市场所抛弃。