在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()
完成,但我想使用汇编。
然而,它根本无法工作。有什么想法吗?
答案 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)定义自己的“版本”,以在其中包含更多或更少的信息。