修改导入表实现DLL注入

DLL注入_修改导入表(1) PE文件分析 (一) 替换DLL函数 通过修改PE文件导入导出表来更改函数。单纯分析PE文件是一件比较无聊的事,通过修改可以更加灵活的利用和理解PE文件。这就像生活一样,总要有一些特别的事,才能更加有灵感。学习本身就是生活的一部分,如何让程序更加灵活,是一个比较值得去实践的事,可以更加接近计算机的一些思想。 (二) 环境 VC++ 6.0 为了减少复杂度,用VC++ 6.0编译sum.cpp su... 阅读详情
Code:[Copy to clipboard]  
//
// Copy from Matt Pietrek
// Given an RVA, look up the section header that encloses it and return a
// pointer to its IMAGE_SECTION_HEADER
//
PIMAGE_SECTION_HEADER
__AddImportTable_GetEnclosingSectionHeader(
        DWORD rva,
        PIMAGE_NT_HEADERS pNTHeader
)
{
    PIMAGE_SECTION_HEADER section = IMAGE_FIRST_SECTION32(pNTHeader);
    unsigned i;
   
    for ( i=0; i < pNTHeader->FileHeader.NumberOfSections; i++, section++ )
    {
        // Is the RVA within this section?
        if ( (rva >= section->VirtualAddress) &&
             (rva < (section->VirtualAddress + section->Misc.VirtualSize)))
            return section;
    }
   
    return 0;
}


