让我们继续在`《内核读写内存浮点数》`的基础之上做一个简单的延申,如
06月27日 18:43
【资料图】
让我们继续在《内核读写内存浮点数》
的基础之上做一个简单的延申,如何实现多级偏移读写,其实很简单,读写函数无需改变,只是在读写之前提前做好计算工作,以此来得到一个内存偏移值,并通过调用内存写入原函数实现写出数据的目的。
以读取偏移内存为例,如下代码同样来源于本人的LyMemory
读写驱动项目,其中核心函数为WIN10_ReadDeviationIntMemory()
该函数的主要作用是通过用户传入的基地址与偏移值,动态计算出当前的动态地址。
函数首先将基地址指向要读取的变量,并将其转换为LPCVOID
类型的指针。然后将指向变量值的缓冲区转换为LPVOID
类型的指针。接下来,函数使用PsLookupProcessByProcessId
函数查找目标进程并返回其PEPROCESS
结构体。随后,函数从偏移地址数组的最后一个元素开始迭代,每次循环都从目标进程中读取4字节整数型数据,并将其存储在Value
变量中。然后,函数将基地址指向Value
和偏移地址的和,以便在下一次循环中读取更深层次的变量。最后,函数将基地址指向最终变量的地址,读取变量的值,并返回。
如下案例所示,用户传入进程基址以及offset
偏移值时,只需要动态计算出该偏移地址,并与基址相加即可得到动态地址。
#include #include #include // 普通Ke内存读取NTSTATUS KeReadProcessMemory(PEPROCESS Process, PVOID SourceAddress, PVOID TargetAddress, SIZE_T Size){PEPROCESS SourceProcess = Process;PEPROCESS TargetProcess = PsGetCurrentProcess();SIZE_T Result;if (NT_SUCCESS(MmCopyVirtualMemory(SourceProcess, SourceAddress, TargetProcess, TargetAddress, Size, KernelMode, &Result)))return STATUS_SUCCESS;elsereturn STATUS_ACCESS_DENIED;}// 读取整数内存多级偏移/* Pid: 目标进程的进程ID。 Base: 变量的基地址。 offset: 相对基地址的多级偏移地址,用于定位变量。 len: 偏移地址的数量。*/INT64 WIN10_ReadDeviationIntMemory(HANDLE Pid, LONG Base, DWORD offset[32], DWORD len){INT64 Value = 0;LPCVOID pbase = (LPCVOID)Base;LPVOID rbuffer = (LPVOID)&Value;PEPROCESS Process;PsLookupProcessByProcessId((HANDLE)Pid, &Process);for (int x = len - 1; x >= 0; x--){__try{KeReadProcessMemory(Process, pbase, rbuffer, 4);pbase = (LPCVOID)(Value + offset[x]);}__except (EXCEPTION_EXECUTE_HANDLER){return 0;}}__try{DbgPrint("读取基址:%x \n", pbase);KeReadProcessMemory(Process, pbase, rbuffer, 4);}__except (EXCEPTION_EXECUTE_HANDLER){return 0;}return Value;}// 驱动卸载例程VOID UnDriver(PDRIVER_OBJECT driver){DbgPrint("Uninstall Driver \n");}// 驱动入口地址NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath){DbgPrint("Hello LyShark \n");DWORD PID = 4884;LONG PBase = 0x6566e0;LONG Size = 4;DWORD Offset[32] = { 0 };Offset[0] = 0x18;Offset[1] = 0x0;Offset[2] = 0x14;Offset[3] = 0x0c;// 读取内存数据INT64 read = WIN10_ReadDeviationIntMemory(PID, PBase, Offset, Size);DbgPrint("PID: %d 基址: %p 偏移长度: %d \n", PID, PBase, Size);DbgPrint("[+] 1级偏移: %x \n", Offset[0]);DbgPrint("[+] 2级偏移: %x \n", Offset[1]);DbgPrint("[+] 3级偏移: %x \n", Offset[2]);DbgPrint("[+] 4级偏移: %x \n", Offset[3]);DbgPrint("[ReadMemory] 读取偏移数据: %d \n", read);Driver->DriverUnload = UnDriver;return STATUS_SUCCESS;}
编译并运行如上这段代码,则可获取到PID=4884
的PBase
的动态地址中的数据,如下图所示;
至于如何将数据写出四级偏移的基址上面,则只需要取出pbase
里面的基址,并通过原函数WIN10_WriteProcessMemory
直接写出数据即可,此出的原函数在《内核MDL读写进程内存》
中已经做了详细介绍,实现写出代码如下所示;
#include #include #include // 普通Ke内存读取NTSTATUS KeReadProcessMemory(PEPROCESS Process, PVOID SourceAddress, PVOID TargetAddress, SIZE_T Size){PEPROCESS SourceProcess = Process;PEPROCESS TargetProcess = PsGetCurrentProcess();SIZE_T Result;if (NT_SUCCESS(MmCopyVirtualMemory(SourceProcess, SourceAddress, TargetProcess, TargetAddress, Size, KernelMode, &Result)))return STATUS_SUCCESS;elsereturn STATUS_ACCESS_DENIED;}// Win10 内存写入函数BOOLEAN WIN10_WriteProcessMemory(HANDLE Pid, PVOID Address, SIZE_T BYTE_size, PVOID VirtualAddress){PVOID buff1;VOID *buff2;int MemoryNumerical = 0;KAPC_STATE KAPC = { 0 };PEPROCESS Process;PsLookupProcessByProcessId((HANDLE)Pid, &Process);__try{//分配内存buff1 = ExAllocatePoolWithTag((POOL_TYPE)0, BYTE_size, 1997);buff2 = buff1;*(int*)buff1 = 1;if (MmIsAddressValid((PVOID)VirtualAddress)){// 复制内存memcpy(buff2, VirtualAddress, BYTE_size);}else{return FALSE;}// 附加到要读写的进程KeStackAttachProcess((PRKPROCESS)Process, &KAPC);if (MmIsAddressValid((PVOID)Address)){// 判断地址是否可写ProbeForWrite(Address, BYTE_size, 1);// 复制内存memcpy(Address, buff2, BYTE_size);}else{return FALSE;}// 剥离附加的进程KeUnstackDetachProcess(&KAPC);ExFreePoolWithTag(buff2, 1997);}__except (EXCEPTION_EXECUTE_HANDLER){return FALSE;}return FALSE;}// 写入整数内存多级偏移INT64 WIN10_WriteDeviationIntMemory(HANDLE Pid, LONG Base, DWORD offset[32], DWORD len, INT64 SetValue){INT64 Value = 0;LPCVOID pbase = (LPCVOID)Base;LPVOID rbuffer = (LPVOID)&Value;PEPROCESS Process;PsLookupProcessByProcessId((HANDLE)Pid, &Process);for (int x = len - 1; x >= 0; x--){__try{KeReadProcessMemory(Process, pbase, rbuffer, 4);pbase = (LPCVOID)(Value + offset[x]);}__except (EXCEPTION_EXECUTE_HANDLER){return 0;}}__try{KeReadProcessMemory(Process, pbase, rbuffer, 4);}__except (EXCEPTION_EXECUTE_HANDLER){return 0;}// 使用原函数写入BOOLEAN ref = WIN10_WriteProcessMemory(Pid, (void *)pbase, 4, &SetValue);if (ref == TRUE){DbgPrint("[内核写成功] # 写入地址: %x \n", pbase);return 1;}return 0;}// 驱动卸载例程VOID UnDriver(PDRIVER_OBJECT driver){DbgPrint("Uninstall Driver \n");}// 驱动入口地址NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath){DbgPrint("Hello LyShark \n");DWORD PID = 4884;LONG PBase = 0x6566e0;LONG Size = 4;INT64 SetValue = 100;DWORD Offset[32] = { 0 };Offset[0] = 0x18;Offset[1] = 0x0;Offset[2] = 0x14;Offset[3] = 0x0c;// 写出内存数据INT64 write = WIN10_WriteDeviationIntMemory(PID, PBase, Offset, Size, SetValue);DbgPrint("PID: %d 基址: %p 偏移长度: %d \n", PID, PBase, Size);DbgPrint("[+] 1级偏移: %x \n", Offset[0]);DbgPrint("[+] 2级偏移: %x \n", Offset[1]);DbgPrint("[+] 3级偏移: %x \n", Offset[2]);DbgPrint("[+] 4级偏移: %x \n", Offset[3]);DbgPrint("[WriteMemory] 写出偏移数据: %d \n", SetValue);Driver->DriverUnload = UnDriver;return STATUS_SUCCESS;}
运行如上代码将在0x6566e0
所在的基址上,将数据替换为100
,实现效果图如下所示;
那么如何实现读写内存浮点数,字节集等多级偏移呢?
其实我们可以封装一个WIN10_ReadDeviationMemory
函数,让其只计算得出偏移地址,而所需要写出的类型则根据自己的实际需求配合不同的写入函数完成,也就是将两者分离开,如下则是一段实现计算偏移的代码片段,该代码同样来自于本人的LyMemory
驱动读写项目;
#include #include #include // 普通Ke内存读取NTSTATUS KeReadProcessMemory(PEPROCESS Process, PVOID SourceAddress, PVOID TargetAddress, SIZE_T Size){PEPROCESS SourceProcess = Process;PEPROCESS TargetProcess = PsGetCurrentProcess();SIZE_T Result;if (NT_SUCCESS(MmCopyVirtualMemory(SourceProcess, SourceAddress, TargetProcess, TargetAddress, Size, KernelMode, &Result)))return STATUS_SUCCESS;elsereturn STATUS_ACCESS_DENIED;}// 读取多级偏移内存动态地址DWORD64 WIN10_ReadDeviationMemory(HANDLE Pid, LONG Base, DWORD offset[32], DWORD len){INT64 Value = 0;LPCVOID pbase = (LPCVOID)Base;LPVOID rbuffer = (LPVOID)&Value;PEPROCESS Process;PsLookupProcessByProcessId((HANDLE)Pid, &Process);for (int x = len - 1; x >= 0; x--){__try{KeReadProcessMemory(Process, pbase, rbuffer, 4);pbase = (LPCVOID)(Value + offset[x]);}__except (EXCEPTION_EXECUTE_HANDLER){return 0;}}return pbase;}// 驱动卸载例程VOID UnDriver(PDRIVER_OBJECT driver){DbgPrint("Uninstall Driver \n");}// 驱动入口地址NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath){DbgPrint("Hello LyShark \n");DWORD PID = 4884;LONG PBase = 0x6566e0;LONG Size = 4;DWORD Offset[32] = { 0 };Offset[0] = 0x18;Offset[1] = 0x0;Offset[2] = 0x14;Offset[3] = 0x0c;// 写出内存数据DWORD64 offsets = WIN10_ReadDeviationMemory(PID, PBase, Offset, Size);DbgPrint("PID: %d 基址: %p 偏移长度: %d \n", PID, PBase, Size);DbgPrint("[+] 1级偏移: %x \n", Offset[0]);DbgPrint("[+] 2级偏移: %x \n", Offset[1]);DbgPrint("[+] 3级偏移: %x \n", Offset[2]);DbgPrint("[+] 4级偏移: %x \n", Offset[3]);DbgPrint("[CheckMemory] 计算偏移地址: %x \n", offsets);Driver->DriverUnload = UnDriver;return STATUS_SUCCESS;}
运行如上代码将动态计算出目前偏移地址的pbase
实际地址,实现效果图如下所示;
关键词:
让我们继续在`《内核读写内存浮点数》`的基础之上做一个简单的延申,如
06月27日 18:43
九寨沟县气象台2023年06月27日08时30分发布暴雨蓝色预警:预计27日08时
06月27日 18:21
黄晓明最近在个人社交媒体上晒出了自己在观看了奥运滑雪选手谷爱凌的比
06月27日 18:29
大家好,今日关于【普里戈任:我们不是为了推翻俄领导层】迅速上了的热
06月27日 18:26
在估值缩水、竞争对手的夹击之下,SHEIN也于今年推出了平台模式:允许
06月27日 18:42
太激动!女单名将4:2晋级4强,跳上球台挥舞球拍,战胜过陈梦2次,陈梦,
06月27日 18:23
成渝地区双城经济圈建设迈出新步伐(主题)人民日报记者姜峰常碧罗在重
06月27日 18:32
“小修小补”重回社区,既能解决灵活就业,还能满足群众生活便利,让百
06月27日 18:39
第一时间提供各大券商研究所报告,最大程度减少个人投资者与机构之间信
06月27日 18:41
随着“90后”和“95后”等新一代年轻父母成为母婴市场的主力消费群体,
06月27日 18:42
中超联赛在经过了一个短暂的间歇期之后,即将要重燃战火了,在联赛重启
06月27日 18:21
央视网消息:第十四届夏季达沃斯论坛将于明天,也就是6月27日至29日,
06月27日 18:34
都说这两天凉快了讲真……这体感……主打一个“似有还无”?!难道降雨
06月27日 18:34
罂粟能盛放花朵,却结不出善良的果实。毒品能激发幻觉,却带不来幸福的
06月27日 18:24
本报讯(张东)近日,四川省甘孜县举行创建国家牦牛养殖标准化示范区项
06月27日 18:24
南都讯记者孙小鹏实习生饶阳阳“感谢大家对我们的支持信任,我们拿冠军
06月27日 18:32
6月27日盘中消息,13点16分蜀道装备(300540)触及涨停板。目前价格28
06月27日 18:16
中新社台北6月26日电台湾缺药危机持续多年,新冠疫情后不仅缺西药,中
06月27日 18:30
本文内容是由小编为大家搜集关于河南农村信用联社新闻,以及河南农信社
06月27日 18:36
6月26日上午,市人大常委会主任、商丘经济技术开发区党工委书记张家明
06月27日 18:26
目前31个省区市2023高考录取控制分数线均已公布↓↓祝所有考生好运
06月27日 18:39
普京再次发表电视讲话:武装叛乱都会被镇压,俄罗斯社会展现出最高度的
06月27日 18:33
6月27日消息,今年3月,天津一特斯拉ModelY发生交通事故,车主在限速70
06月27日 18:35
每日甘肃网张掖讯(新甘肃·每日甘肃网记者杨红丽)记者从张掖市文化广
06月27日 18:28
《塞尔达传说王国之泪》远古史诗巡礼任务攻略是塞尔达传说:王国之泪游
06月27日 18:15
长春吉大正元信息技术股份有限公司旗下服务器密码机SJJ1978;SJJ-Y;SJJ1
06月27日 18:15
我们购买的鸡胸肉,大多是冷冻品,难免腥味比较重。我们在烹饪时,建议
06月27日 18:17
IT之家6月27日消息,安全研究专家Cyble近日发现,有黑客在网络上散布带
06月27日 18:28
夫子庙大成殿是南京著名的景点。在手机上,点开夫子庙大成殿介绍,可以
06月27日 18:18
无人机在边坡盘旋,机器狗在配电室巡视,无人驾驶卡车在矿坑行驶……这
06月27日 18:18