仿真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

从科研小白到动物行为分析:我的DeepLabCut 3.0安装与初体验全记录

本文记录了从科研小白到成功安装并使用DeepLabCut 3.0进行动物行为分析的全过程。详细介绍了Anaconda环境配置、CUDA版本选择、DeepLabCut安装步骤及验证方法,并分享了初体验中的实用技巧和跨学科研究心得,为生物研究者提供了AI工具应用的实战指南。

weixin_30235225的博客 402

PE文件(1)导入表

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

nyzdmc的博客 865

用Matlab机器人工具箱搞定六轴机械臂建模:从DH参数到3D可视化(附完整代码)

本文详细介绍了如何使用Matlab机器人工具箱进行六轴机械臂建模,从DH参数输入到3D可视化全流程解析。通过正运动学验证、逆运动学求解和交互控制等实战技巧,帮助工程师快速掌握机械臂建模核心方法,并提供完整代码示例解决常见问题。

weixin_27372101的博客 394

几何修复_ANSYS流体分析:几何前处理

建模及几何处理工具非常多,选择起来让人眼花缭乱。对于仿真而言,高效的对几何进行清理及生成符合仿真要求的几何至关重要。ANSYS SpaceClaim Direct Modeler是基于直接建模思想的新一代3D高效率建模和几何编辑修补软件。SCDM提供了当今最快速、最富有创意的直接建模解决方案。由于它的直接建模能力即使对于导入的其它3D模型(如catia、proe、solid works创建的几何)...

weixin_35778830的博客 2417

怎么拦截系统函数

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

6559

PINN for PDE(偏微分方程)4 - 反向问题 - Burgers’ equation

PINN for PDE(偏微分方程)4 - 反向问题 - Burgers’ equation

m0_62030579的博客 3003

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

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

hgy413的专栏 1999

NBU计算机大二下期末

计算机网络 任课老师:JG (放了一学期的他自己的视频和上了一学期网课没什么区别,甚至不如上网课。。。) 考试题型 填空题10*1 判断题10*1 选择题30*1 简答和计算题30(4题) 讨论题20 强烈建议不要再这门课上花太多时间复习,不然有复习了个寂寞的感觉。。。计网是一页开卷的,一页开卷纸不用写太多,第一他不会考太详细;第二反正最后都要被收走。 填空题、判断题基本看懂了英文就能做的差不多;选择题去网上找点英文题多刷一下问题不大;简答题把书上每章根据他上课的内容在开卷纸上抄下就好,今年是解释check

weixin_45816954的博客 710

基于深度学习的三维重建算法——详解与实现

随着深度学习技术的迅猛发展,基于深度学习的三维重建算法在最近几年取得了显著的进展。而基于深度学习的三维重建算法通过利用深度神经网络,能够从大规模数据中学习到更准确、鲁棒的三维结构表示。本文综述了基于深度学习的三维重建算法,并给出了相应的源代码。随着深度学习技术的不断发展,我们相信基于深度学习的三维重建算法将会在未来得到更广泛的应用。实验结果表明,基于深度学习的三维重建算法在准确性和鲁棒性方面取得了显著的提升。以上是关于基于深度学习的三维重建算法的详细介绍与实现,希望对您有所帮助。

CyberGenius的博客 1227

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

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

kendyhj9999的专栏 1427

Simulink实例--电动汽车充电站与微电网协同运行仿真

​电网负荷剧增:单站1000台车同时充电需150MW功率(超配电网容量30%)​能源孤岛问题:传统充电站仅作为单向负荷,无法参与电网调频​可再生能源消纳:光伏/风电波动导致充电站功率波动±40%​多目标矛盾:充电效率、电网稳定性、设备寿命的协同优化​节能效果:每百万辆车年节电1.8GWh​成本回收:投资回报周期<4年(IRR>25%)​减排效益:每年减少CO₂排放12万吨。

xiaoheshang_123的博客 330

Windows PE文件启动全过程深度解析:从双击到main函数

可执行文件(.exe)的启动本质是操作系统将磁盘PE格式映像加载至内存并移交控制权的过程。其核心原理涵盖进程创建、虚拟地址空间初始化、PE节区映射、导入表解析、重定位处理及CRT运行时初始化等关键阶段。这一机制直接支撑Windows应用程序的隔离性、安全性和兼容性,广泛应用于软件开发、逆向分析、漏洞挖掘与系统运维等领域。深入理解PE加载流程,尤其是CreateProcess内核路径、ntdll加载器行为和ImageBase重定位机制,是诊断‘0xc000007b’、‘找不到模块’等典型启动失败问题的技术根基

weixin_33462927的博客 289

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

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

gitblog_00338的博客 735

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

内存加载DLL

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

weixin_30788731的博客 436

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Wine 源码构建与 Windows 程序运行实战指南:从 configure 到 winecfg 配置调优

Wine 是一个允许在 Unix 类操作系统上直接运行 Microsoft Windows 程序(涵盖 DOS、Windows 3.x、Win32 与 Win64 可执行文件)的自由软件。本文以 Wine 源码仓库中的 [README.md](https://link.gitcode.com/i/1d4b7557bad9897ee4a367481c1b5cdf) 为核心主线,完整梳理从环境准备、源

gitblog_00830的博客 381
上一篇: 如何运行内存中的程序
下一篇: 8088 汇编指令速查手册
yxyhack
博客等级 码龄19年 296粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值