下面代码将在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 §ion[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