挂接CreateProcessW实现对进程创建的完全控制

Win10 Hook 进程创建的研究 Win7甚至在它之前开始,想要hook进程创建已经不能简单的HookCreateProcessInternalW这一个函数了,因为Vista开始引入了UAC机制。如果一个进程想要通过UAC弹窗创建管理员进程,hook这个进程的CreateProcessInternalW已经不起作用,我在几年前的博文《Win7/VistaHook CreateProcess 的特别之处》(http://blog 阅读详情
SystEm32:这份文档演示了如何实现全局HOOK


<< 挂接CreateProcessW实现对进程创建的完全控制 >>
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
【前言】
【概述】
【copy-on-write】
【三种可行的办法】
<查询CreateProcessW的基址及属性>
<枚举系统中所有进程>
<修改CreateProcessW页属性>
<在进程中分配一块可用空间>
<将代码写入远程进程空间>
<编译器的魔术>
<解决麻烦的定位问题>
【完整演示代码】
【资源】
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
【前言】
写这篇文档的时候由于我足够菜,碰到了不少问题,多谢bkbll,a1rsupply和SobeIt的指点,还有TCH的辛勤劳动,才有这篇文档的诞生,本文中可能存在一些错误,这些错误都是由于我的失误造成的,如果您有什么意见和看法,欢迎来http://www.itaq.org指出,或者E-mail:zf35@citiz.net
【概述】
在服务器上实现对进程创建的控制有很大的意义,通过监控进程的创建,我们可以让被允许运行的进程正确创建,而未被允许的程序则会创建失败,这样就可以防止未知木马,病毒和蠕虫对服务器的威胁。要实现上述目的,必须hook windows创建进程相关的API,根据《inside the windows NT》和《Native API Reference》中记载,加上softIce的实际跟踪,windows创建进程的API调用流程如下:
代码
CreateProcessA-> CreateProcessW-> CreateProcessInternalW->…->最终调用ZwCreateProcess

本文档中我们选用CreateProcessW来实现我们的目的,当然你也可以使用其它几个API。本文档的演示代码稍做改动可应用于任意Ring3函数。
对于hook一个API而言,可使用的办法有很多,本文选用改写函数入口点的办法来实现挂接CreateProcessW,更多的详细资料请参阅SobeIt写的《windows下hook API的几种办法》。

【copy-on-write】
最初试验时,我使用softice的 a CreateProcessW改写函数入口点的代码,F5切换回windows之后发现一切如愿以偿,但是当我编写程序修改CreateProcessW入口点代码时,发现所做的改动仅对本进程有效,而对于系统的其他进程没有产生任何影响。用softice跟踪后发现本进程中CreateProcessW的虚拟地址被映射到了一个新的,与其它进程不同的物理地址上,如果你读过Webcrazy的《copy-on-write机制》一文,就不难看出这是copy-on-write机制产生的影响。对于系统的dll,每个dll都被映射在不同进程的相同的虚拟地址上,而这些虚拟地址又指向相同的物理地址,通过这种机制,系统实现最低的资源消耗.当某个进程试图改写物理内存中的数据时,为了不对其它进程产生影响,系统自动新分配一块物理内存,把原物理内存中的数据复制过去,改写,然后把改写内存的那个进程的虚拟地址重新映射到新的物理内存上去,而其它进程则还是映射在原来的物理内存上,这就是“写时复制技术”(copy-on-write),那么系统是如何判断何时应该使用copy-on-write呢?这是以虚拟地址的PTE来决定的,当PTE中copy-on-write标志被置位时,任何对该虚拟地址的写操作都将导致一个copy-on-write.


【三种可行的办法】
为了实现全局hook,我们不能被copy-on-write机制所限制住,目前我想到了三种办法来达到我们的目的。
1. 通过驱动来修改页表项(PTE)的属性,使CreateProcessW对应的虚拟地址失去copy-on-write的属性,这样在本身进程中对CreateProcessW入口点代码的修改会对系统中所有进程生效,从而实现全局hook。

2. 通过windows本身提供的一个对象//phymem来对物理内存进行直接读写,先定位本身进程的Eprocess(KTEB)(PS:如何在Ring3下定位任意进程的Eprocess请参考我之前写的《获取进程的Eprocess》一文),获得Eprocess之后,可以得到进程的页目录,然后利用//phymem读取存放页目录的物理内存的内容,再模拟操作系统进行虚拟地址->物理内存地址的转换,最终得到CreateProcessW所对应的物理地址,利用//phymem我们避开copy-on-write机制,直接改写CreateProcessW。

3. 通过最常规的手段来达到目的,先枚举系统中所有进程,然后通过VirtualQueryEx,VirtualAllocEx,VirtualProtectEx等函数修改每个进程的页面属性,分配新的空间等。最后将我们的代码用WriteProcessMemory写到各进程的空间中,利用改写CreateProcessW入口为Jmp *******来跳到我们的代码中,改变函数的执行流程。

以上三个办法中,方法1只是一个构想,还没成为现实,有空的话我回去试试看的,当然页欢迎各位高手去实现,然后mail一份代码给我:P方法2我写了一份完整的代码来实现它,但是在本文档中不进行讨论,否则文档会变的很长,我将在另一份文档中专门说明这种办法的具体实现。方法3使本文讨论的重点,下面就方法3进行详细说明。
<查询CreateProcessW的基址及属性>
这里我们使用VirtualQueryEx这个函数,其原型如下:
SIZE_T
VirtualQueryEx
(
HANDLE hProcess,
LPCVOID lpAddress,
PMEMORY_BASIC_INFORMATION lpBuffer,
SIZE_T dwLength
);
参数说明:
HANDLE hProcess 想要查询内存信息的进程句柄
LPCVOID lpAddress 指向想要查询内存区域的指针
PMEMORY_BASIC_INFORMATION lpBuffer 指向MEMORY_BASIC_INFORMATION结构的指针
SIZE_T dwLength lpBuffer的大小

调用这个函数之后,相关的信息存放在lpBuffer指向的结构中


<修改CreateProcessW的页属性>
对于一个页来说,有如下几种属性:
PAGE_EXECUTE
PAGE_EXECUTE_READ
PAGE_EXECUTE_READWRITE
PAGE_EXECUTE_WRITECOPY
PAGE_NOACCESS
PAGE_READONLY
PAGE_READWRITE
PAGE_WRITECOPY


我们通过VirtualProtectEx来修改页的属性:
BOOL
VirtualProtectEx
(
HANDLE hProcess,
LPVOID lpAddress,
SIZE_T dwSize,
DWORD flNewProtect,
PDWORD lpflOldProtect
);
参数说明:
HANDLE hProcess 进程句柄
LPVOID lpAddress 指向想要修改的内存区域的指针
SIZE_T dwSize 修改的内存区域的大小
DWORD flNewProtect 新的页属性
PDWORD lpflOldProtect 指向保存老的页属性的内存的指针

从后面的代码中我们可以看到,为了改写函数入口点代码,我们必须赋予它PAGE_EXECUTE_READWRITE属性。


<在进程中分配可用空间>
光修改函数入口点代码是不够的。我们必须自己编写一段code来接管CreateProcessW的工作,由于进程空间是相互隔离的,为了达到全局hook的目标,我们必须向每个进程索要一块空间来存放我们的代码,这就要用到VirtualAllocEx这个函数了,VirtualAllocEx原型如下:
LPVOID
VirtualAllocEx
(
HANDLE hProcess,
LPVOID lpAddress,
SIZE_T dwSize,
DWORD flAllocationType,
DWORD flProtect
);
参数说明:
HANDLE hProcess 进程句柄
LPVOID lpAddress 指向分配内存区域的指针
SIZE_T dwSize 分配的区域的大小
DWORD flAllocationType 内存类型
DWORD flProtect 新内存的属性

<将代码写入远程进程空间>
我们使用WriteProcessMemory这个函数来向远程进程写入我们的代码和数据,其原型如下:
BOOL
WriteProcessMemory(
HANDLE hProcess,
LPVOID lpBaseAddress,
LPCVOID lpBuffer,
SIZE_T nSize,
SIZE_T* lpNumberOfBytesWritten
);
参数说明:
HANDLE hProcess 进程句柄
LPVOID lpBaseAddress 指向写入地址的指针
LPCVOID lpBuffer 指向写入数据的指针
SIZE_T nSize lpBuffer的大小
SIZE_T* lpNumberOfBytesWritten 实际写入的字节数


<编译器的魔术>
我在使用WriteProcessMemory把我自己写的一个函数JmpToAddress的内容写入远程进程空间时,发现无论我的JmpToAddress的内容是什么,写入空间的都是E9****这几个字节,这令我非常困惑,从机器码来看,这是一条相对跳转指令。那么它又是从何而来呢,为了搞清楚这个问题,我用VC调试了一下,在watch窗口中输入JmpToAddress,显示出JmpToAddress的虚拟地址0x00410XXX,然后打开memory窗口,查看这段内存中存放的内容,发现确实是JmpToAddress的代码,这就奇怪了,那神秘的E9****是从何而来呢,于是我请教了a1rsupply,他告诉我VC的调试版本会生成跳转表,这下真相大白,原来是编译器玩的魔术。

为了向远程进程正确写入代码,我们必须自己计算真正的函数地址,下面我写了一段代码来计算真正的函数地址:
__asm
{
pushad
lea eax,JmpToAddress
mov ecx,JmpToAddress
shr ecx,8
add eax,ecx
add eax,5
mov JmpAfterCalc,eax
popad
}

<解决麻烦的定位问题>
在编写代码的过程中,我遇到的另一个较大的问题就是如何定位地址。我编写的JmpToAddress()函数如下:
void __declspec(naked) JmpToAddress(void)
{
__asm jmp [HookedAddr]
}
在本地进程中这句代码没什么问题,但是当它被写入远端进程后便会产生种种问题,我们来看看它的汇编代码,如下
jmp [00401Cxxx]
我们注意到本进程中这个虚拟地址里存放的是HookedAddr的地址,但是在远程进程中,这个地址指向的是别的什么东西,jmp过去会产生不可预料的结果,为了实现正确的行为,我们先用WriteProcessMemory向远程进程写入HookedAddr的内容,然后用一个相对地址引用它
void __declspec(naked) JmpAddress(void)
{
__asm call flag
flag:
__asm pop eax
__asm add eax,0x0e
__asm mov ebx,[eax]
__asm jmp ebx
}
pop eax后,eax里面存放的就是本条指令的虚拟的地址,加上一个固定值后,[eax]就是我们通过WriteProcessMemory写入的数据。

代码
【完整演示代码】
/******************************************************************
*Author:                                                         *
*  [I.T.S]SystEm32                                   *
*Module Name                                                     *
*  Hook_Api_1.cpp                                    *
*Abstract:                                                       *
*  This Code Show the Method of Hooking Win32 API    *
*Environment:                                                    *
*  User Mode - Win32                                 *
*Revision History:                                               *
*  2004-9-20                                         *
*express My thanks to:                                           *
*  Bkbll,A1rsupp1y,SoBeIt and TCH                    *
*Our HomePage:                                                   *
*  http://www.itaq.org                           *
******************************************************************/

#include <windows.h>
#include <stdio.h>
#include "psapi.h"

#pragma comment(lib,"psapi.lib")

#define NTAPIADDR FARPROC
#define K_MODULE "kernel32.dll"
#define HOOK_API "CreateProcessW"

HMODULE  hKernel32  = GetModuleHandle(K_MODULE);
NTAPIADDR pCreateProcessW = GetProcAddress(hKernel32,HOOK_API);
LPVOID  HookedAddr  = NULL;


void __declspec(naked) RealExecute(void)
{
/*You can add your own Hooked CreateProcessW function here*/
__asm ret 0x28
}

void __declspec(naked) JmpToAddress(void)
{
__asm call flag
flag:
__asm pop  eax
__asm add  eax,0x0e
__asm   mov  ebx,[eax]
__asm jmp  ebx
}

BOOL WINAPI GetDebugPrivilege(void);
BOOL WINAPI InsertHook(DWORD ProcessID);

void main(void)
{
DWORD ProcessList[80],ProcessNUM;

EnumProcesses(ProcessList,sizeof(ProcessList),&ProcessNUM);

ProcessNUM/=sizeof(DWORD);

printf("Current process num is %d/n/r",ProcessNUM);
//printf("%08x/n/r",(LPVOID)RealExecute);

GetDebugPrivilege();

//step over the 0 process
for(DWORD Count=1;Count<ProcessNUM;Count++)
{
 InsertHook(ProcessList[Count]);
}

Sleep(2000);
return;
}

BOOL WINAPI GetDebugPrivilege(void)
{
HANDLE    hToken,hProcess;
TOKEN_PRIVILEGES tp;
char *pSEDEBUG = "SeDebugPrivilege";

hProcess = GetCurrentProcess();
OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken);
LookupPrivilegeValue(NULL,pSEDEBUG,&tp.Privileges[0].Luid);
tp.PrivilegeCount   = 1;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,FALSE,&tp,NULL,NULL,NULL);
return 0;
}

