? ? ? ? 為了方便后面使用xposed和unidbg調(diào)用,我們來先分析一下tlv544是如何在java層與so層是怎么定位到關(guān)鍵代碼的。
一、TLV544:Java層定位
由于qq沒啥混淆,打開jadx直接就可以搜索到相關(guān)的tlv類,如下。
?通過這一排的類的名字,我們可以找到tlv544一些相關(guān)的字符串,如下。
?通過trace這個(gè)tlv_t544類可以發(fā)現(xiàn)確實(shí)調(diào)用了它生成tlv544,如下。
?繼續(xù)追蹤分析......
????????發(fā)現(xiàn)調(diào)用到了com.tencent.mobileqq.qsec.qsecdandelionsdk.Dandelion這個(gè)類里面。通過fly方法調(diào)用energy這個(gè)方法返回tlv544的加密結(jié)果,而這個(gè)函數(shù)存在于native層。
二、TLV544:So層定位
????????我們發(fā)現(xiàn)在這個(gè)類中,并沒有在靜態(tài)塊調(diào)用so的加載函數(shù),那么肯定是在其他類加載的so。對(duì)我們尋找jni函數(shù)造成了麻煩。
? ? ? ? 1)靜態(tài)注冊(cè)的jni函數(shù)定位
????????我們依然使用frida去hook查找,代碼如下。
// 靜態(tài)函數(shù)搜索
function hook_dlsym(){
// 獲取dlsym函數(shù)的地址
let dlsymAddr = Module.findExportByName("libdl.so","dlsym");
console.log(dlsymAddr);
// hook dlsym
Interceptor.attach(dlsymAddr,{
onEnter:function(args){
this.args1 = args[1];
},
onLeave:function(retval){
let md= Process.findModuleByAddress(retval);
if(md==null)return;
console.log("函數(shù):"+this.args1.readCString(),"模塊:"+md.name,"地址:"+retval,"偏移:"+retval.sub(module1.base));
}
})
}
hook_dlsym();
????????dlsym這個(gè)函數(shù),會(huì)在運(yùn)行時(shí)被調(diào)用,它傳入了兩個(gè)參數(shù),一個(gè)是handle(對(duì)我們沒啥用),一個(gè)是symbol(這個(gè)就是我們的函數(shù)符號(hào)),它會(huì)返回當(dāng)前這個(gè)函數(shù)的地址。
效果,如下(模糊的話,雙擊查看就可以了):?
通過搜索發(fā)現(xiàn)并沒有找到我們想要的energy函數(shù),不要著急,還有一種方式 。
2)動(dòng)態(tài)注冊(cè)的jni函數(shù)定位
????????眾所周知,jni函數(shù)注冊(cè)的方式有兩種,靜態(tài)的不行,那就hook動(dòng)態(tài)的。我們來hook RegisterNatives這個(gè)函數(shù),通過它來獲取JNINativeMethod數(shù)組中的方法,frida代碼如下:
function hook_RegisterNatives() {
var RegisterNatives_addr = null;
var symbols = Process.findModuleByName("libart.so").enumerateSymbols();
for (var i = 0; i < symbols.length; i++) {
var symbol = symbols[i].name;
if ((symbol.indexOf("CheckJNI") == -1) && (symbol.indexOf("JNI") >= 0)) {
if (symbol.indexOf("RegisterNatives") >= 0) {
RegisterNatives_addr = symbols[i].address;
console.log("RegisterNatives_addr: ", RegisterNatives_addr);
}
}
}
Interceptor.attach(RegisterNatives_addr, {
onEnter: function (args) {
var env = args[0];
var jclass = args[1];
var class_name = Java.vm.tryGetEnv().getClassName(jclass);
var methods_ptr = ptr(args[2]);
var method_count = args[3].toInt32();
console.log("RegisterNatives method counts: ", method_count);
for (var i = 0; i < method_count; i++) {
var name = methods_ptr.add(i * Process.pointerSize * 3).readPointer().readCString();
var sig = methods_ptr.add(i * Process.pointerSize * 3 + Process.pointerSize).readPointer().readCString();
var fnPtr_ptr = methods_ptr.add(i * Process.pointerSize * 3 + Process.pointerSize * 2).readPointer();
var find_module = Process.findModuleByAddress(fnPtr_ptr);
console.log("類: ", class_name, "方法: ", name, "簽名: ", sig, "函數(shù)地址: ", fnPtr_ptr, "模塊名: ", find_module.name, "函數(shù)偏移: ", ptr(fnPtr_ptr).sub(find_module.base));
}
},
onLeave: function (retval) {}
});
}
hook_RegisterNatives()
然后我們搜索就能找到我們的energy函數(shù),它位于libfekit.so 中偏移0x79134位置,如下。?
拖入ida查看,如下:
文章來源:http://www.zghlxwxcb.cn/news/detail-646699.html
先到這里,下一篇更精彩,后面就分析如何使用xposed怎么調(diào)用這個(gè)tlv544。文章來源地址http://www.zghlxwxcb.cn/news/detail-646699.html
到了這里,關(guān)于安卓騰xQ協(xié)議逆向-TLV544定位 (二)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!