某某会sign值分析
北海 历史精选 202浏览 · 2025-03-07 08:10

前言

设备: pixel2 android10

app: 6IuPZeih{beihai}jDMuM{beihai}jMuMQ==



正文

抓包

抓登录包,下面分析signature,random,password字段的编码加密算法

image.png




脱壳

使用开发者助手查看app信息,发现存在网易加固

image.png


这个app里面没有运行frida检测机制,所以直接运行脱壳脚本就好了



运行后到处点点,dump出尽可能多的dex

image.png


signature和random字段分析

把结果用jadx反编译。直接祭出一手字符串的大法搜索关键字"signature",看到不少可疑位置,但是hook了一圈之后好像没找到真正有关的。

image.png


于是换一种方法,直接hook原生库HashMap和JsonObject,代码如下:

attach模式运行并把结果保存到txt文件中便于搜索。在结果中搜索signature。

image.png


这不就有了嘛,直接在反编译代码中搜索函数com.bwton.metro.network.strategy.impl.MSXLocalSignatureStrategy.generateSignature

可以看到sign是函数signReqJsonBody用公钥加密str得到的

random是函数encryptByPublicKey用公钥加密str2得到的

image.png


进入函数signReqJsonBody,发现这个只是在encryptByPublicKey前对字符串取了md5哈希而已

image.png


那进入encryptByPublicKey,可以看到这就是ecb模式的rsa算法

image.png


至此signature和random字段的算法明确了,接着就要看公钥和加密的参数是什么了,先hook函数generateSignature

代码如下:



attach模式运行,可以看到这个headers跟str2其实是一个东西,每次都不一样。str则是固定的json数据,而且包含了password

image.png




接着要搞清楚str2和公钥是什么

hook函数getPublicKey,打印结果,公钥好像不变

image.png




那么就剩下str2了,根据前面的调用栈向上追溯

image.png


可以看到这个str2是在headers中HEADER_AES_KEY字段,点击查看到HEADER_AES_KEY的值是headerAesKey。

image.png


显然这个headers是在之前就初始化过的,如果要顺着okhttp realcall对象的chain一路找过去根据会比较复杂。于是这里想到了个取巧的方法。想着既然str2是从header里获取headerAesKey对应的值,可能还是会涉及hashmap类,于是又在前面hook得到的调用栈结果中搜索headerAesKey。结果真的找到了

image.png


这里确实是添加了headerAesKey键值对,继续往前追溯查看键对应的值是什么

image.png


好家伙,好像连password字段都找到了,不过先继续看headerAesKey键对应的值。这个值是genAesKey,它是由函数genAesKey生成的

image.png


查看函数genAesKey,逻辑相当简单,就是从自定的字符表中随机挑出8个字符

image.png


那么用生成random的参数str2也知道了。于是signature和random就都解决了

password字段分析

password字段同样可以在前面的调用栈结果搜到,正是前面碰到的函数

image.png




image.png


进入Aes.encryptByECBPKCS5,这里使用AES算法的ECB 模式和PKCS5填充方式对字符串进行加密。str是明文,str2是key,这个key就是前面分析过的genAesKey

image.png




hook一下,打印参数和返回值,发现前面的分析没毛病

image.png




于是password的加密也解决了

0 条评论
某人
表情
可输入 255