2011-04-19 163 views
0

我有这个功能应该隐窝从资源文件的字节,但它只是崩溃我的应用程序:德尔福:crypting资源文件

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函数程序工作。我究竟做错了什么?

+1

我假设你想*加密资源。即使你使它工作,以这种方式来冷却资源也是毫无意义的。 – 2011-04-19 05:30:26

回答

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突出的问题。我只是添加这段代码来说明我认为是一种规范的方式来缓冲作为无效指针到达的缓冲区。

+0

我认为德尔福的“无效”指针通常称为无类型或“裸”。 – 2011-04-19 07:37:05

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; 
    .. 


二是,你仍然会得到一个AV为试图修改只读内存段。根据您正在尝试执行的操作,在调用'crypt'之前,您可以在'字节'上使用VirtualProtect,或者将内存复制到字节数组并在其中进行修改,或者如果您尝试修改,则使用BeginUpdateResource - UpdateResource-EndUpdateResource资源。