码迷,mamicode.com
首页 > 其他好文 > 详细

修改PE直接加载DLL

时间:2015-05-14 16:02:55      阅读:539      评论:0      收藏:0      [点我收藏+]

标签:

流程:修改可选头里的IMPORT表,添加DLL名及起码一个DLL的导出函数名

要点:RAW【文件偏移地址】=RVA【内存偏移地址】-VirtualAdress【内存中的节区起始位置】+PointerToRawData【文件中的节区起始位置】

相关结构

  1. typedef struct _IMAGE_IMPORT_DESCRIPTOR {     //简称IID,20个字节
  2.     union {  
  3.         DWORD   Characteristics;  
  4.         DWORD   OriginalFirstThunk;  
  5.     } DUMMYUNIONNAME;  
  6.     DWORD   TimeDateStamp;  
  7.     DWORD   ForwarderChain;  
  8.     DWORD   Name;                     //存放DLL名称的地址
  9.     DWORD   FirstThunk;              //IAT表,存放导入函数表的地址
  10. } IMAGE_IMPORT_DESCRIPTOR; 
  11. typedef struct _IMAGE_SECTION_HEADER {              //节区表,
  12. BYTE  Name[IMAGE_SIZEOF_SHORT_NAME];             //8个字节
  13. union {
  14. DWORD PhysicalAddress;
  15. DWORD VirtualSize;
  16. } Misc;
  17. DWORD VirtualAddress;
  18. DWORD SizeOfRawData;
  19. DWORD PointerToRawData;
  20. DWORD PointerToRelocations;
  21. DWORD PointerToLinenumbers;
  22. WORD  NumberOfRelocations;
  23. WORD  NumberOfLinenumbers;
  24. DWORD Characteristics;
  25. } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER
  26. typedef struct _IMAGE_DATA_DIRECTORY {                //可选头的成员表,由16个该结构组成。
  27. ULONG VirtualAddress;
  28. ULONG Size;
  29. } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

修改思路

一,查看IDT是否有足够空间(IDT即为IMPORT表内容)

     IDT是个IID的结构数组,每个DLL对应一个IID结构,占20字节(0x16),整个IDT空间为(DLL个数+1)*20个字节,末尾用一个空的IID结构填充。

二,如果存放不下就移动IDT,先查看所在节区的空间,有没有足够大的空白区,如果没有就考虑在文件末尾添加一个节区吧。

      一般节区的大小都是0200的倍数,极有可能有空余的。

三,修改导入表的RVA值,删除绑定导入表【可选头第12个表,可选,用以提高DLL的加载速度】

四,移动好IDT后添加新的IID,设置好Name【DLL名称】,INT【RVA数组,导入名称表】,IAT【同INT,也可以不同,影响不大】

五,修改IAT节区的属性值,PE加载到内存时,PE装载器会修改IAT,写入函数的实际地址,所以相关节区一定要有WRITE属性

 

修改PE直接加载DLL

标签:

原文地址:http://www.cnblogs.com/DJ0322/p/4503396.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!