Доступ к памяти, на которую указывает PAnsiChar в Inno Setup Pascal Script - PullRequest
1 голос
/ 25 июня 2019

Необходимо использовать API шифрования Win32 для преобразования пароля в зашифрованный BLOB-объект перед передачей в дочерний процесс.

Попытка использовать CryptProtectData@crypt32.dll API для выполнения шифрования. Функция возвращает успех. Но я столкнулся с проблемой при доступе к возвращенному зашифрованному BLOB-объекту.

Пытался использовать StrPas() для преобразования PAnsiChar в AnsiString, но я получаю "Неверный идентификатор" ошибка.

const
  CRYPTPROTECT_LOCAL_MACHINE = $4;

type
  DataBlob = record
    cbData: Longword;
    pbData: PAnsiChar;
  end;

function CryptProtectData(var pDataIn: DataBlob;
  szDataDescr, pOptionalEntropy, pvReserved, pPromptStruct : DWORD;
  dwFlags: DWORD; var pDataOut: DataBlob): Boolean;
  external 'CryptProtectData@crypt32.dll stdcall delayload';

var
  Password: AnsiString;

function Encrypt(): Boolean;
var
  DataBlobIn, DataBlobOut: DataBlob
  EncryptStr: AnsiString;
begin
  DataBlobIn.cbData := Length(Password);
  DataBlobIn.pbData := Password;
  if CryptProtectData(DataBlobIn, 0, 0, 0, 0, CRYPTPROTECT_LOCAL_MACHINE, DataBlobOut) then
  begin
    Log('Success');

    { Using StrPas gives an 'unknown identifier error' }
    EncryptStr := StrPas(DataBlobOut.pbData);
  end;
end;

Размер возвращаемого блоба памяти DataBlobOut.cbData, но как получить доступ к блобу памяти, возвращенному в DataBlobOut.pbData?

Не могли бы вы указать пример кода, где мы можем получить доступ к памяти длиной X?

1 Ответ

1 голос
/ 25 июня 2019

Чтобы скопировать данные из указателя памяти в буферную переменную Inno Setup (например, AnsiString), вы можете использовать RtlMoveMemory Функция WinAPI :

procedure RtlMoveMemory(Dest: AnsiString; Source: PAnsiChar; Len: Integer);
  external 'RtlMoveMemory@kernel32.dll stdcall';

Вы можете использовать его как:

{ Allocate memory }
SetLength(EncryptStr, DataBlobOut.cbData);
{ Copy data }
RtlMoveMemory(EncryptStr, DataBlobOut.pbData, DataBlobOut.cbData);
...