某app sig参数逆向分析

1. 捉包分析一下api

sig参数在app会校验, 错误会显示


api捉包

2. 静态分析代码

jadx打开apk, 搜索关键词: "sig"

全局搜索sign相关的关键词

如:  &sign=  "sign'  sign= ......等等


进入调用的方法中, 看到sig的值是CPU.a()这个方法的返回值


进入CPU.a(), 发现最后是调用了native方法


3. frida + objection 查看调用的参数hook住CPU.a()


调用栈如下:

(agent) [r0aofowzhsa] Backtrace:

        com.yxcorp.gifshow.util.CPU.a(Native Method)

        g.a.a.g6.d0.a(kSourceFile:50987168)

        g.a.w.n.a(kSourceFile:69468173)

        g.a.a.g6.x.a(kSourceFile:68943983)

        g.a.w.f.a(kSourceFile:18612728)

..

..

..

试试hook g.a.a.g6.d0.a这个方法


貌似只能看到参数类型, 换种思路解决


4. 编写frida脚本, 重写这个方法

js代码


运行结果



分析方法的三个参数

第一个是 okhttp3.Request请求实例

第二个是url中的get参数 , map形式


第二个是url中的post参数, map形式


5. 分析方法的逻辑


5. native方法, so文件分析

查看 jni_onload


本人汇编不是很熟, 借鉴了网上大神的文章, 发现so中是md5 + salt的方式加密

ida分析内存, 获取sign的salt盐, salt是经过内存动态加载的



切换回汇编代码


偏移量是0x5070

使用frida通过内存地址获取salt值

js代码

Java.perform(function () {

            //读取基址并加上偏移,就是该字符串在内存中的地址

            var soAddr = Module.findBaseAddress("libcore.so");

            console.log(soAddr);

//基址 + 偏移,就是动态时的内存地址

            var saltAddr = soAddr.add(0x5070);

            //观察内存中的值

            console.log(hexdump(saltAddr , {

                offset: 0,

                length: 64,

                header: true,

                ansi: true

            }));

}

运行得到以下结果:


试下打印出上述获得的内存地址

  console.log(hexdump(new ptr(0xa9b62730) ,{

              offset: 0,

              length: 64,

              header: true,

              ansi: true

          }));

使用frida自带的api打印出salt




还原成python方法, 算出的加密sig参与捉包的一致

你可能感兴趣的:(某app sig参数逆向分析)