探索NTFS探寻Windows NT/2000 Copy On Write机制

Copy-On-Write机制,全局hook(一) 我本来想在ring3下全局hook,大约有这么几种方法: 1: 用SetWindowsHookEx,安装的钩子类型,如WH_GETMESSAGE,WH_KEYBOARD等,但这种方法只能挂接系统中的所有GUI线程。 2: 还有一种通过插入注册表来实现 HKEY_LOCAL_MACHINE/Software/Microsoft/Windows NT/CurrentVersion/Windows/AppInit_DLLs,这种方法简单,但是还是只能挂钩GUI 程序,并且这个键值已经被广大HI 阅读详情
探寻Windows NT/2000 Copy On Write机制
WebCrazy(http://wecrazy.yeah.net)

Copy On Write机制是典型的Lazy evaluation实现,现代操作系统如Windows NT/2000,UNIX/Linux的内存管理部分大量使用这种机制。本文通过对Windows NT/2000中Copy On Write机制作一深入分析,旨在探寻Windows NT/2000内核态内存管理器的几个重要的数据结构,在继续以下的讨论之前,您务必要明白PDE/PTE、VAD等一些术语(参见我先前的《小议Windows NT/2000分页机制》与《分析Windows NT/2000堆内存与虚拟内存组织 》),另外我将述及另几个与内存子系统相关的术语,如Control Area,Subsection,Working Set List,Page Frame Database。下面列出我在本文中用于分析Copy On Write机制的代码,文中所有的叙述均基于这段代码。

// cow.c
// Writed by ChenChengQin(tsu00@263.net )

#include <stdio.h>
#include <string.h>

#define BUFSIZE 10

#pragma data_seg(".seg_cow")
char data[BUFSIZE]={'A','A','A','A','A','A','A','A','A',''};
#pragma data_seg()
#pragma comment(linker, "/SECTION:.seg_cow,RWC")

void main(int argc,char *argv[])
{
int i;
if (argc>1){
//memset(data,'B',BUFSIZE);
__asm int 3;
for(i=0;i<BUFSIZE;i++)
data[i]='B';
data[BUFSIZE-1]='';
}
printf("%s",data);

getchar();
}


非常简单的一段代码,使用如下指令编译:

cl /Zi /Fa cow.c

运行一个实例(别退出):
c:>cow
AAAAAAAAAA

使用SoftICE看看cow.exe映像在内存中的分布:

:addr cow
:map32 cow
Owner Obj Name Obj# Address Size Type
cow .text 0001 001B:00401000 00006BB8 CODE RO
cow .rdata 0002 0023:00408000 000005C8 IDATA RO
cow .data 0003 0023:00409000 00002EC4 IDATA RW
cow .idata 0004 0023:0040C000 00000633 IDATA RW
cow .seg_cow 0005 0023:0040D000 0000010C IDATA RW
cow .reloc 0006 0023:0040E000 000006B2 IDATA RO

//查看.seg_cow段(虚拟地址0x40d000)的首地址的PTE,详见《小议Windows NT/2000分页机制 》
:dd c0000000+1*1000+d*4 l 10
0023:C0001034 003F9225 00000000 00000000 00C3C067 %.?.........g...
--------
|
|_cow.exe进程.seg_cow段首地址的PTE

SoftICE的page命令可以dump出这个PTE的属性,如下所示:

:page 40d000
Linear Physical Attributes
0040D000 003F9000 P A U R

不过这里列出的Attributes并没有指出.seg_cow的Copy On Write属性,因为X86的PTE的低12位(0-11),即属性位并没有指出这个属性,但Microsoft(当然不仅仅Microsoft)使用了这12位中的保留的系统(OS)位,下面是这一DWORD值在Windows 2000的具体格式:

struct _HARDWARE_PTE_X86 (sizeof=4)
+0 bits0-0 Valid
+0 bits1-1 Write
+0 bits2-2 Owner
+0 bits3-3 WriteThrough
+0 bits4-4 CacheDisable
+0 bits5-5 Accessed
+0 bits6-6 Dirty
+0 bits7-7 LargePage
+0 bits8-8 Global
+0 bits9-9 CopyOnWrite
+0 bits10-10 Prototype
+0 bits11-11 reserved
+0 bits12-31 PageFrameNumber

从上的PTE为003F9225的值可以看出0x40d000的只读、CopyOnWrite属性。只读属性是实现CopyOnWrite的保证,这样X86才能在另一个cow实例试图写.seg_cow段时raise一个0eh(页故障)中断(陷阱),让Windows处理这个Copy On Write操作。基于这个原理,我即运行cow的另一个实例,跟踪Copy On Write机制:

c:>cow 1(设置一个参数,让cow试图更新.seg_cow段)

我在代码中设置了int 3指令让softice在i3here设置为on状态时让softice激活。然后使用bpint e指令让softice捕获0eh中断。i386在raise 0e中断时将发生页故障的虚拟地址保存于CR2寄存器中。Windows 2000页故障处理入口KiTrap0E就是根据这个地址制作cow进程.seg_cow的副本,并替代第二个cow实例工作集(Working List,这儿只指进程工作集,未牵涉系统工作集)的原始页面,实现CopyOnWrite的目的。我并不准备将KiTrap0E的汇编代码列于此,只是讲一讲Windows寻找CR2指定的地址的属性的步骤,Windows 2000中由MiQueryAddressState过程实现。KiTrap0E当然也会调用MiQueryAddressState。

1、首先检查0x40d000(由CR2指定)的PDE。由MiDoesPdeExistAndMakeValid实现。
2、检查PTE。
3、查页框数据库(PFN,Page Frame Database,由内核结构数组变量MmPfnDatabase指定)
4、根据PFN中工作集索引寻找Working Set List Entry(Working Set基址由内核变量_MmWsle指出),这一步骤由内核例程MiLocateWsle完成。
5、然后根据Wsle的属性(也是前12位)查找MmProtectToValue数组,以获得用户态可以理解的格式。即在winnt.h中定义的PAGE_WRITECOPY、PAGE_READWRITE等等。

步骤3至5其实也实现了物理地址至线性地址的转换,当然这个是在这个地址Present的前提下。这也是为什么Windows 2000使用如此复杂且繁琐的结构来管理内存子系统。确切的说我并没有谈到PFN的PteAddress成员(下面i386kd输出可以看到),这些都是使用分页文件(pagefile.sys,通过ProtoPTE,即原型PTE实现的),共享内存块等的基础。David Solomon的书《Inside Windows NT,2nd Edition》有四种PFN形态的具体结构等等其他很多详细的说明。

下面是i386kd的分析,其实根据上面我给定的一些内核变量SoftICE也可以看出些东西。不过远没有i386kd来的容易。

// cow.exe 进程ID(ClientID)=4ac
kd> !process 4ac
!process 4ac
Searching for Process with Cid == 4ac
PROCESS ff605d60 SessionId: 0 Cid: 04ac Peb: 7ffdf000 ParentCid: 04a0
DirBase: 017bc000 ObjectTable: ff610f88 TableSize: 12.
Image: cow.exe
VadRoot ff624168 Clone 0 Private 37. Modified 0. Locked 0.
.
.
.
//转换40d000至物理地址,取得PFN。
//SoftICE中使用Page命令
kd> !vtop 017bc000 40d000
--------
|_DirBase(见!process输出)
!vtop 017bc000 40d000
Pdi 1 Pti d //输出PDE与PTE
0040d000 00a6e000 pfn(00a6e) //输出PFN

//查PfnDatabase
//Softice中:
// dd @MmPfnDatabase+a6e*18 (每一PFN项占用0x18字节)
kd> !pfn a6e
!pfn a6e
PFN 00000A6E at address FFB8EA50
flink 00000097 blink / share count 00000001 pteaddress E151E1B4
reference count 0001 color 0
restore pte 056B04B0 containing page 002AF3 Active P
Shared


/*
查MmWsle
SoftICE中:
:dd @MmWsle+97*4 l 10
0023:C05028FC 0040DF29 000006A0 00510C09 000009B0 ).@.......Q.....
--------
|_0040D000是不是PFN为A6E的Virtual Address
*/
kd> !wsle 4ac
!wsle 4ac

// KPEB中的VmWorkingSetList成员(Windows 2000 Server Build 2195中偏移0f0处,值为C0502000)指出Working Set List
// 见《Windows 2000内核KPEB/KTEB详细结构 》

Working Set @ c0502000
Quota: 2f FirstFree: 22 FirstDynamic: 4
LastEntry ad NextSlot: 16 LastInitialized 257
NonDirect 1e HashTable: c06f3000 HashTableSize: 200
.
.
.

这些i386kd指令已经较清楚的指出以上5个步骤。但要理解Copy On Write还必须对Section(用户态的FileMapping)对象有一基本的理解。在使用NtCreateSection/NtOpenSection(CreateFileMapping/OpenFileMapping间接使用这些例程)等时,Windows 2000一般会在VAD这个自平衡的二叉树中插入一个节点。(我在《分析Windows NT/2000堆内存与虚拟内存组织 》中详细介绍过VAD)。SoftICE在使用query指令dump VAD树时有一成员MMCI(内存管理结构),她指向的是Control Area。如下所示:

// SoftICE输出
:query cow
Address Range Flags MMCI PTE Name
00010000-00010000 C4000001
.
.
.
00400000-0040E000 07100005 FF62FD48 E11EBF80 cow.exe
--------
|_Control Area
.
.
.

其实我们使用i386kd的!memusage可以dump出系统中所有的Control Area:

kd> !memusage
loading PFN database
loading (99% complete)
Zeroed: 15 ( 60 kb)
Free: 0 ( 0 kb)
Standby: 1274 ( 5096 kb)
Modified: 686 ( 2744 kb)
ModifiedNoWrite: 1 ( 4 kb)
Active/Valid: 14380 ( 57520 kb)
Transition: 11 ( 44 kb)
Unknown: 0 ( 0 kb)
TOTAL: 16367 ( 65468 kb)
Building kernel map
Finished building kernel map

Control Valid Standby Dirty Shared Locked PageTables name
.
.
.
ff62fd48 32 0 0 0 0 0 mapped_file( cow.exe )
--------
|_Control Area与上面SoftICE的MMCI一致
.
.
.

i386kd的ca命令可以看出一个Control Area结构:

kd> !ca ff62fd48

ControlArea @ff62fd48
Segment: e11ebf48 Flink 0 Blink: 0
Section Ref 1 Pfn Ref 8 Mapped Views: 1
User Ref 2 Subsections 7 Flush Count: 0
File Object ff684288 ModWriteCount 0 System Views: 0
WaitForDel 0 Paged Usage a0 NonPaged Usage 120
Flags (10000a0) Image File HadUserReference

File: Desktophackcow.exe

Segment @ e11ebf48:
Base address 0 Total Ptes f NonExtendPtes: f
Image commit 5 ControlArea ff62fd48 SizeOfSegment: f000
Image Base 0 Committed 0 PTE Template: 54f1c30
Based Addr 400000 ProtoPtes e11ebf80 Image Info: e11ebfc0

Subsection 1. @ ff62fd80
ControlArea: ff62fd48 Starting Sector 0 Number Of Sectors 8
Base Pte e11ebf80 Ptes In subsect 1 Unused Ptes 0
Flags 15 Sector Offset 0 Protection 1
ReadOnly CopyOnWrite
.
.
.

由ca命令的输出结果可以看出这个Control Area有7个子区域(Subsection),限于篇幅我删掉部分输出结果,你可以将所有结果与SoftICE的map32指令输出比较比较。Control Area中实际上所有Subsection结构均是使用线性结构组织,每个Subsection在Windows 2000 Server Build 2195中占用0x20字节。所以SoftICE可以很容易的分析所有的这些。

需要指出的是不仅仅Section对象使用Control Area,她在Windows 2000中也由SECTION_OBJECT_POINTERS结构使用:

typedef struct _SECTION_OBJECT_POINTERS {
PVOID DataSectionObject; //Control Area
PVOID SharedCacheMap;
PVOID ImageSectionObject; //Control Area
} SECTION_OBJECT_POINTERS;

而每一个FILE_OBJECT都有SECTION_OBJECT_POINTERS成员(见ntddk.h)。这个机制是Windows 2000装载可执行文件、文件IO操作(看到DataSectionObject与ImageSectionObject了吗?)的关键所在。只有熟悉这些结构,才可能真正初步明白Copy On Write机制。剩下的只有你自己多研究研究了。

关于cow.exe,我还有两点要说明的是:
1、cow.c使用#pragma comment(linker, "/SECTION:.seg_cow,RWC")显式的指出.cow_seg段的Copy On Write属性,实际上在Windows NT/2000中这种共享属性是默认存在的。可执行文件的映射、可读可写的数据都被默认设为Copy On Write属性,您可以使用Jeffrey Richter的VMMAP验证这种说法。
2、Windows NT/2000使用可执行文件名(ImageName)用于识别这种程序多个实例间使用Copy On Write共享内存,对于有不同文件名的可执行文件,即便其内容完全一致,这种机制也不起作用,而用分别映射Section对象替之。

所有以上讨论的都没有找到Microsoft的Full Documented,所有以上讨论的也只是在我初步分析Windows 2000后得到的,有什么技术问题需要交流的,欢迎赐教(tsu00@263.net)!

参考资料:
1.David Solomom《Inside Windows NT,2nd Edition》
Undocumented Windows NT 带图完整英文版chm Table of Contents Chapter 1: Windows NT: An Inside Look EVALUATING WINDOWS NT DELVING INTO THE WINDOWS NT ARCHITECTURE SUMMARY Chapter 2: Writing Windows NT Device Drivers PREREQUISITES TO WRITING NT DEVICE DRIVERS DRIVER BUILD PROCEDURE STRUCTURE OF A DEVICE DRIVER SUMMARY Chapter 3: Win32 Implementations: A Comparative Look WIN32 API IMPLEMENTATION ON WINDOWS 95 WIN32 API IMPLEMENTATION ON WINDOWS NT WIN32 IMPLEMENTATION DIFFERENCES SUMMARY Chapter 4: Memory Management MEMORY MODELS IN MICROSOFT OPERATING SYSTEMS WINDOWS NT MEMORY MANAGEMENT OVERVIEW BELOW THE OPERATING SYSTEM THE INSIDE LOOK VIRTUAL MEMORY MANAGEMENT VIRTUAL ADDRESS DESCRIPTORS IMPACT ON HOOKING SWITCHING CONTEXT DIFFERENCES BETWEEN WINDOWS NT AND WINDOWS 95/98 SUMMARY Chapter 5: Reverse Engineering Techniques HOW TO PREPARE FOR REVERSE ENGINEERING HOW TO REVERSE ENGINEER UNDERSTANDING CODE GENERATION PATTERNS HOW WINDOWS NT PROVIDES DEBUGGING INFORMATION HOW TO DECIPHER THE PARAMETERS PASSED TO AN UNDOCUMENTED FUNCTION TYPICAL ASSEMBLY LANGUAGE PATTERNS AND THEIR MEANINGS THE PRACTICAL APPLICATION OF REVERSE ENGINEERING SUMMARY Chapter 6: Hooking Windows NT System Services SYSTEM SERVICES: THE LONG VIEW NEED FOR HOOKING SYSTEM SERVICES TYPES OF HOOKS IMPLEMENTATIONS OF HOOKS WINDOWS NT SYSTEM SERVICES HOOKING NT SYSTEM SERVICES SUMMARY Chapter 7: Adding New System Services to the Windows NT Kernal DETAILED IMPLEMENTATION OF A SYSTEM SERVICE IN WINDOWS NT ADDING NEW SYSTEM SERVICES EXAMPLE OF ADDING A NEW SYSTEM SERVICE SUMMARY Chapter 8: Local Procedure Call THE ORIGIN OF THE SUBSYSTEMS LOCAL PROCEDURE CALL PORT-RELATED FUNCTIONS LPC SAMPLE PROGRAMS QUICK LPC SUMMARY Chapter 9: Hooking Software Interrupts WHAT ARE INTERRUPTS? HOW OPERATING SYSTEMS USE SOFTWARE INTERRUPTS WHY SOFTWARE INTERRUPTS NEED TO BE HOOKED HOW TO HOOK SOFTWARE INTERRUPTS SUMMARY Chapter 10: Adding New Software Interrupts WHAT HAPPENS WHEN A 32-BIT APPLICATION EXECUTES AN INT NN INSTRUCTION? ADDING NEW SOFTWARE INTERRUPTS TO THE WINDOWS NT KERNEL USING CALLGATES TO EXECUTE PRIVILEGED CODE HOW TO USE THE CALLGATE TECHNIQUE PAGING ISSUES SUMMARY Chapter 11: Portable Executable File Format OVERVIEW OF A PE FILE STRUCTURE OF A PE FILE RELATIVE VIRTUAL ADDRESS DETAILS OF THE PE FORMAT INDICES IN THE DATA DIRECTORY LOADING PROCEDURE SUMMARY 立即下载

相关推荐

Inside Windows200(第三版中文版)

C,C++,操作系统,window程序设计经典教材;程序开放必备手册

Windows internals 7 -- 2 -- 本书历史

以前看书,从不看所谓的各版本之间的差别 现在,感觉,了解一下其中的历史,还是有一定的趣味的,到底什么趣味,见人见智 至少可以感受时代的进步,科技的发展,应用的更新,或许直到有一天,所有人的工作都被AI替代了,哈哈 第一版本, INSIDE WINDOWS NT,主要包含了WINDOWS NT技术的架构与设计思路, 作者,HELEN CUSTER 第二版本,INSIDE WINDOW

3229

2023最新扫码连wifi-扫码挪车-聚合CPS返利多合一小程序源码

2023最新扫码连wifi-扫码挪车-聚合CPS返利多合一系统 系统特点: 目前已接入的 CPS 渠道: 充值:话费充值、电费充值、影视会员充值、会员卡券充值 本地团购:联联周边游 电商平台:京东、拼多多、唯品会、淘宝、抖音美团:外卖、闪购、酒店、到店、优选饿了么:外卖、商超 出行服务:滴滴打车、滴滴加油、滴滴货运、花小猪打车、高德打车、同程打车 连锁餐饮点餐:肯德基、麦当劳、百果园、奈雪的茶、瑞幸咖啡、星巴克、喜茶、汉堡王、必胜客电影票:特价电影票 注意:以上涉及到需要支付的 CPS 渠道,不需要预存!

qq_41837379的博客 3110

作为初学者,我是如何认识写时拷贝(copy-on-write)——Windows内存管理

《Windows核心编程》学习笔记:内存管理重要内容:Copy-On-Write。 copy-on-write为什么需要写时拷贝?实现原理:详细写入过程实现代码: 为什么需要写时拷贝? Windows支持一种机制,允许俩个或俩个以上的进程共享同一块存储器。 一方面会极大地提升系统的性能;另一方面,这也要求所有的应用程序实例只能读取其中的数据或是执行其中的代码,一个程序实例修改并写入一个存储页时,就...

weixin_43742894的博客 1110

iOS开发者必备:从越狱设备里提取IPA的三种方法(含Filza、iTools实战)

本文详细介绍了iOS开发者从越狱设备提取IPA文件的三种实用方法,包括使用Filza文件管理器、AFC2配合桌面工具以及命令行高级技术。内容涵盖环境准备、操作步骤和技术原理,帮助开发者高效获取应用包文件,适用于逆向工程、测试分析等场景。

weixin_28717969的博客 812

AppleAccount注册之生成sign

根据日志发现:签名来自于AuthKit的-[AKAppleIDServerResourceLoadDelegate signRequest:withCompletionHandler:]的一个block,这个库是放在共享缓存库里的,找到提前准备好的IDA文件,先去找主方法,根据分析IDA,最后找到了实际生成签名的方法:t1。,接受五个参数,context(之前讲的获取到的客户端证书),bytes(待加密的body字节),length(字节长度),以及两个接受结果的参数,直接进这个方法看,

2503_90751938的博客 1005

Windows内核理解1(基于Inside Windows NT)

《Windows内核理解1》摘要: 本文基于《Inside Windows NT》梳理Windows内核机制,重点解析进程、线程与纤程的核心概念。进程是资源容器,包含虚拟地址空间(32位2-3GB/64位128TB)、工作集(物理内存驻留部分)、可执行映像、句柄表、安全上下文等要素,由PEB管理模块列表与进程参数。线程是CPU调度实体,共享进程资源但拥有独立栈与寄存器,通过ETHREAD/KTHREAD结构实现抢占式多任务调度。纤程作为用户态轻量线程,由应用自主协作调度,无内核开销但需手动切换。三者形成&q

charlie114514191的博客 1233

Warning-[INFL_DELTA] Too many events zero delay loop

项目场景: 运用VCS工具执行仿真的时候,遇到如下错误提示,但仿真还在继续。 Warning-[INFL_DELTA] Too many events Possible zero delay loop. Too many events in the simulation at time 0 fs. 问题描述: 为什么会有这个问题; 什么导致了这个问题; 原因分析: 1、为什么会有这个问题 由于竞争条件或编码风格不明确,可能会产生零延时回路,导致仿真挂起或仿真时间无限。 2、什么导致了这个问题 举

hh199203的博客 1万+

Windows和Linux都有的Copy-on-write技术

Windows和Linux都有的Copy-on-write技术 MySQL技术内幕Innodb存储引擎第2版 P375 SQL Server2008 实现与维护(MCTS教程)P199 LVM快照技术 LVM使用写时复制copy-on-write技术来创建快照,当创建一个快照时,仅复制原始卷中数据的元数据metadata,并不会有数据物理操作,因此快照创建过程非常...

dingshen2767的博客 177

用InVEST做碳中和规划?手把手教你计算城市碳储量与热岛效应

本文详细介绍了如何利用InVEST模型进行城市碳中和规划的科学评估。通过手把手教学,演示了如何使用该模型的碳存储与城市热岛缓解模块,从数据准备、模型运行到结果解读,量化评估不同规划方案下的碳储量变化与热岛效应缓解潜力,为城市规划者提供科学的决策依据。

weixin_29201313的博客 822

手把手教你用CANape调试XCP安全会话:DLL权限管理+四种加密模式实战演示

本文详细介绍了如何使用CANape调试XCP安全会话,重点解析了DLL权限管理的实现与配置方法,并通过实战演示了标定页切换、DAQ测量、STIM旁路和PGM刷写四种典型加密模式的操作流程与调试技巧,帮助工程师深入理解并掌握XCP安全访问机制。

smartcontract5的博客 562

[ZT]Inside WINDOWS NT Object Manager

[ZT]Inside WINDOWS NT Object ManagerInside WINDOWS NT Object Manager=====================================                                                                                  Заточенное са

LionD8' Blog 个人作品 www.360kdj.com 360KDJ股票实验室 6165

EtherCAT主站SOEM -- 29 -- STM32F767-SOEM通过 CSP模式(周期同步位置模式)控制一个电机转圈圈

以上就是EtherCAT主站SOEM – 29 – STM32F767-SOEM通过 CSP模式(周期同步位置模式)控制一个电机转圈圈的内容。有不明白的地方欢迎留言;有建议欢迎留言,我后面编写文档好改进。创作不容,如果文档对您有帮助,记得给个赞。

常驻客栈的博客--嵌入式EtherCAT 2240

Gloomy对Windows内核的分析(对象管理器)

Inside WINDOWS NT Object Manager=====================================                                                                                  Заточенное само в себе                         

峥嵘岁月 5456

PLSQL Developer安装详细步骤

一、下载安装PLSQL Developer(plsql安装百度也有步骤) 官网下载地址:https://www.allroundautomations.com/registered-plsqldev/ 1、网上自己下载适合自己电脑的安装包(32或64),并解压。 2、打开解压的文件夹,得到以下三个文件(分别是汉化工具,PLSQL安装包、激活码),双击安装,如下图: 3、安装界面,点击next,进入下一步,如图: 4、安装协议界面,此处必须选择“I accept the terms in

Gorden的博客 11万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

从win32中的写时复制(Copy on write )机制谈起

我们知道,内存映射文件的物理存储器来自

bobopeng 3638

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

COW奶牛!Copy On Write机制了解一下

前言 只有光头才能变强 在读《Redis设计与实现》关于哈希表扩容的时候,发现这么一段话: 执行BGSAVE命令或者BGREWRITEAOF命令的过程中,Redis需要创建当前服务器进程的子进程,而大多数操作系统都采用写时复制(copy-on-write)来优化子进程的使用效率,所以在子进程存在期间,服务器会提高负载因子的阈值,从而避免在...

weixin_33701617的博客 1488

android 蓝牙通讯demo

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

IEM模型,地表粗糙度模拟

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

解密NtQueryVirtualMemory

NtQueryVirtualMemory是windows的一个未公开API(导出但未形成文档),他的作用主要是查询指定进程的某个虚拟地址控件所在的内存对象的一些信息。 原型(prototype): NTSTATUS NTAPI NtQueryVirtualMemory(           IN HANDLE               ProcessHandle,      //目标进

Less Is More 1万+

由枚举模块到ring0内存结构 (分析NtQueryVirtualMemory)

是由获得进程模块而引发的一系列的问题,首先,在ring3层下枚举进程模块有ToolHelp,Psapi,还可以通过在ntdll中获得ZwQuerySystemInformation的函数地址来枚举,其中ZwQueryInformationProcess相当于是调用系统服务函数,其内部实现就是遍历PEB中的Moudle链表, kd> dt _PEB +0x00c Ldr...

weixin_30667649的博客 917

Windows NT 就是指现在的 Windows

Windows NT 求助编辑百科名片    Windows NT Microsoft Windows NT(Network Termination)是由微软公司发行的操作系统,基于OS/2 NT基础编制。OS/2由微软和IBM联合研制,分为微软的Microsoft OS/2 NT与IBM的IBM OS/2。协作后来不欢而散,IBM继续向市场提供先前的OS/2版...

weixin_34240657的博客 516

copy-on-write详解

主要通过两个大神的博客来理解copy-on-write(COW)技术 1. std::string中的COW技术 (转自:http://blog.youkuaiyun.com/haoel/article/details/24058) 1、             概念   Scott Meyers在《More Effective C++》中举了个例子,不知你是否还记得?在你还在上学的

上善若水 1万+

【数据结构-5】单链表的实现

单链表,具体来说是单向的、不带头的、不循环的链表。链表由一个一个节点组成,每个节点分为数据域和指针域,数据域存放数据,指针域存放下一节点的地址。这样,就可以根据指针域中的地址找到下一个节点,节点就串起来了构成了单链表。

weixin_44218929的博客 176
上一篇: 探索 Windows 2000 的内存管理机制
下一篇: Windows 2000内存篇 分页机制介绍1-2
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值