之前又研究下怎么反调试, 该到道高一尺魔高一丈的时候了, 再来研究下怎么反反调试
void anti_debug(){
LOGD("call ptrace ....... ");
ptrace(PTRACE_TRACEME, 0, 0, 0);
}
jint JNI_OnLoad(JavaVM* vm, void* reserved){
anti_debug();
JNIEnv* env;
if (vm->GetEnv(reinterpret_cast(&env), JNI_VERSION_1_6) != JNI_OK){
return -1;
}
return JNI_VERSION_1_6;
}
编译好之后用ida打开, 因为程序简单, 很容易就找到入口点JNI_OnLoad:

然后在000004b5处找到我们的关键调用anti_debug(),那我们只要让他不要再调用这个地方, 就不会被反调试了
那么这个call _Z10anti_debugv汇编指令一共5个byte: 1byte的指令, 4byte的目标地址, 那么用二进制编辑器把000004b5 到000004b9 这5个byte用空指令(二进制0x90)替换掉, 就不会被运行了, 就像这样:

然后再用ida打开验证下:

好了, 重新生成一下apk包, 再次运行, 不会print出”call ptrace ……. “, 也可以被attach了
下次估计又得是道高一尺的时候, 既然反反调试依赖反编译, 那看看能不能反反编译
##备注
- 用vim修改, 打开后用:%!xxd进入二进制, 修改后用:%!xxd -r 返回再保存
- 其实可以用Hopper Disassembler v3来反编译和修改: Modify -> Assemble Instruction 直接输入nop即可
- 修改文件, 最好是修改obj目录里的.so文件, 因为每次运行的时候还会走一次make, 修然没有 make, 但是会把obj里的.soinstall到libs里
本文链接:https://www.it72.com/9265.htm