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..68] of 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.
Delphi4Ever 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..68] of 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); 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!