Seite 1 von 1

CPU Register ermitteln

Verfasst: 10.01.2009 12:52
von cxAlex
Hier ein kleiner Source um den Inhalt der CPU Register zu ermitteln. AUs mir unbekannten Gründen kann ich leider das EIP - Register nicht auslesen, vlt. weis jemand der sich in ASM besser auskennt als ich dir Ursache.

Hier mal der Code, wers braucht:

Code: Alles auswählen

Structure _CPU_Register
  EAX.l
  EBX.l
  ECX.l
  EDX.l
  ESP.l
  EBP.l
  EDI.l
  EIP.l
  CS.l
  DS.l
  ES.l
  FS.l
  GS.l
  SS.l
EndStructure

; CPU Register ermitteln
Procedure Show_CPURegister(*Var._CPU_Register)
  Define.l EAX, EBX, ECX, EDX
  Define.l ESP, EBP, EDI, EIP
  Define.w CS, DS, ES, FS, GS, SS
  !MOV dword[p.v_EAX] ,EAX
  !MOV dword[p.v_EBX] ,EBX
  !MOV dword[p.v_ECX] ,ECX
  !MOV dword[p.v_EDX] ,EDX
  !MOV dword[p.v_ESP] ,ESP
  !MOV dword[p.v_EBP] ,EBP
  !MOV dword[p.v_EDI] ,EDI
  ; !MOV dword[p.v_EIP] ,EIP // Compiler Fehler, kA Warum
  !MOV word[p.v_CS] ,CS
  !MOV word[p.v_DS] ,DS
  !MOV word[p.v_ES] ,ES
  !MOV word[p.v_FS] ,FS
  !MOV word[p.v_GS] ,GS
  !MOV word[p.v_SS] ,SS
  With *Var
    \EAX = EAX
    \EBX = EBX
    \ECX = ECX
    \EDX = EDX
    \ESP = ESP
    \EBP = EBP
    \EDI = EDI
    \EIP = EIP
    \CS = CS
    \DS = DS
    \ES = ES
    \FS = FS
    \GS = GS
    \SS = SS
  EndWith
EndProcedure

Define Register._CPU_Register

; Register ausgeben
Show_CPURegister(@Register)
With Register
  Debug \EAX
  Debug \EBX
  Debug \ECX
  Debug \EDX
  Debug \ESP
  Debug \EBP
  Debug \EDI
  Debug \EIP
  Debug \CS
  Debug \DS
  Debug \ES
  Debug \FS
  Debug \GS
  Debug \SS
EndWith

Verfasst: 11.01.2009 03:41
von Thorium
Das EIP Register ist sowieso uninteressant.

Verfasst: 11.01.2009 16:04
von Helle
Naja, sooo uninteressant ist der Wert des EIP-Registers nicht, da kann man schon viel mit machen; aber natürlich auch viel Unfug, deshalb ist es auch weitestgehend geschützt. Aber Thorium hat Recht in der Hinsicht, dass sein Wert in einer Auflistung Muster ohne Wert ist, denn bei seiner Anzeige stimmt ja der Wert schon nicht mehr.
Will man von einer bestimmten Code-Adresse dennoch den Wert bestimmen (eben EIP), geht mit FAsm dies:

Code: Alles auswählen

Global VEIP.i
;diese Adresse wird ermittelt
!mov eax,$                   ;lädt Anfangsadresse der MOV-Instruktion
!mov [v_VEIP],eax
Debug Hex(VEIP)
Eine andere Möglichkeit ist (wenn z.B. der verwendete Assembler obiges Konstrukt nicht unterstützt) der Weg über das Sichern der FPU-Umgebung. Dabei wird auch der EIP gesichert:

Code: Alles auswählen

Global Buffer.i
Global VEIP.i
Buffer = AllocateMemory(28)  ;28 Bytes für FNSTENV
!mov esi,[v_Buffer]
;diese Adresse wird ermittelt
!fnop                        ;irgendeine (möglichst "harmlose") FPU-Instruktion
!fnstenv [esi]               ;lädt Anfangsadresse von FNOP
!mov eax,[esi+12]            ;an Buffer+12 wird EIP (im 32-Bit-Protected Mode) gespeichert
!mov [v_VEIP],eax
Debug Hex(VEIP)
Gruß
Helle

Verfasst: 13.01.2009 12:09
von remi_meier
@cxAlex:
Sorry, aber der Code ist ziemlich unbrauchbar. Ich gebe dir hier mal
nen Hinweis:

Code: Alles auswählen

!mov ecx,3
!mov edx,4
Show_CPURegister(@Register) 
With Register 
  Debug \ECX 
  Debug \EDX 
EndWith
Gibt hier nicht 3 und 4 aus. Wenn's das bei dir tut, ist das reines Glück...

Verfasst: 13.01.2009 12:18
von Rings
remi_meier hat geschrieben:@cxAlex:
Sorry, aber der Code ist ziemlich unbrauchbar. Ich gebe dir hier mal
nen Hinweis:

Code: Alles auswählen

!mov ecx,3
!mov edx,4
Show_CPURegister(@Register) 
With Register 
  Debug \ECX 
  Debug \EDX 
EndWith
Gibt hier nicht 3 und 4 aus. Wenn's das bei dir tut, ist das reines Glück...
vollkommen richtig.
Beim Aufruf der Procedure wird innerhalb der procedure (am anfang)
die Register geändert.
Ausserdem ist da ja noch der Debugger....
Register auslesen funktioniert nur richtig als Macro oder
direkt als inline asm.
wers nicht glaubt, /commented gibt euch antwort ;)