如何在EXE上绑定一个DLL

本文介绍了一种在EXE文件中重建导入表并添加指定DLL的方法。代码处理了程序的附加数据和绑定引入,避免操作失败。通过一系列函数如GetSectionByRVA、RVAToFileOffset等,实现了在PE文件中插入新的DLL引用。
摘要由CSDN通过智能技术生成

下面代码将在EXE文件中重建一个导入表,并将指定的DLL文件作为新的引用添加到导入表中,为什么要这样做呢?呵呵,用得到这种代码的人肯定不会想拿去做什么好事吧,所以用途就不介绍了!顺便说一下,下面代码已经处理了程序的附加数据和绑定引入,不会因为EXE存在附加数据或绑定引入导致添加失败。

 
#define NTSIGNATURE(a) ((LPVOID)((BYTE *)a + ((PIMAGE_DOS_HEADER)a)->e_lfanew))
#define PEFHDROFFSET(a) ((LPVOID)((BYTE *)NTSIGNATURE(a) + 4))
#define OPTHDROFFSET(a) ((LPVOID)((BYTE *)NTSIGNATURE(a) + 4 + sizeof(IMAGE_FILE_HEADER)))

#pragma pack(push)   // 保存对齐状态
#pragma pack(1)
typedef struct _NEW_IMPORT
{
 char szDllName[20];  // 导入DLL的名字
 WORD Hint;    // 导入函数的Hint
 char szFuncName[20]; // 导入函数的名字
 IMAGE_THUNK_DATA data[2];
} NEW_IMPORT, *PNEW_IMPORT;
#pragma pack(pop)

//---------------------------------------------------------------------------
// 返回RVA所指向的节
//---------------------------------------------------------------------------
PIMAGE_SECTION_HEADER GetSectionByRVA(DWORD rva, PIMAGE_NT_HEADERS pNTHeader)
{
 PIMAGE_SECTION_HEADER section = IMAGE_FIRST_SECTION(pNTHeader);
 DWORD i;

 for (i = 0; i < pNTHeader->FileHeader.NumberOfSections; i++)
 {
  if ((rva >= section[i].VirtualAddress) && (rva < (section[i].VirtualAddress + section[i].Misc.VirtualSize)))
   return &section[i];
 }

 return NULL;
}

//---------------------------------------------------------------------------
// 返回文件偏移所指向的节
//---------------------------------------------------------------------------
PIMAGE_SECTION_HEADER GetSectionByFileOffset(DWORD dwFileOffset, PIMAGE_NT_HEADERS pNTHeader)
{
 PIMAGE_SECTION_HEADER section = IMAGE_FIRST_SECTION(pNTHeader);
 DWORD i;

 for (i = 0; i < pNTHeader->FileHead

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值