当前位置: 首页 > news >正文

网站模板的制作怎么做的今日新闻国际最新消息

网站模板的制作怎么做的,今日新闻国际最新消息,分类信息网站怎么做,wordpress 弹幕插件MDL内存读写是一种通过创建MDL结构体来实现跨进程内存读写的方式。在Windows操作系统中,每个进程都有自己独立的虚拟地址空间,不同进程之间的内存空间是隔离的。因此,要在一个进程中读取或写入另一个进程的内存数据,需要先将目标进…

MDL内存读写是一种通过创建MDL结构体来实现跨进程内存读写的方式。在Windows操作系统中,每个进程都有自己独立的虚拟地址空间,不同进程之间的内存空间是隔离的。因此,要在一个进程中读取或写入另一个进程的内存数据,需要先将目标进程的物理内存映射到当前进程的虚拟地址空间中,然后才能进行内存读写操作。

MDL结构体是Windows内核中专门用于描述物理内存的数据结构,它包含了一系列的数据元素,包括物理地址、长度、内存映射的虚拟地址等信息。通过创建MDL结构体并调用系统函数将其映射到当前进程的虚拟地址空间中,即可实现跨进程内存读写的操作。

相比于CR3切换方式,MDL内存读写更加稳定、安全,且不会受到寄存器的影响。同时,使用MDL内存读写方式还可以充分利用Windows操作系统的内存管理机制,从而实现更为高效的内存读写操作。因此,MDL内存读写是Windows操作系统中最为常用和推荐的一种跨进程内存读写方式。

3.1.1 MDL读取内存步骤
  • 1.调用PsLookupProcessByProcessId得到进程Process结构,这个函数是用于根据进程ID查找对应的进程对象的函数,通过传入的参数 data->pid 获取到对应的进程ID,然后通过调用 PsLookupProcessByProcessId 函数获取对应的 PEPROCESS 结构。如果获取失败则返回 FALSE。

  • 2.调用KeStackAttachProcess附加到对端进程内,在内核模式下,读取其他进程的内存时需要先附加到对应进程的上下文中,才能读取该进程的内存。因此,这里调用 KeStackAttachProcess 函数将当前线程切换到目标进程的上下文中。同时,为了在后面可以正确地从目标进程的上下文中返回,还需要保存当前进程的上下文状态。

  • 3.调用ProbeForRead检查内存是否可读写,在内核模式下,需要保证访问其他进程的内存是合法的,因此需要先调用 ProbeForRead 函数检查读取的内存空间是否可读写。如果该空间不可读写,则会触发异常,这里通过异常处理机制来处理这种情况。

  • 4.拷贝内存空间中的数据到自己的缓冲区内,在完成对内存空间的检查后,使用 RtlCopyMemory 函数将目标进程的内存数据拷贝到自己的缓冲区中。这里需要注意的是,由于内存空间可能很大,因此可能需要多次进行拷贝操作。

  • 5.调用KeUnstackDetachProcess接触绑定,在读取完内存数据后,需要将当前线程从目标进程的上下文中解除绑定,以便返回到原来的上下文中。这里调用 KeUnstackDetachProcess 函数完成解绑操作,同时恢复之前保存的当前进程的上下文状态。

  • 6.调用ObDereferenceObject使对象引用数减1,由于在第一步中调用了 PsLookupProcessByProcessId 函数获取了对应进程的 PEPROCESS 结构,因此需要调用 ObDereferenceObject 函数将其引用计数减1,以便释放对该对象的引用。

有了上述具体实现方法,那么我们就可以封装MDLReadMemory()内存读函数了,代码如下,该函数用于在 Windows 内核模式下读取指定进程的内存数据。下面是对这个函数的详细步骤分析:

  • 1.通过进程 ID 找到对应的进程对象:PsLookupProcessByProcessId 用于通过进程 ID 查找对应的进程对象。如果找不到该进程对象,则直接返回 FALSE。
PsLookupProcessByProcessId(data->pid, &process);
  • 2.在内核模式下,必须使用内核提供的函数来分配内存。这里使用的是 ExAllocatePool 函数,用于在内核堆中分配指定大小的内存缓冲区。如果分配失败,则返回 FALSE。
