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

恶意软件环境感知与沙箱逃逸技术:Demiguise原理与攻防实战 在计算机安全领域,沙箱是一种重要的动态分析技术,用于在隔离环境中安全执行和观察可疑程序行为,以检测恶意软件。其核心原理是通过虚拟化或容器化技术,创建一个受控的、与真实系统隔离的执行环境,从而在不危害主机的情况下分析软件意图。这项技术的价值在于能够自动化、大规模地筛查恶意代码,是威胁检测体系的关键组成部分,广泛应用于病毒分析、漏洞研究等场景。然而,攻击者为了对抗自动化分析,发展出了环境感知技术,通过检测运行环境的特征(如硬件信息、软件配置、用户交互模式)来判断自身是否处于沙箱中。本文聚焦的Demiguise正 阅读详情
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;
}


 
现代终端防护绕过技术:Shellcode投递与内存执行攻防解析 在网络安全领域,终端防护与恶意代码检测是保障系统安全的核心防线。其基本原理是通过静态特征扫描、动态行为监控和内存分析等多层次机制,识别和阻断恶意活动。这些技术的核心价值在于实时防御未知威胁,保护关键业务数据与系统完整性。在实际应用场景中,攻防对抗往往围绕代码执行权限展开,攻击者需要在不触发警报的前提下完成载荷投递。本文聚焦于**进程镂空**和**Shellcode加密**等关键技术,深入剖析如何通过精细化的内存操作和API调用伪装,绕过现代终端检测与响应系统。这些方法不仅涉及底层的系统调用机制,还涵盖了合法 阅读详情

相关推荐

ShellcodePack赋能DLL与COM劫持:高级隐蔽进程控制技术实践

在Windows系统安全与进程控制领域,DLL劫持和COM劫持是两种经典的代码注入技术。其核心原理在于利用系统模块加载机制中的信任关系,例如DLL搜索顺序或COM组件注册表查找,诱导目标进程主动加载并执行攻击者预设的代码。这类技术的核心价值在于其极高的隐蔽性,能够绕过传统基于文件特征的静态检测,实现权限维持和持久化访问。在实际应用场景中,红队渗透测试和高级威胁模拟常利用这些技术进行横向移动和防御规避。为了进一步提升对抗能力,现代载荷封装工具如ShellcodePack被广泛采用。它通过对原始Shellcod

weixin_30653023的博客 383

PE文件(1)导入表

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

nyzdmc的博客 865

红队实战:绕过360/火绒,从Webshell到Cobalt Strike上线的完整免杀方案

在网络安全领域,终端检测与响应(EDR)和命令与控制(C2)是攻防对抗的核心概念。EDR通过监控端点行为来识别威胁,而C2则是攻击者用于远程控制受害主机的通信机制。其技术价值在于构建了现代威胁检测与隐蔽攻击的基础框架。在实战中,攻击者常需绕过EDR的静态与动态检测,将Webshell作为跳板,部署C2 Beacon以实现持久化控制。这涉及Webshell免杀、载荷生成、进程注入和流量伪装等多个环节,对红队人员的工程能力提出了较高要求。本文聚焦于在已部署360、火绒等安全软件的Windows服务器环境下,如何

weixin_34335458的博客 350

怎么拦截系统函数

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

6559

Havoc框架逆向工程实战:从样本分析到架构还原

恶意软件分析是网络安全领域的核心技术,其核心原理在于通过逆向工程深入理解恶意代码的行为逻辑与实现机制。这项技术的价值在于能够精准识别威胁、还原攻击链,并为主动防御提供关键情报。在实际应用场景中,安全分析师常需面对如Havoc这类模块化、持续演化的高级攻击框架。针对此类复杂样本,有效的分析需要遵循分层递进的策略,结合静态与动态方法。例如,通过行为动态分析可快速勾勒样本轮廓,利用Procmon监控进程活动,而代码静态逆向分析则借助IDA Pro或Ghidra等工具深入解析通信加密、命令分发等关键模块。掌握这些方

weixin_30851867的博客 320

Unity找不到ffmpeg.dll的四大根因与实战解决方案

动态链接库(DLL)是Windows平台原生功能的核心组件,其加载机制依赖于路径搜索、ABI兼容性、架构匹配及运行时环境干预。Unity引擎对DllImport的解析并非直接调用系统LoadLibrary,而是叠加了平台识别、Plugins目录规则、构建资源剥离等多层约束,导致常见‘DllNotFoundException’错误表面是路径问题,实则涉及PE格式、ASLR支持、CRT依赖链与加载顺序等底层原理。尤其在音视频处理场景中,ffmpeg.dll作为高频依赖项,其MSVC/MinGW编译差异、x64/

