2011-04-19 166 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資源。