最近打算从pc转安卓,随便在应用市场上找了个app练手,大佬可以略过了!!
存在sslpinning, 直接使用瘦蛟舞大佬提供的unpinning脚本来bypass(https://github.com/WooyunDota/DroidSSLUnpinning) 发现每次请求,都有一个sign字段来做签名,ok直接开干。https://api-bc.wtzw.com/api/v6/search/words?imei_ip=3658671245&page=1&gender=1&wd=dydyd&sign=69821b24fe91d2f0be88a28df7987d94
将apk解包发现里面有okhttp3,所以直接尝试hook okhttp3的url方法,并打印出其调用栈 看这个调用栈,明显是在okhttp的拦截器中对url做了手脚,所以直接hook getResponseWithInterceptorChain函数打印出所有的用户拦截器。
打印出拦截器后,发现有加壳。 这是个抽取壳,之前自己有实现个基于被动调用的脱壳镜像,正好派上用场(目前安卓的脱壳应该不是问题了吧,略过)。 修复下被抽取了的代码。
在上面打印的用户拦截器类(vu)中找到了拼接sign参数的地点。 可以看到加密函数是Encryption.sign(stringBuilde.toString())果断hook下 跟进去发现这个函数是一个native函数,这里很奇怪开始以为是动态注册,并hook了registerNative函数,但并未找到。而且在导出符号中也未找到native函数,后来用frida遍历了下所有导出符号在libcommon-encryption.so中发现了该符号,计算出偏移后在去so中定位发现名称不一样。。。 暂且不管,猜测可能跟elf文件结构相关。
看样子是存在rtti信息,所有的类名函数名都显示了出来,这就比较方便了。看着几个常量,基本可以推断为标准MD5 so层的逻辑很简单大概分析了下,就是md5加盐的算法 所以目前的重点就是获取盐就行了。getkeydata直接返回了this首地址 getkeydataSize从this+0x84的位置取出长度。 他们的this来自于MD5KeyGenerator::Instance函数,并存放在了全局数据区。 整体的逻辑大概就是,如果这个this未初始化就调用init来初始化,如果初始化了则直接使用。 他是存在于全局数据区中,所以我们可以不关心她初始过程,直接等他初始化后计算出全局变量的偏移dump内存,直接获取盐
可以看到我们dump出了key和keyLen
[2022夏季班]《安卓高级研修班(网课)》月薪两万班招生中~
这个工具分享下老哥
淡定小胖子 大佬晚上好, 文章中好像有点儿小问题。 刚才跟着文章复现了一下。发现文章前面看的是headers中的sign,但是后面变成了url中的sign[em_7]