Assembler Verständniss

Hiho ;)

Das ist mein erster Beitrag (seit sehr langem) in diesem Forum, deswegen möchte ich mich kurz
vorstellen. Ich nenne mich üblicherweise Dandro(lvorn) und bin im Moment
19 Jahre alt. Immoment möchte ich gerne näher kennenlernen, wie assembler
funktioniert, und alles drumherum.

Da kommt schonmal die ein oder andere Frage auf, und ich versuche mal meine
erste so gut es geht, rüberzubringen ...
____________________________________________________

Ich habe einen Assembler-Code, aus OllyDbg kopiert, der für mich einen
Funktionsblock darstellt. Innerhalb dieser Funktion wird die WSASendTo()
Methode aufgerufen (Mittels Breakpoints hingefunden), der zweite Parameter
laut MSDN
ist ein Pointer auf ein Array aus Buffern (genauer WSABuffer).
Als nächstes füge ich hier mal den Code-Abschnitt ein =>

Code:
009AC1F0  /$ 53             PUSH EBX
009AC1F1  |. 8B5C24 08      MOV EBX,DWORD PTR SS:[ESP+8]
009AC1F5  |. 8B93 B4040000  MOV EDX,DWORD PTR DS:[EBX+4B4]
009AC1FB  |. 55             PUSH EBP
009AC1FC  |. 56             PUSH ESI
009AC1FD  |. 57             PUSH EDI
009AC1FE  |. 33FF           XOR EDI,EDI
009AC200  |. 33C0           XOR EAX,EAX
009AC202  |. 85D2           TEST EDX,EDX
009AC204  |. 8DB3 6C020000  LEA ESI,DWORD PTR DS:[EBX+26C]
009AC20A  |. 7E 0E          JLE SHORT app.009AC21A
009AC20C  |. 8D6424 00      LEA ESP,DWORD PTR SS:[ESP]
009AC210  |> 033CC6         /ADD EDI,DWORD PTR DS:[ESI+EAX*8]
009AC213  |. 83C0 01        |ADD EAX,1
009AC216  |. 3BC2           |CMP EAX,EDX
009AC218  |.^7C F6          \JL SHORT app.009AC210
009AC21A  |> 8B83 B8040000  MOV EAX,DWORD PTR DS:[EBX+4B8]
009AC220  |. 85C0           TEST EAX,EAX
009AC222  |. C74424 14 FFFF>MOV DWORD PTR SS:[ESP+14],-1
009AC22A  |. 74 07          JE SHORT app.009AC233
009AC22C  |. 8380 00010000 >ADD DWORD PTR DS:[EAX+100],1
009AC233  |> 8B4424 18      MOV EAX,DWORD PTR SS:[ESP+18]
009AC237  |. 8B49 30        MOV ECX,DWORD PTR DS:[ECX+30]
009AC23A  |. 6A 00          PUSH 0                                   ; /Callback = NULL
009AC23C  |. 6A 00          PUSH 0                                   ; |pOverlapped = NULL
009AC23E  |. 6A 10          PUSH 10                                  ; |ToLength = 10 (16.)
009AC240  |. 50             PUSH EAX                                 ; |pTo
009AC241  |. 8B83 B4040000  MOV EAX,DWORD PTR DS:[EBX+4B4]           ; |
009AC247  |. 6A 00          PUSH 0                                   ; |Flags = 0
009AC249  |. 8D5424 28      LEA EDX,DWORD PTR SS:[ESP+28]            ; |
009AC24D  |. 52             PUSH EDX                                 ; |pBytesSent
009AC24E  |. 50             PUSH EAX                                 ; |nBuffers
009AC24F  |. 56             PUSH ESI                                 ; |pBuffers
009AC250  |. 51             PUSH ECX                                 ; |Socket
009AC251  |. FF15 0417B300  CALL DWORD PTR DS:[<&WS2_32.WSASendTo>]  ; \WSASendTo
009AC257  |. 8B2D 4017B300  MOV EBP,DWORD PTR DS:[<&WSOCK32.#111>]   ;  WS2_32.WSAGetLastError
009AC25D  |. 8BF0           MOV ESI,EAX
009AC25F  |. 83FE FF        CMP ESI,-1
009AC262  |. 75 12          JNZ SHORT app.009AC276
009AC264  |. FFD5           CALL EBP                                 ; [WSAGetLastError
009AC266  |. 3D E5030000    CMP EAX,3E5
009AC26B  |. 75 09          JNZ SHORT app.009AC276
009AC26D  |. 8BC7           MOV EAX,EDI
009AC26F  |. 5F             POP EDI
009AC270  |. 5E             POP ESI
009AC271  |. 5D             POP EBP
009AC272  |. 5B             POP EBX
009AC273  |. C2 0C00        RETN 0C
009AC276  |> FFD5           CALL EBP
009AC278  |. 8BC8           MOV ECX,EAX
009AC27A  |. 81E9 33270000  SUB ECX,2733
009AC280  |. 74 05          JE SHORT app.009AC287
009AC282  |. 83E9 14        SUB ECX,14
009AC285  |. 75 06          JNZ SHORT app.009AC28D
009AC287  |> 33F6           XOR ESI,ESI
009AC289  |. 897424 14      MOV DWORD PTR SS:[ESP+14],ESI
009AC28D  |> 8B5424 14      MOV EDX,DWORD PTR SS:[ESP+14]
009AC291  |. 6A 00          PUSH 0
009AC293  |. F7DE           NEG ESI
009AC295  |. 53             PUSH EBX
009AC296  |. 1BF6           SBB ESI,ESI
009AC298  |. 52             PUSH EDX
009AC299  |. 23F0           AND ESI,EAX
009AC29B  |. 56             PUSH ESI
009AC29C  |. E8 EFFCFFFF    CALL app.009ABF90
009AC2A1  |. 8B4424 14      MOV EAX,DWORD PTR SS:[ESP+14]
009AC2A5  |. 5F             POP EDI
009AC2A6  |. 5E             POP ESI
009AC2A7  |. 5D             POP EBP
009AC2A8  |. 5B             POP EBX
009AC2A9  \. C2 0C00        RETN 0C

Dieser Parameter interessiert mich, bzw. was mit den Arrays vor dem versenden passiert. Meiner Meinung nach wird mit "PUSH ESI" der Pointer
auf den Stack gelegt, und mit "LEA ESI,DWORD PTR DS:[EBX+26C]"
die Speicheradresse von [EBX+26C] in ESI gesichert.

Nun zu meiner Frage, wie verfolge ich das am besten weiter? Ist die Adresse
von EBX statisch, also wird [EBX+26C] immer zum gleichen Ergebniss kommen?
Was kann ich tun? Passiert innerhalb dieses Blocks noch irgendwas mit dem
Pointer oder gar dem Array?
 
Erstmal ein Tipp: wenn du Assembler lernen willst, ist es vielleicht angebracht mit etwas leichterem anzufangen. Schau dir am besten mal die ganzen Beispielprogramme an, die mit MASM mitgeliefet werden. Ich fand sie sehr hilfreich.

Nun zu meiner Frage, wie verfolge ich das am besten weiter? Ist die Adresse
von EBX statisch, also wird [EBX+26C] immer zum gleichen Ergebniss kommen?
Was kann ich tun? Passiert innerhalb dieses Blocks noch irgendwas mit dem
Pointer oder gar dem Array?
Also EBX ist ein Register und da kann man alles mögliche reinschreiben (4 Bytes groß), ist also nicht statisch. So richtig Array kann man das nicht nennen, ist halt der Speicher ohne große Begrenzungen. Hab mir den Code jetzt nicht näher angeschaut, kann ohne Zusammenhang nix mit anfangen. Kleine Anleitung, wie man Daten aus dem Speicher (Dump) in die Register laden kann und umgekehrt:

Code:
mov eax,dword ptr[esi];läd 4 Bytes aus dem Speicher mit der Adresse aus ESI ins EAX Register
mov dword ptr[esi],eax;das Gleiche in umgekehrter Richtung

dword (Doppelwort) = 4 Bytes
word (Wort) = 2 Bytes

eax = 4 Bytes
ax = 2 Bytes
ah/al = 1 Byte

also ginge auch: mov al,byte ptr[esi+5]
(Byte von Adresse esi+5 ins erste Byte des eax Registers - Wert von esi wird nicht verändert)

Ansonsten klick in Olly dann mal mit der rechten Maustaste auf ein Register (falls es als Pointer benutzt wird) und wähle "Follw in Dump"
 
Joa, danke schonmal für die Antwort ;)

Da muss ich wohl noch weiter ausholen als ich dachte ^^ Eigentlich möchte ich nur den
Codeabschnitt finden, der das Array von Buffern (Darauf zeigt der Pointer aus ESI), in
irgendeiner Art und Weise verschlüsselt, und mit "Follow in dump" bin ich nicht ganz
zurecht gekommen ... :D Gibt es vielleicht noch andere Methoden dem Pointer zu folgen?
Denn irgendwo muss ja die Adresse in ESI nochmal auftauchen, damit der Algorithmus
das Array bearbeiten kann ...
 
Zurück
Oben