- A+
静态分析Android程序
代码定位技巧
- 入口分析法 在反编译出的
AndroidManifest.xml
文件中找主Activity,然后查看其所在类的OnCreate()的代码,追踪软件的执行流程。 - 信息反馈法 先运行程序,然后讲程序运行时给出的反馈信息作为突破口来寻找关键代码。程序中用到的字符串会存储在String.xml文件中或者被硬编码到程序代码中。
- 特征函数法 弹出注册码错误的提示信息需要调用
Toast.MakeText().Show()
方法, 在反汇编代码中直接搜索“Toast” 定位调用代码。如果代码中使用了按钮, 必然会为其注册按钮响应事件。 在反编译代码中搜索OnClickListener()
就可以列出所有的按钮事件。
动态分析Android程序
动态分析框架
DroidBox:主要用于对敏感API与系统网络流量进行监控, 以及对程序进行简单的模糊测试(Fuzz Testing )。(过时)
MobSF:同时支持Android、iOS、Windows平台上的软件分析, 它的测试框架同时支持静态分析、动态分析WebAPI测试。
动态分析技巧
- 代码注入法 先反编译Android程序,然后在反汇编出来的smali文件中添加Log调用的代码,最后再重新打包程序运行,查看输出结果。
- 栈跟踪法 工程量大的时候,代码注入法就会显得非常乏力(不断地手动注入Log输出代码)。栈跟踪法主要操作是手动向反汇编后的smli文件中添加用于输出栈跟踪信息的代码,
采用栈跟踪法时只需要知道大概的代码注入点, 而且注入代码后的反馈信息比Log注入要详细得多
。 - Method Profiling(方法剖析) 在程序运行时记录每个被调用的API的名称,只需查看API的调用序列, 就可以了解这段代码的用途。
- UI检查
dumpsys
命令:使用该命令可以打印当前系统中运行的所有程序的组件信息。
动态注入
动态注入指将一段程序或一个完整的可执行文件加载到目标程序中。
动态注入与Hook的区别:Hook会修改原方法或原函数的指针,让其去执行Hook的方法。而动态注入则是将一段代码程序写到目标程序的内存空间中,然后修改目标程序的指令指针。
软件保护技术
软件水印技术,混淆技术,防篡改技术,反调试技术,运行环境检测。
软件混淆技术
代码混淆:对源码进行静态修改的源码混淆,基于源码模板展开的模板混淆。
编译期混淆:编译期泪淆分为编译器前端在进行原生代码分析时采取的前端混淆, 以及在编译原生代码并生成中间代码IR时采取的IR混淆。
二进制混淆:典型的有生成DEX文件后对其进行反编译,对DEX文件进行二次混淆。
- 源码混淆
- 模板混淆
- AST混淆
- IR混淆
- DEX混淆 DEX编译时混淆方法ProGuard,proguard-android.txt 与 proguard-rules.pro 用于存放ProGuard的配置信息,描述DEX文件中的哪些类和方法将参与混淆、 哪些不参与混淆。
- DEX二次混淆 不仅提供了ProGuard所具有的基本混淆能力,还支持DEX的
流程混淆
和字符串混淆
。
资源保护
资源保护主要应用在三个方面:App资源被篡改,游戏素材资源被窃取,游戏脚本资源被破解。
完整性校验
反调试技术
方法:在程序启动过程中检查是否被调试器附加,自身进程的父进程是否存在异常,进程列表中是否有正在运行的调试器等。
软件壳
Android平台上的软件壳:
第一代壳(压缩壳,加密壳)(动态加载型壳):对本地的DEX文件,so库,资源文件进行加密在运行时进行动态还原。
第二代壳(保护壳)(代码抽取型壳):在DEX方法执行前解密,执行后加密,防止内存Dump的方式对DEX文件进行脱壳。
第三代壳(虚拟执行壳)(代码混淆壳):基于LLVM Pass的虚拟执行壳使用指令变换,花指令混淆,指令膨胀,代码流程混淆等。
动态加载型壳
- 缓存脱壳法 一些软件壳没有处理DEX优化时缓存的路径,将优化结果放到了默认的
/data/dalvik-cache
目录下,只需在该目录下的ODEX文件取出进行deodex操作即可脱壳。 - 内存Dump脱壳法
- Hook脱壳法 Hook脱壳法与单纯的内存重组脱壳法不同之处在于:
- 系统定制脱壳法