私はChromeからパスワードを取得するリカバリアプリを作成しています。それはGUIを持っているので、SQLConnectionとSQLQueryの両方を使用するSQLiteラッパーを使用しました。ここに私のコードのスニップです:CryptUnprotectDataを含むRAD Studio CreateBlobStreamが余分な文字を返すのはなぜですか?
//Create our blob stream
TStream *Stream2 = SQLQuery1->CreateBlobStream(SQLQuery1->FieldByName("password_value"), bmRead);
//Get our blob size
int size = Stream2->Size;
//Create our buffer
char* pbDataInput = new char[size+1];
//Adding null terminator to buffer
memset(pbDataInput, 0x00, sizeof(char)*(size+1));
//Write to our buffer
Stream2->ReadBuffer(pbDataInput, size);
DWORD cbDataInput = size;
DataOut.pbData = pbDataInput;
DataOut.cbData = cbDataInput;
LPWSTR pDescrOut = NULL;
//Decrypt password
CryptUnprotectData(&DataOut,
&pDescrOut,
NULL,
NULL,
NULL,
0,
&DataVerify);
//Output password
UnicodeString password = (UnicodeString)(char*)DataVerify.pbData;
passwordgrid->Cells[2][i] = password;
出力データは、何かが私のヌルターミネータと間違っていたかのように振る舞うを除いて、正常に見えます。ここでは、出力はすべての行に次のようになります。私が読んだ
CryptUnprotectData
ため
Windowsのドキュメント:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa382377.aspx
CreateBlobStream
ため
エンバカデロのドキュメント:
http://docwiki.embarcadero.com/Libraries/en/Data.DB.TDataSet.CreateBlobStream
のmemset:
http://www.cplusplus.com/reference/cstring/memset/
ありがとう、私はそれがヌルターミネーターと何か関係がありました。あなたの答えをアップアップする。 –