Autor Thema: Assembler - Set-Ausdrücke  (Gelesen 1761 mal)

Cjreek

  • Beiträge: 104
    • Profil anzeigen
Gespeichert
« am: 12. June 2010, 13:26 »
Hallo,

Folgender Delphi-Code:

procedure TSynAsmSyn.NumberProc;
begin
  inc(Run);
  fTokenID := tkNumber;
  while FLine[Run] in ['0'..'9', '.', 'a'..'f', 'h', 'A'..'F', 'H'] do
    Inc(Run);
end;

Dazu wird folgender (von mir so gut wie möglich lesbar gemachter) Assemblercode generiert:

(Hier externe Version mit Highlighting: *klick*)
; Label   | Adresse |     Opcode    |   Mnemonic

; Initialisierung
           00475bac  55                 push ebp
           00475bad  8bec               mov ebp,esp
           00475baf  51                 push ecx
           00475bb0  8945 fc            mov dword ptr ss:[ebp-4],eax
           00475bb3  8b45 fc            mov eax,dword ptr ss:[ebp-4]

; inc(Run)
           00475bb6  ff80 70080000      inc dword ptr ds:[eax+870]
           00475bbc  8b45 fc            mov eax,dword ptr ss:[ebp-4]

; fTokenID := tkNumber;
           00475bbf  c680 80080000      mov byte ptr ds:[eax+880],4

           00475bc6  eb 09              jmp short 00475bd1                    ; ---> 1.Durchl
Schleife:  00475bc8  8b45 fc              / mov eax,dword ptr ss:[ebp-4]     

; inc(Run)
           00475bcb  ff80 70080000        | inc dword ptr ds:[eax+870]

; al := FLine[Run]
1.Durchl:  00475bd1  8b45 fc              | mov eax,dword ptr ss:[ebp-4]
           00475bd4  8b40 68              | mov eax,dword ptr ds:[eax+68]
           00475bd7  8b55 fc              | mov edx,dword ptr ss:[ebp-4]
           00475bda  8b92 70080000        | mov edx,dword ptr ds:[edx+870]
           00475be0  8a0410               | mov al,byte ptr ds:[eax+edx]

; al in ['0'..'9', '.', 'a'..'f', 'h', 'A'..'F', 'H'] ?
           00475be3  04 d8                | add al,0d8
           00475be5  3c 47                | cmp al,47
           00475be7  77 0a                | ja short 00475bf3                ; ---> Schl_end
           00475be9  83e0 7f              | and eax,7f
           00475bec  0fa305 f85b470>      | bt dword ptr ds:[475bf8],eax     ; **** Bitmaske
Schl_end:  00475bf3  72 d3                \ jb short 00475bc8                ; ---> Schleife

; Finalisierung
           00475bf5  59                 pop ecx
           00475bf6  5d                 pop ebp
           00475bf7  c3                 retn



; Daten
Bitmaske:  00475bf8  40ff037e           dd 7e03ff40                       
           00475bfc  01                 db 01
           00475bfd  00                 db 00
           00475bfe  00                 db 00
           00475bff  7e                 db 7e                                 
           00475c00  01                 db 01
           00475c01  00                 db 00
           00475c02  00                 db 00
           00475c03  00                 db 00

Das ist der Codes von dem SEG-Editor, der mir sehr gefällt, aber dessen (auf TSynEdit basierendes) Syntaxhighlighting gefällt mir leider nicht so, weswegen ich die exe gerade (bisher sehr erfolgreich) meinen Wünschen anpasse.

Mein Problem ist dass er keine Hexzahlen im Format 0xABCDEF erkennt, da er das "x" nicht als Bestandteil einer Zahl ansieht.

Ziel ist es jetzt den Assemblercode so umzugestalten (die Dateigröße darf natürlich nicht wachsen!), dass auch "x"-Zeichen akzeptiert werden.
Der Assemblercode soll dann äquivalent sein zu einer der folgenden Delphi-Codes:

A)
procedure TSynAsmSyn.NumberProc;
begin
  inc(Run);
  fTokenID := tkNumber;
  while FLine[Run] in ['0'..'9', '.', 'a'..'f', 'h', 'A'..'F', 'H', 'x', 'X'] do
    Inc(Run);
end;

B)
// auf das "H" kann ich persönlich verzichten
procedure TSynAsmSyn.NumberProc;
begin
  inc(Run);
  fTokenID := tkNumber;
  while FLine[Run] in ['0'..'9', '.', 'a'..'f', 'x', 'A'..'F', 'X'] do
    Inc(Run);
end;

Würde mich freuen wenn mir da jemand helfen könnte ;-)

Lg
Cjreek
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 12. June 2010, 14:12 »
Ich bin mir sicher, irgendjemand hier kriegt das hingebastelt, Binaries patchen macht ja in der Regel auch Spaß. ;)

Aber würde es als Langweilervariante nicht gehen, irgendwo anders zusätzlichen Code hinzupacken und einfach ein call einzufügen bzw. die Aufrufer zu patchen, dass sie die neue Funktion aufrufen?
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Cjreek

  • Beiträge: 104
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 13. June 2010, 14:37 »
Also ich habe mal die Bitmaske auseinander genommen und bin auf folgendes ergebnis gekommen

Bitmaske:  00475bf8  40ff037e           dd 7e03ff40                       
           00475bfc  01                 db 01
           00475bfd  00                 db 00
           00475bfe  00                 db 00
           00475bff  7e                 db 7e                                 
           00475c00  01                 db 01
           00475c01  00                 db 00
           00475c02  00                 db 00
           00475c03  00                 db 00

==>



0000  0000  |  0000  0000  |  0000  0000  |  0000  0001  |  0111  1110  | 0000  0000  |  0000  0000  |  0000  0001  |  0111  1110  0000  0011  1111  1111  0100  0000
            |   ~}|  {zyx  |  wvut  srqp  |  onml  kjih  |  gfed  cba`  | _^]\  [ZYX  |  WVUT  SRQP  |  ONML  KJIH  |  GFED  CBA@  ?>=<  ;:98  7654  3210  /.-,  +*)(



Die Prüfung der Bitmaske erfolgt aber aufgrund von

cmp al, 0x47
ja short 00475bf3

nur von ganz rechts (Bit 0) bis Bit 71 (das kleine "o").

D.h. folgende Veränderung brachte Erfolg:


00475be5  3c 47          cmp al, 0x54
00475be7  77 0a          ja short 00475bf3                ; ---> Schl_end

; [...]

Bitmaske:  00475bf8  40ff037e           dd 7e03ff40                       
           00475bfc  01                 db 01
           00475bfd  00                 db 00
           00475bfe  00                 db 01
           00475bff  7e                 db 7e                                 
           00475c00  01                 db 01
           00475c01  00                 db 00
           00475c02  00                 db 01
           00475c03  00                 db 00

"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

 

Einloggen