2017-01-16 2 views
0

J'ai cherché pendant un certain temps, et je n'arrivais pas à trouver la réponse à mon problème. J'essaie de coder certaines fonctions pour détecter si l'exécutable est en cours de débogage, et j'utilise un assemblage en ligne pour cela (avec la balise __asm). Il continue à jeter deux erreurs, et le reste du code semble bien se compiler. Voici la fonctionVC++ erreurs d'assemblage en ligne

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

et je continue à obtenir les erreurs

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' 

Je ne peux pas sembler comprendre. Si quelqu'un peut aider, je l'apprécierais vraiment. Merci!

+0

On ne sait pas quelles lignes les erreurs se réfèrent, mais je suppose que vous devez supprimer toute la ligne 'de assume', et vous avez une faute de frappe' DBYTE'. – Jester

+2

Quel est le problème avec 'IsDebuggerPresent'? – 1201ProgramAlarm

+0

@Jester où est la faute de frappe? – LifeInKernelSpace

Répondre

0

au premier pas 18 mais 0x18 et non 30 mais 0x30

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

ont besoin utiliser des constantes non codés en dur. particulièrement faux.

au deuxième int peb_detect() doit être __declspec(naked) si vous utilisez l'instruction RET. si le code peut ressembler à ceci:

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

mais nous pouvons utiliser et plus courte variante

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

et pour mettre en œuvre IsDebuggerPresent nous ne pouvons pas utiliser assembleur en ligne du tout. et ce sera le travail pour x64 trop

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

@ user7423208 - désolé pour mon anglais, qu'est-ce qui n'est pas clair? – RbMm

+0

'ProcessEnviromentBlock': membre illégal struct/union dans 'second opérande' @RbMm – LifeInKernelSpace

+0

@ user7423208 êtes-vous '#include '? – RbMm