加载中…
正文 字体大小:

Invalid number of data directories in NT header

(2010-07-15 10:17:55)
标签:

杂谈

分类: asp.net

http://kb.cnblogs.com/a/1664170/

 

先简单介绍一下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打开,看到可以查看源代码

Invalid <wbr>number <wbr>of <wbr>data <wbr>directories <wbr>in <wbr>NT <wbr>header

图1 Reflector可以查看CLIAPI.dll

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

Invalid <wbr>number <wbr>of <wbr>data <wbr>directories <wbr>in <wbr>NT <wbr>header

图2 CFF Explorer修改Optional Header的NumberOfRvaAndSizes

再尝试用Reflector打开CLIAPLI.dll,提示无法查看:Invalid number of data directories in NT header。

Invalid <wbr>number <wbr>of <wbr>data <wbr>directories <wbr>in <wbr>NT <wbr>header

图3 Reflector查看修改后的CLIAPI.dll

0

阅读 评论 收藏 转载 喜欢 打印举报
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有