BOOL WINAPI InsertHook(DWORD ProcessID)
{
MEMORY_BASIC_INFORMATION MBI;
HANDLE      hProcess;
LPVOID      RealAfterCalc,JmpAfterCalc;

int cb=sizeof(TCHAR)*4*1024;

//only for test
//if(1860 != ProcessID) goto end;

printf("PID is %d/n/r",ProcessID);

hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,ProcessID);

if(NULL == hProcess)
{
 printf("failed!/n/r");
 goto end;
}
//calculate the real address of RealExecute
__asm
{
 pushad
 lea eax,RealExecute
 mov ecx,RealExecute
 shr ecx,8
 add eax,ecx
 add eax,5
 mov RealAfterCalc,eax
 popad
}
//calculate the real address of JmpToAddress
__asm
{
 pushad
 lea eax,JmpToAddress
 mov ecx,JmpToAddress
 shr ecx,8
 add eax,ecx
 add eax,5
 mov JmpAfterCalc,eax
 popad
}

//Alloc some memory in the process
HookedAddr = VirtualAllocEx(hProcess,NULL,cb,MEM_COMMIT,PAGE_EXECUTE_READWRITE);

if(0 == WriteProcessMemory(hProcess,HookedAddr,RealAfterCalc,5,NULL))
 printf("WriteProcessMemory failed!/n/r");

VirtualQueryEx(hProcess,(LPVOID*)pCreateProcessW,&MBI,sizeof(MBI));
VirtualProtectEx(hProcess,MBI.BaseAddress,MBI.RegionSize,PAGE_EXECUTE_READWRITE,&MBI.Protect);

printf("HookedAddr is 0x%08x/n/r",HookedAddr);
WriteProcessMemory(hProcess,pCreateProcessW,JmpAfterCalc,0x0e,NULL);
WriteProcessMemory(hProcess,(char*)pCreateProcessW+0x13,&HookedAddr,4,NULL);

end:
return 0;
}
Win7/Vista Hook CreateProcess 的特别之处 Win7/Vista Hook CreateProcess 的特别之处 搬运自我的百度空间,写本文时主流系统为Win7,本文的方法没有在高版本的windows尝试 Hook了CreateProcess后发现,每当非管理员进程创建管理员进程,这个Hook被绕过了。   Win7中如果要截取创建新进程,单单Hook 本进程kernel32中的 阅读详情

相关推荐

易语言-Hook_CreateProcess阻止创建一个新的进程和它的主线程

通过HOOK CreateProcess 函数 来实现阻止创建一个新的进程和它的主线程

Hook CreateProcess

6种比较常用的运行(执行)程序的方法: 包括WinExec、ShellExecute、CreateProcess、CreateProcessAsUser、CreateProcessWithLogonW、CreateProcessWithTokenW 要在r3层hook程序的运行,需要用到上述api CreateProcessAsUser win7用 CreatePr...

weixin_30616969的博客 1266

hook CreateProcessInternal

利用inline hook技术挂钩CreateProcessInternal,win7 32/64代码均有

易语言api hook CreateProcessA 创建进程

CreateProcessA我们非常熟悉,就是创建一个进程,这个API的函数hook非常实用,本课我们可以通过CreateProcessA来运行系统的计算器,或者记事本等等。 CreateProcessA .版本 2 .DLL命令 CreateProcessA, 整数型, "kernel32.dll", "CreateProcessA", , 创建进程。 .参数 lpApplicationName, 文本型 .参数 lpCommandLine, 文本型 .参数 lpPr

511遇见 6863

易语言-APIHOOK拦截指定进程创建新进程

APIHOOK拦截指定进程创建新进程

Ansys -PEmag 平面变压器仿真与circuit电路模型验证

ansys 软件集成了电路、磁路、PCB参数提取,结构参数提取等功能仿真,基于内置模块的功能参数的仿真后可以提取出主要关键参数,寄生参数,频域响应参数等。该软件的优势在于能够将所有的仿真参数导出为电路模型文件,可以在自带的模块中仿真也可以导出在其他第三方软件中仿真,比如matlab-simulink文件扥。主要介绍ANSYS插件的使用,对PEmag做了详细使用说明并通过案例得到对用的变压器参数;基于变压器参数再将其磁路模型导入到电路中进行建模仿真,实现PEmag与circuit的联合仿真。

weixin_41609745的博客 3020

软件内嵌页面被运营商插入广告的处理方法

本文仅讨论内嵌页面被插入广告的处理(可控制的IWebBrowser2) 一些内嵌页面的软件往往被无耻的电信运营商加入广告弹窗,严重影响用户体验和口碑,我将在这里讨论几个现象和方法,希望可以给大家一些启发。 一、直接弹窗类 这个我定义为只要是打开你的页面,随之就会弹出一个或数个另外的IE或其他浏览器窗口,显示广告或其他推广内容。(比如广州电信的催费通知) 1.解决方法

时不我待 5819

毕业设计——基于卷积神经网络的高速公路团雾智能识别系统设计与实现(数据集+源码+可视化+综述)

同时,也可以结合其他技术,如雷达、红外传感器等,实现多源信息的融合与协同处理,提高系统的可靠性和稳定性。实验结果表明,该系统能够实现对高速公路团雾的准确、快速识别,为高速公路的安全运行提供了有力保障。团雾作为一种常见的气象现象,具有突发性、局地性和消散迅速的特点,对高速公路的行车安全构成严重威胁。通过设计合适的网络结构,如增加卷积层、池化层等,实现对图像中团雾特征的自动学习和提取。预处理:对采集到的图像进行去噪、增强等预处理操作,以提高图像质量,降低后续处理的难度。读取数据,随机分为训练集和验证集。

abackcab的博客 668

Detours版HOOK 未导出的API函数CreateProcessInternalW

#include <stdio.h> //#include <tchar.h> #include <windows.h> #include "detours.h" #pragma comment(lib,"detours.lib") //以下是HOOK需要的头文件 //#include <winsock2.h> //#include <MSWSock.h> //#pragma comment(lib,"ws2_32.lib") //.

追逐光芒,追随内心 2014

2024年上半年网络工程师下午真题及答案解析

位于MPLS域边缘、连接其他网络的LSR称为( 3 ),区域内部的LSR称为核心LSR(CoreLSR)IP报文进入MPLS网络时,MPLS入口设备分析IP报文的内容并为其添加合适的标签,所有MPLS网络中的LSR根据标签转发数据,当该IP报文离开MPLS网络时,标签由出口LER弹出。LSP的出口LER称为( 6 )。某高校网络拓扑如下图所示,两校区核心(CORE-1、CORE-2),出口防火墙(NGFW-1、NGFW-2)通过校区间光缆互联,配置OSPF实现全校路由收敛,两校区相距40km。

bsefef的博客 2476

个人信息保护合规审计人员(中级)能力测试试卷

本文是关于个人信息保护合规考试的试题解析,内容涵盖《个人信息保护法》相关规定。试卷包含单选题、多选题、判断题、简答题和案例分析题五种题型,总分100分,考试时间120分钟。试题重点考察个人信息处理的基本原则、敏感个人信息处理要求、合规审计流程、个人信息保护影响评估等内容。通过案例分析题详细解析了人脸识别登录、数据共享、跨境传输等场景下的合规要求。参考答案均严格依据《个人信息保护法》等法律法规,为个人信息处理活动提供了明确的合规指引。

qq_41525079的博客 857

小试X64 inline HOOK,hook explorer.exe--->CreateProcessInternalW监视进程创建

原始函数是这样的 kernel32!CreateProcessInternalW: 00000000`7738e750 4c8bdc mov r11,rsp 00000000`7738e753 53 push rbx 00000000`7738e754 56 push rsi 00000000`7738e7

zwfgdlc的专栏 1万+

ShaderJoy —— 简单又神奇的 “合体” 函数【GLSL】

