Invalid number of data directories in NT header

來源:互聯網
上載者:User

先簡單介紹一下PE(Windows的可執行程式exe和動態連結程式庫dll都採用Portable Executable檔案格式)的Nt Headers下的Optional Header結構欄位NumberOfRvaAndSizes:
MSDN的介紹:The number of directory entries in the remainder of the optional header. Each entry describes a location and size.
NumberOfRvaAndSizes儲存了資料目錄表的數目,通常它的值為00 00 00 10(16)。由它告知系統當前某個exe或dll所能夠訪問的資料目錄數。在查看一個資料目錄前,必定會先根據資料表目錄數目來判斷。如果將它 設定為0、1、2則會直接導致來源程式或dll無法運行或載入。因為0表示資料目錄什麼都沒有、1表示有Export Table,2表示有Export Table又有Import Table。沒有這些資料目錄數的標識,系統根本就無法識別匯入原程式的一些重要運行資料和函數(.idata、.edata)。
以下是Optional Header所對應_IMAGE_OPTIONAL_HEADER的定義(在WinNT.h中):
typedef struct _IMAGE_OPTIONAL_HEADER {
  WORD                 Magic;
  BYTE                 MajorLinkerVersion;
  BYTE                 MinorLinkerVersion;
  DWORD                SizeOfCode;
  DWORD                SizeOfInitializedData;
  DWORD                SizeOfUninitializedData;
  DWORD                AddressOfEntryPoint;
  DWORD                BaseOfCode;
  DWORD                BaseOfData;
  DWORD                ImageBase;
  DWORD                SectionAlignment;
  DWORD                FileAlignment;
  WORD                 MajorOperatingSystemVersion;
  WORD                 MinorOperatingSystemVersion;
  WORD                 MajorImageVersion;
  WORD                 MinorImageVersion;
  WORD                 MajorSubsystemVersion;
  WORD                 MinorSubsystemVersion;
  DWORD                Win32VersionValue;
  DWORD                SizeOfImage;
  DWORD                SizeOfHeaders;
  DWORD                CheckSum;
  WORD                 Subsystem;
  WORD                 DllCharacteristics;
  DWORD                SizeOfStackReserve;
  DWORD                SizeOfStackCommit;
  DWORD                SizeOfHeapReserve;
  DWORD                SizeOfHeapCommit;
  DWORD                LoaderFlags;
  DWORD                NumberOfRvaAndSizes;
  IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER, 
 *PIMAGE_OPTIONAL_HEADER;
關於_IMAGE_OPTIONAL_HEADER結構內欄位的詳細內容可以查閱MSDN:http://msdn.microsoft.com/en-us/library/ms680339(VS.85).aspx

Reflector可以反編譯查看未加密和混淆的程式碼,不過通過修改PE的Nt Headers下的Optional Header結構中的部分值一樣可以anti對方的查看(前提是對方對反編譯與加殼技術不瞭解)。現在修改之前提到的NumberOfRvaAndSizes的值,讓它足夠小,但不要小於2。
首先隨便找一個dll然後用Reflector開啟,看到可以查看原始碼

圖1 Reflector可以查看CLIAPI.dll

用一些反殼工具(比如CFF、WinHex)找到Optional Header,修改其中的NumberOfRvaAndSizes然後重新儲存CLIAPI.dll

圖2 CFF Explorer修改Optional Header的NumberOfRvaAndSizes

再嘗試用Reflector開啟CLIAPLI.dll,提示無法查看:Invalid number of data directories in NT header。

圖3 Reflector查看修改後的CLIAPI.dll

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.