|
拿到app,无壳,国际贯例,抓包分析:
GET https://**********/api/app/user/getVcode?
mark=0
&medalState=0
&phone=13094613288
&type=0
×tamp=1527586894475
&version=4.8
&version_code=480
&platform=android
&sys_version=6.0
&cid=10301
&partner_id=10002
&deviceId=3de9bd99a03eddfe427b1249148019dcc
&sign=de40fb6853879865e5b6fd89bd02fd4f HTTP/1.1
Host: ********
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/2.6.0
可以看到get请求中,有sign校验。既然它没有壳,直接拖入jadx中查找关键处
查找过程就不去截图了,直接来看调用加密语句的地方
可以看到sign是调用了EpUtils.getEpStr方法
到这里可以请晰地看出,getEpStr方法是GetEp 这个so文件中的本地方法
参数分别是上下文和需要加密的原文
按照安卓的规定,so文件名会在前面加上lib,后面加上.so后缀
我们在app的lib\armeabi-v7a文件夹中,找到libGetEp.so文件,拖入IDA中查看它的导出函数表
函数不多,直接双击,查看getEpStr函数
为了方便看查看,还是导入jni头文件,F5看下伪C吧
为了方便查看,适当改了些变量名。
逻辑很清晰明了,走了关键的函数
- <DIV class=blockcode>
- <BLOCKQUOTE>javaStr = ((*a1)->GetStringUTFChars)(a1, a4, 0);
- constStr = j_StringSub("803D35E66F721EB889446877F5ED051D", 3, 20);
- v9 = j_join4(javaStr, constStr, 2);
复制代码 就进行md5了。我们来看看这三名函数
由于java与C语言字符所占宽度不一样,
第一个函数:GetStringUTFChars将传入的原文,jstring格式转换成为UTF-8格式的char*
第二个函数:j_StringSub从字面意思,看起来是把字符串"803D35E66F721EB889446877F5ED051D"截取部分,做md5盐用,我们跟进去看看
除了前面部分的判断,关键的就是memcpy函数
函数原型:void *memcpy(void *dest, void *src, unsigned int count);
memcpy 函数用于 把资源内存(src所指向的内存区域) 拷贝到目标内存(dest所指向的内存区域)拷贝数量由count控制
根据调用这个函数时传入的参数("803D35E66F721EB889446877F5ED051D", 3, 20),可以看出,它是用为了把传入的字符串
从下标2开始,截取20个字符,也就是 "3D35E66F721EB8894468"
第三个函数:j_join4
可以看到把传入的char* (包括盐)进行了,排序,strcat重新拼接。
再把拼接的结果通过md5计算,return回去。
最后通过IDA动态调试这个方法,得到的结果与静态分析一致。分析结束。
抛砖引玉,还请高手勿喷。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|