加殼技術探討-加殼時處理IAT

看雪資料發表於2015-11-15

加殼時處理IAT
kongfoo/2004.4.3
  避免殼執行時處理IAT能被跳過的弊端。達到原程式沒有一刻是完好的的目的。
加殼時處理IAT要的是找到檔案中IAT所在位置和大小。
  VC和DELPHI程式不同。
  一、VC notepad.exe分析
  PE header(eifanew)在e8處。
  IAT RVA在eifanew+d8處,1000
  IAT Size在eifanew+dc處,324,這2個值是系統參考值,系統在裝入檔案時就會參考這2個值。
  物理位置上的IAT放在第一個節。即400處。
  PE頭接著就是第一個節,所以取SizeOfHeader值就可以定位到第一個節。
  SizeOfHeader在eifanew+54處,400。
  現在有了IAT的物理位置和大小。
  二、DELPHI project1.exe分析
  eifanew+d8和eifanew+dc處都為0。
  IAT RVA在eifanew+80處,54000,即目錄表的IMPORT_DIR.VirtualAddress
  IAT Size在eifanew+84處,1f4,即目錄表的IMPORT_DIR.Size
  這2個值也是系統參考值,系統在裝入檔案時參考這2個值,把IAT放進去。

  跳轉表在第一個節開始。

  三、系統裝入IAT工作流程猜測
  先在eifanew+d8和eifanew+dc取IAT RVA和IAT Size,值非空即將第一個節IAT Size
個位元組裝入IAT RVA指向的地址。
  若取得的IAT RVA和IAT Size為0即取eifanew+80和eifanew+84的IMPORT_DIR.VirtualAddress
和IMPORT_DIR.Size值,將這2個值作為IAT RVA和IAT Size參考值。再去BaseOfData
取各API的字串和DLL字串,根據字串取API地址,再把地址放到IAT RVA中。

  四、加殼時加密IAT
  要在加殼時加密IAT,對VC的程式很簡單。對DELPHI複雜很多。一:取IMPORT_DIR值,
再用取各API地址,把地址寫回第一個節,再把IAT RVA和IAT Size的值改成IMPORT_DIR的值。
這樣就完成了DELPHI程式IAT向VC程式的轉變。再用對VC程式IAT加密的方法對其進行加密。
但有一難點,原來的第一個節沒辦法處理。所以加殼時加密IAT只能針對個別程式。

  五、其它
  DELPHI這種對API地址處理的方式也有其好處,跨平臺。

相關文章