-
-
[原创]记一次某密的逆向笔记碎片,ida,frida
-
发表于: 6天前 161
-
首先感谢看雪论坛中的前辈们分享的逆向知识,我这些东西全是在前辈分享的知识的基础上学习到的
本次分享是2025-06-11,主要记录碎片知识,不知道目标程序是采用的厂商哪个加固版本
1.通过ida打开.init_array
2.找到检测点
3.断点registernative
4.DebuggerActive对应上层的android.os.Debug.isDebugger,修改标识
5.错误原因分析,当ida出现下图错误时,我的理解是当ida还在附加的运行当中,程序意外停止了,不是把ida进程杀掉了,是目标程序被杀掉了
6.libexec的so地址对不上,不会修复,只能采用动态调试
7.通过ida动态调试,后面遇到了,定时任务结束进程的异常,改用frida结合ida动态调试
8.针对加固厂商动态加载apk,导致hook不到目标类的问题,(我忘了原地址是哪个前辈分享的了,感谢),这段代码大致思路好像是需要二次获取classLoader,第一次的classLoader加载apk后,会产生第二个classLoader用来加载真实的apk
Java.perform(function(){
console.error("javaperform");
var application = Java.use("android.app.Application");
application.attach.overload('android.content.Context').implementation = function(context) {
var result = this.attach(context); // 先执行原来的attach方法
var classloader = context.getClassLoader(); // 获取classloader
Java.classFactory.loader = classloader;
var ActivityThread = Java.classFactory.use("android.app.ActivityThread");
ActivityThread.installContentProviders.implementation = function(context, providers) {
console.error("Installing content providers...");
// 可以在这里添加更多的日志输出或修改逻辑
//this.installContentProviders(context, providers); // 调用原始方法
console.error("Installing content providers...Finish");
};
}
});
9.在通过frida hook时,有个检测点在so层,是个分支条件,ida运行时,可以正常下去,frida运行时是另一个分支,那个地方是以0和6来区分的,我找到那个偏移量后,动态修改了,然后就过了
Interceptor.attach(so_addr.add(0x729AC),{
onEnter:function(args){
console.log(' attachR_Sub 被调用','RegisterNatives called from:\\n' + Thread.backtrace(this.context, Backtracer.ACCURATE).map(DebugSymbol.fromAddress).join('\\n') + '\\n')
var off_7986EC6B80Value = ptr(so_addr.add(0xE4B80));
var off_7986EC6B80ValueAddr = Memory.readU64(off_7986EC6B80Value);
console.error("off_7986EC6B80ValueAddr:",off_7986EC6B80ValueAddr)
var off_7986EC6B80Value848 = ptr(off_7986EC6B80ValueAddr+848);
var off_7986EC6B80ValueAddr848 = Memory.readU64(off_7986EC6B80Value848);
console.error("off_7986EC6B80ValueAddr848:",off_7986EC6B80ValueAddr848)
Memory.writeU32(off_7986EC6B80Value848, 0x6);
console.error("off_7986EC6B80ValueAddr848 after:",Memory.readU64(off_7986EC6B80Value848))
},
onLeave:function(retval){
for(var i = 0; i<10 ; i ++){
console.error("attachR_Sub 调用结束")
}
}
})