2

在 32 位汇编中,我可以访问ProcessEnvironmentBlockTEB结构。从那里我可以访问LdrTEB结构。

此处描述了此技术:http ://en.wikipedia.org/wiki/Win32_Thread_Information_Block

在 32 位汇编中执行此操作的代码是:

void* ptr = NULL;

__asm
{
    mov eax, FS:[0x18]
    mov eax, [eax + 0x30]  //Offset of PEB
    mov eax, [eax + 0x0C]  //Offset of LDR in PEB structure
    mov eax, _ptr
};

std::cout<<ptr<<"\n";

TEB 结构可以在这里看到:http: //msdn.moonsols.com/win7rtm_x64/TEB.html,PEB 结构可以在这里看到:http: //msdn.moonsols.com/win7rtm_x64/PEB.html

以上适用于 32 位代码。

但是,我还想编写代码以在 x64 机器上工作。我查看了 x64 版本的结构并写道:

__asm
{
    mov rax, GS:[0x30]
    mov rax, [rax + 0x60]
    mov rax, [rax + 0x18]
    mov rax, _ptr
};

这可以使用Winnt.h NtCurrentTeb()但我想使用汇编来完成。

但是,它根本无法工作。任何想法为什么?

4

3 回答 3

4

如果您使用 Visual Studio,则可以使用 Intrinsics!

[x86] __readfsbyte __readfsdword __readfsqword __readfsword

[x64] __readgsbyte __readgsdword __readgsqword __readgsword

祝你好运~

于 2014-12-22T06:24:16.550 回答
1

Visual Studio 不允许用于 X64 C++ 的内联汇编程序。不支持 __asm 关键字。您可以在单独的文件中编写汇编程序并将其链接,或者您可以使用内在函数来完成您需要做的事情。

于 2015-11-17T20:10:53.650 回答
1

为了实现这一点,您必须在 Visual Studio 中创建一个 .asm 文件,如此处所述

要访问使用 Visual Studio 编译的 x64 中的 TEB/PEB,您可以使用以下代码:

GetTEBAsm64 proc
    push rbx
    xor rbx,rbx
    xor rax,rax
    mov rbx, qword ptr gs:[00000030h]
    mov rax, rbx
    pop rbx
    ret
GetTEBAsm64 endp

GetPEBAsm64 proc
    push rbx
    xor rbx,rbx
    xor rax,rax
    mov rbx, qword ptr gs:[00000060h]
    mov rax, rbx
    pop rbx
    ret
GetPEBAsm64 endp

然后简单地使用它们:

PTEB pTeb = GetTEBAsm64();
PPEB pPeb = GetPEBAsm64();

专家提示:

您可以定义您自己的这些结构(PTEB/PPEB)的“版本”,以在其中包含或多或少的信息。

于 2020-04-09T11:26:53.423 回答