weixin_32187037的博客 561

学写压缩壳心得系列之三 模拟加载,步步为营

在熟悉了PE结构之后,我们还有知道系统从磁盘加载静态文件映射到内存,作了哪一些的改变。 PE结构,就好像一张指南,告之系统自己的各个属性,哪些地方保存着哪些数据,随后又加载到哪里去。加壳的PE文件始终是也是一个文件,同原始的PE文件比较,只不过是两种数据结构相同,却数据内容不同罢了。 下面我们模拟一次系统loader的过程,探讨一下PE文件是如何从磁盘的静态数据加载的内存中去的。...

weixin_30528371的博客 98

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

ARM64EC 全景解读:从仿真原理到原生性能的飞跃

基于 Darek Mihocka (Emulators.com) 的 "ARM64 Boot Camp" 教程系列,结合微软官方文档与社区逆向工程研究,本章将带你深入理解 ARM64EC 的本质。不同于传统的“构建指南”,本文侧重于**“为什么”**——揭示 ARM64EC 如何通过天才的设计打破了架构间的“气密舱”效应,实现 x64 与 ARM64 的无缝融合。

weixin_46486440的博客 681

Vivado 2018.3实战:用IDELAYE3和ISERDESE3搞定高速ADC数据采集(附仿真源码)

本文详细介绍了在Vivado 2018.3中使用Xilinx UltraScale架构的IDELAYE3和ISERDESE3原语实现高速ADC数据采集的实战方法。通过分析5GHz采样系统的时序挑战,提供从PCB布局到Vivado实现的完整解决方案,包括精密时序校准、多相位数据重组及系统级调试技巧,并附赠仿真源码助力工程师快速掌握高速数据采集技术。

weixin_30567225的博客 582

图解说明JLink驱动与目标板电源匹配的关键细节

深入讲解JLink驱动安装及使用过程中,如何正确匹配目标板电源,避免常见通信故障。通过图解方式清晰展示关键连接细节,确保调试稳定可靠,是嵌入式开发中不可或缺的实战经验分享。

weixin_42173218的博客 431

伪装成监管文件的“狼爪”:Arcane Werewolf组织如何用钓鱼邮件撕开俄罗斯制造企业的数字防线?

近日,俄罗斯知名网络安全公司BI.ZONE发布最新威胁情报报告,披露了一个代号为“Arcane Werewolf”(神秘狼人)的APT组织,正以高度定制化的网络钓鱼手段,对俄罗斯本土制造企业发起持续性、高成功率的定向攻击。“最关键的是打破IT与OT的壁垒,”芦笛总结道,“安全不能只是IT部门的事。“最可怕的情况不是数据泄露,而是物理破坏,”芦笛严肃表示,“想象一下,攻击者远程修改注塑机的温度参数,或让传送带突然反向运转——这可能导致设备损毁、产线停摆,甚至人员伤亡。正如芦笛所言:“钓鱼的本质是信任的滥用。

331

Cadence学习之路(六)元器件封装绘制

使用Allegro PCB Designer绘制元器件封装

qq_46757048的博客 1万+

linux沙箱隔离_360隔离沙箱在WINDOWS 10 的WSL下的沙箱逃逸

简介:360隔离沙箱是360安全中心于2011年5月14日发布的安全产品,目前内置与360安全卫士的功能大全中。在360隔离沙箱内运行程序完全隔离不怕中毒。快速建立隔离环境,轻量便捷。自动识别与手动模式结合。Windows Subsystem for Linux(简称WSL)是一个为在Windows 10上能够原生运行Linux二进制可执行文件(ELF格式)的兼容层。它是由微软与Canonical...

weixin_39737951的博客 1065

[pytorch] MedicalNet 3D Resnet预训练模型迁移学习实战:从分割到分类的代码改造

本文详细介绍了如何利用PyTorch对MedicalNet 3D ResNet预训练模型进行迁移学习,从分割任务改造为分类任务。通过解析模型结构、调整分类头、加载预训练权重及优化训练策略,帮助开发者在医疗影像领域快速实现高效模型部署。文章还涵盖了数据预处理、增强技巧及模型轻量化等实用内容。

kmeans3miner的博客 247

YOLOv8训练流程-原理解析[目标检测理论篇]

本篇文章主要介绍了YOLOv8训练的流程,主要介绍了Task Aligned Assigner正负样本匹配策略以及YOLOv8的损失计算。

ice 4517
上一篇: 动态加载EXE文件到内存执行
下一篇: 在同一个进程空间运行两个程序
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值