|
|
本帖最后由 Philia114514 于 2025-10-24 15:16 编辑
基于上次发的帖子(传送门),wakeup课程表绕过frida检测后继续分析,想尝试抓包,但是发送验证码失败。排除我们修改so的影响,用原包重签名,发现也发送不了验证码,可以确定是签名校验了。
应用应该是将正确的签名打包一起发送给服务器校验,校验失败导致验证码发送失败,所以,想hook出正确签名,必须拿原包来进行hook。
起初我觉得行不通,不过发现签名校验是在frida校验前完成的,所以依然可以hook到关键信息。
下载链接:包含过frida检测版,js脚本,一键去签+过frida检测版,原包 点这里
1.定位进入so层分析
直接去jadx搜索packageinfo,signature等等字符串太慢,搜索结果出来的少的几十多的几百上千。所以选择hook android.app.ApplicationPackageManager再打印堆栈就能输出调用签名的地方。查看堆栈,发现调用来自nativeSetToken方法
进入jadx找到方法,你会发现这里没告诉你,这个方法从哪个so加载来的
定位方法也很简单,直接hook registernatives 就能得出所有动态注册方法的信息,为什么?它里面有一个结构体数组,包含着所有动态注册函数,每一个java层的动态注册函数,在 这里都有着一一对应的so函数,这样就建立起了一张映射表,我们hook得到映射表信息就能找出对应的so函数在哪
typedef struct {
const char* name; // Java 方法的名字,例如 "nativeMethod"
const char* signature; // Java 方法的签名,例如 "()V" 或 "(Ljava/lang/String;)I"
void* fnPtr; // 指向对应的 C/C++ 函数的指针
} JNINativeMethod;
找到了,位于 libbaseutil.so,地址0x128c
进入函数,反编译得到c代码。可以看到63行使用了签名,取了md5值,但是签名是在哪个方法返回的呢?往上查看,发现大多为jni函数和c库函数,只有开头的29行init方法最可疑
进入init,发现我们找的签名校验就在里面,通过getAndroidSignatures(env, thiz, context)方法取签名,点击查看方法,正在使用jni函数来获取签名。我们只要安装原包,hook出 返回值就能得出正确签名。
其实还没完,回到nativeSetToken。仔细看,在获取正确签名(v19)后,后面64行还有一个if 进行校验,如果失败,还是会跳转到失败分支(LABEL_6)。通过hook,发现还有其它方法调用strcmp,所以不能直接将这个方法返回0,如何确定是我们这个签名的比较?很简单,hook crymd5,当传入的参数是我们返回的签名时,结果v19即为正确md5值。再hook strcmp,当传入参数有正确的md5值时,返回0即可绕过
2.安装过frida检测版尝试,进入java层分析
现在,我们得到了正确的签名,绕过了strcmp的比较,编写js脚本,安装过frida版本进行测试。失败了,验证码发不出去。
多次尝试,发现签名是替换成功了,但是strcmp没反应,它应该要输出Strcmp replace successed 才对,日志也可以看出,找到了strcmp的地址
我怀疑是过frida检测版没有调用nativeSetToken方法,进行java层hook nativeSetToken,多次尝试发现没输出
那过frida检测版是去哪找的签名?再hook了一下PackageManager,发现过frida检测版,调用签名的方法是nativeInitBaseUtil,和nativeSetToken方法来自一个类(图2)。
那么肯定是它们的上层调用决定的,查看上层调用方法,都来自同一个叫大写o小写o还有0的混淆方法。nativeInitBaseUtil是签名生成器,当OooO0O02和OooO0O03都为空时开始签名,签名后存入本地。nativeSetToken是签名校验器,当OooO0O02或OooO0O03有值时进行校验。
为什么失败?我们目前安装的是过frida检测版本,不是原版签名,打开时调用nativeInitBaseUtil生成签名,但是生成不了有效签名,生成不了意味着根本不会调用nativeSetToken来验证,所以验证码发送失败。
影响路径的关键是OooO0O02和OooO0O03的值,hook if里面的判断,发现原包和过frida检测版,返回值都为true,所以不可能走else里面的代码
那么目标明显,安装原包,hook这个方法 OooOO0(LibPreference.KEY_ANTISPAM_SIGN_B),可以得出正确的signA和signB字符串,进行hook替换即可。
3.整合js脚本,用过frida检测版进行测试
这里写好了js脚本,放到了上面的链接中。发送验证码成功
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
-
查看全部评分
总评分:好评 +2
金币 +2
|