int
AddImportDll(
        IN HANDLE hFile,
        IN LPSTR  lpDllName,
        IN DWORD  dwBase,
        IN PIMAGE_NT_HEADERS pNTHeader
)
{
        //
        // 通过OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress
        // 获得导入表的RVA, 利用此RVA找到ImportTable所在的Section,之后计算Offset,公式:
        //     Offset = (INT)(pSection->VirtualAddress - pSection->PointerToRawData)
        // 之后利用Offset来定位文件中ImportTable的位置.
        //
        PIMAGE_IMPORT_DESCRIPTOR  pImportDesc = 0;
    PIMAGE_SECTION_HEADER     pSection = 0;
    PIMAGE_THUNK_DATA         pThunk, pThunkIAT = 0;
        int Offset = -1;

        pSection = __AddImportTable_GetEnclosingSectionHeader(
                pNTHeader->OptionalHeader.DataDirectory
                        [IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress,
                pNTHeader);
        if(!pSection)
        {
                fprintf(stderr, "No Import Table../n");
                return -1;
        }

        Offset = (int) (pSection->VirtualAddress - pSection->PointerToRawData);

        //
        // 计算ImportTable在文件中的位置
        //
        pImportDesc =
                (PIMAGE_IMPORT_DESCRIPTOR)(pNTHeader->OptionalHeader.DataDirectory
                                        [IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress - Offset + dwBase);
       
        //
        // 取出导入的DLL的个数
        //
        int nImportDllCount = 0;
        while(1)
        {
                if ((pImportDesc->TimeDateStamp==0 ) && (pImportDesc->Name==0))
            break;
                pThunk    = (PIMAGE_THUNK_DATA)(pImportDesc->Characteristics);
                pThunkIAT = (PIMAGE_THUNK_DATA)(pImportDesc->FirstThunk);

                if(pThunk == 0 && pThunkIAT == 0)
                                return -1;
               
                nImportDllCount++;
                pImportDesc++;
        }

        //
        // 恢复pImportDesc的值,方便下面的复制当前导入表的操作.
        //
        pImportDesc -= nImportDllCount;

        //
        // 取得ImportTable所在Section的RawData在文件中的末尾地址,计算公式:
        //     dwOrigEndOfRawDataAddr = pSection->PointerToRawData + pSection->Misc.VirtualSize
        //
        DWORD dwEndOfRawDataAddr = pSection->PointerToRawData + pSection->Misc.VirtualSize;

        PIMAGE_IMPORT_DESCRIPTOR pImportDescVector =
                (PIMAGE_IMPORT_DESCRIPTOR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 20 * (nImportDllCount+1));
        if(pImportDescVector == NULL)
        {
                fprintf(stderr, "HeapAlloc() failed. --err: %d/n", GetLastError());
                return -1;
        }
        CopyMemory(pImportDescVector+1, pImportDesc, 20*nImportDllCount);
       

        //
        // 构造添加数据的结构,方法笨拙了点.
        //
        struct _Add_Data
        {
                char        szDllName[256];                        // 导入DLL的名字
                int                nDllNameLen;                        // 实际填充的名字的长度
                WORD        Hint;                                        // 导入函数的Hint
                char    szFuncName[256];                // 导入函数的名字
                int     nFuncNameLen;                        // 导入函数名字的实际长度
                int     nTotal;                                        // 填充的总长度
        } Add_Data;

        strcpy(Add_Data.szDllName, lpDllName);
        strcpy(Add_Data.szFuncName, "Startup");

        //
        // +1表示'/0'字符
        //
        Add_Data.nDllNameLen  = strlen(Add_Data.szDllName) + 1;
        Add_Data.nFuncNameLen = strlen(Add_Data.szFuncName) + 1;
        Add_Data.Hint = 0;
        //
        // 计算总的填充字节数
        //
        Add_Data.nTotal = Add_Data.nDllNameLen + sizeof(WORD) + Add_Data.nFuncNameLen;

        //
        // 检查ImportTable所在的Section中的剩余空间是否能够容纳新的ImportTable.
        // 未对齐前RawData所占用的空间存放在pSection->VirtualSize中,用此值加上新的ImportTable长度与
        // 原长度进行比较.
        //
        // nTotalLen 为新添加内容的总长度
        // Add_Data.nTotal 为添加的DLL名称,Hint与导入函数的名字的总长度.
        // 8 为IMAGE_IMPORT_BY_NAME结构的长度.
        // 20*(nImportDllCount+1) 为新的ImportTable的长度.
        //
        int nTotalLen = Add_Data.nTotal + 8 + 20*(nImportDllCount+1);
//        printf("TotalLen: %d byte(s)/n", nTotalLen);
        if(pSection->Misc.VirtualSize + nTotalLen > pSection->SizeOfRawData)
        {
                fprintf(stderr, "[X] Not enough space!/n/n");
                return -1;
        }

        IMAGE_IMPORT_DESCRIPTOR Add_ImportDesc;
        //
        // ThunkData结构的地址
        //
        Add_ImportDesc.Characteristics = dwEndOfRawDataAddr + Add_Data.nTotal + Offset;
        Add_ImportDesc.TimeDateStamp = -1;
        Add_ImportDesc.ForwarderChain = -1;
        //
        // DLL名字的RVA
        //
        Add_ImportDesc.Name = dwEndOfRawDataAddr + Offset;
        Add_ImportDesc.FirstThunk = Add_ImportDesc.Characteristics;

        CopyMemory(pImportDescVector, &Add_ImportDesc, 20);

        //
        // 对文件进行修改
        //
        DWORD dwBytesWritten = 0;
        DWORD dwBuffer = dwEndOfRawDataAddr + Offset + Add_Data.nTotal + 8;
        long  lDistanceToMove = (long)&(pNTHeader->OptionalHeader.DataDirectory
                [IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress) - dwBase;
        int nRet =0;

        //
        // 修改IMAGE_DIRECTOR_ENTRY_IMPORT中VirtualAddress的地址,
        // 使其指向新的导入表的位置
        //
        SetFilePointer(hFile, lDistanceToMove, NULL, FILE_BEGIN);

//        printf("OrigEntryImport: %x/n", pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
        nRet = WriteFile(hFile, (PVOID)&dwBuffer, 4, &dwBytesWritten, NULL);
        if(!nRet)
        {
                fprintf(stderr, "WriteFile(ENTRY_IMPORT) failed. --err: %d/n", GetLastError());
                return -1;
        }
//        printf("NewEntryImport: %x/n", pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
        //
        // 修改导入表长度
        //
        dwBuffer = pNTHeader->OptionalHeader.DataDirectory
                [IMAGE_DIRECTORY_ENTRY_IMPORT].Size + 40;
        nRet = WriteFile(hFile, (PVOID)&dwBuffer, 4, &dwBytesWritten, NULL);
        if(!nRet)
        {
                fprintf(stderr, "WriteFile(Entry_import.size) failed. --err: %d/n", GetLastError());
                return -1;
        }

        //
        // 修改[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT]中VirtualAddress和Size成员,设置为0
        //
        lDistanceToMove = (long)&(pNTHeader->OptionalHeader.DataDirectory
                [IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].VirtualAddress) - dwBase;
        dwBuffer = 0;
        SetFilePointer(hFile, lDistanceToMove, NULL, FILE_BEGIN);
        WriteFile(hFile, (PVOID)&dwBuffer, 4, &dwBytesWritten, NULL);
        WriteFile(hFile, (PVOID)&dwBuffer, 4, &dwBytesWritten, NULL);

        //
        // 修改ImportTable所在节的长度
        //
        lDistanceToMove = (long)&(pSection->Misc.VirtualSize) - dwBase;
        SetFilePointer(hFile, lDistanceToMove, NULL, FILE_BEGIN);
        dwBuffer = pSection->Misc.VirtualSize + nTotalLen;
        nRet = WriteFile(hFile, (PVOID)&dwBuffer, 4, &dwBytesWritten, NULL);
        if(!nRet)
        {
                fprintf(stderr, "WriteFile(Misc.VirtualSize) failed. --err: %d/n", GetLastError());
                return -1;
        }
        //
        // 修改SECTION的Characteristics属性修改为E0000020
        //
        lDistanceToMove = (long)&(pSection->Characteristics) - dwBase;
        dwBuffer = 0xE0000020;
        SetFilePointer(hFile, lDistanceToMove, NULL, FILE_BEGIN);
        nRet = WriteFile(hFile, (PVOID)&dwBuffer, 4, &dwBytesWritten, NULL);
        if(!nRet)
        {
                fprintf(stderr, "WriteFile(Characteristics) failed. --err: %d/n", GetLastError());
                return -1;
        }

        //
        // 从节的末尾添加新的DLL内容
        //
        lDistanceToMove = dwEndOfRawDataAddr;
        SetFilePointer(hFile, lDistanceToMove, NULL, FILE_BEGIN);
        nRet = WriteFile(hFile, Add_Data.szDllName, Add_Data.nDllNameLen, &dwBytesWritten, NULL);
        nRet = WriteFile(hFile, (LPVOID)&(Add_Data.Hint), sizeof(WORD), &dwBytesWritten, NULL);
        nRet = WriteFile(hFile, Add_Data.szFuncName, Add_Data.nFuncNameLen, &dwBytesWritten, NULL);
        dwBuffer = dwEndOfRawDataAddr + Add_Data.nDllNameLen + Offset;
        nRet = WriteFile(hFile, (LPVOID)&dwBuffer, 4, &dwBytesWritten, NULL);
        dwBuffer = 0;
        nRet = WriteFile(hFile, (LPVOID)&dwBuffer, 4, &dwBytesWritten, NULL);
        nRet = WriteFile(hFile, (LPVOID)pImportDescVector, 20*(nImportDllCount+1), &dwBytesWritten, NULL);

        HeapFree(GetProcessHeap(), 0, pImportDescVector);
        printf("[V] Modify PE file Successfully!/n/n");
        return 0;
}

以前发过的代码,这份是全部的,必须要将SECTION的Characteristics修改为E0000020才能实现services.exe的注入,否则会提示错误。
[分析]detours 通过修改输入表注入DLL -- UpdateImports 函数的分析 前段时间有一个需求,就是在进程启动的第一时间实现dll的注入,当时一想以为很简单嘛,比如拦截CreateProcessInternalW等不就行了吗?后来发现如果你在CreateProcessInternalW前处理进程还没有启动,而之后处理的话,进程的主线程已经开始工作了,再后来通过修改创建标志把创建的进程的主线程挂起,等进程创建后我来注入,此时才发现创建远线程搞不定, 此时进程只有NTDLL, 阅读详情

相关推荐

把dll模块注入到游戏进程的方法_基于文件修改的注入方式

通过对pe结构的了解,我们会发现进程加载时依赖的dll主要来源于PE的导入表,因此我们可以自己写代码修改pe文件的导入表,也可以利用LordPe等Pe工具自行修改文件的导入表,从而让想注入的dll在原PE文件中有一席之地。(4)再用PrcoessExplorer查看test.exe所加载的dll,会发现dbghelp_0.dll(改名后的系统dll)和dbghelp.dll(我们的dll,MyDbghelp.dll改名得到的)都会被加载,如下图所示,请注意两个dll的路径。

douluo998的博客 1844

PE输入表DLL注入

PE输入表DLL注入

944

使用IAT表注入模块到进程中 样例

模块注入到进程的方法有很多,想一一写例子,学习一下,也练习一下!         首先先从IAT表注入开始吧!         如果了解PE文件的格式的话,原理很简单。当一个模块被系统加载起来后,会遍历模块的导入表,将静态导入的函数地址填充到导入表中,以便进程执行起来后,调用到该模块时,能够使用导入函数。要获取导入函数地址,首先要将导出该函数的模块加载起来。         那方法来了,

Fly Follow the Heart 5560

DLL注入-静态修改PE表

首先要知道,我们要完成的操作是通过修改PE结构来完成注入dll,PE中有关于模块导入的是输入表结构,而输入表是一个IID数组,那么想要将我们的dll导入到程序中就需要将一个我们构造的IID结构写入这个数组中,此时需要考虑我们新写入的IID结构大小,假设原IID大小为old,那么显然,由于只导入了一个函数,我们新的IID结构大小newIIDSize = Old+ sizeof(IMAGE_IMPORT_DESCRIPTOR)。将以上各值填入原IID位置,填写的时候需要注意字节序是小端序,填写结果如下。

m0_52164435的博客 1128

手动进行dll静态注入

大概思路是这样的:要注入一个dll文件,也就是需要修改输入表的中的IMPORT Directory Table结构,需要增加一个对应的结构体和该结构对应的IMAGE_IMPORT_DESCRIPTO和对输入表的size进行修改。所以我们只需要在原先的结构体数组后面增加对应的就够就行了,但是有时候往往在这些数据之后存在其他的数据,我们进行添加会对其进行覆盖,这是我们不想看到的。因此我们可选择考虑将整...

qq_38184895的博客 3262

华为海思2026届数字IC秋招笔试真题解析与实战技巧(2025最新版)

本文深度解析华为海思2026届数字IC秋招笔试真题,涵盖高频考点如后端设计、低功耗设计、SystemVerilog语法等核心内容。提供时序违例修复、时钟树综合等实战技巧,帮助考生高效备考。特别关注UPF低功耗设计规范等最新考点,助力考生在秋招笔试中脱颖而出。

lg888的博客 1091

PE文件静态注入

点击"蓝字"关注,获取更多技术内容DLL注入指的是向运行中的其他进程强制插入特定的DLL文件。可以通过修改静态的PE文件,修改输入表结构,使得程序执行时载入特定的DLL文件。通常可执行文件...

蚁景网安学院 1487

STM32F407编译下载全流程:从CubeMX到HEX烧录

嵌入式固件开发中,编译与下载是连接代码与硬件的关键闭环。其本质是将高级语言描述的逻辑,经交叉编译(ARM GCC)、链接(ELF生成)、格式转换(HEX/BIN)后,通过调试接口(SWD/UART)写入MCU Flash存储器的过程。该流程涉及工具链协同、二进制格式特性(如Intel HEX的地址映射与无元数据设计)、启动模式(System Memory Bootloader)、Flash选项字节(RDP/WRP)等底层机制,直接决定固件可运行性与安全性。典型应用场景包括STM32F407开发板调试、量产固

weixin_28840811的博客 260

驱动开发实现修改导入表注入dll

导入表注入dll其实就是给程序的导入表添加一个dll和相应函数,程序在被载入时,系统会自动加载该dll,从而实现dll注入。 我在驱动实现修改导入表的方法就是使用PsSetLoadImageNotifyRoutine函数创建回调,在回调中修改导入表。 修改导入表的过程如下: 1,申请一块内存,将原来的导入表和自己添加的项拷贝到这块内存。 2,修改pe头的导入表偏移,使其指向新导入表。 经

chaos的专栏 3649

OpenMontage:AI代理驱动的端到端视频生产系统实战指南

在当今内容创作领域,自动化视频生成技术正成为提升生产效率的关键。其核心原理在于通过智能体(Agent)架构,将复杂的视频制作流程拆解为可被AI理解和执行的标准化任务,从而实现从创意到成片的端到端自动化。这项技术的核心价值在于大幅降低了专业视频制作的门槛,使非专业用户也能快速产出具有一定专业度的内容。其典型应用场景包括社交媒体短片、产品演示、知识科普视频的批量生产。OpenMontage正是这一技术理念的杰出实践,它构建了一个完整的代理驱动视频生产系统,将AI编码助手转变为能自主规划并执行脚本撰写、素材检索、

weixin_35757191的博客 649

从指令到坐标:深度解析307系列基站定位的AT指令实战与排错

本文深度解析了ML307系列模组基站定位的AT指令实战应用与排错方法。重点剖析了AT+MLBSCFG和AT+MLBSLOC两条核心指令的配置、执行流程及异步响应机制,并针对高德与OneOs两种主流定位服务提供了完整的配置指南。文章结合常见错误码(如126、127)和硬件注意事项,分享了确保定位成功的实战经验与稳健的程序框架。

weixin_29057695的博客 490

PE 通过导入表注入 Dll

导入表注入,当程序被加载时,系统会根据程序导入表信息来加载需要用到的dll,导入表注入的原理就是修改程序的导入表,将自己的dll添加到程序的导入表中,这样程序运行时可以将自己的DLL加载到程序的进程空间。...

多一份贡献,多一份环保 1293

硬件开发流程

研发流程在一个有一定规模的企业中起到了非常重要的作用,也是一个产品或者项目成功量产出货依赖的平台体系,作为工程师如果想要走的更远,就必须了解流程体系,了解如何对产品的开发质量进行更好的管控。...

weixin_44126796的博客 8384

导入表注入

程序开始运行时,加载程序根据导入表的DLL名字首先在运行目录下查找DLL,如果找到,则把他加载进进程空间。如果没找到则在系统目录下继续寻找。可以通过这一个特点,在原有的导入表后面增加一个导入表结构(INT和IAT表至少有一个函数的名字)。 这就是导入表注入。 ...

qq_41490873的博客 631

飞牛fnNAS搭建web版微信

摘要:本文介绍了一种通过Docker在飞牛NAS上部署微信客户端的方法,实现24小时同步微信聊天记录。具体步骤包括:1)激活飞牛NAS的Docker功能并配置镜像加速源;2)创建专用文件夹并下载docker-wechat镜像;3)设置容器参数并部署微信客户端;4)通过局域网或ZeroTier内网穿透实现远程访问。相比传统Windows/Linux方案,该方法资源占用更低,适合需要长期保存微信聊天记录的用户。

