2

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()、アセンブリを使用したいです。

ただし、まったく機能しません。理由はありますか?

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 に答える