导入表注入
思路
构造新的节表,存放导入表结构,在这之后构造INT、IAT、IMAGE_IMPORT_BY_NAME结构。同时注意FOA到RVA的转化。
导入表注入
1.创建新节表并移动导入表copy(不需要修复)
2.创建导入表之后添加一个新导入表(在新表之后添加一个导入表大小的0作为导入表的结束标志)
3.追加INT和IAT表
4.构造IMAGE_IMPORT_BY_NAME结构
5.赋值
6.修正IMAGE_DATA_DIRECTORY的VirtualAddress 和Size
需要的函数
RVATOFOA
1.定位节表
2. 判断是否在文件头中 RVA小于最后一个节表的 末尾
ReadPEFile
1.文件流读取
2.计算文件的大小
3.分配内存
4.文件读取到内存中
(AddNewSection)
1.定位节表位置
2.定位最后一个节表的末尾
3.判断是否足够两个节表位置
4.新增节表并修改节表的属性、节区后添加空白区
//5.分配空间得到新句柄并将内存复制
ImportInject
1.原来导入表全部copy到新增节//导入表的数量计算 需要ImportTable地址进行循环
2.追加一个导入表 追加导入表结束标志(一个导入表的大小)
3.追加INT和IAT表
4.IMAGE_IMPORT_BY_NAME结构
5.将IMAGE_IMPORT_BY_NAME结构的RVA赋值给INT和IAT表中的第一项(IAT有INT的值得到)
6.分配空间存储DLL名称字符串 并将该字符串的RVA赋值给Name属性
7.修正IMAGE_DATA_DIRECTORY结构的VirtualAddress和Size
代码演示
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
DWORD RVATOFOA(DWORD RVA,LPVOID pFileBuffer)
{
DWORD FOA = NULL;
PIMAGE_DOS_HEADER pDosHeader = NULL;
PIMAGE_NT_HEADERS pNtHeaders = NULL;
PIMAGE_FILE_HEADER pFileHeader = NULL;
PIMAGE_OPTIONAL_HEADER pOptionalHeader = NULL;
PIMAGE_SECTION_HEADER pSectionHeader = NULL;
pDosHeader = (PIMAGE_DOS_HEADER)pFileBuffer;
pNtHeaders = (PIMAGE_NT_HEADERS)((DWORD)pDosHeader + pDosHeader->e_lfanew);
pFileHeader = (PIMAGE_FILE_HEADER)((DWORD)pNtHeaders + 4);
pOptionalHeader = (PIMAGE_OPTIONAL_HEADER)((DWORD)pFileHeader + IMAGE_SIZEOF_FILE_HEADER);
pSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD)pOptionalHeader + pFileHeader->SizeOfOptionalHeader);
if(RVA <= pOptionalHeader->SizeOfHeaders)
return RVA;
for(;RVA > (pSectionHeader->VirtualAddress + pSectionHeader->Misc.VirtualSize);pSectionHeader++);//定位到所在节
FOA = RVA - pSectionHeader->VirtualAddress + pSectionHeader->PointerToRawData;
return FOA;
}
DWORD FOATORVA(DWORD FOA,LPVOID pFileBuffer)
{
DWORD RVA = NULL;
PIMAGE_DOS_HEADER pDosHeader = NULL;
PIMAGE_NT_HEADERS pNtHeaders = NULL;
PIMAGE_FILE_HEADER pFileHeader = NULL;
PIMAGE_OPTIONAL_HEADER pOptionalHeader = NULL;
PIMAGE_SECTION_HEADER pSectionHeader = NULL;
pDosHeader = (PIMAGE_DOS_HEADER)pFileBuffer;
pNtHeaders = (PIMAGE_NT_HEADERS)((DWORD)pDosHeader + pDosHeader->e_lfanew);
pFileHeader = (PIMAGE_FILE_HEADER)((DWORD)pNtHeaders + 4);
pOptionalHeader = (PIMAGE_OPTIONAL_HEADER)((DWORD)pFileHeader + IMAGE_SIZEOF_FILE_HEADER);
pSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD)pOptionalHeader + pFileHeader->SizeOfOptionalHeader);<