dgnankai的专栏 3342

RK3568平台开发系列讲解(安卓篇)LED呼吸灯系统流程

1.app层封装后使用NotificationManager发出:NotificationManager.notify() 2.Android 系统架构中:一个manager类对应一个aidl接口,一个manager对应一个底层的服务,notification也是这个架构

内核笔记 3646

滴水逆向三期实践17:导入表注入

在动态链接库一章提到DllMain,这里再回顾一次 当dll被加载进4GB空间时,会调用一次DllMain(入口方法) 当程序执行完了要把dll从4GB空间被卸载,也会调用一次DllMain 注入的本质就是想方设法把自己的dll扔到别人进程的4GB空间里 而前面导入表一章在最后提到,只有在PE文件内隐式调用(静态使用)时才会在调用者PE文件的导入表内出现该 dll 的名字和相关函数,若为显示调用(动态使用),则这个被调用的dll名和相关函数不会在调用者导入表内出现。 那么反过来也就是说,写

Rivival_S 的博客 3192

ProcessingJoy —— 最简单的实时流体模拟【JAVA】

实现基于非常非常经典的 Paper ——Jos Stam 的Real-Time Fluid Dynamics for Games 代码和注释 float visc = 0.0f; float diff = 0.0f; int N = 250; int size = (N + 2) * (N + 2); float[] u = new float[size]; // 速度, 水平/竖直 float[] v = new float[size]; float[] u_prev = new fl...

ShaderJoy 的兴趣技术杂货铺 2816

C/C++ 手工实现IAT导入表注入劫持

DLL注入有多种方式,今天介绍的这一种注入方式是通过修改导入表,增加一项导入DLL以及导入函数,我们知道当程序在被运行起来之前,其导入表中的导入DLL与导入函数会被递归读取加载到目标空间中,我们向导入表增加导入函数同样可以实现动态加载,本次实验用到的工具依然是上次编写的PE结构解析器。

微软技术分享 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

驱动 进程回调中修改导入表插入DLL (只做了一点儿修正不算原创)

 //虽然现在对很多程序的注入都一点儿问题 ,不过一般的程序还是能注入的 最好建议使用zwCreateThreadEX来注入 好处你懂的= =我修正了判断EXE名字 因为 直接用PsGetImageFileNmae 会获取名字不完整因为某结构中只保存了16 char的 内容 不同系统 还不一样= = 所有就用这个 还有就是 卸载驱动会蓝屏= =因为 系统在回调数组中找到了指向我们这里回调函数

落笔飞花笑百生的博客 1016

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

《逆向工程》通过修改PE注入DLL

文章目录通过修改PE加载DLL修改导入表查看IDT空间是否足够移动IDT 通过修改PE加载DLL TextView是一个文本查看工具,将文本文件拖入即可显示。 代码如下,注意按照32位编译,否则PEView不能分析64位IDT。 #include "windows.h" #include "stdio.h" LRESULT CALLBACK WndProc(HWND, UINT, WPARAM,...

