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
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.
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
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.
ret
Nun kehrt die Funktion IsDebuggerPresent zurück. EAX ist der Rückgabewert, in diesem Fall: 1 (TRUE).
viele grüße
ralph