上一篇中提到了“通过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。
-
PEB:PEB 是 Windows 进程的环境块,它存储了进程的运行时信息。在 64 位的 Windows 系统上,32 位的应用程序(x86 应用程序)运行在 32 位的子系统中,它们使用的是 32 位的 PEB 结构。这个 PEB 结构是在 32 位的地址空间中,适用于 32 位的进程。
-
PEB64:PEB64 是在 64 位的地址空间中,用于 64 位的应用程序(x64 应用程序)。64 位的应用程序运行在 64 位的子系统中,使用的是 64 位的 PEB64 结构。这个结构提供了更多的空间来存储指针和其他 64 位数据。
这两种 PEB 结构存在的原因是因为 Windows 64 位操作系统支持在不同的子系统中运行 32 位和 64 位的应用程序。因此,为了适应不同的应用程序架构,Windows 提供了两种不同的 PEB 结构。这使得操作系统能够正确地管理不同子系统中的应用程序,并且能够正确处理 32 位和 64 位应用程序的运行时信息。
一、32位的程序在x64里的NtGlobalFlag情况
这个在上篇中都有所介绍,
我们来调试下这个,看什么情况?
当调试到关键位置时,发现并没有检测到调试器的存在!
二、64位的程序在x64里的NtGlobalFlag情况;
看下“64位程序在x64(win64)下的情况”,上面的程序是用delphi写的,也就同样用delphi写下64位的程序,但是,在编译x64位程序时发现提示“asm”编译通过不了,提示为“[dcc64 Error] Unit1.pas(27): E1025 Unsupported language feature: 'ASM'”
搜索了一翻,提示是“ 不支持内联64位混合汇编。要么函数里面只有Pascal 要么函数里面只有汇编语句,不能写了Pascal的变量生成,然后又写汇编代码”。
1、感到这个提示有点麻烦,就用VS2022搞了一段,如下,
代码:
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 ;
来调试下:
当调试到关键位置时,发现并没有检测到调试器的存在!
2、后来想了想,还是用delphi试一下,只要不是混合编程,应该也没问题,最后代码如下:
代码:
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没有检测到win64下的调试器的存在,也许还有什么条件我们没有掌握,但还是有收获的,以后再深入下!
原文始发于微信公众号(MicroPest):续上篇---NtGlobalFlag
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论