Starr 1243

C语言实现导入表注入

导入表注入原理: 当exe被加载时,系统会根据exe导入表信息来加载需要用到的DLL,导入表注入的原理就是修改exe导入表,将自己的DLL写入exe中 导入表注入的实现步骤: 第一步:根据目录项(第二个就是导入表)得到导入表信息 typedef struct _IMAGE_DATA_DIRECTORY { DWORD VirtualAddress;:指向导入表结构 DWO...

jxust_xiaoxiong 733

修改PE加载dll

创建远程线程(CreateRemoteThread()API),使用注册表(AppInit_Dlls),消息勾取(SetWindowsHookEx()API)等Dll注入都是动态注入,也就是程序本身并不加载待注入的Dll。通过修改exe的格式,我们可以实现静态注入,也就是对程序的机器字节进行修改,使程序运行时自动加载dll。 下面我们就来详细的介绍一下这种方法。exe,dll等文件统称为可执行文

擦掉汗、微笑的博客 3295

驱动中给进程注入DLL,模拟GlobaHook,不完整,某些情况下报错

利用 PsSetLoadImageNotifyRoutine 设置回调,等有镜像被加载的时候,根据进程PID获取基址,然后和镜像基址对比, 如果相同,则加载的是进程EXE的镜像,这个时候通过修改镜像头中的导入表 来注入DLL。 修改导入表部分的代码,是修改的MS的detours库来的。 经过测试大部分进程注入都没问题,碰到一些比较特殊的进程运行的时候会报错,请教高手。。。 一下是核心代码:

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 3433

Dll注入--修改PE文件头

DLL注入,除了常见的远线程注入,挂钩和修改注册表以外还可以通过修改PE文件头来达到注入目的,废话少说先上菜。1. 思路PE文件经常会调用外部DLL文件,而需要调用的DLL文件都会在PE文件说明,通过 NT头->可选头->导入表 可以找到导入表,而导入表就是对需要导入的每个DLL的说明,它实际上是一个20个字节组成的IID结构体数组,每个结构体就是一个DLL信息说明,我们只需要想PE文件中准确添加这

王二娃的生活的博客 1万+
上一篇: 向其他进程注入代码的三种方法
下一篇: FAKE PROTOCOL NDIS hook 支持拨号的选项
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值