2011-06-29 149 views
4

我今天編寫了一些代碼,將列出PE文件中的所有部分...代碼有效,但最後它會發出異常:無效的指針操作...並且我不知道爲什麼...有人可以請發現錯誤爲什麼此代碼會生成異常?

下面是代碼

procedure TForm1.Button1Click(Sender: TObject); 
var 
    IDH:PImageDosHeader; 
    buf:Pointer; 
    INH:PImageNtHeaders; 
    ISH:array of TImageSectionHeader; 
    FS:TFileStream; 
    i,total:Word; 
begin 
    if OpenDialog1.Execute then 
    begin 
     Self.Caption:=OpenDialog1.FileName; 
     FS:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead or fmShareDenyNone); 
     GetMem(buf,FS.Size); 
     FS.Read(buf^,FS.Size); 
     FS.Free; 
     IDH:=buf; 
     INH:=Ptr(Cardinal(buf)+Cardinal(IDH^._lfanew)); 
     ISH:=Ptr(Cardinal(buf)+Cardinal(IDH^._lfanew) + Sizeof(TImageNtHeaders)); 
     total:=INH^.FileHeader.NumberOfSections - 1 ; 
     for i:=0 to total do 
     begin 
       ListBox1.Items.Add(PAnsichar(@ISH[i].Name)); 
       Application.ProcessMessages; 
     end; 

    end; 
end; 
+0

@CodeInChaos不是如果你看到一個問題,你不知道什麼關於指針 – opc0de

+0

我只是混淆了變量名稱,它們太相似了。對'ISH'的分配對我來說看起來很奇怪。我認爲'ISH'應該是一個指向普通數組而不是動態數組的指針。我很驚訝,一個無類型指針指向一個動態數組沒有明確的強制轉換。 – CodesInChaos

+0

@CodeInChaos,我回滾了標題編輯,因爲我不認爲這個問題是由解析PE頭特別引起的;即使那些我不能發現實際的錯誤。 –

回答

11
ISH:array of TImageSectionHeader; 

聲明一個動態數組。雖然動態數組是指針,但它們需要在它們指向的數據前面有附加數據,包括長度和引用計數。

因此使它指向PE頭部的某些數據是沒有意義的:

ISH:=Ptr(Cardinal(buf)+Cardinal(IDH^._lfanew) + Sizeof(TImageNtHeaders)); 

雖然這一部分看起來編譯出於某種原因,訪問陣列可能會表現出錯誤:

ISH[i]//This might not work correctly since ISH does not point to a valid dynamic array. 

或者,如果代碼存活的那部分(也許你有禁用數組邊界檢查或長度信息碰巧足夠大),然後delphi一旦數組超出範圍delphi嘗試減少refcount並可能釋放數組。並且該部分訪問陣列指向的數據的infrount信息,這在您的情況下不會有效。

如果我沒有記錯的動態數組的內存佈局與此類似:

-------------------------- 
|refcount|length|data....| 
-------------------------- 
       ^pointer goes here 

這意味着你會得到,因爲引用計數問題/長度字段包含垃圾。


我想你想聲明爲:

type TImageSectionHeaderArray=array[0..70000]TImageSectionHeader;//No idea what the limit on section headers is 
    PImageSectionHeaderArray=^TImageSectionHeaderArray; 
... 
var ISH:PImageSectionHeaderArray; 

(我的Delphi是有點生疏了,所以有可能在有一些小的語法錯誤)

+3

+1,生鏽的delphi與否,就是這樣;這就是爲什麼在代碼完成後,錯誤「彈出」:當Delphi嘗試完成動態數組時,它會彈出。 –

+0

不錯的工作夥伴並不知道動態數組有很多值得了解的額外數據! – opc0de

+0

動態數組是非常廣義的字符串。 – CodesInChaos

相關問題