CryptUnprotectData und CryptStringToBinary definieren

Antworten
Pseudo
Beiträge: 21
Registriert: Fr 28. Sep 2012, 17:31

CryptUnprotectData und CryptStringToBinary definieren

Beitrag von Pseudo »

Hallo Lazarusforum,

ich versuche bereits eine Weile die Funktionen CryptUnprotectData und CryptStringToBinary zu definieren:

Code: Alles auswählen

function CryptUnprotectData(pDataIn: PDATA_BLOB; ppszDataDescr: PLPWSTR; pOptionalEntropy: PDATA_BLOB; pPromptStruct: Pointer;  dwFlags: DWORD; pDataOut: PDATA_BLOB): Boolean; external 'Crypt32' name 'CryptUnprotectData';
 
function CryptStringToBinary(pszString: LPCSTR; cchString: DWORD; dwFlags: DWORD; pbBinary: PByte; pcbBinary: PDWORD; pdwSkip: PDWORD; pdwFlags: PDWORD): Boolean; external 'Crypt32' name 'CryptStringToBinaryA';
 


Nur gibt es beim Aufruf immer eine SIGSEGV :(

Gibt es schon eine Unit, in der diese Funktionen definiert sind? Und warum sind meine Definitionen falsch?

Danke

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: CryptUnprotectData und CryptStringToBinary definieren

Beitrag von theo »

Lazarus hat ein tolles Feature, welches leider etwas versteckt ist.

Schreibe einfach irgendwo, wo es passen könnte, den gesuchten Funktionsnamen in den Code.
Dann kompiliere. Du erhältst jetzt eine Fehlermeldung im Nachrichtenfenster.
z.B.
unit1.pas(35,1) Error: Identifier not found "CryptUnprotectData"

Clicke mit der rechten Maustaste da drauf und wähle aus dem Kontextmenu "Suche Bezeichner".

Jetzt öffnet sich ein Fenster. Wähle dort bei Bereich z.B. Lazarus-IDE aus. Nun wird die Unit gesucht, die diese Funktion enthält.

Das Rätselraten hat ein Ende. (Find-in-Files hätte natürlich auch geklappt).

Pseudo
Beiträge: 21
Registriert: Fr 28. Sep 2012, 17:31

Re: CryptUnprotectData und CryptStringToBinary definieren

Beitrag von Pseudo »

Danke :D

Leider bringt die gefundene Funktion (in der Unit jwaWindows) einen Fehler beim Aufrufen hervor, denn sie lädt die Funktion dynamisch und sucht in der advapi32.dll, die Funktion befindet sich jedoch in der Crypt32.dll...

Da ich leider sehr viel mit der Windows-API arbeiten muss, und dort unter Lazarus leider nur sehr wenige (halt die wichtigsten) Funktionen bereits definiert sind, werde ich zumindest für dieses Projekt zu C++ wechseln (schade :( Ich dachte, dieses große Projekt könnte ich mit weniger Aufwand unter Lazarus schreiben und muss nicht meine verstaubten C++ Kenntnisse nutzen)

Danke für die Hilfe

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: CryptUnprotectData und CryptStringToBinary definieren

Beitrag von theo »

Wenn das wirklich so ist, kannst du aber wenigstens die Deklaration übernehmen für deine eigene Variante.
Stdcall fehlt z.B.

Pseudo
Beiträge: 21
Registriert: Fr 28. Sep 2012, 17:31

Re: CryptUnprotectData und CryptStringToBinary definieren

Beitrag von Pseudo »

Jetzt wirds langsam echt komisch :O :

Code: Alles auswählen

function DecryptKey(szKey: String): String;
var
  byKey: Array[0..1024] of Byte;
  cbBinary, dwFlags, dwSkip: DWORD;
  DataOut, DataVerify: DATA_BLOB;
  i: Integer;
begin
  cbBinary := sizeof(byKey);
  CryptStringToBinaryA(PChar(@szKey[1]), Length(szKey), 4, @byKey, cbBinary, @dwFlags);
  DataOut.cbData := cbBinary;
  DataOut.pbData := @byKey;
  IF CryptUnprotectData(@DataOut, nil, nil, nil, nil, 0, @DataVerify) Then WriteLn('SU');
  DataOut.pbData:=Nil;
  DAtaOut.cbData:=0;
  DataVerify.cbData:=0;
  DataVerify.pbData:=nil;
  Result := 'ASD';
end;


Dieser Code funktioniert wunderbar! Naja, zumindest fast! Wenn man mit dem Debuggger schaut, welchen Wert DataVerify.pbData hat, sehe ich den richtigen Wert und es kommt innerhalb der Funktion zu keinem Fehler! Erst wenn die Funktion beendet wird (ich lasse den Debugger bei

Code: Alles auswählen

Result := 'ASD'
halten) und wieder in die Main Funktion gesprungen wird, kommt der Fehler! An der Main kanns nicht liegen, die macht nahc diesem Aufruf nämlich nichtsmehr! Mit dem Assembler kenne ich mich nicht aus, aber das steht dick oben drüber: "fpc_reraise (74)" und die stelle an der er hält ist: "00409683 c7400c00000000 movl $0x0,0xc(%eax)"

Ich hoffe ihr könnt mir helfen :D

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: CryptUnprotectData und CryptStringToBinary definieren

Beitrag von theo »

Wie importierst du die Funktionen jetzt? (Code)

Hast du mal alle Checks eingeschaltet?

Was ist ohne diese Nil und 0 Geschichten am Ende? Vielleicht nochmal alle Dokus lesen, z.B.

Code: Alles auswählen

LocalFree(DataOut.pbData);

Pseudo
Beiträge: 21
Registriert: Fr 28. Sep 2012, 17:31

Re: CryptUnprotectData und CryptStringToBinary definieren

Beitrag von Pseudo »

Die Frees am Ende habe ich gemacht, da ich dachte, es leigt vlt an nicht freigegebenen Resourcen...
Die Definition von "CryptStringToBinaryA" ist die aus jwaWindows, die von "CryptUnprotectData" habe ich selber gemacht:

Code: Alles auswählen

function CryptUnprotectData(pDataIn: PDATA_BLOB; ppszDataDescr: PLPWSTR; pOptionalEntropy: PDATA_BLOB; pvReserved: Pointer; pPromptStruct: PCRYPTPROTECT_PROMPTSTRUCT; dwFlags: DWORD; pDataOut: PDATA_BLOB): BOOL; stdcall; external 'crypt32.dll' Name 'CryptUnprotectData';


Beide geben ja das richtige Ergebnis, nur nach beenden meiner Funktion kommt es zu einem SIGSEGV...

Danke :D

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: CryptUnprotectData und CryptStringToBinary definieren

Beitrag von theo »

Soll ich jetzt den Kindergartenmodus einschalten?

Bist du meinen Tipps nachgegangen?
Lies nochmal meine Anworten, da gibt es noch drei Tipps, für die ich kein Feedback von dir habe.
Könntest du die mal beantworten?

Pseudo
Beiträge: 21
Registriert: Fr 28. Sep 2012, 17:31

Re: CryptUnprotectData und CryptStringToBinary definieren

Beitrag von Pseudo »

Warte:

"Hast du mal alle Checks eingeschaltet?" Ja, aber kein Unterschied.

"Was ist ohne diese Nil und 0 Geschichten am Ende?" Genau das selbe, wie ich bereits geschrieben habe, habe ich die erst nachdem der Fehler aufgetreten ist überhaupt hinzugefügt.

Danke

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: CryptUnprotectData und CryptStringToBinary definieren

Beitrag von theo »

Und LocalFree(DataOut.pbData) ?

Pseudo
Beiträge: 21
Registriert: Fr 28. Sep 2012, 17:31

Re: CryptUnprotectData und CryptStringToBinary definieren

Beitrag von Pseudo »

Hilf leider auch nicht... Hab ich irgendeinen Bezeichner verwendet, der intern verwendet wird? Irgendsowas muss es doch eigentlich sein. Alle "gefährlichen" WinAPI Funktionen funktionieren. Die Funktion wird beendet (eigentlich, damit sogar das ganze Programm) und dann tritt ein FEhler auf :O

Antworten