Delphi:加密资源文件

| 我有这个功能,应该从资源文件中加密字节,但是它只是崩溃了我的应用程序:
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函数,则程序有效。我究竟做错了什么?
已邀请:
像这样的代码最容易用这样的指针编写:
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强调的只读内存问题。我只是添加此代码来说明我认为是遍历作为空指针到达的缓冲区的规范方法。
该代码有两个问题。首先是字节数组,它的元素不包含资源数据,而是包含以指针“ 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。根据您要执行的操作,可以在调用\'crypt \'之前在\'bytes \'上使用
VirtualProtect
,或者将内存复制到字节数组并在那里进行修改,或者如果您\\使用use5ѭ-
UpdateResource
-
EndUpdateResource
正在尝试修改资源。

要回复问题请先登录注册