# Funktionen aus DLLs nutzen



## Rene Albrecht (22. Oktober 2003)

Hi,

ich habe eine DLL, deren Name auf interessante Funktionen schließen läßt. Leider hat mein C-Compiler (LCCwin32) keine Headerdateien etc. dafür.

1. Wie bekomme ich heraus, welche Funktionen die DLL bietet?
2. Wie binde ich die Funktionen in meinen C-Code ein?
2. Wie erzeuge ich ggf. die zum Kompilieren/Linken benötigten Headerdateien, LIBs etc. (nicht auf o.g. Compiler beschränkt)?

Ich hoffe, ich bekomme von Euch Anregungen...

Gruß
René


----------



## rockbaer (23. Oktober 2003)

Du kannst die dll in einem disassembler öffnen, zb. ida pro (eine demo version kriegste auf http://www.datarescue.com) und dann auf den function tab klicken, dann listet der dir alle funktionen aus der dll auf.


----------



## Rene Albrecht (23. Oktober 2003)

Okay... hab ich! 

Aber wie binde ich diese Funktionen dann in mein C-Programm ein?


----------



## rockbaer (23. Oktober 2003)

Hier ist ein source den ich mal gemacht habe, um eine Funktion aus der msvbvm60.dll zu nutzen (ich habe den eben noch mal mit lcc kompiliert, er sollte gehen).  Eventuell hilft er dir ja weiter...


----------



## Rene Albrecht (23. Oktober 2003)

Danke für den Source, habe ihn (mit LCCwin32) kompiliert und die EXE läuft und macht das, was sie machen soll.  

Habe auch mit Erfolg versucht, (mittels der Demo von WDasm32) die Einsprungadresse für eine Funktion der "unbekannten" DLL zu bekommen.  

Allerdings erfahre ich auf diese Weise lediglich den Namen der Funktion und nicht die Art und Anzahl der zu übergebenen Parameter sowie die Art des Returns der Funktion. Kann mir dazu vielleicht auch noch jemand weiterhelfen?  

Aber bis hierher war das schonmal eine Riesenhilfe, Danke nochmal @rockbaer


----------



## rockbaer (23. Oktober 2003)

Wie gesagt IDA gibt dir auch die Parameter anzahl der Funktion .
Könnte man mal den Namen der dll wissen ?


----------



## Rene Albrecht (23. Oktober 2003)

Sorry, Datarescue wollte eine request-Mail für die Demoversion von IDA pro, deshalb hab ich die Demo von WDasm32 genutzt. Und genau DIE zeigte mir leider nicht an, welche Parameter ich mitzugeben habe... 

Schau dir mal bitte *diese* DLL an. Man munkelt, dass wäre die genannte... 

Nachtrag:Mich interessiert speziell die Funktion acs_query_drive!


----------



## rockbaer (24. Oktober 2003)

Also diese Dll ist in einem ganz bestimmten Kontext zu sehen, die Parameter Anzahl für acs_query_drive beträgt 2, ich denke mal mit den Drives sind die gemeint, die das Prog Cerberus anlegt, du müsstest dich eventuell (vielleicht hast du das auch schon) in das Cerberus File-System einarbeiten. Auf der Site habe ich zu der dll keinerlei readme gesehen.


----------



## Rene Albrecht (24. Oktober 2003)

die dll kommuniziert mit einem bandroboter - hat weniger mit dem cerberus zu tun (frag mich nicht, warum die dll dort zu finden ist). die dll gehört zu einem produkt namens "libattach" der firma storagetek. mich würde insbesondere interesssieren welchen typ die parameter haben. aber das ist wohl nicht rauszufinden.


----------



## chibisuke (24. Oktober 2003)

musste wohl ausprobieren...

im prinzip gibts ja nur 5 typen, alle anderen sind dann daraus abzuleiten

nämlich long --> alle parameter werden per defitnition auf 32bit erweitert
pointer --> alle pointer sind gleich, der typ eines pointers ist nur beim dereferenzieren wichtig, also nix worum du dich kümmern musst
float --> klar
double --> naja eigendlich selten verwendet
__int64 --> 64bit datentypens sind extrem selten im einsatz.

und dann kannst du einfach ausprobieren...

der einzige datentyp den man ziemlich sicher feststellen kann ist ein pointer
prinziell wenn du an einem platz wo ein pointer gehöhrt einen ungültigen pointer übergibt (versuch mal ((unsigned)-5))) dann stürzt das programm an der stelle ab.. auf jedenfall aber im debugger ausführen, denn wenn die DLL den abstorz abfang (was viele programme heutzutage tun) dann merkst du das gar nicht so richtig, aber der debugger zeicht dir nachricht eines 0xC0000005 an (Access Violation)
damit kannst du pointer ziemlich sicher erkennen..

was den rest betrifft, da würd ich zuerst long/int versuchen, und wenn du feststellst es funnktioniert nich, dann erstmal float und naja.. dann eben die anderen beiden...


----------

