如何对代码混淆的APP进行安全审计?

在软件开发过程中,开发人员一般 会给出更多的变量名称语义信息,以确保程序的高可读性。然而,足够的语义也为供了便利。在变量名称的帮助下,逆向者可以轻松理解原作者的意图,窃取重要的实现,从而威胁开发者的知识产权。通过删除变量中的语义信息,标识符重命名可以有效地增加逆向者的攻击成本,从而得到广泛的应用。据文献所述,70%以上的中国开发者和60%以上的恶意软件开发者将标识符重命名混淆。但两者之间的混淆实现有很大的不同。通常情况下开发人员一般 应用AndroidSTudio(Google官方推荐的Android开发集成环境)中内置的proguard工具进行标识符重命名,但其策略比较简单,一般 只按字典顺序将标识符重命名为a、b、aa、ab……恶意软件开发人员会应用更具迷惑性的策略,比如形状相似的字母组合,比如Ill1I1ll或01oooO0,甚至出现英文之外的字符(Unicode)。此外,恶意软件开发人员往往会将重载功能与标识符重载功能的重载功能与标识工具结合起来,导致一些敏感功能与标识工具的重载功能不同。


字符串加密,因为应用程序中的字符串包含了大量的语义信息,所以反向者一般 会把它作为理解程序语义的突破。以下程序片段显示,即使混淆了程序中出现的标识符名称,有经验的反向者仍然可以依靠字符串来猜测功能。


为了防止程序中明确的信息泄露,字符串加密是一种有效的混淆手段。在安卓应用开发过程中,字符串加密可以应用于多个阶段,包括Java代码编译阶段、Java字节码转换到Dex文件阶段等。

对于恶意代码开发人员来说,字符串加密可以有效消除程序的语义信息,抵御基于硬代码特征的一些扫描工具的检测。如果加密算法足够复杂,反向过程的时间成本也可以有效增加。根据文献,普通软件开发人员很少应用字符串加密。


反射是Java语言的先进用法,它提供了一种灵活的交互方式,使开发在程序运行过程中能够理解类、方法和变量信息,甚至动态地创建类的例子或启用方法。Java一般 用以启用AndroidSDK中的非公开方法(标有hidden注解的API)。下面的代码显示了如何通过反射启用android.telaphony.SinglephonyManager类的putNehowrkTypNeeame方法。

分享: