Toon posts:

[Assembly] DLL exports parameters achterhalen

Pagina: 1
Acties:
  • 101 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik ben bezig om uit te zoeken in hoeverre ik zelf bestanden in m'n freecom beatman kan krijgen.

De freecom wordt geleverd met een USBDLL2.DLL, waarin de functies zitten die ik nodig heb, bv de functie dll_fn_upload_file. Lijkt me duidelijk wat die functie moet doen.

Mijn vermoeden is dat deze functie als parameter vraagt de bestandslocatie, en of dat bestand naar het interne en/of externe geheugen moet. Nu heb ik die DLL met PE Explorer gedisassembleerd, en dat levert mij de volgende code op voor deze functie:

code:
1
2
3
4
5
6
7
8
9
10
11
        Align   16
 dll_fn_upload_file:
        mov eax,[esp+0Ch]
        mov ecx,[esp+08h]
        mov edx,[esp+04h]
        push    eax
        push    ecx
        push    edx
        call    SUB_L10002A90
        add esp,0000000Ch
        retn


Mijn assembly is niet meer wat het geweest is, en is nooit echt denderend geweest, maar als ik dit goed lees gebruiken ze hier 3 parameters (eax, ecx, edx). Hoe vind ik nu de types van deze parameters uit? (lijkt me overigens dat hij ook iets teruggeeft). Ik vraag niet om het antwoord, maar meer om de methode om dit antwoord te bepalen..

Voor alle volledigheid, hij called die SUB_L10002A90, hier even een stukje daaruit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
        push    FFFFFFFFh
        push    L10015448
        mov eax,fs:[00000000h]
        push    eax
        mov fs:[00000000h],esp
        sub esp,0000009Ch
        push    ebx
        push    ebp
        push    esi
        push    edi
        mov ecx,00000008h
        xor eax,eax
        lea edi,[esp+4Ah]
        mov byte ptr [esp+44h],23h
        mov byte ptr [esp+45h],00h
        mov byte ptr [esp+46h],04h
        mov byte ptr [esp+47h],3Ah
        mov byte ptr [esp+48h],4Dh
        mov byte ptr [esp+49h],52h
        mov esi,[esp+000000BCh]
        rep stosd
        stosw
        mov edi,esi
        or  ecx,FFFFFFFFh
        xor eax,eax
        repne scasb
        not ecx
        dec ecx
        lea edi,[esp+6Dh]
        mov [esp+18h],ecx
        mov ecx,0000000Fh
        mov [esp+6Ch],al
        rep stosd
        stosw
        lea ecx,[esp+34h]
        stosb
        call    SUB_L1000F12E

  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Hier is een tijdje terug een soortgelijk topic over geweest. Ik denk dat je in jouw geval het beste een debugger aan het programma dat de DLL gebruikt kan hangen en een breakpoint zet op de DLL functies zodat je ze 'live' aan het werk ziet (probeer ollydbg eens bijvoorbeeld).

www.madwizard.org


Verwijderd

Als de dll niet gecompileerd is met symbol informatie (wat vermoedelijk zo zal zijn), kan je de type informatie niet zomaar achterhalen.

Wat je het best kan doen, is het proces te starten waarmee je files kan uploaden, dat proces debuggen (bv met visual c++ of met de ddk debugger: http://www.microsoft.com/ddk/debugging/ ), vervolgens bepaalde breakpoints te plaatsen (op SUB_L10002A90), de file upload te starten, en als de debugger het proces onderbreekt op de breakpoint, te kijken welke informatie zich bevindt op de locatie waar de registers naar pointen.

Verwijderd

Topicstarter
Ik heb ollydbg even gedownload, en ben druk bezig, bedankt voor de tip.

Ik heb ontdekt dat ze 'download/upload' gebruiken vanuit de player bekeken, oftewel met upload haal je een bestand van de player af.

Tot zover gaat het goed, ik zie idd. de bestandsnaam voorbijkomen, en ook een aanduiding of hij het interne of externe geheugen moet gebruiken (intern=$000003E8, extern=$000007D0).

Hoe kan ik de volgorde van de parameters achterhalen? Hier geef ik 'm bijvoorbeeld de opdracht het bestandje 'HENRI.RES' uit de player te halen:
Afbeeldingslocatie: http://www.tweakers.net/ext/i.dsp?FotoAlbumID=1574&format=full&ext=.jpg (clickable)

Zoals ik al geconstateerd had gebruikt deze functie 3 parameters
1) de bestandsnaam in de player
2) het geheugen in de player
3) bestandsnaam op de computer

Je ziet die idd. terug in het screenshot, dus dat klopt allemaal wel. Het enige wat ik nu nog moet weten is in welke volgorde ik die parameters moet zetten, en of de volledige bestandsnaam ASCII "HENRIS .RES" is, of alleen "HENRIS .RES".

[ Voor 10% gewijzigd door Verwijderd op 01-02-2003 18:28 ]


  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Screenshot krijg ik niet te zien hoor :? Alleen de melding "Private storage is alleen te gebruiken door mensen met een betaald account. (...)"

Aan de call te zien is het een functie met C(++) calling convention, dus parameters van rechts naar links op de stack gezet (bij dll_fn_upload_file dus func(edx,ecx,eax)). Als je aan het begin van de functie staat (de push FFFFFFFFh in je voorbeeld) staat de eerste parameter op [esp+4], de 2e op [esp+8] en de 3e op [esp+12]. Als je ze uit de stacktrace van ollydbg haalt dus van boven naar beneden.

"ASCII" hoort niet bij de parameter, de quotes ook niet. Dat doet ollydbg alleen om aan te geven dat ie een ascii string pointer herkent.

www.madwizard.org


Verwijderd

Topicstarter
Het plaatje zou nu wel moeten werken.. het zijn idd c++ calling convention functies, er is nl 1 functie waar wel een omschrijving bij zit en daar staat idd bij dat het c++ is.

//edit

om precies te zijn:
code:
1
2
?dll_fn_replace_file@@YAHPADHH@Z; Index 1;
Undecorated C++ Function: int __cdecl dll_fn_replace_file(char *,int,int)

[ Voor 34% gewijzigd door Verwijderd op 01-02-2003 19:10 ]


Verwijderd

Topicstarter
Ik ben een stapje verder. Ik heb even een simpele opdracht genomen, nl. het verwijderen van een bestandje uit de player. Deze gebruikt 2 parameters, de bestandsnaam en het geheugen. In principe gaat alles goed, het bestand wordt daadwerkelijk verwijderd, echter daarna krijg ik een AV om m'n oren. Ik heb het vermoeden dat dit is omdat de dll een waarde terug wil geven aan mijn applicatie, ik kan er echter niet achter komen hoe en wat.

Nu heb ik gezien dat er bij het originele programma een opmerking staat als
code:
1
RETURN to Digital_.0048FD30 from <JMP.&USBDLL2.dll_fn_delete_file>


wat wordt hier mee bedoeld?

//edit
excuses, ik had even moeten editten, zat niet op te letten..

//edit2

ok, ik ben er uit.. ik had 'stdcall' gebruikt ipv 'cdecl'.. nu werkt 't allemaal wel, bedankt voor de hulp!

[ Voor 17% gewijzigd door Verwijderd op 01-02-2003 20:53 ]

Pagina: 1