2017-01-16 13 views
0

私はしばらく検索していましたが、私の問題の答えを見つけることができませんでした。私は、実行可能ファイルがデバッグされているかどうかを検出するためにいくつかの関数をコーディングしようとしており、__asmタグを使ってそのためにいくつかのインラインアセンブリを使用しています。それは2つのエラーを投げつけ続け、残りのコードはうまくコンパイルされているようです。ここでは機能VC++インラインアセンブリエラー

int peb_detect() { 
    __asm { 
     ASSUME FS : NOTHING 
     MOV EAX, DWORD PTR FS : [18] 
     MOV EAX, DBYTE PTR DS : [EAX + 30] 
     MOVZX EAX, BYTE PTR DS : [EAX + 2] 
     RET 
    } 
} 

だと私はそれを把握するように見えることはできませんエラー

warning C4405: 'FS': identifier is reserved word 
warning C2400: inline assembler syntax error in 'opcode'; found 'FS' 
warning C2408: illegal type on PTR operator in 'second operand' 

を得続けます。誰かが助けることができれば、私は本当にそれを感謝します。ありがとう!最初のない18に

+0

x64のための作業になりますこれは、エラーはを参照している行は不明だが、私はあなたが全体 'assume'行を削除する必要がありますね、とあなたがタイプミス' DBYTE'を持っています。 – Jester

+2

'IsDebuggerPresent'の何が問題なのですか? – 1201ProgramAlarm

+0

@Jester入力がどこですか? – LifeInKernelSpace

答えて

0

が、0x18のではなく30が、0x30から

C_ASSERT(FIELD_OFFSET(NT_TIB, Self) == 0x18); 
C_ASSERT(FIELD_OFFSET(TEB, ProcessEnvironmentBlock) == 0x30); 

は、ハードコードされていない定数を使用する必要があります。特に間違っている。

第2のint peb_detect()は、RET命令を使用する場合は__declspec(naked)でなければなりません。

#include <winternl.h> 
#include <intrin.h> 

__declspec(naked) BOOLEAN peb_detect() { 
    __asm { 
     MOV EAX, FS:[NT_TIB.Self] 
     MOV EAX, [EAX + TEB.ProcessEnvironmentBlock] 
     MOV AL, [EAX + PEB.BeingDebugged] 
     RET 
    } 
} 

を我々は使用することができますし、短いバリアント

__declspec(naked) BOOLEAN peb_detect2() { 
    __asm { 
     MOV EAX, FS:[TEB.ProcessEnvironmentBlock] 
     MOV AL, [EAX]PEB.BeingDebugged 
     RET 
    } 
} 

をしてIsDebuggerPresentを実装するために、我々は、すべてのインラインアセンブラを使用することはできませんので、コードは次のように見ることができます。これはあまりにも

__forceinline BOOLEAN peb_detect3() 
{ 
    return ((PEB*) 
#ifdef _WIN64 
     __readgsqword 
#else 
     __readfsdword 
#endif 
     (FIELD_OFFSET(_TEB, ProcessEnvironmentBlock)))->BeingDebugged; 
} 
+0

@ user7423208 - 私の英語は申し訳ありませんが、何が分かりませんか? – RbMm

+0

'ProcessEnviromentBlock': '第2オペランド'の構造体/共用体が無効です@RbMm – LifeInKernelSpace

+0

@ user7423208あなたは#include ですか? – RbMm