app sign so 加密算法分析还原|so 算法分析

android 逆向 17 / 38

仅供学习研究 。请勿用于非法用途,本人将不承担任何法律责任。

const 龙哥 = Function() {}

const a = 全能的傻宝,每天都会换一种姿势来分享各种骚操作,10月份开始分享密码学;
const b = 点击加入星球;
return "无敌的龙哥";

推荐阅读

unidbg hook inline hook 使用
unidbg console debugger 使用
so 分析过程在验阶段会使用 unidbg debugger hook 功能,不熟悉的可以阅读以上文章
JD app sign so 加密算法分析还原|简单分析
JD app sign so 加密算法分析还原|so sub_126AC 函数算法还原

前言

上一篇文章分析了加密逻辑入口,并使用 unidbg 跑起来,这一篇就来看一看 so 的加密逻辑

0x1 so 加密逻辑分析

打开 libjdbitmaoki.so 文件,在 exports 窗口里搜索 java 查看 getSignFromJni 函数的逻辑

前面的话就是字符串拼接,functionId body uuid client 等字段都是我们传进来的

再往下先是获取时间戳,在拼接 st sv 等字段,最后调用 getBytes 函数

这里先是调用了 sub_126AC 函数(注意:这个函数是主逻辑,里面的算法是 某东 自己实现的,后面只需要还原这个就行了)
然后就是 base64Encode md5Hash 函数,这里我是改了名字,是通过算法的特征值来判断的可以点进去看看

base64Encode

点进来就可以到 base64 的特征,查看下是不是标准的 table

双击查看,是标准的,稍后可以在使用 CyberChef 验证一下

md5Hash

这个函数点进来,就可以到四个常量,猜测是 md5 的常量,Google Wiki 搜索一下

刚好相同,就可以确定是 md5 算法,再来看看 sub_126AC 函数

sub_126AC

这里面的核心逻辑在 switch 暂时不知道 v13 的数据是啥。大概逻辑分析完了,下面使用 unidbg 看一下

0x2 unidbg debugger hook

先添加三个断点 0x12B6E 0x12BA4 0x12BC8,分别是 sub_126AC base64Encode md5Hash 函数的执行前

成功断下来,通过日志,也能看到一些执行的数据,咱们按 c 跳转到 base64 函数

base64 函数有三个参数,分别是 r0 r1 r2r0 是内存地址 = 0x40218000r1byteArray 数据, r2r1 的长度

这里查看 r1 的全部数据

然后复制 hexdumpCyberChef 转成 base64Encode 编码

单步执行,完成 base64 函数的调用,查看 0x40218000 地址的数据,大小是 r1 长度的两倍
结果跟 CyberChef 进行对比,结果相同,就说明是标准的 base64 table

在使用 md5 加密

输入 c 指令跳转到 md5Hash 函数,查看地址个参数,正是 base64 结果,在输入 c 结束执行,查看结果

Tips: 这里中间断开了一次,就重新运行的最后结果跟前的不一样,不过不影响我们分析逻辑
这里的结果是 ff31e5b33385fb670b393927104701e3

使用 CyberChef 的结果也是 ff31e5b33385fb670b393927104701e3,结果一样,没啥大问题

Tips: 所以 Sign 加密的流程就是,字符串拼接 -> sub_126AC -> base64Encode -> md5Hash

最后

so 的算法就分析完了,下一篇来看下 sub_126AC 函数的算法还原分析

暂无评论
本文作者:
本文链接: https://www.qinless.com/?p=584
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 qinless 的博客!
100

发表评论

返回顶部