Autor Beitrag
Delphi4Ever
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mo 03.03.08 19:38 
Hallo,
Ich habe Probleme diesen Codeteil zu übersetzen.
Vielen Dank für die Hilfe im Vorraus.


ausblenden 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:
int (*funcdll)(const uint8_t *p, const int length, const void *xp);

    struct {
        uint32_t    n1;       
        uint8_t     *it;     
        uint32_t    n2;       
        uint32_t    n3;       
        uint32_t    n4;     
        uint32_t    len;   
        uint32_t    n5;       
        uint8_t     n6[40]; 
    } struct_dll;

    hLib = LoadLibrary(DLL);
    if(!hLib) std_err();

    funcdll = (void *)hLib + OFFSET;

    memset(&struct_dll, 0, sizeof(struct_dll));

    funcdll(stritt, strlen(stritt), &struct_dll);

    es = strdup(struct_dll.it);
    FreeLibrary(hLib);
alias5000
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2145

WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
BeitragVerfasst: Mo 03.03.08 20:55 
So und was genau ist dein Problem?

_________________
Programmers never die, they just GOSUB without RETURN
Delphi4Ever Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mo 03.03.08 22:18 
Also ich hab das so gemacht, es funktioniert aber nicht... Das Programm stürzt ab.

ausblenden 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:
type
  Tfuncdll = function(const p: PByte; const length: LongInt; const xp: Pointer): LongInt;
(...)
var
  hLib: THandle;
  struct_dll: Array[1..68of Byte;
  funcdll : Tfuncdll;
  stritt, es, DLL: String;
begin
  (...)
  hLib := LoadLibrary(PChar(DLL));
  try
    if hLib <> 0 then
    begin
      funcdll := Tfuncdll(hLib  + OFFSET);
      FillMemory(@struct_dll, SizeOf(struct_dll), 0);
      funcdll(PByte(stritt), Length(stritt), @struct_dll);
      es := ByteToString(struct_dll[4]);
    end;
  finally
    FreeLibrary(hLib);
  end;
end;
Regan
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: Mo 03.03.08 22:26 
Erstmal :welcome: hier im Forum.
user profile iconDelphi4Ever hat folgendes geschrieben:
Also ich hab das so gemacht, es funktioniert aber nicht... Das Programm stürzt ab.

Wenn du uns jetzt noch eine Fehlermeldung sagen könntest, dann wär das noch besser.
Delphi4Ever Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mo 03.03.08 22:33 
Es ist eine externe Fehlermeldung:
'External Exception C0000008'
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Mo 03.03.08 23:59 
hLib+OFFSET finde ich schon ein bisschen heftig!
Da brauch man nur ein Byte daneben sein und schon hat man einen haufen Schrott.
Wenn du schon dynamisch binden willst, solltest du nicht mit dem Offset arbeiten sondern mit dem Index oder Name.
Was dann mit GetProcAddress geht.
Zudem: wenn du Strings an eine DLL übergibst dann nicht einfach in den gewünschten Typ umwandeln, wie hier, sondern entweder in ein statisches Array kopieren und das übergeben oder vorher auf PChar Casten.
in dem C-Quelltext steht es ja eigentlich ganz deutlich uint8: das ziehlt auf Byte Array.

ausblenden 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:
type
  Tfuncdll = function(const p: PByte; const length: LongInt; const xp: Pointer): LongInt;
(...)
var
  hLib: THandle;
  struct_dll: Array[1..68of Byte;
  funcdll : Tfuncdll;
  stritt, es, DLL: String;
begin
  (...)
  hLib := LoadLibrary(PChar(DLL));
  try
    if hLib <> 0 then
    begin
      funcdll := GetProcAddress(hLib, 'TheName??'); 
      FillMemory(@struct_dll, SizeOf(struct_dll), 0);
      funcdll(PByte(PChar(stritt)), Length(stritt), @struct_dll); // erst PChar! dann PByte, wenn überhaupt!
      es := ByteToString(struct_dll[4]);
    end;
  finally
    FreeLibrary(hLib);
  end;
end;

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
Delphi4Ever Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Di 04.03.08 00:10 
Erstmal vielen Dank für die Antwort, das Problem ist nur, dass ich nicht den Namen der Funktion habe.
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Di 04.03.08 00:37 
Den kann man aber rausbekommen indem man sich die DLL mal mit einem Tool anschaut das die Exporttabelle vollständig anzeigen kann.
So wie mein PESpy (ist leider nicht ganz fertig geworden. Man kann noch keine Ressourcen anschauen, aber das brauchst du ja auch nicht.)

Also Dll drauf schmeißen und dann die Exports ansehen.
Da gibt es eine Spalte RVA, das ist dein Offset (in Hex). Ganz hinten müsste dann der Name stehen.
Soweit es sich um eine offizielle exporte Funktion handelt ist sie dabei.
Einloggen, um Attachments anzusehen!
_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
Delphi4Ever Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Di 04.03.08 00:54 
Nein leider finde ich keine Funktion mit dem angegeben Offset.
Aber ein interessantes Tool. :D
Danke
SAiBOT
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 323
Erhaltene Danke: 6

XP SP2; 7
D7; D2009
BeitragVerfasst: Di 04.03.08 12:24 
Hatte ähnliches Problem vor ein paar Tagen versuchs ma mit

ausblenden Delphi-Quelltext
1:
Tfuncdll = function(const p: PByte; const length: LongInt; const xp: Pointer): LongInt; stdcall;					


Der Code kommt mir sehr bekannt vor ;).
Vll interessiert dich dieser Link:
www.evilsoft.de/Proj...teamPasswordDecoder/

Den habe ich auch in Delphi geschrieben...

MfG
Delphi4Ever Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Di 04.03.08 18:07 
Vielen Dank habs hinbekommen :D