2014-02-23 97 views
2

在32位程序集中,我可以訪問TEB結構的ProcessEnvironmentBlock。從那裏我訪問了TEB結構的Ldr訪問x64 TEB C++&彙編

這種技術被描述如下: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機器上工作。我認爲結構的64位版本,並寫道:

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

這可以使用Winnt.hNtCurrentTeb()做,但我想用組裝。

但是,它根本無法工作。任何想法爲什麼?

+0

「失敗」意味着什麼? –

+4

您是否追溯到'NtCurrentTeb'並檢查偏移以確保它們確實是正確的? –

+0

失敗含義'_ptr'與'NTCurrentTeb'具有不同的值。我會追查它並再次檢查。我相當肯定我確實讓他們正確。 – Brandon

回答

0

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

[86] __readfsbyte __readfsdword __readfsqword __readfsword

[64] __readgsbyte __readgsdword __readgsqword __readgsword

好運〜

1

Visual Studio中不允許的內聯彙編X64 C++。 __asm關鍵字不受支持。您可以將彙編程序寫入單獨的文件並將其鏈接,或者您可以使用intrinsics完成您需要執行的操作。