来源
https://bbs.kanxue.com/thread-277808.htm
声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途给予盈利等目的,否则后果自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!
反调试与反反调试
IDA调试端口检测
读取/proc/net/tcp,查找IDA远程调试所用的23946端口,若发现说明进程正在被IDA调试。
5D8A —十进制—》23946
反反调试
更改IDA调式默认端口:
./as_64 -p12346
特征文件检测
android_server 特征文件名检测,更改过文件名。
Tracepid 检测
安卓的native下,通过读取进程的status或stat来检测Tracepid ,它主要原理是调试状态下的进程Tracepid不为0。
当检测到Tracepid 不为0时,app会kill掉进程,从而达到反调试的目的。
在 Android 系统中,Tracepid 是指调试当前进程的进程的 PID 。当 Android 程序处于调试状态时,Linux 会向
/proc/"进程 pid"/status
中写入状态信息,其中的 Tracepid 就是调试该进程的进程的 PID.例如,开发人员可以通过不断轮询检查 Tracepid 的值来判断当前进程是否正在被调试,如果 Tracepid 的值为 0,则说明该进程没有被调试;如果不为 0,则说明当前该进程正在被调试,程序可以据此执行相应的操作,如exit(0)
来防止被进一步调试.
一般情况下当 app 只有一个进程时,附加后程序不会立即退出,而是等待运行到相关退出函数时才会退出,原因很简单,只有一个进程时程序会断下但没办法继续往下执行,便不能够杀死自己,针对这种情况一般会 fork 出一个子进程,让子进程负责 kill 父进程,再优化便是父子进程相互检测是否被调试。
反反调试
让Tracepid在调试的状态下,Tracepid 仍然为0,并且以为万一让kill失效,但能让 app 退出的函数并不止这一个。
编写hook代码:
function Tracepid() {
console.warn(".............")
var fgetsPtr = Module.findExportByName("libc.so", "fgets");
var fgets = new NativeFunction(fgetsPtr, 'pointer', ['pointer', 'int', 'pointer']);
Interceptor.replace(fgetsPtr, new NativeCallback(function (buffer, size, fp) {
var retval = fgets(buffer, size, fp);
var bufstr = Memory.readUtf8String(buffer);
if (bufstr.indexOf("TracerPid:") > -1) {
Memory.writeUtf8String(buffer, "TracerPid:t0");
}
return retval;
}, 'pointer', ['pointer', 'int', 'pointer']));
var killptr = Module.findExportByName("libc.so", "kill");
var kill = new NativeFunction(fgetsPtr, 'int', ['int', 'int']);
Interceptor.replace(killptr, new NativeCallback(function (pid,sig) {
console.log("kill")
return 0;
}, 'int', ['int', 'int']));
}
frida 先执行hook代码后,ida进行附加调试,程序并不退出,反调试点就确定了,Tracepid值检测。
原文始发于微信公众号(进击的HACK):IDA 动态调试之反反调试
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论