CPU Register ermitteln

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

CPU Register ermitteln

Beitrag 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
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag von Thorium »

Das EIP Register ist sowieso uninteressant.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag 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
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag 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...
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Beitrag 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 ;)
Rings hat geschrieben:ziert sich nich beim zitieren
Antworten