仿真WINDOWS PE加载器的程序

模拟Windows PE加载器,从内存资源中加载DLL 1、前言 目前很多敏感和重要的DLL(Dynamic-link library) 都没有提供静态版本供编译器进行静态连接(.lib文件),即使提供了静态版本也因为兼容性问题导致无法使用,而只提供DLL版本,并且很多专业软件的授权部分的API,都是单独提供一个DLL来完成,而主模块通过调用DLL中的接口来完成授权功能。虽然这些软件一般都采用了加壳和反调试等保护,但是一旦这些功能失去作用,比如脱壳, 阅读详情
此程序用来仿真 PE 加载器,可以直接运行内存中的程序。

bool PELoader ( char * lpStaticPEBuff , long lStaticPELen )
{
 
long lPESignOffset = *( long *)( lpStaticPEBuff + 0x3c );
  IMAGE_NT_HEADERS
* pINH = ( IMAGE_NT_HEADERS *)( lpStaticPEBuff + lPESignOffset );

 
//取加载到内存中大小
 
long lImageSize = pINH - >OptionalHeader . SizeOfImage ;
 
char * lpDynPEBuff = new char [ lImageSize ];
 
if ( lpDynPEBuff == NULL )
 
{
   
return false ;
 
}
  memset
( lpDynPEBuff , 0 , lImageSize );

 
//取PE文件的节数量
 
long lSectionNum = pINH - >FileHeader . NumberOfSections ;

 
//计算PE头信息及节表信息占用内存大小
 
long lPEHeadSize = lPESignOffset + sizeof ( IMAGE_NT_HEADERS ) + lSectionNum * sizeof ( IMAGE_SECTION_HEADER );
 
 
//加载PE头部信息及其各个节表
  memcpy
( lpDynPEBuff , lpStaticPEBuff , lPEHeadSize );

 
//加载各个节
 
long lFileAlignMask = pINH - >OptionalHeader . FileAlignment - 1 ;         //各节在磁盘中的对齐掩码
 
long lSectionAlignMask = pINH - >OptionalHeader . SectionAlignment - 1 ;   //各节在load后内存中的对齐掩码
  IMAGE_SECTION_HEADER
* pISH = ( IMAGE_SECTION_HEADER *)(( char *) pINH + sizeof ( IMAGE_NT_HEADERS ));
 
for ( int nIndex = 0 ; nIndex < lSectionNum ; nIndex ++, pISH ++)
 
{
   
//判定各节的对齐属性,合法不
   
if (( pISH - >VirtualAddress & lSectionAlignMask ) || ( pISH - >SizeOfRawData & lFileAlignMask ))
   
{
     
//出现非法节
     
delete lpDynPEBuff ;
     
return false ;
   
}

   
//加载改节
    memcpy
( lpDynPEBuff + pISH - >VirtualAddress , lpStaticPEBuff + pISH - >PointerToRawData , pISH - >SizeOfRawData );
 
}

 
//修改导入表,导入程序执行过程中要用到的API函数地址
 
if ( pINH - >OptionalHeader . DataDirectory [ IMAGE_DIRECTORY_ENTRY_IMPORT ]. Size > 0 ) //大于0说明有导入表
 
{
    IMAGE_IMPORT_DESCRIPTOR
* pIID = ( IMAGE_IMPORT_DESCRIPTOR *)( lpDynPEBuff + /
      pINH
- >OptionalHeader . DataDirectory [ IMAGE_DIRECTORY_ENTRY_IMPORT ]. VirtualAddress );

   
//循环扫描每个将有函数导入的dll
   
for (; pIID - >Name != NULL ; pIID ++)
   
{
     
/*曾看过OllyDump源代码,那里在重建导入表的时候,并没有初始化OriginalFirstThunk这个字段,
      所以这里也不对OriginalFirstThunk这个字段进行处理了*/

      IMAGE_THUNK_DATA
* pITD = ( IMAGE_THUNK_DATA *)( lpDynPEBuff + pIID - >FirstThunk );

      HINSTANCE hInstance
= LoadLibrary ( lpDynPEBuff + pIID - >Name );
     
if ( hInstance == NULL )
     
{
       
//导入这个dll失败
       
delete lpDynPEBuff ;
       
return false ;
     
}

     
//循环扫描dll内每个被导入函数
     
for (; pITD - >u1 . Ordinal != 0 ; pITD ++)
     
{
        FARPROC fpFun
;
       
if ( pITD - >u1 . Ordinal & IMAGE_ORDINAL_FLAG32 )
       
{
         
//函数是以序号的方式导入的
          fpFun
= GetProcAddress ( hInstance , ( LPCSTR )( pITD - >u1 . Ordinal & 0x0000ffff ));
       
}
       
else
       
{
         
//函数是以名称方式导入的
          IMAGE_IMPORT_BY_NAME
* pIIBN = ( IMAGE_IMPORT_BY_NAME *)( lpDynPEBuff + pITD - >u1 . Ordinal );
          fpFun
= GetProcAddress ( hInstance , ( LPCSTR ) pIIBN - >Name );
       
}

       
if ( fpFun == NULL )
       
{
         
//导出这个函数失败
         
delete lpDynPEBuff ;
         
return false ;
       
}

        pITD
- >u1 . Ordinal = ( long ) fpFun ;
     
}

     
FreeLibrary ( hInstance );
   
}
 
}


 
//重定位处理
 
if ( pINH - >OptionalHeader . DataDirectory [ IMAGE_DIRECTORY_ENTRY_BASERELOC ]. Size > 0 )
 
{
   
//取第一个重定位块
    IMAGE_BASE_RELOCATION
* pIBR = ( IMAGE_BASE_RELOCATION *)( lpDynPEBuff + /
      pINH
- >OptionalHeader . DataDirectory [ IMAGE_DIRECTORY_ENTRY_BASERELOC ]. VirtualAddress );

   
long lDifference = ( long ) lpDynPEBuff - pINH - >OptionalHeader . ImageBase ;

   
//循环每个重定位块
   
for (; pIBR - >VirtualAddress != 0 ; )
   
{
     
char * lpMemPage = lpDynPEBuff + pIBR - >VirtualAddress ;
     
long lCount = ( pIBR - >SizeOfBlock - sizeof ( IMAGE_BASE_RELOCATION )) >> 1 ;

     
//对这个页面中的每个需重定位的项进行处理
     
short int * pRelocationItem = ( short int *)(( char *) pIBR + sizeof ( IMAGE_BASE_RELOCATION ));
     
for ( int nIndex = 0 ; nIndex < lCount ; nIndex ++)
     
{
       
int nOffset = pRelocationItem [ nIndex ] &0x0fff ;
       
int nType = pRelocationItem [ nIndex ] >> 12 ;

       
//虽然windows定义了很多重定位类型,但是在PE文件中只能见到0和3两种
       
if ( nType == 3 )
       
{
         
*( long *)( lpDynPEBuff + nOffset ) += lDifference ;
       
}
       
else if ( nType == 0 )
       
{
         
//什么也不做
       
}
     
}

     
//pIBR指向下一个重定位块
      pIBR
= ( IMAGE_BASE_RELOCATION *)( pRelocationItem + lCount );
   
}

 
}

 
delete lpDynPEBuff ;

 
return true ;
}
ModelSim SE 10.4 Windows安装与FPGA仿真环境配置指南 ModelSim是FPGA开发中关键的HDL功能仿真工具,其核心能力在于RTL级逻辑验证、波形可视化及与Quartus Prime等综合工具的协同。理解仿真原理需从Verilog/VHDL编译流程、testbench驱动机制和时序无关验证范式入手;技术价值体现在早期发现状态机错误、数据通路缺陷等设计隐患,显著降低硬件调试成本。典型应用场景包括数字电路教学实验、工业控制FPGA原型验证及SoC模块级回归测试。本文围绕ModelSim SE 10.4在Windows平台的工程化部署,深度解析系统位宽匹配、中文路 阅读详情

