Delphi: зашифрованный файл ресурсов - PullRequest
0 голосов
/ 19 апреля 2011

У меня есть эта функция, которая должна зашифровывать байты из файла ресурсов, но это просто сбивает мое приложение:

function crypt(src: Pointer; len: DWORD): DWORD;
var
  B: TByteArray absolute src;
  index: DWORD;
begin
  for index := 0 to len - 1 do
  begin
    B[index] := B[index] xor 5; //just to test if its working
  end;
  result := 1;
end;

Я использую это так:

hFind := FindResource(...);
size := SizeOfResource(HInstance, hFind);
hRes :=LoadResource(HInstance, hFind);
bytes :=LockResource(hRes);
crypt(bytes, size);

если я не вызываюФункциональная программа crypt работает.Что я делаю не так?

Ответы [ 2 ]

4 голосов
/ 19 апреля 2011

У вас две проблемы с этим кодом.Во-первых, это байтовый массив, его элементы не содержат данные о вашем ресурсе, а случайные данные, начиная с адреса вашего указателя 'src'.Используйте указатель на TByteArray следующим образом:

var
  B: PByteArray absolute src;              
  index: DWORD;
begin
  for index := 0 to len - 1 do
  begin
    B^[index] := B^[index] xor 5; //just to test if its working
  end;
  ..

Во-вторых, вы все равно получите AV для попытки изменить сегмент памяти только для чтения.В зависимости от того, что вы пытаетесь сделать, вы можете использовать VirtualProtect на «байтах» перед вызовом «crypt», или скопировать память в байтовый массив и изменить ее там, или использовать BeginUpdateResource - UpdateResource - EndUpdateResource если вы пытаетесь изменить ресурс.

0 голосов
/ 19 апреля 2011

Код, подобный этому, проще всего написать с помощью таких указателей:

function crypt(src: Pointer; len: DWORD): DWORD;
var
  B: ^Byte;
  index: DWORD;
begin
  B := src;
  for index := 0 to len - 1 do
  begin
    B^ := B^ xor 5; //just to test if its working
    inc(B);
  end;
  result := 1;
end;

Естественно, вам нужно учитывать проблему памяти только для чтения, которую выделил Sertac. Я просто добавляю этот код, чтобы проиллюстрировать то, что я считаю каноническим способом обхода буфера, который поступает как пустой указатель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...