修改PE直接加载DLL

流程:修改可选头里的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属性

时间: 2024-10-21 03:54:25

修改PE直接加载DLL的相关文章

内存加载DLL

1.前言 目前很多敏感和重要的DLL(Dynamic-link library) 都没有提供静态版本供编译器进行静态连接(.lib文件),即使提供了静态版本也因为兼容性问题导致无法使用,而只提供DLL版本,并且很多专业软件的授权部分的API,都是单独提供一个DLL来完成,而主模块通过调用DLL中的接口来完成授权功能.虽然这些软件一般都采用了加壳和反调试等保护,但是一旦这些功能失去作用,比如脱壳,反反调试,HOOK API或者干脆写一个仿真的授权DLL(模拟授权DLL的所有导出函数接口),然后仿真

java 加载dll介绍(转)

最近在做的工作要用到本地方法,需要在Java中加载不少动态链接库(以下为方便延用Windows平台下的简写dll,但并不局限于Windows).刚刚把程序跑通,赶紧把一些心得写出来,mark.也希望对大家的类似工作有所帮助 首先,应当明确,dll有两类:(1)Java所依赖的dll和,(2)dll所依赖的dll.正是由于第(2)种dll的存在,才导致了java中加载dll的复杂性大大增加,许多说法都是这样的,但我实验的结果却表明似乎没有那么复杂,后面会予以详细阐述. 其次,Java中加载dll的

加载dll、lib库

2.是关于如何加载dll或lib库的.可以看这篇bog   Qt调用dll中的功能函数点击打开链接 **************************************************************************************************************************************************** 声明: 事先我已经自己动手写了一个简单的dll文件(myDLL.dll),C版接口的.并且用我前两篇有

从内存中加载DLL DELPHI版

//从内存中加载DLL DELPHI版 unit MemLibrary; interface uses Windows; function memLoadLibrary(pLib: Pointer): DWord; function memGetProcAddress(dwLibHandle: DWord; pFunctionName: PChar): Pointer; stdcall; function memFreeLibrary(dwHandle: DWord): Boolean; imp

加载dll过程中assembly失败

错误现象: 进行插件读取时出现错误:“尝试从一个网络位置加载程序集,在早期版本的 .NET Framework 中,这会导致对该程序集进行沙盒处理.此发行版的 .NET Framework 默认情况下不启用 CAS 策略,因此,此加载可能会很危险.如果此加载不是要对程序集进行沙盒处理,请启用 loadFromRemoteSources 开关.有关详细信息,请参见 http://go.microsoft.com/fwlink/?LinkId=155569.” 错误原因:由于在项目中引用了外部dll

从内存中加载DLL Delphi版(转)

源:从内存中加载DLL DELPHI版 原文 : http://www.2ccc.com/article.asp?articleid=5784 MemLibrary.pas //从内存中加载DLL DELPHI版 unit MemLibrary; interface uses Windows; function memLoadLibrary(pLib: Pointer): DWord; function memGetProcAddress(dwLibHandle: DWord; pFunctio

Wince下演示系统自启动/加载dll方法

前面我们已经介绍过了Wince开机画面,自启动方法了. 今天主要是介绍我们演示系统是如何实现的自运行和加载Dll的方法. 之前我们碰到的主要问题是这样的: 1.在catalog items下加载 Sotorage Devices--MSFLash- Drivers--Flash MDD. 这样,Wince下就可以看到NandFlash的盘符,并且修改注册表/校准鼠标后都可以保存下来. 但是,此时是不能用飞凌提供的程序自启动的,且dll也无法自动加载. 2.在catalog items下不加载 S

使用c#封装海康SDK出现无法加载 DLL“..\bin\HCNetSDK.dll”: 找不到指定的模块

最近在研究网络摄像头的二次开发,测试了一款海康威视的网络摄像头,程序调试的时候,出现如题的报错. 调试随机自带的demo时,程序运行正常,但当把该程序引入到我自己的程序中时,就开始报错.根据开发软件包的提示,将调试所需的DLL文件拷贝到bin文件下,仍然报错. 根据错误提示"无法加载DLL"..\bin\HCNetSDK.dll":找不到指定的模块"信息,找到报错内容的定义处,发现为DLL文件引用. 与报错信息相同的为导入DLL文件的路径,即程序在该路径下无法找到所

无法加载 DLL“rasapi32.dll”: 动态链接库(DLL)初始化例程失败。的处理备注方案

网站提示   无法加载 DLL"rasapi32.dll": 动态链接库(DLL)初始化例程失败. (异常来自 HRESULT:0x8007045A). <system.net><defaultProxy><proxy usesystemdefault="false" /></defaultProxy></system.net> 初步怀疑是因为做了云加速服务造成的代理问题,自己瞎猜!反正应该管用