Frage zur internen Funktionsweise von IsDebuggerPresent



  • Hallo in der ersten Zeile kopiere ich ja den Wert aus FS:[18] nach EAX.
    In der 2ten Zeile kopiere ich den Wert der an der Adresse [EAX+30] steht ins EAX Register.

    Aber hier MOV EAX,DWORD PTR FS:[18] muss ja intern noch mehr passieren als nur FS[18] nach EAX zu kopieren.

    Den ansonsten müsste ich ja wenn ich in der ersten Zeile MOV EAX,DWORD PTR DS:[EAX+30] aufrufe den selben Wert herausbekommen als wenn ich zu erst MOV EAX,DWORD PTR FS:[18] und dann MOV EAX,DWORD PTR DS:[EAX+30] aufrufe.

    7C813133 > 64:A1 18000000   MOV EAX,DWORD PTR FS:[18]
    7C813139   8B40 30          MOV EAX,DWORD PTR DS:[EAX+30]
    7C81313C   0FB640 02        MOVZX EAX,BYTE PTR DS:[EAX+2]
    

    Ich stelle mir das so vor:

    Es wir auf FS:[18] zugegriffen der Prozessor sieht das der Wert von FS:[18] nach EAX kopiert wurde als schreibt der Prozessor den nächsten Wert an DS:[EAX+30].

    Das ganze funktioniert ja sogar mit EBX, z.b. so:

    7C813133 > 64:A1 18000000   MOV ebx,DWORD PTR FS:[18]
    7C813139   8B40 30          MOV ebx,DWORD PTR DS:[ebx+30]
    7C81313C   0FB640 02        MOVZX ebx,BYTE PTR DS:[ebx+2]
    

    Ist das richtig so was ich hier schreibe?^^



  • De_Bugger schrieb:

    Ist das richtig so was ich hier schreibe?^^

    nein.

    Es sei aber zu sagen, das die erste Zeile unnötig ist, da die lineare Adresse des TIB nicht benötig wird:

    MOV EAX,DWORD PTR FS:[30]
    MOVZX EAX,BYTE PTR DS:[EAX+2]
    


  • De_Bugger schrieb:

    Ist das richtig so was ich hier schreibe?

    Nein, das ist nicht richtig

    1. mov eax,dword ptr fs:[18]

    Hier holt sich die CPU den Wert aus FS:18 und belegt EAX damit. EAX hat dann (bei mir zum Beispiel) den Wert 0x7FFDF000.

    1. mov eax,dword ptr ds:[eax+30]

    Zuerst wird zu EAX (0x7FFDF000) 0x30 addiert, ergibt: 0x7FFDF030. Die Adresse in den eckigen Klammern ist also 0x7FFDF030. Was dort steht (bei mir: 7FFD9000), wird nach EAX kopiert. EAX hat jetzt also den Inhalt 0x7FFD9000

    1. movzx eax,byte ptr ds:[eax+2]

    Jetzt wird 2 zu EAX (0x7FFD9000) addiert, in den eckigen Klammern steht also die Adresse 0x7FFD9002. Was an dieser Stelle steht (bei mir: 0x01), wird nach AL kopiert und das restliche EAX-Register auf Null gesetzt. In EAX steht also: 0x00000001.

    1. ret

    Nun kehrt die Funktion IsDebuggerPresent zurück. EAX ist der Rückgabewert, in diesem Fall: 1 (TRUE).

    viele grüße
    ralph


Anmelden zum Antworten