C++反而调试技术

以调节一些病毒程序的下,可能会见遇到一些倒调试技术,也就是说,被调剂的主次可以检测及自己是否让调试器附加了,如果探知自己在吃调剂,肯定是有人试图反汇编啦之类的道破解自己。为了了解什么破解反调试技术,首先我们来探视反调试技术。

一、Windows API方法

Win32供了片只API,
IsDebuggerPresent和CheckRemoteDebuggerPresent可以为此来检测时经过是否在让调剂,以IsDebuggerPresent函数为条例,例子如下:

 

BOOL ret = IsDebuggerPresent();

printf(“ret = %d\n”, ret);

 

破解方法好粗略,就是以系统里以立即片单函数hook掉,让这有限只函数一直返回false就好了,网上发出不少做hook
API工作之家伙,也产生成百上千器源代码是放之,所以这边虽非仔细谈了。

 

第二、查询进程PEB的BeingDebugged标志位

当进程被调试器所附加的时,操作系统会活动安装这个标志位,因此当先后里定期查询这标志位就是好了,例子如下:

 

bool PebIsDebuggedApproach()

{

       char result = 0;

       __asm

       {

     //
进程的PEB地址位于fs这个寄存器位置及

              mov eax, fs:[30h]

 // 查询BeingDebugged标志位

              mov al, BYTE PTR [eax + 2] 

              mov result, al

       }

 

       return result != 0;

}

 

其三、查询进程PEB的NtGlobal标志位 

以及第二个章程同样,当进程被调剂的上,操作系统除了修改BeingDebugged这个标志位外,还会见改外几个地方,其中NtDll中一些决定堆(Heap)操作的函数的表明位即会给改,因此也得查询者标志位,例子如下:

 

bool PebNtGlobalFlagsApproach()

{

       int result = 0;

 

       __asm

       {

     // 进程的PEB

              mov eax, fs:[30h]

 //
控制堆操作函数的干活方式的标志位

              mov eax, [eax + 68h]

 //
操作系统会加上这些标志位FLG_HEAP_ENABLE_TAIL_CHECK, 

 //
FLG_HEAP_ENABLE_FREE_CHECK and FLG_HEAP_VALIDATE_PARAMETERS,

 // 它们的并集就是x70

 //

 // 下面的代码相当给C/C++的

 //     eax = eax & 0x70

              and eax, 0x70

              mov result, eax

       }

 

       return result != 0;

}

 

季、查询进程堆的组成部分标志位

此办法是第三个章程的变种,只要经过被调剂,进程在积上分红的内存,在分配的积的峰信息里,ForceFlags这个标志位会受涂改,因此可以通过判断是标志位之章程来反而调试。因为经过可以生成百上千之积,因此只要检查任意一个积聚的头信息就是可了,所以这主意一般很强劲,例子如下:

 

bool HeapFlagsApproach()

{

       int result = 0;

 

       __asm

       {

     // 进程的PEB

              mov eax, fs:[30h]

     //
进程的积聚,我们无看了一个积聚,下面是默认的堆

              mov eax, [eax + 18h]

 //
检查ForceFlag标志位,在没为调剂之情状下应该是

              mov eax, [eax + 10h]

              mov result, eax

       }

 

       return result != 0;

}

 

参考资料:http://www.symantec.com/connect/articles/windows-anti-debug-reference

 

未完待续