在逆向一个Android程序时,如果只是盲目的分析需要阅读N多代码才能找到程序的关键点或Hook点,本文将分享一下如何快速的找到APP程序的加密参数位置,其实不论是找关键位置、找hook点,找加密参数、代码逻辑追踪,都是类似的处理方法。
巧用搜索-静态分析
一般静态分析找加密参数的流程都是先查壳(脱壳)、反编译、查找程序的入口方法、分析程序的执行流程。
假设已经使用Android killer反编译了未加壳的app,直接使用工程搜索检索需要查找的参数名,根据AK的反馈信息进行对比,找到其对应的参数位置。也可以根据应用执行流程逐行向下分析代码,比较累。
objection定位
objection是基于Frida的动态分析工具包,可以免root动态调式apk,同时支持iOS和Android。安装方法可以到github查看。Github:https://github.com/sensepost/objection
在通过搜索之后如果有几个不确定的位置,则正好可以使用Objection,Objection就是专业的定位小能手,从定位流程上来说也只有三步。
1、注入目标进程
objection -g com.xxx.xxx explore
2、跟踪类
android hooking watch class 'com.xxx.xxx.lx.ApiSign'
3、查看入参和返回值
android hooking watch class_method 'com.xxx.xxx.lx.ApiSign.a' --dump-args --dump-return
然后通过参数和返回值与请求接口中的协议进行对比就可以却确定究竟是在哪一个位置了。
frida-hook
frida、xposed这类hook工具也是动态分析的一种。假设某App的接口有 signature 签名,并且该参数值看上去非常像是Base64,并且长度为定长且少于20位。这个时候如果通过工具全局搜索没有找到,则可以通过frida凭感觉Hook下App中所有操作Base64的位置。
Frida代码如下:
var Base64Class = Java.use("android.util.Base64"); Base64Class.encodeToString.overload("[B", "int").implementation = function(a,b){ var resault = this.encodeToString(a,b); console.log(">>> Base64 " + resault); if(resault.length <= 20){ var stackAdd = threadinstance.currentThread().getStackTrace(); console.log("resault stackAdd is:" + Where(stack)); } return rc; }
通过这种方式大概率能打印出签名计算的位置,这也属于巧计的一种,大家一定不要忘记这种定位方式。
log注入
代码注入也属于动态分析,流程是先修改apk的smali代码,既是在某关键函数前加入 android/util/Log 输出,配合LogCat 查看程序执行时的log数据。
关于android/util/Log的 Log extends Object 一共有5个方法:Log.v() Log.d() Log.i() Log.w() and Log.e()
一般使用Log.v() 日志输出函数就可以了,不做案例了,详细内容会往书中写。
动态调试
其实定位的方法只有两种静态分析和动态分析,动态调试也属于动态分析,和上面的方法异曲同工。
动态调试这里可以理解为堆栈调试,有时候需要利用到不同的工具和方法,
比如 JEB调试、smali调试、IDA调试等等。
不再细说了,本文简单总结一下。