Jni反反调试
之前又研究下怎么反调试
, 该到道高一尺魔高一丈的时候了, 再来研究下怎么反反调试
还是用之前的项目: android-anti-debug
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<void**>(&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
里