Autor Beitrag
fuba
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 125

Win7
D7 Ent.
BeitragVerfasst: Mi 06.02.08 21:23 
tach zusammen.

ich hab ma ne frage:
ist es möglich, die exportes einer fremden DLL aufzurufen, wenn man die übergabe parameter nicht kennt?

die exports der DLL hab ich mit PE Explorer rausgefunden.

soweit ich gesehen habe, dürfte dies ne Dlephi DLL sein, da diese auch Forms enthält.

Die DLL enthält 5 Exports.

--

kann man da irgendwie genau rausfinden, wie man die exports ansteuern oder was auch immer muss?

Habs scho so versucht:
ausblenden Delphi-Quelltext
1:
procedure Export1; stdcallexternal 'myDLL.dll';					


aber da kommt immer:
Zugriffsverletzung bei Adresse 0012F708. Schreiben von Adresse 0560F588.
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Mi 06.02.08 21:28 
Die Namen der Prozeduren hast du schon?
Dann fehlen dir wohl nur noch die Parameter - und soweit ich weiß, kann man diese nicht "auslesen". Normalerweise liegt bei einer DLL ein Headerfile bei, wo der Aufbau der Prozeduren drinsteht.
Ich behaupte mal, dass du ohne dieses File nicht weiterkommst.
dummzeuch
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 593
Erhaltene Danke: 5


Delphi 5 ent, Delphi 6 bis Delphi XE8 pro
BeitragVerfasst: Mi 06.02.08 22:21 
user profile iconfuba hat folgendes geschrieben:
kann man da irgendwie genau rausfinden, wie man die exports ansteuern oder was auch immer muss?


Die Chancen stehen ziemlich schlecht. Du koenntest hoffen, dass die DLL die stdcall calling convention benutzt, dann raeumt die DLL-Routine den Stack auf, d.h. Du koenntest Dir ansehen, um wieviele Bytes der Stack korrigiert wird und damit einen Hinweis bekommen, wieviele Parameter uebergeben werden muessen. Aber dann weisst Du immernoch nicht, was sie bedeuten.

Oder Du suchst Dir ein Programm, welches die DLL benutzt und versuchst, die Parameteruebergabe zu analysieren. Auch das ist 'ne Menge Aufwand.

twm
fuba Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 125

Win7
D7 Ent.
BeitragVerfasst: Do 07.02.08 01:05 
Zitat:

Oder Du suchst Dir ein Programm, welches die DLL benutzt und versuchst, die Parameteruebergabe zu analysieren. Auch das ist 'ne Menge Aufwand.


hmm, wie könnte man sowas analysieren?
dummzeuch
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 593
Erhaltene Danke: 5


Delphi 5 ent, Delphi 6 bis Delphi XE8 pro
BeitragVerfasst: Do 07.02.08 09:24 
user profile iconfuba hat folgendes geschrieben:
Zitat:

Oder Du suchst Dir ein Programm, welches die DLL benutzt und versuchst, die Parameteruebergabe zu analysieren. Auch das ist 'ne Menge Aufwand.


hmm, wie könnte man sowas analysieren?


Du koenntest selbst eine DLL schreiben, die Du als Zwischenlayer zwischen dem Programm und der eigentlichen DLL laedst (gleicher Name, gleiche Exports, jeweils ohne Parameter, eigentliche DLL umbenennen und per LoadLibrary laden).
Da ich das selbst noch nie gemacht habe, kann ich Dir keine weiteren Tips dazu geben.

Aber sei gewarnt: Einfach wird das nicht. Versuche lieber, Dokumentation zu der DLL aufzutreiben und seien es C-Headerfiles, das ist in der Regel eine viel bessere Investition der Zeit.

twm
fuba Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 125

Win7
D7 Ent.
BeitragVerfasst: Do 07.02.08 22:06 
Zitat:

Aber sei gewarnt: Einfach wird das nicht. Versuche lieber, Dokumentation zu der DLL aufzutreiben und seien es C-Headerfiles, das ist in der Regel eine viel bessere Investition der Zeit.


Jo das denk ich mir, irgendwie ist nichts einfach :D
Aber die Headerfile zu bekommen, ist nicht so einfach, weil...

Das programm dass die dll aufruft hat:

1.
keine kontakt info, also kein plan wen ich da kontaktieren soll

2.
das Programm dass diese dll aufruft, verstößt warscheinlich gegen die Forum regeln,
was wiederrum erklären würde, warum da keine kontakt infos vorhanden sind :D

Zitat:

Du koenntest selbst eine DLL schreiben, die Du als Zwischenlayer zwischen dem Programm und der eigentlichen DLL laedst (gleicher Name, gleiche Exports, jeweils ohne Parameter, eigentliche DLL umbenennen und per LoadLibrary laden).
Da ich das selbst noch nie gemacht habe, kann ich Dir keine weiteren Tips dazu geben.


