内存管理(二)

x64下隐藏可执行内存 我们如果想要实现进程隐藏在3环通常会使用到PEB断链去达到隐藏进程的效果,但是那只是表面上的进程隐藏,所有内存的详细信息都会被储存在vad树里面,这里我们就来探究在64位下如何隐藏可执行内存。 阅读详情

探索虚拟内存

   1.0 系统信息

    GetSystemInfo, GetNativeSystemInfo.想了解64位windows提供的32位模拟层,参阅:http://www.microsoft.com/whdc/system/platform/64bit/wow64_bestprac.mspx.

  1.1 虚拟内存状态

    GlobalMemoryStatus可以获得当前内存状态的动态信息。

  1.2 Microsoft Windows 提供了以下三种机制来对内存进行操控。

      虚拟内存,内存映射文件,堆。

  1.3 VirtualAlloc来预订进程中的地址空间区域。对于大多数程序员来说,能够让系统在指定的内存地址预订区域是个不同寻常的概念。

如果应用程序在非统一内存访问(NUMA)机器上运行,那么我们可以调用VirtualAllocExNuma来强制系统在某个节点的物理内存中分配一部分虚拟内存,以此提升性能。系统会从页交换文件中来调拨物理存储器给区域。

  1.4 大页面分配必须满足三个条件:

  a. 要分配的内存块大小(即dwSize参数的值),必须是GetLargePageMinimum函数返回值的整数倍。

  b. 在调用VirtualAlloc时,必须把MEM_RESERVE | MEM_COMMIT与fdwAllocationType参数按位或起来。

  c. 在用VirtualAlloc分配内存时必须传PAGE_READWRITE保护属性给fdwProtect参数。

 1.5 重置物理存储器的内容:

  MEM_RESET只能单独使用。

 1.6 地址窗口扩展:

  在创建AWE时,Microsoft有以下两个目标:

  a.允许应用程序以一种特殊的方式分配内存,操作系统保证不会将以这种方式分配的内存换出到磁盘上。

  b.允许应用程序访问比进程地址空间还要多的内存。

 基本上AWE提供了一种方式,可以让应用程序分配一块或多块内存。 

1.7 当系统在创建线程的时候默认会为其预订1MB的地址空间并给区域顶部(即地址最高)的两个页面调拨物理存储器。我们可以通过Microsoft编译器的/F选项,或/STACK选项来改变这个默认值(/Freserve ,/STACK:reserve[,commit])。在构建程序的时候,系统会将其写入到.EXE,.DLL文件的PE文件头中,当系统创建线程的时候会根据这大小来预订地址空间,在调用CreateThead,_beginthreadex函数时可以指定一开始就要调拨的存储器的数量,所有调拨的物理储存器都有PAGE_READWRITE保护属性。系统永远不会给区域底部的那个页面调拨储存器(这样做的目的是为了保护进程使用其他的数据,使它们不会因为意外的内存写越界而遭到破坏,如果这个页面也调拨了那么系统就无法捕捉到线程对栈外区域的访问)

    当线程访问最后一个防护页面时,系统会抛出EXECEPTION_STACK_OVERFLOW异常,如果线程捕获了该异常并继续执行,那么系统将不会在同一个线程中再次抛出此异常,这时因为后面再也没有防护页面了。如果希望在同一线程中继续收到此异常,那么应用程序必须重置防护页面。我们可以调用c运行库中的_resetstkoflw(在malloc.h中)这个函数来实现。

    如果栈的增长越过了所预订的区域,那么线程就会覆盖进程地址空间中的其他数据——像这种类型的缺陷是很难找到的。另一种很难找的缺陷是栈下溢(stack underflow)如下:

    int WINAPI WinMain(HINSTANCE hInstExe, HINSTANCE , PTSTR pszCmdLine, int nCmdShow)

  {

      BYTE aBytes[100];

      aBytes[10000] = 0; //stack underflow

      这条语句有可能会引发访问违规,也可能不会(因为紧接着线程栈的后面可能有另一块 已调拨的区域),如果这样系统将无法检测到。

      return(0);

  }

   下面的栈下溢总是会引起内存破坏:

DWORD WINAPI ThreadFunc(PVOID pvParam) {

   BYTE aBytes[0x10];

   // Figure out where the stack is in the virtual address space
   // See Chapter 14 for more details about VirtualQuery
   MEMORY_BASIC_INFORMATION mbi;
   SIZE_T size = VirtualQuery(aBytes, &mbi, sizeof(mbi));

   // Allocate a block of memory just after the 1 MB stack
   SIZE_T s = (SIZE_T)mbi.AllocationBase + 1024*1024;
   PBYTE pAddress = (PBYTE)s;
   BYTE* pBytes = (BYTE*)VirtualAlloc(pAddress, 0x10000,
      MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);

   // Trigger an unnoticeable stack underflow
   aBytes[0x10000] = 1; // Write in the allocated block, past the stack

   ...

   return(0);
}

    

Linux 内存管理二 Linux mmap刨析mmap系统调用介绍 mmap系统调用介绍 阅读详情

相关推荐

二、后台内存管理

C#编程的一个优点是程序员不需要担心具体的内存管理,垃圾收集器会自动处理所有的内存清理工作。用户可以得到像C++语言那样的效率,而不需要考虑像在C++中那样内存管理工作的复杂性。虽然不必手动管理内存,但仍需要理解后台发生的事情。理解程序在后台如何管理内存有助于提高应用程序的速度和性能。本节要介绍变量分配内存时在计算机的内存中发生的情况。 注意: 本节不详细介绍许多主题的相关内容。应把这一节看作...

singhwong 907

Python 报错 Fatal Python error: PyFrame_BlockPop: block stack underflow 如何解决?

Fatal Python error: PyFrame_BlockPop: block stack underflow 只有使用pycharm的debug时会报错,正常run就不会完整 报错内容:Fatal Python error: PyFrame_BlockPop: block stack underflow

Chazz66的博客 2332

Lua源码阅读二——lua内存管理

<br />距离写的上一篇lua源码阅读,已经一个月了,在这一个月里,除了正常上班之外,业余时间都去玩战神-奥林匹斯之链了,当然,lua源码阅读的任务也在进行中。<br />接下来,将对个人在过去一个月的业余时间里阅读lua源码进行一下总结,,将陆续写一些个人阅读lua源码时的一些分析、一些疑问等等,力争保证每天一篇,力争在2010年结束之前写完。废话不多了,开始本篇的主题吧。<br /> <br />本篇文章,主要探讨一下lua中的内存管理(涉及到的文件 lmem.c,lauxlib.c )。<br />

hong201的专栏 1万+

malloc,new,VirtualAlloc,HeapAlloc性能(速度)比较

http://www.cppblog.com/woaidongmao/archive/2011/12/02/153160.html 这里比较的VC++编译的C++代码中的性能 我用的是VC6.0测试的 就不介绍这几个的用法了 我写了一段简单的测试代码 测试结果是: malloc:390 new:391 VirtualAlloc:454 HeapAlloc:47 很明显的是He

未来软件 6066

StackUnderflow

堆栈下溢 文档: 执照 版权所有 2014 Benjamin Lavin、Jonathan Emery、Maciej Ogrocki、Michael Williams、Ross Cockburn、Tamara Bain 根据 Apache 许可,版本 2.0(“许可”)获得许可; 除非遵守许可,否则您不得使用此文件。 您可以在以下网址获取许可证副本 http://www.apache.org/licenses/LICENSE-2.0 除非适用法律要求或书面同意,否则根据许可分发的软件是按“原样”分发的,没有任何类型的明示或暗示的保证或条件。 请参阅许可证以了解管理许可证下的许可和限制的特定语言。 第三方库 GSON 许可证:Apache 许可证,版本 2.0 网址: : 图标 象形图许可证:可自由更改并用于个人或商业产品( ) 网址: :

Fatal Python error: PyFrame_BlockPop: block stack underflow 源代码

Fatal Python error: PyFrame_BlockPop: block stack underflow 源代码

Linux任督二脉之内存管理(五) PPT

Linuxer五节课的第五节课 其他工程问题以及调优DMA和cache一致性内存的cgroup性能方面的调优:page in/out, swapin/outDirty ratio的一些设置swappiness前序pptLinux任督二脉之内存管理(一) PPTLinux任督二脉之内存管理(二) PPTLinux任督二脉之内存管理(三) PPTLinux任督二脉之内存管理(四) PPT习题位置htt

Linux阅码场 966

【HarmonyOS】ArkUI的组件扩展

ArkuI的组件扩展主要是通过等装饰器来对于一些常用的自定义组件进行封装, 来简化UI开发流程, 提高自定义组件的可复用性。

2302_79763237的博客 1166

【FreeRTOS】(二)内存管理

在使用FreeRTOS创建任务、队列、信号量等对象时,提供两种方法:动态方法创建和静态方法创建。动态方法创建:自动从FreeRTOS管理的内存堆中申请创建对象所需的内存,并且在对象删除后,可将这块内存释放回FreeRTOS管理的内存堆。静态方法创建:自行提供内存空间,这些内存空间在创建后就固定下来了,即使任务、队列等被删除后,这些被占用的内存空间一般也不在做其他用途。

yipenmian的博客 1399

PyTorch版Unet训练后别只看loss:手把手教你计算并可视化多类别语义分割的mIoU(附完整代码)

本文详细介绍了在PyTorch中使用Unet模型进行多类别语义分割后,如何计算和可视化mIoU(mean Intersection over Union)以全面评估模型性能。通过完整的代码示例和实用技巧,帮助开发者从loss优化转向更精准的区域分割评估,特别适用于医学图像分析等关键场景。

weixin_30906185的博客 435

2022年全国职业院校技能大赛 高职组大数据技术与应用卷⑦——解析答案

大数据时代,电商经营模式发生很大改变。在传统运营模式中,缺乏数据积累,人们在做出一些决策行为过程中,更多是凭借个人经验和直觉,发展路径比较自我封闭。而大数据时代,为人们提供一种全新的思路,通过大量的数据分析得出的结果将更加现实和准确。商家可以对客户的消费行为信息数据进行收集和整理,比如消费者购买产品的花费、选择产品的渠道、偏好产品的类型、产品回购周期、购买产品的目的、消费者家庭背景、工作和生活环境、个人消费观和价值观等。通过数据追踪,知道顾客从哪儿来,是看了某网站投放的广告还是通过朋友推荐链接,是新访客还是

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 470

Linux任督二脉之内存管理(二) PPT

五节课的第二节课-内存的动态申请和释放* slab、kmalloc/kfree、/proc/slabinfo和slabtop* 用户空间malloc/free与内核之间的关系* mallopt* vmalloc* 内存耗尽(OOM)、oom_score和oom_adj* Android进程生命周期与OOM练习题*看/proc/slabinfo,运行slabtop*运行mallopt.c程序:mal

Linux阅码场 1131

UG NX二次开发(C#)-外部模式-批量删除某些图层中的体对象和曲线对象

在 UG NX中,有时需要批量删除某文件夹下多个.prt文件中固定一些图层中的体对象和曲线对象,这时如果采用手动逐个打开模型,并选择针对的图层删除,即耗时也容易遗漏,因此采用外部模式来处理比较方便。本文介绍批量删除某些图层中的体对象和曲线对象。

GimiGimmy 3035

内存管理(二) ARC

内存管理(二) ARC 上篇我们介绍了MRC,本篇我们介绍下ARC ARC概述 ARC是一种编译器功能,它通过LLVM编译器和Runtime协作来进行自动管理内存。LLVM编译器会在编译时在合适的地方为 OC 对象插入retain、release和autorelease代码来自动管理对象的内存,从而彻底解放程序员。 ARC不能解决的问题 Block等引发的循环引用问题(更多循环引用看我这篇文章) 底层 Core Foundation 对象需要手动管理 所有权修饰符 __strong __weak __

iOS随笔 3041

深入YOLOv8内部核心:用RepNCSPELAN4深度重构主干网络,即插即用的高效涨点方案

本文提出了一种改进YOLOv8目标检测模型的方法,通过在YOLOv8中引入RepNCSPELAN模块来提高检测性能。该模块融合了RepVGG重参数化思想与CSP-ELAN结构,在保持推理速度的同时增强特征表达能力。实验结果表明,改进后的RepNCSPELAN-YOLOv8相比原模型在多项指标上均有提升:准确率从0.84提高到0.86,召回率从0.72提升至0.81,mAP50和mAP50-95也分别提高了0.06和0.04。文章详细介绍了模块设计原理和移植步骤,包括配置文件创建、代码修改等关键环节,为YOL

FJN110的博客 185

《Python基础教程》专栏总结篇

今天给大家带来的文章是《Python基础教程》专栏总结篇,希望能对同学们有所帮助。 文章目录 1. 背景 2. 专栏亮点 3. 你的收获 4. 详细目录

weixin_43178406的博客 73万+

Linux的内存管理(二)

Linux的内存管理(二) 6.Linux数据结构 pg_data_t的主要数据结构 域 作用 node_zones 保存该节点所拥有的管理区描述符, DMA、NORMAL、HIGHMEM node_zonelists 内存管理区的分配策略, 当调用free_area_init_core()时,由build_zonelists()函数设置

totxian的专栏 889

Claude Code Cli 源码泄露事件全解析:从51万行代码中拆解AI Agent的记忆护城河

2026年3月,Anthropic的AI编程助手Claude Code意外泄露51万行核心代码,暴露了其多Agent架构、六级权限验证系统及创新的记忆机制。记忆系统采用四层设计:用户自定义框架、自动记忆提取、智能上下文压缩和纯文件存储。最独特的是"自动做梦"功能,AI会定期整理记忆,类似人类睡眠记忆巩固。代码还揭示未发布功能如电子宠物系统,但也暴露权限系统漏洞和代码质量问题。这次泄露展现了AI助手核心技术的复杂性,特别是其记忆系统如何通过透明可编辑的设计建立用户信任。

program哲学 468

linux内存管理分析 二,linux内存管理分析【二】

为建立内存管理系统,在内核初始化过程中调用了下面几个函数:init/main.casmlinkagevoid__initstart_kernel(void){......初始化持久映射与临时映射的一些信息,后面持久映射和临时映射一节将详细讲解page_address_init();setup_arch是特定于体系架构的函数,负责初始化自举分配器和内核页表等。setup_arch(&c...

weixin_39639518的博客 311

2025华为OD机试真题目录汇总 B+C+D+E卷(570道)(Python语言)

本文是华为OD机试真题(Python 语言)专栏的目录贴(持续更新中…)华为OD是Outsourcing Dispacth模式,是华为和外企德科联合招聘的简称。目前华为大多数是OD招聘。OD模式也是华为提出的一种新的用工形式,每年都会从OD项目挑优秀员工转为正编。所有OD和正式员工一样对待,没有差别,部门平时开会、评审等活动都是一起参加的,是同薪同酬,都是由华为的HR直接定的薪资,看的是我们技术能力。华为是大企业,能到华为上班也是有能力的,每个部门都有好多职位,是金子,在哪都会发光。

KJ.JK 18万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

轻量级操作系统FreeRTOS的内存管理机制(二)

轻量级操作系统FreeRTOS的内存管理机制

嵌入式企鹅圈 5001

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

内存管理二

C++内存管理 [导语] 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内存管理一关是必须要过的,除非放弃C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃

zou_J_L专栏 925

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Linux内存管理解析(二) : 关于Linux内存管理的大体框架

  什么是内存管理 ?   首先内存管理管理的主要对象是虚拟内存,但是虚拟内存对应的映射主要为物理内存,其次也可能通过交换空间把虚拟内存与硬盘映射起来,既然如此,那我们先了解物理内存的管理。   对于物理内存而言,首先我们需要知道的是,linux x86体系结构中内核主要处于 0 - 1G(物理地址)中。而物理内存是有限的。但我们又要为每个程序提供相互独立且连续的内存空间。正因如此我们引...

RT_776的博客 232

linux 内存管理 二

疫情憋在家,继续写下笔记,Buddy 算法把空闲页面管理起来,一个已经被占用的页面,其他人肯定不能申请到的,这些页面都是4k 8k 16k .... ,无论是在内核还是在应用,有时候都要申请很小的内存。比如说我们在内核中需要申请16Bytes,Buddy 还是申请4K的内存,这样就很乱费,所以在内核里面会进行内存的二次管理,在Buddy中申请的内存进行切割,内核中这种机制叫做slab。 Slab...

mj5742356的专栏 366
上一篇: 内存管理(一)
下一篇: DOS命令实现文件合并隐藏秘密
SWenJing
博客等级 码龄18年 8粉丝 20原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值