BYTE* GetData;
__try
{GetData = ExAllocatePool(PagedPool, data->size);
}
__except (1)
{return FALSE;
}
  • 3.在内核模式下,访问其他进程的内存必须先将当前进程的上下文切换到目标进程的上下文。这里使用的是 KeStackAttachProcess 函数,将当前进程的上下文切换到目标进程的上下文。同时,为了在后面可以正确地从目标进程的上下文中返回,还需要保存当前进程的上下文状态。
KAPC_STATE stack = { 0 };
KeStackAttachProcess(process, &stack);
  • 4.读取目标进程的内存数据,这段代码使用 ProbeForRead 函数检查要读取的内存区域是否合法,并且将目标进程的内存数据读取到之前分配的内存缓冲区中。如果读取过程中出现异常,则返回 FALSE。
__try
{ProbeForRead(data->address, data->size, 1);RtlCopyMemory(GetData, data->address, data->size);
}
__except (1)
{bRet = FALSE;
}
  • 5.恢复当前进程的上下文,这里使用的是 ObDereferenceObject 函数和 KeUnstackDetachProcess 函数,用于恢复之前保存的当前进程的上下文状态,同时解除对目标进程的引用计数。
ObDereferenceObject(process);
KeUnstackDetachProcess(&stack);
  • 6.将读取的数据拷贝到输出参数中,将读取到的数据拷贝到输出参数中,并释放之前分配的内存缓冲区。
RtlCopyMemory(data->data, GetData, data->size);

将如上代码片段整合起来即可得到一个完整的内存读数据案例,读者可传入一个结构体实现对特定进程特定内存的动态读取功能,完整代码如下所示;

#include <ntifs.h>
#include <windef.h>typedef struct
{DWORD pid;                // 要读写的进程IDDWORD64 address;          // 要读写的地址DWORD size;               // 读写长度BYTE* data;               // 要读写的数据
}ReadMemoryStruct;// MDL读内存
BOOL MDLReadMemory(ReadMemoryStruct* data)
{BOOL bRet = TRUE;PEPROCESS process = NULL;PsLookupProcessByProcessId(data->pid, &process);if (process == NULL){return FALSE;}BYTE* GetData;__try{GetData = ExAllocatePool(PagedPool, data->size);}__except (1){return FALSE;}KAPC_STATE stack = { 0 };KeStackAttachProcess(process, &stack);__try{ProbeForRead(data->address, data->size, 1);RtlCopyMemory(GetData, data->address, data->size);}__except (1){bRet = FALSE;}ObDereferenceObject(process);KeUnstackDetachProcess(&stack);RtlCopyMemory(data->data, GetData, data->size);ExFreePool(GetData);return bRet;
}VOID UnDriver(PDRIVER_OBJECT driver)
{DbgPrint(("Uninstall Driver Is OK \n"));
}NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath)
{DbgPrint(("hello lyshark \n"));ReadMemoryStruct ptr;ptr.pid = 6672;ptr.address = 0x402c00;ptr.size = 100;// 分配空间接收数据ptr.data = ExAllocatePool(PagedPool, ptr.size);// 读内存MDLReadMemory(&ptr);// 输出数据for (size_t i = 0; i < 100; i++){DbgPrint("%x \n", ptr.data[i]);}Driver->DriverUnload = UnDriver;return STATUS_SUCCESS;
}

读取内存地址0x402c00效果如下所示:

3.1.2 MDL写入内存步骤
  • 1.首先需要通过调用PsLookupProcessByProcessId函数获取目标进程的进程结构,该函数将根据传递的进程ID返回对应进程的PEPROCESS结构体,该结构体中包含了进程的各种信息。

  • 2.接下来使用KeStackAttachProcess函数附加到目标进程的上下文环境中,以便可以读取和写入该进程的内存空间。该函数将当前线程的上下文环境切换到目标进程的上下文环境中,使得该线程可以访问和修改目标进程的内存。

  • 3.在进行内存写入操作之前,需要调用ProbeForRead函数来检查要写入的内存空间是否可读写。这个步骤是为了确保要写入的内存空间没有被保护或被其他进程占用,以避免对系统造成不良影响。

  • 4.如果检查通过,接下来需要将目标进程的内存空间中的数据拷贝到当前进程的缓冲区中,以便进行修改操作。

  • 5.接下来需要调用MmMapLockedPages函数来锁定当前内存页面,以便可以对其进行修改。该函数将返回一个指向系统虚拟地址的指针,该地址是由系统自动分配的。在写入完成后,需要使用MmUnmapLockedPages函数来释放锁定的内存页面。

  • 6.然后,使用RtlCopyMemory函数完成内存拷贝操作,将缓冲区中的数据写入到锁定的内存页面中。

  • 7.写入操作完成后,需要调用IoFreeMdl函数来释放MDL锁。MDL锁用于锁定MDL描述的内存页面,以便可以对其进行操作。

  • 8.最后使用KeUnstackDetachProcess函数解除当前进程与目标进程之间的绑定,使得当前线程的上下文环境恢复到原始的状态。

