1、内窥镜-反混淆虚拟化加固的安卓程序演讲人:余帘虚拟化加固简介及研究背景01Rhino逆向RHINO字节码的特殊案例02加固后的程序结构更常见的虚拟化加固程序模式03恢复原始字节码基于已知模式进行逆向04观点和总结安卓程序加固趋势05目录/CONTENTS虚拟化加固是指将原始程序中包含的代码指令“编译”成由一组特定的自定义指令组成的字节码,并在自定义的虚拟机上执行该字节码。它是混淆手段中强度较高的一种,常用于:虚拟化加固简介非法用途:隐藏恶意行为,提高分析和执法难度合法用途:反剽窃、防抄袭,保护软件知识产权等近年来,安卓系统上使用虚拟化加固技术对应用进行混淆的案例持续增加。虚拟化加固安卓应用与加
2、固PC程序的区别在于,安卓存在多层次的架构,加固器普遍会利用Java Native Interface(JNI)进行跨层函数调用,而PC程序不存在这种特征。虚拟化加固安卓应用研究背景后续,我们又遭遇了多款在野的安卓恶意程序,它们使用了更为常见的虚拟化加固模式,并且加固器是闭源的。前述的逆向方法对这些程序不再适用,因此我们采用了一种更加通用的方法进行逆向,还原出混淆前的字节码数月前,我们发现一个安卓恶意样本的主要逻辑被编译成字节码,在Rhino JS引擎上执行,且源码字段被故意置空了。这种类型的混淆不是严格意义上的vmp但有相似之处。我们通过分析Rhino引擎的解释执行过程,能够逆向还原出部分原
3、始语义。Custom Virtual MachineInterpreter虚拟化加固简介及研究背景01Rhino逆向RHINO字节码的特殊案例02加固后的程序结构更常见的虚拟化加固程序模式03恢复原始字节码基于已知模式进行逆向04观点和总结安卓程序加固趋势05目录/CONTENTSRhino字节码案例-JS on AndroidonCreate()of Entry Activity handleIntent()doExecution()executeScriptWithContinuations()decrypt()这个恶意程序主Activity的onCreate()加载并执行一个Interp
4、retedFunction对象,该对象只保存字节码而非源码,使用interpretLoop()中一个有大量分支的switch-case语句解释执行。不像Dalvik字节码已有多款工具能够把它反编译成人类易读的java,目前没有现成工具可以逆向Rhino字节码Rhino字节码的生成Js源码抽象语法树(AST)字节码解析生成解释执行”foobar.split().reverse().join();rootExpressionStatementFunctionCallPropertyGetStringLiteral“”FunctionCallName“join”PropertyGetFunction
5、CallNamePropertyGet“reverse”StringLiteral“”StringLiteral“foobar”Name“split”Icode_LINEIcode_REG_STR_C0STRINGIcode_REG_STR_C1Icode_PROP_AND_THISIcode_REG_STR_C2STRINGIcode_REG_IND_C1CALLIcode_REG_STR_C3Icode_PROP_AND_THISIcode_REG_IND_C0CALLIcode_REG_STR1Icode_PROP_AND_THISIcode_REG_STR1STRINGIcode_RE
6、G_IND_C1CALLIcode_POP_RESULTRETURN_RESULT-42-16-4341-3338-44-16-3238-45-16-4541-33逆向-从字节码重建ASTIcode_LINEIcode_REG_STR_C0STRINGIcode_REG_STR_C1Icode_PROP_AND_THISIcode_REG_STR_C2STRINGIcode_REG_IND_C1CALLIcode_REG_STR_C3Icode_PROP_AND_THISIcode_REG_IND_C0CALLIcode_REG_STR1Icode_PROP_AND_THISIcode_REG