首页
社区
课程
招聘
[原创]记一次某密的逆向笔记碎片,ida,frida
发表于: 6天前 161

[原创]记一次某密的逆向笔记碎片,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 调用结束")

}

}

})




[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回