Crack App | 某貓小說必讀榜加密參數(shù) sign 分析
友情提示:本文章僅供學(xué)習(xí)交流,請勿用于非法用途!如果侵犯貴司請及時聯(lián)系刪除
本次分析的是七貓小說中的七貓必讀榜的接口,關(guān)鍵參數(shù) sign ,接口是 /api/v1/must-read ,將app脫入到j(luò)adx中進(jìn)行分析,直接搜索 must-read 參數(shù),

發(fā)現(xiàn)可疑參數(shù),跟進(jìn)去看一下

上面一個參數(shù)跟我們抓包得到的參數(shù)是一致的,但是唯獨缺少了sign,懷疑可能是后續(xù)進(jìn)行添加的,接著搜索sign參數(shù)

發(fā)現(xiàn)可疑的節(jié)點,addQueryyParameter,極大可能是利用這個方法添加sign參數(shù),直接上frida進(jìn)行hook驗證一下我們的猜想

發(fā)下sign參數(shù)和抓包的參數(shù)是一致的,那我們就去跟蹤 Encryption.sign 這個方法,先用frida hook一下入?yún)⒌膕tr

看的結(jié)果像是md5,到本地去驗證一下

結(jié)果發(fā)現(xiàn)對不上,那我們值接調(diào)用這個方法加密 123456 試一下,加密123456得到的結(jié)果是 8c3d25f82b40f42281ae47ed2ca937ad加密可能是經(jīng)過魔改或者是參數(shù)進(jìn)行加鹽,接著跟具體的加密算法


是so層的加密,那我們要找到他是加載的哪一個so文件,可以看到在定義 native方法的這個位置并沒有加載so文件的方法 System.loadLibrary 我們往上層看 在Encryption 這個類中有個init方法是有點可疑的,那我們直接看他的用例,果然在用例中發(fā)現(xiàn)了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進(jìn)行解析,但是經(jīng)過IDA解析之后沒有發(fā)現(xiàn)我們需要的sign方法

我們再使用frida-trace 看一下內(nèi)存中是不是有這一個方法,按照靜態(tài)加載的格式拼接好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
根據(jù)包名

果然找到在內(nèi)存中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中進(jìn)行搜索,搜索發(fā)現(xiàn)15620 竟然指向的是Java_com_km_encryption_api_Security_token

那我們就直接分析token,整個加密算法是這樣的

發(fā)現(xiàn)到一個比較可疑的方法, 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
}));
}
})
}
在入?yún)⒌臅r候我們最好能夠把入?yún)⒐潭ㄒ幌拢覀冎苯影焉厦娴膆ooksign的方法拿過來用
Java.perform(function(){
let Encryption = Java.use("com.qimao.qmsdk.tools.encryption.Encryption")
Encryption.sign.implementation = function(str1){
console.log(`[Encryption.sign HOOK] 入?yún)?${str1}`)
let result = this.sign("123456");
console.log(`[Encryption.sign HOOK] 返回值:${result}`)
return result;
}
});
用這段代碼固定住入?yún)⒌募用軈?shù),來看下結(jié)果

可以看到MD5是加了鹽的,到加密工具中測試一下

[Encryption.sign HOOK] 返回值:8c3d25f82b40f42281ae47ed2ca937ad
再恢復(fù)正常的參數(shù)進(jìn)行測試


接下來放到python中請求一下,完美成功,當(dāng)然heders中還有qm-params sign,多次抓包分析這些參數(shù)是不會變得,這篇文章就完結(jié)撒花啦!

這個文章是參考馬到成功這個大佬的文章寫的,大佬的文章寫的是登錄接口后面還有其他的參數(shù),如果有需要可以到大佬的博客看下,本文是我的第一篇安卓逆向的文章,寫的不好還請各位看官海涵!
參考資料
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
