Delphi:加密资源文件

时间:2011-04-19 01:04:24

标签: delphi encryption

我有这个函数应该从资源文件中加密字节,但它只是崩溃了我的应用程序:

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 个答案:

答案 0 :(得分:4)

您的代码存在两个问题。首先是字节数组,它的元素不包含你的资源数据,而是随你的指针'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;
  ..

其次,您仍然会尝试修改只读内存段。根据您要执行的操作,您可以在调用'crypt'之前对'bytes'使用VirtualProtect,或者将内存复制到字节数组并在那里修改它,或者使用BeginUpdateResource - {{ 1}} - UpdateResource如果您正在尝试修改资源。

答案 1 :(得分:0)

像这样的代码最容易用这样的指针编写:

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强调的只读内存问题。我只是添加了这段代码来说明我认为是一种规范的方式来处理作为void指针到达的缓冲区。