[硬核但没有干货] 某菠萝轻小说最新版安卓APP签名
今天我们的目标是与上次分析的漫画的类似请求头: nonce=5929E1CC-461B-4786-84E9-9B9954D4224D×tamp=1742537959397&devicetoken=194341A8-0947-350E-9420-813CCDE215D4&sign=9784E5EF70F065B61AFDB3ABC815D0E8为保护平台版权,这里只提供思路,不提供算法
首先先观察,看了多个请求,nonce为随机的uuid,timestamp为当前毫秒时间戳(我这里给的例子时间有点久远,不过无伤大雅),deviceToken顾名思义为设备id
刚开始我被原来的逻辑误导了,以为仍然是md5(nonce+timestamp+deviceToken+salt)的组合,所以一直在尝试抓盐,试过hook memcpy方法保存全部内存数据查找类似结构,但最终一无所获。
首先原来的APP有梆梆加固企业版的壳,对抗调试比较强,所以我采用与上一篇类似的方案 - 自己写一个简单的APP调用
然后就出了点事故: 一点签名按钮,进程就被杀了,根本不让我hook。最后一步一步过反调试,hook open方法,改了/proc/self/maps,然后就能成功签名出结果了。
这个版本相比之前版本,java传参多了一个int,经hook,其值始终为0x3,所以我们也写死就好
根据我曾经逆向这个平台的经验,一般sign始终是md5不变。trace了一下,发现日志里有md5的K值,基本确定MD5了。
新版里面找不到md5相关的symbol了,所以静态名称hook就pass掉了。不过问题不大,通过trace K值引用一路跟上去,是可以找到MD5Update的
所以我们就这么找到了,地址不透漏
frida钩上这个地址,然后dump参数指针,我们得到了这样一串内容
36N7R1QDBNOBN12O25285980RP39N6Q43N4NN805N6874Q354N906N5P60M6340N54N3R2M99632B8OQ531Q4PCDPG8MHD2AGQRBP
很明显,这并不是我们输入的一部分。
所以只能继续追,这段数据生成的地点。
于是我们又得到了一个函数指针,继续钩住,查找数据,得到了这样一个数据
;805;6874>354PCD=G8:HD2.GQRB=;906;5=60:6340;54;3?2:9-632B8<>531>436;7?1>D/;</;12<25285980?=39;6>43;4;
这里可以透漏一下,上面的数据调换了顺序,然后经过某种变换,就成了上面进MD5Update的值
这是调换顺序的代码
```python
def remap(data: str) -> str:
lens =
A = data]
B = data:lens+lens]
C = data+lens:lens+lens+lens]
D = data+lens+lens:]
return D + A + C + B
```
至于数据是怎么变换的,可以自己研究研究。和charCode有关。
我们继续分析数据是怎么出来的,继续溯源
这部分比较复杂,就是两段数据,经过右移出来了上面那个一堆符号的数据
一个是
1742537959397[这里保密,是盐,长度16位]194341A8-0947-350E-9420-813CCDE215D45929E1CC-461B-4786-84E9-9B9954D4224D
另一个是
E9-9B9954D4224786-84E9-9B9954E9-9B9954D4224D5929E1CC-461B-4786-8424D5929E1CC-461B-4786-84E9-9B9954D42
第二个可以看出来是nonce经过变换得到的,具体怎么变就先保密了,后面适当的时机再放出来
第一段数据就是参数拼接
两段数据对应位的charCode相加,右移一位,再换回char,就是那堆符号和数字
好了就这样,看了一天汇编,累死了 太强了👍 大佬求教 感谢分享 牛👍🏻 感谢 感谢分享 牛🐮 感谢分享 牛