Crack App | 某猫小说必读榜加密参数 sign 分析
友情提示:本文章仅供学习交流,请勿用于非法用途!如果侵犯贵司请及时联系删除
本次分析的是七猫小说中的七猫必读榜的接口,关键参数 sign
,接口是 /api/v1/must-read
,将app脱入到jadx中进行分析,直接搜索 must-read
参数,
发现可疑参数,跟进去看一下
上面一个参数跟我们抓包得到的参数是一致的,但是唯独缺少了sign
,怀疑可能是后续进行添加的,接着搜索sign
参数
发现可疑的节点,addQueryyParameter
,极大可能是利用这个方法添加sign
参数,直接上frida进行hook验证一下我们的猜想
发下sign参数和抓包的参数是一致的,那我们就去跟踪 Encryption.sign
这个方法,先用frida hook一下入参的str
看的结果像是md5,到本地去验证一下
结果发现对不上,那我们值接调用这个方法加密 123456
试一下,加密123456得到的结果是 8c3d25f82b40f42281ae47ed2ca937ad
加密可能是经过魔改或者是参数进行加盐,接着跟具体的加密算法
是so层的加密,那我们要找到他是加载的哪一个so文件,可以看到在定义 native方法的这个位置并没有加载so文件的方法 System.loadLibrary
我们往上层看 在Encryption
这个类中有个init方法是有点可疑的,那我们直接看他的用例,果然在用例中发现了System.loadLibrary
public class dk extends zx0 {
@Override // defpackage.yx0
public void run() {
Context context = this.b;
Encryption.init(context, context.getResources().getString(R.string.app_md5_key));
try {
try {
r5.b(this.b, "common-encryption");
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception unused) {
System.loadLibrary("common-encryption");
}
}
}
确定我们需要的so文件时 common-encryption
,直接上IDA进行解析,但是经过IDA解析之后没有发现我们需要的sign方法
我们再使用frida-trace 看一下内存中是不是有这一个方法,按照静态加载的格式拼接好sign方法
frida-trace -U -i "Java_com_km_encryption_api_Security_sign" -p 8845
-p 获取线程id
frida-trace -UF -i "Java_com_km_encryption_api_Security_sign" com.kmxs.reader
根据包名
果然找到在内存中trace到了方法,但是我们还是在IDA中找不到这个方法。这个时候我们利用一段脚本来找到方法的偏移地址(脚本来自于: 马到成功https://blog.csdn.net/weixin\_56039202/article/details/126376536?spm=1001.2014.3001.5501[1])
function hook_func_from_exports(){
var module = Process.findModuleByName("libcommon-encryption.so")
var funcs = module.enumerateExports()
funcs.forEach(function(func){
if(func.name.indexOf("Java_com_km_encryption_api_Security_sign")>=0){
console.log("sign offset-->0x" + (func.address-module.base).toString(16))
}
})
}
setImmediate(hook_func_from_exports)
>sign offset-->0x15620
得到方法的偏移地址之后到IDA中进行搜索,搜索发现15620
竟然指向的是Java_com_km_encryption_api_Security_token
那我们就直接分析token,整个加密算法是这样的
发现到一个比较可疑的方法, MessageDigestAlgorithm::toStr((MessageDigestAlgorithm *)v23);
,那我们来hook一下v23的值,直接上frida代码
function hook_MessageDigestAlgorithm_toStr() {
var libcommon = Process.findModuleByName("libcommon-encryption.so")
Interceptor.attach(libcommon.base.add(0x15778), {
onEnter: function (args) {
console.log("---toStr---");
console.log(hexdump(this.context.x1, {
offset: 0,
length: 128,
header: true,
ansi: true
}));
}
})
}
在入参的时候我们最好能够把入参固定一下,我们直接把上面的hooksign的方法拿过来用
Java.perform(function(){
let Encryption = Java.use("com.qimao.qmsdk.tools.encryption.Encryption")
Encryption.sign.implementation = function(str1){
console.log(`[Encryption.sign HOOK] 入参:${str1}`)
let result = this.sign("123456");
console.log(`[Encryption.sign HOOK] 返回值:${result}`)
return result;
}
});
用这段代码固定住入参的加密参数,来看下结果
可以看到MD5是加了盐的,到加密工具中测试一下
[Encryption.sign HOOK] 返回值:8c3d25f82b40f42281ae47ed2ca937ad
再恢复正常的参数进行测试
接下来放到python中请求一下,完美成功,当然heders中还有qm-params
sign
,多次抓包分析这些参数是不会变得,这篇文章就完结撒花啦!
这个文章是参考马到成功这个大佬的文章写的,大佬的文章写的是登录接口后面还有其他的参数,如果有需要可以到大佬的博客看下,本文是我的第一篇安卓逆向的文章,写的不好还请各位看官海涵!
参考资料
https://blog.csdn.net/weixin_56039202/article/details/126376536?spm=1001.2014.3001.5501: https://blog.csdn.net/weixin_56039202/article/details/126376536?spm=1001.2014.3001.5501