【发布时间】:2014-03-25 06:19:51
【问题描述】:
在 32 位汇编中,我可以访问 TEB 结构的 ProcessEnvironmentBlock。从那里我访问TEB 结构的Ldr。
这里描述了这种技术: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() 来完成,但我想使用汇编。
但是,它根本无法工作。任何想法为什么?
【问题讨论】:
-
您是否追踪到
NtCurrentTeb并检查偏移量以确保它们实际上是正确的? -
失败意味着
_ptr的值与NTCurrentTeb不同。我会追踪它并再次检查。我相当肯定我做对了。 -
您是从 64 位进程还是 32 位进程(WOW)读取 TEB?
-
x64。我知道出了什么问题。这是我的语法。如果我使用 AT&T 语法而不是 intel 语法,则相同的代码可以正常工作。所以我肯定做错了什么:stackoverflow.com/questions/21974224/…
-
mov rax, _ptr将_ptr的值移动到rax,而不是相反。如果那是您的实际代码_ptr仍应包含空指针值。
标签: windows assembly visual-c++ x86-64 kernel32