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的目标地址, 那么用二进制编辑器把000004b5000004b9 这5个byte用空指令(二进制0x90)替换掉, 就不会被运行了, 就像这样:

然后再用ida打开验证下:

好了, 重新生成一下apk包, 再次运行, 不会print出”call ptrace ……. “, 也可以被attach

下次估计又得是道高一尺的时候, 既然反反调试依赖反编译, 那看看能不能反反编译

##备注