相关推荐

PEMicro Debugger仿真器驱动程序.rar

软件介绍: PEMicro仿真器在Windows系统下的驱动程序WIN7系统上安装会弹出WINDOWS安全窗口,需要勾选始终信任来自Jungo Connectivity Lty这个软件。redistuninstalldifxapi.dllpe_winusb_interface.infpe_winusb_interface.logpemicro12.catwd1170.catwdreg_gui.exewindrvr6.infwindrvr6.syswindrvr6_install.log

一段仿真PE加载器行为的程序

bool PELoader(char *lpStaticPEBuff, long lStaticPELen) {   long lPESignOffset = *(long *)(lpStaticPEBuff + 0x3c);   IMAGE_NT_HEADERS *pINH = (IMAGE_NT_HEADERS *)(lpStaticPEBuff + lPESignOffset);   /

Chinawash 专栏 1654

Jetson Nano官方镜像下载&烧录

在NVIDIA Jetson Nano开发者套件上安装NVIDIA官方Ubuntu镜像

weixin_44222088的博客 8855

PE文件(1)导入表

PE文件(1)导入表 概念 导入函数的代码位于一个或者多个DLL中,在调用者程序中只保留一些相关的函数信息,包括函数名及其对应的DLL名等。 对于磁盘上的PE 文件来说,它无法得知这些输入函数将来在内存中的地址,只有当PE 文件被装入内存后,Windows的 加载器才将相关DLL 装入,并将调用导入函数的指令和函数实际所处的地址联系起来。 这就是“动态链接”的概念。动态链接是通过PE 文件...

nyzdmc的博客 865

AMESim柱塞泵建模全指南:从HCD库搭建到联合仿真

液压系统仿真中,轴向柱塞泵的建模始终是难点与热点。柱塞泵结构紧凑、功率密度高,在工程机械与航空航天领域应用广泛,然而其运动学与流体细节深度耦合,给仿真带来不小挑战。AMESim平台中的HCD库提供了一种从物理结构出发的建模思路,将柱塞泵分解为容积腔、节流口与机械约束等基础单元,从而真实刻画柱塞腔压力波动、配流特性和容积效率等关键行为,摆脱黑盒模型的局限。基于机理建模的仿真结果,可用于泵参数优化、故障特征分析以及控制策略验证。进一步结合AMESim与Simulink联合仿真,可以高效开发变量泵排量控制系统,研

weixin_29159441的博客 290

实战对比:VINS和ORBSLAM3在无人机避障中的表现(含实测数据)

本文通过实战测试,深度对比了VINS和ORBSLAM3两种主流视觉SLAM算法在无人机避障中的表现。测试聚焦于光照变化、动态遮挡和快速运动三大挑战,提供了详细的实测数据与性能分析。结果表明,VINS在计算效率和实时性上占优,而ORBSLAM3在定位精度和地图管理方面更稳健,为不同应用场景下的工程选型提供了清晰依据。

醉三国 627

怎么拦截系统函数

 主  题:  怎么拦截系统函数?(超高度难题!)    在Dos下,我们可以拦截中断,用自己的处理替换系统中断,然后调用原来的中断,在Windows中,没有了中断,只有函数,那么我们如何来拦截系统的函数,然后我们的函数又调用原来的系统函数呢?比如说系统有一个GetSystemDirectory()函数,我想用我自己的函数替换它,经过我的函数MyGetSystemDirectory()进行处理,然

6559

反激开关电源变压器设计实战:从理论到绕制的完整流程解析

本文详细解析了反激开关电源变压器的完整设计流程,从核心理论到实战绕制。文章以24W电源为例,手把手讲解如何根据输入输出电压、功率和频率等关键参数,计算匝比、峰值电流、电感量,并完成磁芯选择、匝数确定、气隙计算及线径选取。重点阐述了CCM模式下的设计要点与绕制工艺,旨在帮助工程师设计出稳定高效的反激变压器,避免常见陷阱。

weixin_29305313的博客 685

一种保护应用程序的方法 模拟Windows PE加载器,从内存资源中加载DLL

一种保护应用程序的方法-模拟Windows PE加载器,从内存资源中加载DLL  作者:老实和尚  coverlove@163.com  1、前言 目前很多敏感和重要的DLL(Dynamic-link library) 都没有提供静态版本供编译器进行静态连接(.lib文件),即使提供了静态版本也因为兼容性问题导致无法使用,而只提供DLL版本,并且很多专业软件的授权部分的API,都

hgy413的专栏 1999

YOLOv11改进 | 主干/Backbone篇 | 利用目标检测轻量化网络MobileNetV2替换Backbone(yolov11系列全系轻量化)

本文给大家带来的改进机制是,其是专为移动和嵌入式视觉应用设计的轻量化网络结构。其在MobilNetV1的基础上采用反转残差结构和线性瓶颈层。这种结构通过轻量级的深度卷积和线性卷积过滤特征,同时去除狭窄层中的非线性,以维持表征能力。MobileNetV2在性能上和精度上都要比V1版本强很多,其在多种应用(如对象检测、细粒度分类、面部属性识别和大规模地理定位)中都展现了一定的有效性。YOLOv11改进系列专栏——本专栏持续复习各种顶会内容——科研必备目录一、本文介绍二、MobileNetV2的框架原理。

Snu77的博客 2846

Vue3 - Element Plus 全局修改更换主题色配置详细教程,element-plus自定义主题色全局替换主色调强力解决方案,支持动态修改主题颜色/动态皮肤,将默认蓝色主题色更换为其他颜色!

vue3,nuxt3,element-plus,组件库,主题色,修改主题颜色,更换主题色,如何修改组件默认主题蓝色,项目主题色定制,修改失败,主题色覆盖不了,:root直接修改,hover颜色没改,自定义主题色,vue3全局设置elementPlus主题色最新详细修改教程,怎么修改全局的颜色,scss变量,覆盖原来的主题色改为自己的颜色,统一替换,有没有好办法,颜色不变,失败,无效,动态主题切换,主题颜色怎么在项目里直接改,plus主题色更换,覆盖默认主题色,最强最好用,设置主题色,换肤,皮肤,动态更换

🏆 前端领域优质创作者 1万+

从内存资源中加载DLL 模拟PE加载器

一种保护应用程序的方法 模拟Windows PE加载器,从内存资源中加载DLL From:http://www.zeroplace.cn/article.asp?id=122 1、前言 目前很多敏感和重要的DLL(Dynamic-link library) 都没有提供静态版本供编译器进行静态连接(.lib文件),即使提供了静态版本也因为兼容性问题导致无法使用,而只提供DLL版本,并且很多

kendyhj9999的专栏 1428

软件产品国际化:前后端及App多语言版本解决方案(超详细实现过程)

多语言版本解决方案是应对全球化趋势的关键策略,它通过构建灵活且可扩展的架构,支持软件产品在不同语言和文化环境下的顺畅运行与展示。此方案涵盖了前端多语言界面实现、后端多语言数据处理及大数据环境下的多语言支持等多个层面,确保公司能够高效地推出适应全球用户多样化需求的软件产品。在前端多语言界面实现方面,解决方案采用了国际化与本地化的结合方法。国际化过程确保软件的功能和代码设计能够处理多种语言和文化习惯,而本地化则针对特定地区进行界面和内容的调整。

大模型大数据攻城狮的专栏 2755

Wine:跨越平台鸿沟的Windows应用兼容层技术深度解析

你是否曾梦想在Linux或macOS上无缝运行Windows应用程序?是否厌倦了双系统切换的繁琐,或者虚拟机带来的性能损耗?Wine(Wine Is Not an Emulator)正是为这一梦想而生的革命性技术。这个开源兼容层通过精妙的系统调用转换,让Windows二进制程序能够在Unix-like系统上原生运行,打破了操作系统之间的壁垒。 ## 为什么我们需要Wine:跨平台兼容的迫切需求

gitblog_00338的博客 735

DCNv4+YOLOv8:2024最新可变形卷积赋能目标检测,从原理到实战的科研级优化指南

从理解DCNv4“自适应变形卷积核”的核心思想,到亲手将其嵌入YOLOv8并验证在复杂场景的检测效果,再到基于此探索属于自己的科研与工程方向——这个过程能让你深刻理解目标检测中“特征自适应提取”的核心价值。现在就开始行动,相信你会在目标检测的“自适应特征提取”之路上,走出一条属于自己的技术路径。实验通常会证明:嵌入DCNv4后,YOLOv8在复杂场景下的检测精度提升3-5个百分点,尤其是小目标和遮挡目标的AP提升更为明显,而推理速度仅下降5%-10%(可通过模型量化进一步优化)。2024年最新推出的。

m0_64661770的博客 269

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

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

内存加载DLL

1、前言 目前很多敏感和重要的DLL(Dynamic-link library) 都没有提供静态版本供编译器进行静态连接(.lib文件),即使提供了静态版本也因为兼容性问题导致无法使用,而只提供DLL版本,并且很多专业软件的授权部分的API,都是单独提供一个DLL来完成,而主模块通过调用DLL中的接口来完成授权功能。虽然这些软件一般都采用了加壳和反调试等保护,但是一旦这些功能失去作用,比如脱...

weixin_30788731的博客 436

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Veyra-NRVideo 采集链路排查实战:抗锯齿顺序、显示器状态事件化查询与固定帧离线对照方法

本文以仓库中的采集链路整体排查接手指南为主线,讲清楚一次"从别人手里接续"的技术交接该如何落地:怎么审查采集链路里拖慢软件的同步轮询,怎么修正抗锯齿与降噪(NR)的执行顺序,怎么用一张固定截图做出可复查的抗锯齿对照实验,以及哪些结论在当前证据下**不能**成立。读完后你能掌握 Veyra-NRVideo 中效果链顺序编排、`DisplayStateService` 事件化显示查询、截图完成回执与窗

gitblog_00830的博客 381

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

AnyPS5 PS5 原生移植工具:3 步把 PS5 可执行文件变成 Linux / Windows 原生程序

AnyPS5 是一个 PS5 可执行文件原生移植工具。它用 relinker 把 PS5 ELF 转成 Linux ELF 或 Windows PE,再链接项目自己实现的 prx 系统库——不模拟、不挂额外运行时进程。适合想在 PC 上直接跑 PS5 程序的用户,以及想读懂重链接管线源码的开发者。 ## 🎯 先说痛点:在 PC 上跑 PS5 程序,难在哪 传统思路是模拟:逐条翻译 CPU 指

gitblog_00062的博客 549
上一篇: 一个内核级的SHELL工具源代码
普通网友
博客等级 码龄17年 1粉丝 13原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值