Entwickler-Ecke

Sonstiges (Delphi) - C Code in Delphi


Delphi4Ever - Mo 03.03.08 19:38
Titel: C Code in Delphi
Hallo,
Ich habe Probleme diesen Codeteil zu übersetzen.
Vielen Dank für die Hilfe im Vorraus.



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 - Mo 03.03.08 20:55

So und was genau ist dein Problem?


Delphi4Ever - Mo 03.03.08 22:18

Also ich hab das so gemacht, es funktioniert aber nicht... Das Programm stürzt ab.


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 - 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 - Mo 03.03.08 22:33

Es ist eine externe Fehlermeldung:
'External Exception C0000008'


Sinspin - 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.


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;


Delphi4Ever - 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 - 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.


Delphi4Ever - Di 04.03.08 00:54

Nein leider finde ich keine Funktion mit dem angegeben Offset.
Aber ein interessantes Tool. :D
Danke


SAiBOT - Di 04.03.08 12:24

Hatte ähnliches Problem vor ein paar Tagen versuchs ma mit


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:
http://www.evilsoft.de/Projekte/SteamPasswordDecoder/

Den habe ich auch in Delphi geschrieben...

MfG


Delphi4Ever - Di 04.03.08 18:07

Vielen Dank habs hinbekommen :D