2021/5/25更新:
最近遇到的加固app越来越多,很多时候不好动态调试。所以我修改了下逻辑,现在通过hook classLoader暴力枚举所有类和方法的加载,从而达到可以直接hook加固app的目的。
hook加固app的原理:
以360加固为例,首先我们看看加固app:
通常我们要hook加固的app需要先找到如上图所示的方法,拿到Context,再通过getClassLoader()来拿到壳的classLoader,然后就可以hook到加固app的函数了。
但是有个问题,如果换个app,加固的版本变了,或者用了别的加固,那这个地方又要重新找。
所以我们需要找到一个通用的方法,从而能hook所有加固的app。
我们需要这个classLoader的原因就是我们用xposed的时候经常用XposedHelper.findAndHookMethod()方法来hook我们的目标,这个方法就需要一个实际的classLoader去load目标函数。
我们查看下这个方法的源码:
会发现最终时调用了XposedBridge.hookMethod方法来hook的,所以我们也可以直接调用,传如我们的目标方法对象和一个callback就可以。
安卓引入mutiDex以后用loadClass来加载所有类。源码如下图所示:
所以我想到的办法是直接hook这个loadClass方法,这个方法第一个参数是类名,返回值即为一个类对象。通过param.getResult()拿到返回的类,把类名与我们需要hook的类名匹配,从而拿到需要的目标类,再拿到这个类的所有方法,同样的方法,匹配到我们需要的方法,这样就可以达到我们hook加固app的目的。
[Java] 纯文本查看 复制代码
private void findContext() {
XposedHelpers.findAndHookMethod(ClassLoader.class, "loadClass", String.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
if (!param.hasThrowable()) {
try {
String strClazz = param.args[0].toString();
if (!strClazz.startsWith("android.")) {
Class<?> clazz = (Class<?>) param.getResult();
synchronized (this.getClass()) {
strClassName = strClazz;
// 获取被hook的目标类的名称
if (strClazz.equals(className)) { //这个className是事先在界面上填写的需要hook的类名
Log.d(TAG, "loadClass: " + strClazz);
Method[] methods = clazz.getDeclaredMethods();
// 遍历类的所有方法
if (methods.length > 0) {
for (Method method : methods) {
if (method.getName().equals(methodName)) {//methodName是事先在界面上填写的需要hook的方法名
hook(method);
}
}
}
}
}
}
} catch (Exception e) {
}
}
}
});
}
还是上面的360加固的app,他报文里有个签名字段,先把一堆字符拼在一起最后再加密,
这时候就要找客户端证书以及证书密码了,证书很好找,但是证书密码代码内没有直接硬编码,想分析代码比较困难,且耗费时间,因此我想到直接hook。
经常逆向的人应该都知道,android加载客户端证书使用的是java.security.KeyStore.open()方法。这个方法第一个参数是证书文件流,第二个参数是证书密码。简单定位代码,发现第二个参数来源为SoulNetworkSDK.r().c方法,所以我们直接hook这个c方法,c方法的返回值即为我们需要的证书密码。
直接填写对应包名类名方法名:
直接将包名类名方法名填入工具,点击保存,打开悬浮窗,运行目标app,效果。
可以看到,证书密码已经成功hook到,长按可将hook结果复制到剪切板,现在直接在charles或者burp里导入p12证书并填写密码即可正常抓包。
实战测试顺利通过。
代码比较粗糙,但是用起来很方便,所以各位如果喜欢或者有需要可以star一下。
2021年4月21日修改:
修复了开发者自定义参数类型导致方法hook不到的bug
我想升级,有没有免费评分帮我给个