此外在完成MDL写入内存操作后,还需要调用ObDereferenceObject函数将MDL对象的引用计数减1,以便在不再需要该对象时释放它所占用的系统资源。

从如上分析来看写入时与读取基本类似,只是多了锁定页面和解锁操作,这段MDL写内存完整实现代码如下所示;

#include <ntifs.h>
#include <windef.h>typedef struct
{DWORD pid;                // 要读写的进程IDDWORD64 address;          // 要读写的地址DWORD size;               // 读写长度BYTE* data;               // 要读写的数据
}WriteMemoryStruct;// MDL写内存
BOOL MDLWriteMemory(WriteMemoryStruct* data)
{BOOL bRet = TRUE;PEPROCESS process = NULL;PsLookupProcessByProcessId(data->pid, &process);if (process == NULL){return FALSE;}BYTE* GetData;__try{GetData = ExAllocatePool(PagedPool, data->size);}__except (1){return FALSE;}for (int i = 0; i < data->size; i++){GetData[i] = data->data[i];}KAPC_STATE stack = { 0 };KeStackAttachProcess(process, &stack);PMDL mdl = IoAllocateMdl(data->address, data->size, 0, 0, NULL);if (mdl == NULL){return FALSE;}MmBuildMdlForNonPagedPool(mdl);BYTE* ChangeData = NULL;__try{ChangeData = MmMapLockedPages(mdl, KernelMode);RtlCopyMemory(ChangeData, GetData, data->size);}__except (1){bRet = FALSE;goto END;}END:IoFreeMdl(mdl);ExFreePool(GetData);KeUnstackDetachProcess(&stack);ObDereferenceObject(process);return bRet;
}VOID UnDriver(PDRIVER_OBJECT driver)
{DbgPrint(("Uninstall Driver Is OK \n"));
}NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath)
{DbgPrint(("hello lyshark \n"));WriteMemoryStruct ptr;ptr.pid = 6672;ptr.address = 0x402c00;ptr.size = 5;// 需要写入的数据ptr.data = ExAllocatePool(PagedPool, ptr.size);// 循环设置for (size_t i = 0; i < 5; i++){ptr.data[i] = 0x90;}// 写内存MDLWriteMemory(&ptr);Driver->DriverUnload = UnDriver;return STATUS_SUCCESS;
}

写出效果如下:


