aadnk Skrevet 5. februar 2004 Del Skrevet 5. februar 2004 (endret) 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 25. september 2004 av aadnk Lenke til kommentar
panbo Skrevet 17. februar 2004 Del Skrevet 17. februar 2004 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
aadnk Skrevet 19. februar 2004 Forfatter Del Skrevet 19. februar 2004 Tusen takk! Jo, jeg forstår det nå. Den LOOP-er gjennom alle bytene i en DIB array og multipliserer dem for å endre brightness. Den debuger-en var nyttig. Igjen, takk. Lenke til kommentar
GeirGrusom Skrevet 25. februar 2004 Del Skrevet 25. februar 2004 STOS - Store String (BYTE, WORD, DWORD) LODS - Load string (BYTE, WORD, DWORD) STOSB = Store string byte (char*) LODSB = Load string byte (char*) STOSB LODSB Source memory address Funnet fra Intel Instruction Set Referance Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå