-
-
[原创]我们一起来聊聊反调试 (1)
-
发表于: 2019-7-31 15:49 2777
-
从DbgBreakPoint入手
众所周知,一般的OD等一些调试器都是从DbgBreakPoint开始的,所以今天我就从DbgBreakPoint入手来研究反调试。
; 本汇编代码反编译自ntdll.dll ;------------------------------------------------------------------------------ ; ; 反汇编列表由 PE Explorer 生成,生成器版本为 1.99 ; Heaventools Software (http://www.heaventools.com) ; ;------------------------------------------------------------------------------ DbgUserBreakPoint: int3 nop retn ;------------------------------------------------------------------------------ Align 16 DbgBreakPoint: int3 retn ;------------------------------------------------------------------------------ Align 16
所以,擦除DbgBreakPoint的第一个指令就可以让一般的调试器失效:
/* * 擦除DbgBreakPoint和DbgUserBreakPoint反调试 * By Liankong<QQ: 2928455383> */ void anti(){ DOWRD oldFlags = 0; HMODULE hd = GetModuleHandle("ntdll.dll"); char* p = (char*)GetProcAddress(hd,"DbgBreakPoint"); VirtualProtect(p,2,PAGE_EXECUTE_READWRITE,&oldFlags); *p = 0xC3; VirtualProtect(p,5,oldFlags,&oldFlags); p = (char*)GetProcAddress(hd,"DbgUserBreakPoint"); VirtualProtect(p,2,PAGE_EXECUTE_READWRITE,&oldFlags); *p = 0xC3; VirtualProtect(p,5,oldFlags,&oldFlags); }
这段代码最好可以放在入口处或者TLS中,运行以后会擦除掉DbgBreakPoint的int 3指令让一般的调试器出现“附加的上,却断不了”的尴尬情况。
对抗方法:
这种方法对于一些刚入门的Cracker应该是够折腾的了,但是绕过方法也很简单,可以尝试将DbgBreakPoint中的指令恢复,也可以尝试不使用DbgBreakPoint而用其它方法断下来。
(其实在StrongOD和新版本OD中已经对这种反调试做过处理,所以基本上也是没什么太大的效果,只能用来对付一些小白级的Cracker)
赞赏
看原图
赞赏
雪币:
留言: