访问x64 TEB C ++&部件

时间:2014-02-23 19:26:45

标签: windows assembly kernel32

在32位汇编中,我可以访问ProcessEnvironmentBlock结构的TEB。从那里我访问Ldr结构的TEB

此处描述了此技术: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()完成,但我想使用汇编。

然而,它根本无法工作。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

如果您使用visual studio,则可以使用Intrinsics!

[86] __readfsbyte __readfsdword __readfsqword __readfsword

[64] __readgsbyte __readgsdword __readgsqword __readgsword

祝你好运〜

答案 1 :(得分:1)

Visual Studio不允许内联汇编程序用于X64 C ++。不支持__asm关键字。您可以将汇编程序编写在单独的文件中并将其链接到或者您可以使用内在函数执行您需要执行的操作。

答案 2 :(得分:0)

为了实现这一点,您必须像描述here一样在Visual Studio中创建一个.asm文件。

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

#include <stdio.h>
#include <math.h>

int main(){
char choice = "+", "*", "-", "/";
int a, b;
float outcome;

scanf("%c", &choice);

switch (choice)
{
    case "+":
        scanf("d% d%", &a, &b);
        outcome = a + b;
        printf("%.1f", outcome);
        break;
    case "*":
        scanf("%d %d", &a, &b);
        outcome = a * b;
        printf("%.1f", outcome); 
        break;
    case "-":
        scanf("%d %d", &a, &b);
        outcome = a - b;
        printf("%.1f", outcome);
        break;
    case "/":
        scanf("%d %d", &a, &b);
        outcome = a / b;
        printf("%.1f", outcome);
        break;

   }

return 0;
}

然后简单地使用它们:

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 / PPEB)定义自己的“版本”,以在其中包含更多或更少的信息。