安卓腾xQ协议逆向-TLV544定位 (二)
为了方便后面使用xposed和unidbg调用,我们来先分析一下tlv544是如何在java层与so层是怎么定位到关键代码的。
一、TLV544:Java层定位
由于qq没啥混淆,打开jadx直接就可以搜索到相关的tlv类,如下。
通过这一排的类的名字,我们可以找到tlv544一些相关的字符串,如下。
通过trace这个tlv_t544类可以发现确实调用了它生成tlv544,如下。
继续追踪分析......
发现调用到了com.tencent.mobileqq.qsec.qsecdandelionsdk.Dandelion这个类里面。通过fly方法调用energy这个方法返回tlv544的加密结果,而这个函数存在于native层。
二、TLV544:So层定位
我们发现在这个类中,并没有在静态块调用so的加载函数,那么肯定是在其他类加载的so。对我们寻找jni函数造成了麻烦。
1)静态注册的jni函数定位
我们依然使用frida去hook查找,代码如下。
// 静态函数搜索function hook_dlsym(){ // 获取dlsym函数的地址 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("函数:"+this.args1.readCString(),"模块:"+md.name,"地址:"+retval,"偏移:"+retval.sub(module1.base)); } }) }hook_dlsym();
dlsym这个函数,会在运行时被调用,它传入了两个参数,一个是handle(对我们没啥用),一个是symbol(这个就是我们的函数符号),它会返回当前这个函数的地址。
效果,如下(模糊的话,双击查看就可以了):
通过搜索发现并没有找到我们想要的energy函数,不要着急,还有一种方式 。
2)动态注册的jni函数定位
众所周知,jni函数注册的方式有两种,静态的不行,那就hook动态的。我们来hook RegisterNatives这个函数,通过它来获取JNINativeMethod数组中的方法,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, "函数地址: ", fnPtr_ptr, "模块名: ", find_module.name, "函数偏移: ", ptr(fnPtr_ptr).sub(find_module.base)); } }, onLeave: function (retval) {} });}hook_RegisterNatives()
然后我们搜索就能找到我们的energy函数,它位于libfekit.so 中偏移0x79134位置,如下。
拖入ida查看,如下:
先到这里,下一篇更精彩,后面就分析如何使用xposed怎么调用这个tlv544。
来源地址:https://blog.csdn.net/weixin_44320760/article/details/132021291
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341