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 =>
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?

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?