[asm] EAT func adressen laden

04/27/2012 11:33 Tyrar#1
ich hab da einen kleinen denk fehler, ich versuche folgenden code in asm um zu coden

mein bisheriges ergebnis

allerdings habe ich ein problem mit dieser zeile:
Code:
DWORD funcRVA = *(DWORD*)(base + exportDir->AddressOfFunctions + *ordPtr * 4);
der asm ausschnitt ist mit '<---' gekennzeichnet.

jemand ne idee woran es liegen könnte?

fehler beispiel:
Kernel32 image base: 76E30000
Kernel32 EAT: 76EEF6A0
funcRVA befindet sich angeblich an: DBBBE438
04/27/2012 13:58 link#2
Du solltest Strukturen benutzen, AddressOfFunctions hat nämlich ein Offset von 1Ch.
Mit direkten Offsets zu arbeiten ist sehr unleserlich und so gut wie gar nicht wartbar.
Außerdem braucht man kein mul, da man einfach das SIB-Byte für die Adressierung benutzen kann (sprich mov eax,[eax+ebx*4+55h]).
Und wenn du einen kleineren Teil eines Registers veränderst und im größeren dann das Ergebnis erwartest, musst du das Carry-Flag berücksichtigen.

Code:
mov eax, DWORD [ddKernel32] ; <----
mov edx, DWORD [ddKernel32EAT]
add eax, DWORD [edx+0x28] ; address of functions
add ax, WORD [ecx]
xor edx, edx
mov dl, 4
mul edx
add eax, DWORD [ddKernel32]
mov DWORD [ddGetProcAddress], eax ; <---
->

Code:
mov eax, DWORD [ddKernel32] ; <----
mov edx, DWORD [ddKernel32EAT]
add eax, DWORD [edx+0x1C] ; address of functions
movzx edx,word [ecx]
mov eax,[eax+edx*4]
add eax, DWORD [ddKernel32]
mov DWORD [ddGetProcAddress], eax ; <---
Btw. ich würde statt der Variablen noch esi, edi und ebp hinzuziehen
04/27/2012 15:03 Tyrar#3
Quote:
Originally Posted by link View Post
Und wenn du einen kleineren Teil eines Registers veränderst und im größeren dann das Ergebnis erwartest, musst du das Carry-Flag berücksichtigen.
war mir bisher ehrlich gesagt gar nicht bewusst :o

Quote:
Originally Posted by link View Post
mov eax,[eax+ebx*4+55h]
natürlich self-:facepalm:

die register sind in diesem code allerdings mit absicht nicht verwendet worden ;)

ty :)
04/27/2012 15:34 link#4
Wenn deine Adresse z.B. 76EEF6A0h und der Wert an [ecx], den du auf ax addierst, gleich B00h ist, dann steht in eax 76EE01A0h statt 76EF01A0h.
Dafür gibt es eigentlich add with carry, aber da der höherwertige 16-byte Part der Register nicht ansprechbar ist, müsste man mit adc einen Umweg gehen oder z.B. jc mit add eax,10000h hinzufügen, deswegen ist es einfacher, wenn du direkt movzx benutzt, sodass du den Wert auf 4-Bytes vergrößerst und ihn auf das komplette eax-Register addierst.
Das mit den Variablen sieht halt eher unschön aus, außerdem sind Speicherzugriffe ziemlich langsam.
04/27/2012 15:44 Tyrar#5
Quote:
Wenn deine Adresse z.B. 76EEF6A0h und der Wert an [ecx], den du auf ax addierst, gleich B00h ist, dann steht in eax 76EE01A0h statt 76EF01A0h.
Dafür gibt es eigentlich add with carry, aber da der höherwertige 16-byte Part der Register nicht ansprechbar ist, müsste man mit adc einen Umweg gehen oder z.B. jc mit add eax,10000h hinzufügen, deswegen ist es einfacher, wenn du direkt movzx benutzt, sodass du den Wert auf 4-Bytes vergrößerst und ihn auf das komplette eax-Register addierst.
das ergibt natürlich sinn, hätte ich allerdings nicht dran gedacht ;)

Quote:
Originally Posted by link View Post
Das mit den Variablen sieht halt eher unschön aus, außerdem sind Speicherzugriffe ziemlich langsam.
da die func nur ein einziges mal zum start gecalled wird, macht das nichts... grundsätzlich setze ich auch auf register (natürlich wenn möglich ohne lokale variablen)