haoyiku encryptvalue hash 算法 so 分析还原

android 逆向 16 / 37

前言

最近在学习 so 分析 + unidbg hook inline hook,先找个软柿子捏
本次目标 haoyiku app 版本 4.52.1

charles 抓包

随便抓个包,请求头里有个 encryptvalue 加密参数,看起来是个 hash

jeb

使用 jeb 反编译 apk 全局搜索 encryptvalue 关键词

最终定位到了这里,调用 SignTool.md5 函数返回的 跟进去

调用了 c 函数,c 是个 native 函数,在 libk.so 里,使用 ida 打开 so 分析一下

ida

exports 窗口里没有搜索到 java 关键词,应该是动态注册的,搜索 JNI_OnLoad 点进去分析

找到了这个函数 sub_89D4 ,发现里面有 RegisterNatives 但是不知道 地址是啥,这时候就祭出神器 unidbg 动态调试看看

代码写完 跑起来,这里吧动态注册函数的地址打印了出来 0x880dida 跳过去看看

调过来发现 ida 没有正常识别 函数体,那我们就手动修复一下 使用 DCP 三连大法

修复完后就可以看到正常的函数体了,修复完后不着急分析先使用 unidbg 主动调用跑起来

unidbg

参数只有一个, 是 byteArray 类型的,也就是请求参数

运行代码,结果成功出来了,到这里其实就已经成功了,但是 unidbg 只是一个模拟执行的框架,我们目标的还原算法,下面开始动态调试 so

unidbg 动态调试

经过分析 so sub_8974 函数就是 md5 加密,直接在这三个函数执行前下断点

使用 unidbgconsole debugger 功能,代码跑起来

成功断下来,查看 r0 寄存器的数据,发现有数据大小 32 个字节,不知道是啥 看看 so

r0 就是 v5 = v4 = sub_8E58(&v22, 32, byte_57660); 调用这个函数生成的,应该是随机生成的盐值。
这里调用 sub_8974 函数的时候传了 v16 的指针地址,应该是吧加密结果存到这个地址里面,先看看是啥

这里不知道是啥,先忽略,跳到下一个断点

查看 r0 寄存器的值,发现正是我们传进来的

再看看上面 v16 地址的数据,发现多了一个 hash 值,应该是上面随机生辰盐值的 hash 结果,测试一下

结果一样,那就没错了,第一次是拿盐值完成 md5 加密的,继续,跳到下一个断点

查看 r0 发现又多了一个 hash,应该是我们传进来的请求参数,在验证一下

果然不出所料,结果相,继续执行

程序结束了,结果是 540e897b29f7c9d8c21e446cdfdc6eba
按照之前的尿性,猜测应该是前两次 md5 的结果拼接在来一次 md5 测一下

果然,结果是一样

最后

加密逻辑分析完了还是比较简单的,使用 unidbgconsole debuggerida 调试方便多了

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

3 条评论

big_spider

好哥哥,什么叫 DCP 三连大法呀,能给我学学吗 😥

回复

big_spider

@big_spider 卧槽,我会了

回复

发表评论

返回顶部