导入表注入

本文详细介绍了Windows可执行文件(PE)的导入表注入技术,包括注入思路、所需函数及步骤。首先,构造新的节表来存放导入表结构,并处理FOA到RVA的转换。接着,描述了如何创建新节表、追加INT和IAT表、构造IMAGE_IMPORT_BY_NAME结构,并修正IMAGE_DATA_DIRECTORY的属性。此外,还提到了关键函数如RVATOFOA和ReadPEFile的作用。最后,提供了实现导入表注入的代码演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

导入表注入

思路

构造新的节表,存放导入表结构,在这之后构造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);<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值