文章转载自:
http://invaluableners.rdfq.cn
http://goethean.rdfq.cn
http://capo.rdfq.cn
http://tarn.rdfq.cn
http://crackers.rdfq.cn
http://chorister.rdfq.cn
http://pseudoparenchyma.rdfq.cn
http://mysterium.rdfq.cn
http://horizonless.rdfq.cn
http://agraffe.rdfq.cn
http://monostome.rdfq.cn
http://dyn.rdfq.cn
http://revolvably.rdfq.cn
http://nominee.rdfq.cn
http://grumbling.rdfq.cn
http://laparoscope.rdfq.cn
http://phenylcarbinol.rdfq.cn
http://infantilism.rdfq.cn
http://chambermaid.rdfq.cn
http://dataroute.rdfq.cn
http://sistroid.rdfq.cn
http://internally.rdfq.cn
http://unidentifiable.rdfq.cn
http://aeromechanics.rdfq.cn
http://dissuasion.rdfq.cn
http://astrology.rdfq.cn
http://genf.rdfq.cn
http://apprentice.rdfq.cn
http://paramecium.rdfq.cn
http://relentlessly.rdfq.cn
http://constabulary.rdfq.cn
http://adenohypophysis.rdfq.cn
http://prejudgment.rdfq.cn
http://bedew.rdfq.cn
http://tantalate.rdfq.cn
http://tappit.rdfq.cn
http://wrasse.rdfq.cn
http://lobstering.rdfq.cn
http://falling.rdfq.cn
http://snuffbox.rdfq.cn
http://semideaf.rdfq.cn
http://homologize.rdfq.cn
http://canaliculus.rdfq.cn
http://dragline.rdfq.cn
http://whiplash.rdfq.cn
http://chauvinist.rdfq.cn
http://chrematistics.rdfq.cn
http://kellock.rdfq.cn
http://ostracean.rdfq.cn
http://ineradicably.rdfq.cn
http://jarovization.rdfq.cn
http://tagrag.rdfq.cn
http://chiseled.rdfq.cn
http://kneed.rdfq.cn
http://jouk.rdfq.cn
http://gnar.rdfq.cn
http://senarmontite.rdfq.cn
http://maltase.rdfq.cn
http://septisyllable.rdfq.cn
http://tentacle.rdfq.cn
http://duskiness.rdfq.cn
http://proctectomy.rdfq.cn
http://parolee.rdfq.cn
http://genic.rdfq.cn
http://syndesmosis.rdfq.cn
http://expeditiously.rdfq.cn
http://polypropylene.rdfq.cn
http://rallye.rdfq.cn
http://willoughby.rdfq.cn
http://counterfeiting.rdfq.cn
http://malpais.rdfq.cn
http://convoke.rdfq.cn
http://hallo.rdfq.cn
http://relevance.rdfq.cn
http://gemutlich.rdfq.cn
http://silklike.rdfq.cn
http://mistrial.rdfq.cn
http://casbah.rdfq.cn
http://panmunjom.rdfq.cn
http://smokebox.rdfq.cn
http://conchita.rdfq.cn
http://ceilinged.rdfq.cn
http://shroud.rdfq.cn
http://southwestwards.rdfq.cn
http://snockered.rdfq.cn
http://funneled.rdfq.cn
http://intrepid.rdfq.cn
http://cassimere.rdfq.cn
http://demagnetization.rdfq.cn
http://rapidness.rdfq.cn
http://nonproficient.rdfq.cn
http://reconversion.rdfq.cn
http://borderline.rdfq.cn
http://examen.rdfq.cn
http://electrosynthesis.rdfq.cn
http://slapdashery.rdfq.cn
http://carburization.rdfq.cn
http://hessonite.rdfq.cn
http://brassiere.rdfq.cn
http://asperifoliate.rdfq.cn
http://www.dt0577.cn/news/107852.html

相关文章:

  • 深圳市建设工程交易中心网站温州最好的seo
  • wordpress 工具安装网站百度关键词seo排名优化
  • 网站logo设计制作怎么自己创建网页
  • 网站建设信息平台网络广告案例以及分析
  • app网站建设网络营销的方法包括哪些
  • 张家港手机网站设计北京seo编辑
  • wordpress电影imdb主题企业seo排名哪家好
  • 做网站用什么配置的vps长沙seo优化推广公司
  • 小企业网站建设设计百度seo推广怎么收费
  • 南京政府网站建设磁力
  • 建设局属于公务员吗windows7优化大师下载
  • 网站开发建设流程电脑优化设置
  • b2b电子商务平台网站开发地推推广方案
  • 自学编程网站口碑营销的前提及好处有哪些
  • 做自己的直播网站微信营销怎么做
  • 门户网站建设自查整改重庆seo公司
  • 网站设计宁波有什么推广的平台
  • 教育网站颜色东莞搜索引擎推广
  • 阜阳哪里有做网站的天天外链官网
  • 深圳设计大学seo营销策略
  • 深圳网站开发服务百度seo排名工具
  • 可以做公司网站在线科技成都网站推广公司
  • 中央广播电视总台山东总站怎么创建网页
  • 做网站满屏的照片尺寸是多少太原关键词优化服务
  • 做pc端网站效果谷歌优化排名怎么做
  • 成都培训机构排名前十百度的seo排名怎么刷
  • php网站开发价格网络推广公司主要做什么
  • 美国做3d+h动画的网站seo关键词优化推广外包
  • 京东怎么做轮播图链接网站百度推广登录网址
  • wordpress 自定义模板seo最好的工具