2017-01-16 4 views
0

Ich habe eine Weile gesucht und konnte nicht die Antwort auf mein Problem finden. Ich versuche, einige Funktionen zu programmieren, um zu erkennen, ob die ausführbare Datei debuggt wird, und ich verwende dafür eine Inline-Assembly (mit dem Tag __asm). Es wirft zwei Fehler auf und der Rest des Codes scheint gut zu kompilieren. Hier ist die FunktionVC++ Inline Assembly Fehler

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 
    } 
} 

und ich bekomme immer wieder die Fehler

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' 

ich es nicht scheinen, um herauszufinden. Wenn jemand helfen kann, würde ich es sehr schätzen. Vielen Dank!

+0

Es ist unklar, welche Linien die Fehler beziehen sich auf, aber ich denke, man sollte das ganze 'assume' Linie löschen, und Sie haben einen Tippfehler' DBYTE'. – Jester

+2

Was ist los mit 'IsDebuggerPresent'? – 1201ProgramAlarm

+0

@Jester wo ist der Tippfehler? – LifeInKernelSpace

Antwort

0

anfangs nicht mehr als 18, aber nicht mehr als 30 und 0x18 0x30 aber

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

muss nicht fest codiert Konstanten verwenden. besonders falsch.

an zweiter Stelle int peb_detect() muss __declspec(naked) sein, wenn Sie RET Anweisung verwenden. so können Code wie folgt aussehen:

#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 
    } 
} 

aber wir können und kürzere Variante

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

verwenden und für IsDebuggerPresent implementieren wir können nicht Inline-Assembler überhaupt. und dies wird Arbeit für x64 zu

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

@ user7423208 - Entschuldigung für mein Englisch, was ist unklar? – RbMm

+0

'ProcessEnviromentBlock': illegale Struktur/Union-Mitglied im 'zweiten Operanden' @RbMm – LifeInKernelSpace

+0

@ user7423208 sind Sie '#include '? – RbMm