原标题:如何对混淆的Android应用进行渗透测试?
自动工具
在手工开始工作之前,有几个反编译工具和网站可以在很多混淆场景提供帮助。APK Deguard是其中之一。它最大只支持16Mb的APK文件,为了确保不会超过限制有很多资源文件时候就需要删了。这个工具可以识别库文件,所以有时候可以完美地得到重构方法和类名。不过,它也是有很多bug的:时候它生成4个字节大小的类(null)。
使用XPosed框架
XPosed框架
在某些情况下,使用XPosed框架可能更好,可以记录下任何方法,或者替换存在的方法。不过有个比较麻烦的就是每次更新模块都需要重启(或者软重启)。
另外,例如JustTrustMe,可以和很多应用一起使用,用来绕过SSL pinning。但它不是对所有应用起作用。也有人打了补丁可以用了。RootCloak,也可以在很多应用隐藏root信息,但这个模块已经有些时间没更新了。
Frida
Frida是一个有趣的工具。已经有一些基于Frida的有趣的脚本,例如:appmon。
Frida和XPosed都有一个不好的地方:函数内部执行跟踪,例如我们无法在一个方法中打印一个确定的值。
解包和重打包
检查应用是否检查它自己的签名。使用一个锁定bootloader、没有root的真实设备(不是模拟器)。
查找原始字符串
可以用:grep -r const-string smali/来提取所有代码里的所有字符串。
插入日志代码
可以调试一个小项目:反编译字符串和跟踪执行。
在smali文件夹下增加用于调试的smali文件。
手工插入日志代码:
invoke-static {v1}, LLogger;->printObject(Ljava/lang/Object;)V
要打印的寄存器替换v1。
大多数时候,反编译函数在所有地方都有相同的参数和返回值,在这个情况下,签名是:
.method private X(III)Ljava/lang/String;
可以写一个脚本:
1.查找反编译函数
2.插入一个调用来记录字符串
打印反编译函数中的结果字符串是容易的,但有一个问题:这字符串是从哪来的(哪一行,哪个文件)?
可以像这样插入更详细的日志代码:
const-string v1, "Line 1 file http.java"
invoke-static {v1}, LMyLogger;->logString(Ljava/lang/String;)V
但这需要有未使用的寄存器来存字符串(需要追踪现在哪个寄存器是未使用的),或增加本地寄存器数量然后使用最后一个寄存器(在函数已经使用了所有寄存器时不起作用)。返回搜狐,查看更多
责任编辑: