首页
社区
课程
招聘
[原创]我们一起来聊聊反调试 (1)
发表于: 2019-7-31 15:49 3039

[原创]我们一起来聊聊反调试 (1)

2019-7-31 15:49
3039

从DbgBreakPoint入手

众所周知,一般的OD等一些调试器都是从DbgBreakPoint开始的,所以今天我就从DbgBreakPoint入手来研究反调试。

; 本汇编代码反编译自ntdll.dll

;------------------------------------------------------------------------------
;
;	反汇编列表由 PE Explorer 生成,生成器版本为 1.99
;	Heaventools Software (5abK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3S2W2j5i4k6W2L8Y4c8G2L8$3I4K6i4K6u0W2j5$3!0E0i4K6t1&6
;
;------------------------------------------------------------------------------
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)



[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回