Eine dll zu schreiben, welche die gleichen exports hat sollte nicht so das problem sein.
Diese exports sollen ja auch keine fuktion haben oder doch?
Weil ich habe eher "WENIG" erfahrung um umgang mit DLL's
Wobei sich hier wieder die frage für mich stellt, warum wuss ich die originale dll mit LoadLibrary laden, bzw welchen sinn hätte das?

--

bin bis jetzt so weit, das ich weiß, wann das Programm welche funktion aufruft:
ausblenden volle Höhe Delphi-Quelltext
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:
library Project1;

uses
  Dialogs;

{$R *.res}

procedure PlgGetAbout;
begin
  showmessage('"PlgGetAbout" - aufgerufen');
end;

procedure PlgGetOptions;
begin
  showmessage('"PlgGetOptions" - aufgerufen');
end;

procedure PlgDestroy;
begin
  showmessage('"PlgDestroy" - aufgerufen');
end;

procedure PlgGetDirectLink;
begin
  showmessage('"PlgGetDirectLink" - aufgerufen');
end;

procedure PlgInit(i: integer);
begin
  showmessage('"PlgInit" - aufgerufen');
  showmessage(inttostr(i));
end;

exports
PlgGetAbout, PlgGetOptions, PlgDestroy, PlgGetDirectLink, PlgInit;
end.


wobei mir beim aufruft ne zahl zurückgegeben wird: 5104016

Die Zahl ist immer gleich, egel wie oft ich das programm / die dll ausführe.

// Edit

ok, das mit dem integer wert versteh ich irgendwie nicht :/

hab das jetzt mal von wert "i" bis wert "z" gemacht... aber da kommt nur mist raus :P

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
i: 5104016
j: 2090385624
k: 2089982699
l: 1244100
m: 13188280
n: 12890736
o: 13128704
p: 1244032
q: 5049329
r: 1244072
s: 13216824
t: 0
u: 5050296
v: 0
w: 5050168
x: 0
y: 0
z: 5104016
dummzeuch
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 593
Erhaltene Danke: 5


Delphi 5 ent, Delphi 6 bis Delphi XE8 pro
BeitragVerfasst: Do 07.02.08 22:44 
Zitat:
Zitat:

Du koenntest selbst eine DLL schreiben, die Du als Zwischenlayer zwischen dem Programm und der eigentlichen DLL laedst (gleicher Name, gleiche Exports, jeweils ohne Parameter, eigentliche DLL umbenennen und per LoadLibrary laden).
Da ich das selbst noch nie gemacht habe, kann ich Dir keine weiteren Tips dazu geben.


Eine dll zu schreiben, welche die gleichen exports hat sollte nicht so das problem sein.
Diese exports sollen ja auch keine fuktion haben oder doch?

Weil ich habe eher "WENIG" erfahrung um umgang mit DLL's
Wobei sich hier wieder die frage für mich stellt, warum wuss ich die originale dll mit LoadLibrary laden, bzw welchen sinn hätte das?


Die Idee war, dass Deine DLL die urspruengliche aufruft, so dass Du sehen kannst, welche Parameter uebergeben werden und was gegebenenfalls (in EAX) zurueckgegeben wird. Dazu musst Du uebrigens die calling convention stdcall verwenden und ausserdem etwas Stack-Manipulation betreiben, denn sonst funktioniert die Parameteruebergabe nicht.

Zitat:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure PlgInit(i: integer);
begin
  showmessage('"PlgInit" - aufgerufen');
  showmessage(inttostr(i));
end;

exports
PlgGetAbout, PlgGetOptions, PlgDestroy, PlgGetDirectLink, PlgInit;
end.


wobei mir beim aufruft ne zahl zurückgegeben wird: 5104016

Die Zahl ist immer gleich, egel wie oft ich das programm / die dll ausführe.

// Edit

ok, das mit dem integer wert versteh ich irgendwie nicht :/


Ich sach' ja, dass das nicht einfach ist. Und es ist auch nicht so, dass ich damit die grosse Erfahrung haette. Ich wuerde jetzt einen Breakpoint in die DLL-Funktion setzen und mir im CPU-Fenster den Stack anschauen und dabei versuchen herauszufinden, an welcher Stelle die Ruecksprung-Adresse steht. Daraus dann ermitteln, wieviele Parameter es gibt und mal versuchen, in das Programm rein zu debuggen und versuchen, herauszufinden, welche Art Parameter das sind (z.B. haben PChars bei der Uebergabe einen recht typischen Aufrufcode).
Wenn Du einen C-Compiler zur Verfuegung hast, kannst Du mal verschiedene Aufrufe der DLL programmieren und Dir den erzeugten Assemblercode ansehen, das kann dann weitere Hinweise ergeben.

Naja, wie schon gesagt: Mein Fachgebiet ist das nicht...

twm
fuba Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 125

Win7
D7 Ent.
BeitragVerfasst: Sa 09.02.08 13:30 
hmm ich denk ich lass das erstmal und schau mir mal die DLL programmierung genauer an, vielleicht ergibt sich inzwischen was ;)