续上篇-NtGlobalFlag

admin 2024年4月24日06:12:40评论1 views字数 2132阅读7分6秒阅读模式

    上一篇中提到了“通过antidebugseeker插件发现了多年来在反调试中的一个误区”,这篇接着再延续来谈下这个问题。就以NtGlobalFlag为例,上篇提到使用的反调试代码仅在这个x86(32位)框架下,没有对x64(64位)框架下的进行测试,主要是在思想上没有考虑过这个点(问题)。今天我们就来说这个问题以及所开展的一些 工作,且听道来。

这里主要是涉及到32位和64位的测试,有三种情况,分别是:

1、32位程序在x86下的运行;

2、32位程序在x64下的运行;

3、64位程序在x64下的运行。

1号的“32位程序在x86下的运行”这个就没有必要了,主要是2号和3号的测试。

这里涉及到一个知识点:

在 Windows 64 位操作系统下,有两个版本的 PEB(Process Environment Block),分别是 PEB 和 PEB64。

  1. PEB:PEB 是 Windows 进程的环境块,它存储了进程的运行时信息。在 64 位的 Windows 系统上,32 位的应用程序(x86 应用程序)运行在 32 位的子系统中,它们使用的是 32 位的 PEB 结构。这个 PEB 结构是在 32 位的地址空间中,适用于 32 位的进程。

  2. PEB64:PEB64 是在 64 位的地址空间中,用于 64 位的应用程序(x64 应用程序)。64 位的应用程序运行在 64 位的子系统中,使用的是 64 位的 PEB64 结构。这个结构提供了更多的空间来存储指针和其他 64 位数据。

这两种 PEB 结构存在的原因是因为 Windows 64 位操作系统支持在不同的子系统中运行 32 位和 64 位的应用程序。因此,为了适应不同的应用程序架构,Windows 提供了两种不同的 PEB 结构。这使得操作系统能够正确地管理不同子系统中的应用程序,并且能够正确处理 32 位和 64 位应用程序的运行时信息。

一、32位的程序在x64里的NtGlobalFlag情况

这个在上篇中都有所介绍,

续上篇-NtGlobalFlag

续上篇-NtGlobalFlag

我们来调试下这个,看什么情况?

续上篇-NtGlobalFlag

续上篇-NtGlobalFlag

当调试到关键位置时,发现并没有检测到调试器的存在!

二、64位的程序在x64里的NtGlobalFlag情况;

看下“64位程序在x64(win64)下的情况”,上面的程序是用delphi写的,也就同样用delphi写下64位的程序,但是,在编译x64位程序时发现提示“asm”编译通过不了,提示为“[dcc64 Error] Unit1.pas(27): E1025 Unsupported language feature: 'ASM'”

续上篇-NtGlobalFlag

搜索了一翻,提示是“ 不支持内联64位混合汇编。要么函数里面只有Pascal 要么函数里面只有汇编语句,不能写了Pascal的变量生成,然后又写汇编代码”。

1、感到这个提示有点麻烦,就用VS2022搞了一段,如下,

续上篇-NtGlobalFlag

代码:

extrn MessageBoxA: proc

;64位没有 .model 宏指令,不能指定内存模型和调用约定

 .data

text db 'debugged', 0

caption db 'Title', 0

.code

WinMain proc

    sub rsp,28h

    ; 函数调用前需要预留影子空间,对齐rsp

    push 60h

    pop rsi

    lodsq gs:[rsi]                

    ;Process Environment Block

    mov rax, [rsi*2+rax-14h] 

    ;NtGlobalFlag

    and rax, 70h

    cmp al, 70h

    jne @Exit

    xor r9d,r9d

    lea r8, caption

    lea rdx, text

    xor rcx,rcx

    call MessageBoxA 

    ; 函数调用使用fastcall

@Exit:

    add rsp,28h

    WinMain ENDP

END

来调试下:

续上篇-NtGlobalFlag

当调试到关键位置时,发现并没有检测到调试器的存在!

2、后来想了想,还是用delphi试一下,只要不是混合编程,应该也没问题,最后代码如下:

续上篇-NtGlobalFlag

代码:

function isdebug():Boolean;

{$IFDEF CPUX64}

  asm

        mov @result,0

        push    60h

        pop     rsi

        lodsq                //;Process Environment Block

        mov     al, [rsi * 2 + rax - 14h] //;NtGlobalFlag

        AND     al, 70h

        cmp     al, 70h

        jne @Exit

        mov @result,1

    @Exit:

        ret

  end;

{$ENDIF}

procedure TForm1.FormCreate(Sender: TObject);

 begin

   if isdebug() then  ShowMessage('debuged');

 end;

续上篇-NtGlobalFlag

续上篇-NtGlobalFlag

当调试到关键位置时,发现并没有检测到调试器的存在!

结束语:虽然不知道为什么这个NtGlobalFlag没有检测到win64下的调试器的存在,也许还有什么条件我们没有掌握,但还是有收获的,以后再深入下!

原文始发于微信公众号(MicroPest):续上篇---NtGlobalFlag

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年4月24日06:12:40
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   续上篇-NtGlobalFlaghttps://cn-sec.com/archives/2084033.html

发表评论

匿名网友 填写信息