Gå til innhold

Anbefalte innlegg

Jeg har støtt på noe som jeg aldri hadde trodd jeg ville støte på i min amatør karriære som VB-programmerer. Assembly. I et prosjekt hvor en genial sjel har greid å legge til assembly kode direkte i COM objekter i run-time, går skille mellom programmeringspråkene Visual Basic og Assembly bort. Fordelen er naturligvis at assembly er vanvittig mye raskere en VB, men er til gjengjeld mye vanskeligere å forstå.

 

Jeg disassemblet koden og fikk dette som resultat:

 

PUSH edi
PUSH esi
MOV esi, esp+0x10
MOV edi, esp+0x14
MOV ecx, esp+0x18
SHR ecx, 0x02
MOV edx, esp+0x1C
LODSB esi
MUL dl
MOV al, ah
STOSB
LODSB esi
MUL dl
MOV al, ah
STOSB
LODSB esi
MUL dl
MOV al, ah
STOSB
LODSB esi
MUL dl
MOV al, ah
STOSB
LODSB esi
MUL dl
MOV al, ah
STOSB
LODSB esi
MUL dl
MOV al, ah
STOSB
LODSB esi
MUL dl
MOV al, ah
STOSB
LODSB esi
MUL dl
MOV al, ah
STOSB
LODSB esi
MUL dl
MOV al, ah
STOSB
LODSB esi
MUL dl
MOV al, ah
STOSB
LODSB esi
MUL dl
MOV al, ah
STOSB
LODSB esi
MUL dl
MOV al, ah
STOSB
LOOP 0x15
POP esi
POP edi
XOR eax, eax
RET 0x0014

 

Koden blir kalt når 4 32-bits variabler blir satt inn i stacken, for å gjøre det klart.

Noen som kan forklare koden linje for linje? Jeg vet hva den gjør, men hvordan den gjør det er mer uklart. Koden LOOP-er gjennom et vist antall bytes og redigerer dem slik at et bilde blir mørkere.

Endret av aadnk
Lenke til kommentar
  • 2 uker senere...
Videoannonse
Annonse

PUSH edi - Legger registret edi på stack

PUSH esi - Legger registret edi på stack

MOV esi, esp+0x10 - Legger peker inn i registre esi + 10 hex

MOV edi, esp+0x14 - Legger peker inn i registre edi+ 14 hex

MOV ecx, esp+0x18 - Legger peker inn i registre ecx+ 18 hex

SHR ecx, 0x02 - Shifter bitwise Right ecx 2 bit

MOV edx, esp+0x1C - Legger peker inn i registre ecx+ 18 hex

LODSB esi - Loadstringbyte inn(fra esi) i al registret og legger på esi+1

MUL dl - multipliser

MOV al, ah - Flytter ah inn i al

STOSB - Lagrer al inn i edi og incrementerer edi

LODSB esi - Henter ny byte inn i al...

MUL dl

MOV al, ah

STOSB

LODSB esi

MUL dl

MOV al, ah

STOSB

LODSB esi

MUL dl

MOV al, ah

STOSB

LODSB esi

MUL dl

MOV al, ah

STOSB

LODSB esi

MUL dl

MOV al, ah

STOSB

LODSB esi

MUL dl

MOV al, ah

STOSB

LODSB esi

MUL dl

MOV al, ah

STOSB

LODSB esi

MUL dl

MOV al, ah

STOSB

LODSB esi

MUL dl

MOV al, ah

STOSB

LODSB esi

MUL dl

MOV al, ah

STOSB

LODSB esi

MUL dl

MOV al, ah

STOSB

LOOP 0x15 - Loop til addresse ovenfor (gjentar til ecx = 0)

POP esi - Henter opp original esi fra stack

POP edi - Henter opp original edi fra stack

XOR eax, eax - Gjør en fancy mov eax,0 (rask og færre bytes...)

RET 0x0014 - Returner og poper fra stack mens den returnerer...

 

Denne rutinen ser ut til å laste inn masse tall og bearbeide dem(multiplisere store tall?) Så lagrer den tallene igjen. Hvis du ser på innholde i esi og edi når denne rutinen går, kan du ser bedre hva den gjør. Ett godt råd er å bruke en debugger og sjekke hvordan tingene flyter. Nå om dagen vil jeg anbefale Ollydbg.

(http://home.t-online.de/home/Ollydbg/)

 

Jeg tror den ganger sammen store tall og lagrer dem. Det store tallet pekes på av esi, mens edi er der det skal til.

 

Det ser ut som om den henter tallene ut fra en struktur. Typisk er en array eller en struct. Evt en klasse. Henter tllet fra ett sted og lagrer ett nytt...

 

Håper dette hjalp litt...

 

Pab ;)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...