App 逆向之川观新闻 sign 获取¶
本文非工作中的项目,用来熟悉 frida hook 命令(hook java 应用层及 native 的 so 层方法),ida 静态分析 so 文件的用法。
1. 前提准备¶
以下工具都可换成自己顺手的替代工具,看个人喜好。
川观新闻 app 逆向 sign 参数前的准备如下:
jadxv1.3.3gdav3.99(可选)idav7.5.2- 川观新闻
v8.0.0或v8.2.1都可 HttpCanary等抓包软件- 配置好逆向环境的安卓模拟器或完成安卓真机,我用的是一加
7 pro安卓 9。 - 查壳工具:自己找,不限制使用某个软件
- 脱壳工具:
BlackDex32,使用其它的比如反射大师之类的xp插件脱壳,或用Frida-DEXDump之类的也可。看自己的安卓版本,加固类型和个人喜好。
2. 逆向步骤¶
以下为当前软件的逆向步骤
2.1. 抓包¶

详细请求包数据如下,自己 py 发包可以确定需要 sign 值:

可以尝试下自吐脚本,但没用的,处理逻辑在 so 层。
2.2. 查壳¶
由下图可知为 360 加固

2.3. 脱壳¶
这里使用 BlackDex32 来脱壳,提取 dex 文件后在 jadx 中反编译分析。

2.4. jadx 定位¶
将上步脱出来的 dex 文件放到 jadx 中调试
然后开始定位 sign 生成位置,这里稍微提下搜索定位方法:
- 不能直接搜
sign,结果太多了,可以搜"sign",put("sign",&sign=之类的格式 - 可以搜请求包中其它比较有特征的参数,比如
app_vno,channel之类的参数 - 尽量排除
android,baidu等开头的搜索结果
定位到 app_vno 参数的声明处,也找到了 sign 参数声明,查找其用例。

其用例如下:

进入详情后,就可以看到 sign 生成的方法位置了。

2.5. frida hook¶
上 frida 来 hook getSign 函数,打印其参数及其结果,主要看这个方法是否定位正确。
hook 结果如下,hook 结果和抓包数据一致(说明定位正确),接下来就需要分析这个 getSign 方法。

2.6. 分析 getSign 方法¶
这时候,有两类解决思路,一种 rpc 或 unidbg 之类的方法,不用分析 so 文件逻辑;第二种就需要静态分析和动态调试 so 文件了,最后用 py 算法实现逻辑。
这里选择分析 so 文件,对应 rpc 方法和 unidbg 的解决方法后面有时间也会另开文章详细介绍。
2.6.1. 定位 so 文件¶
我们需要通过 java 应用层方法定位到具体哪个 so 文件,自己在 github 上找找这类 hook 脚本
so动态注册定位:Hook_RegisterNatives- 静态注册定位:
hook dlsym
这里 so 的情况是静态注册的,所以 frida 走起:
定位 so 位置结果:

2.6.2. ida 静态分析 so¶
上 ida 静态分析 libwtf.so 的文件,ida 的一些常规配置及操作这里先不讲,以后另开文章介绍。

进入详情,找到 if 判断的正常分支中。比较重要的是下图中的两个方法,我们要打印其所有参数和结果。

进到 MD5Digest 方法中就可以知道这是个标准 md5 算法。

要查看函数对应地址:


2.6.3. Hook so 关键方法¶
Hook 上步中的
MD5Digest和get32MD5String方法,打印其所有参数和结果值。
结果如下:


到这里就已经结束了,就是对 C90 args[0] 的值 md5 后的结果,而 C90 的参数就是 0093CB6721DAF15D31CFBC9BBE3A2B79 加上时间戳。如下图,与上图抓包数据一致。

3. 总结¶
- 要熟悉
ida操作,熟悉 c 语言和汇编代码对so分析会有很大帮助 - 若碰到复杂的自写或魔改算法的
so时,优先推荐使用unidbg来调通后,用py运行unidbg打包后的jar包最好