Android——JNI层反反调试

Home / Android MrLee 2016-4-20 3904

之前又研究下怎么反调试, 该到道高一尺魔高一丈的时候了, 再来研究下怎么反反调试
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

推荐阅读
最新回复 (0)
返回