smin 函数 它实际上有两种常见的实现方式 多项式 指数 多项式 smin 函数图 其对应的代码为 float smin( float a, float b ) { // 多项式 const float k = 0.5; float h = clamp(0.5 + 0.5 * (b - a) / k, 0.0, 1.0); return mix(b, a, h) - k * h * (1.0 - h); } 从上图中我们可以很明显的看出有两处不连...

ShaderJoy 的兴趣技术杂货铺 1858

通过HOOK控制进程的创建

一、 简介  最近,我了解到一个叫做Sanctuary的相当有趣的安全产品。它能够阻止任何程序的运行-这些程序没有显示在软件列表中-该表中的程序被允许在一个特定的机器上运行。结果,PC用户得到保护而免于各种插件间谍软件、蠕虫和特洛伊木马的侵袭-就算能够进入他/她的计算机,它们也没有机会执行,并因此没有机会对该机器造成任何损害。当然,我觉得这个特征相当有趣;并且,在稍作思考以后,我就有了一个自己

jiangxinyu的专栏 4866

【数据集】全球大气空气柱平均甲烷(XCH₄)和一氧化碳(XCO)浓度数据集 TROPOMI/WFMD

全球大气空气柱平均甲烷(XCH₄)和一氧化碳(XCO)浓度数据集 TROPOMI/WFMD

WW、forever的博客 389

金属表面粗糙度对信号的影响

之前的文章中,已经采用CST中的微带线模块进行了很多的仿真分析,本文将再次利用这些模块,从另外一个角度去探讨关于传输线的使用问题--金属的表面粗糙度。 众所周知,数据传输中,当速率越来越高时,信号在金属介质中的趋肤效应就愈发明显,能量就会更多地集中于金属的表面进行流动,此时,如果金属表面不再光滑而是凹凸不平,能量的传输过程就会产生波动,当这种波动积累到一定的量级,就会严重影响到传输线的阻抗稳定性,从而导致信号失真和传输异常。

一只豌豆象的博客 2897

注意CreateProcessW函数

看下面这个代码有什么问题:  #define PROCESS_NAME _T(“C://Windows/NotePad.ext”)      if (!CreateProcessW(NULL, PROCESS_NAME, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInformation))  这里的问

ITLionWoo的专栏 6547

2026华为OD机试 新系统真题题库目录|机考题库 + 算法考点详解

华为OD机试 新系统真题题库目录|机考题库 + 算法考点详解华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2026e卷,od机试,2026E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2026华为od,如何备战华为od,华为od算法,华为od手撕代码,华为OD机试2024年最新题库,

KJ.JK 4723

通过Hook ZwCreateProcess获取进程全路径(缓存问题解决方案)

环境:WinXP 我们在拦截进程启动时,会去拦截ZwCreateProcess函数,然后在中间获取启动进程的了全路径,判断进程是否合法。 首先看下ZwCreateProcess函数的原型如下: 其中我们主要是利用SectionHandle参数,通过ObReferenceObjectByHandle获取文件对象,然后再利用ObQueryNameString函数进行刷新文件名缓存

博客模版 2758

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

createprocess背后发生了什么

区域对象在关联一个硬盘上具体的文件的时候代表的就是虚拟内存即将要映射的具体文件,调用mapviewoffile函数后操作系统才会真正将文件和虚拟内存的建立映射关系。建立了映射关系后可以理解成内核中出现了一张映射表,代表了从磁盘上某个文件到虚拟内存的映射关系,如果操作系统要加载文件到内存,则会按照这张表上的信息进行加载。但此时并没有发生任何实际的将文件载入内存的行为,只是产生了映射行为,生成了映射表。当不关联磁盘上具体的文件时,区域对象就可以代表一段可共享的虚拟内存。

Shanfenglan's blog 637

Devexpress16.2.6破解工具

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

易语言api CreateProcess 创建进程

封装进程创建的原因主要是易语言自带的运行和执行命令不能启动游戏,当我们写一键启动,批量启动游戏时,便用到了进程_创建的命令。 用到的API CreateProcess WIN32API函数CreateProcess用来创建一个新的进程和它的主线程,这个新进程运行指定的可执行文件,我们先学习它的函数原型,参数和返回值。 函数原型 BOOL CreateProcess ( LPCTSTR lpApplicationName,//程序路径可以是相对也可以是绝对路径 LPTSTR lpCommandLin

511遇见 7536

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

hook方式进程创建监控,进程保护

关于进程创建, xp系统:CreatProcessW->CreateProcessInternalW->NtCreateProcessEx->NtCreatSection Vista以上:CCreatProcessW->CreateProcessInternalW->NtCreateUserProcess->NtCreateSection 所以我们要Hoo...

kernweak的博客 3347
上一篇: keymaker原理-INT 3的插入
下一篇: RemoteLib - DLL Injection for Win9x & NT Platforms
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值