Jun
26

Debugger Interrupts

 14:31    300    0    逆向汇编
      在调试器中步过INT3和INT1指令的时候,由于调试器通常会处理这些调试中断,所以异常处理例程默认情况下将不会被调用,Debugger Interrupts就利用了这个事实。这样壳可以在异常处理例程中设置标志,通过INT指令后如果这些标志没有被设置则意味着进程正在被调试。

      另外,kernel32!DebugBreak()内部是调用了INT3来实现的,有些壳也会使用这个API。
      PEB.NtGlobalFlag  PEB另一个成员被称作NtGlobalFlag(偏移0x68),壳也通过它来检测程序是否用调试器加载。通常程序没有被调试时,NtGlobalFlag成员值为0,如果进程被调试这个成员通常值为0x70(代表下述标志被设置):

       FLG_HEAP_ENABLE_TAIL_CHECK(0X10)
       FLG_HEAP_ENABLE_FREE_CHECK(0X20)
       FLG_HEAP_VALIDATE_PARAMETERS(0X40)

      这些标志是在ntdll!LdrpInitializeExecutionOptions()里设置的。请注意PEB.NtGlobalFlag的默认值可以通过gflags.exe工具或者在注册表以下位置创建条目来修改:
Jun
20

PEB.BeingDebugged Flag : IsDebuggerPresent

 10:43    436    0    逆向汇编
                                            2.1 PEB.BeingDebugged Flag : IsDebuggerPresent()

      最基本的调试器检测技术就是检测进程环境块(PEB)1中的BeingDebugged标志。kernel32!IsDebuggerPresent() API检查这个标志以确定进程是否正在被用户模式的调试器调试。

      下面显示了IsDebuggerPresent() API的实现代码。首先访问线程环境块(TEB)2得到PEB的地址,然后检查PEB偏移0x02位置的BeingDebugged标志。

mov      eax, large fs: 18h
mov       eax, [eax+30h]
movzx      eax, byte ptr [eax+2]
retn

      除了直接调用IsDebuggerPresent(),有些壳会手工检查PEB中的BeingDebugged标志以防逆向分析人员在这个API上设置断点或打补丁。
Jun
20

脱壳的艺术一(简介)

 10:37    205    0    逆向汇编

脱壳的艺术Mark Vincent Yason



     概述:脱壳是门艺术——脱壳既是一种心理挑战,同时也是逆向领域最为激动人心的智力游戏之一。为了甄别或解决非常难的反逆向技巧,逆向分析人员有时不得不了解操作系统的一些底层知识,聪明和耐心也是成功脱壳的关键。这个挑战既牵涉到壳的创建者,也牵涉到那些决心躲过这些保护的脱壳者。
分页: 1/1 第一页 1 最后页 [ 显示模式: 摘要 | 列表 ]