日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

如何写windows系统已保护的内存区域

發布時間:2025/3/15 windows 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何写windows系统已保护的内存区域 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

windows系統在某些版本下對某些內存區域啟用了寫保護的功能,因為這些區域一般合法程序是不可能修改其內容的,那么我們如何來寫這些內存呢?

PS:1) 這些系統包括:windows xp與windows 2003
???2) CPU提供寫保護的功能是從486開始的
???3) 一般合法程序不包括殺毒軟件,因為他們在Hook SSDT中是直接改ServiceTableBase,而沒有用inline的方法
??
我們就用SSDT做例子吧,在Hook SSDT時不用innline hook方法,我們就要修改SSDT這個系統服務描述表;而這個表是被寫保護了,在ring0下也是沒有寫的權限。

方法一:
首先我們來看一下CR0寄存器的格式
|31|30|?????? |18|17|16|????????? 5|4|3|2|0|1|
|P |C |???????|A |? |W |??????????N|E|T|E|M|P|
|G |D |???????|M?|??|P |????????? E|T|S|M|P|E|

我們主要注意這個WP這位,其他的請參考IA-32 Volume 3A;
WP——Write Protect,當設置為1時只提供讀頁權限
PE——Paging,當設置為1時提供分頁
MP——Protection Enable,當設置為1時進入保護模式
所以我們只要把WP這一位設置為0時,就可以修改SSDT了

?//1 關閉寫保護
?__asm
?{
? push eax
??mov? eax, CR0
? and? eax, 0FFFEFFFFh
? mov? CR0, eax
? pop? eax
?}

?//2 打開寫保護
?__asm
?{
? push eax
? mov? eax, CR0
? or?? eax, NOT 0FFFEFFFFh
? mov? CR0, eax
? pop? eax
?}
通過上面的第一組指令我們就可以正常修改SSDT,記得修改后要還原。


方法二:
此方法是蓋茨提供的,在內存描述表(MDL)中描述一塊內存區域,MDL包含此內存區域的起始地址,擁有者進程,字節數量以及標志。
//在ddk中的描述
typedef struct _MDL {
??? struct _MDL *Next;
??? CSHORT Size;
??? CSHORT MdlFlags;
??? struct _EPROCESS *Process;
??? PVOID MappedSystemVa;
??? PVOID StartVa;
??? ULONG ByteCount;
??? ULONG ByteOffset;
} MDL, *PMDL;

#define MDL_MAPPED_TO_SYSTEM_VA???? 0x0001
#define MDL_PAGES_LOCKED??????????? 0x0002
#define MDL_SOURCE_IS_NONPAGED_POOL 0x0004
#define MDL_ALLOCATED_FIXED_SIZE??? 0x0008
#define MDL_PARTIAL???????????????? 0x0010
#define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020
#define MDL_IO_PAGE_READ??????????? 0x0040
#define MDL_WRITE_OPERATION???????? 0x0080
#define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100
#define MDL_LOCK_HELD?????????????? 0x0200
#define MDL_PHYSICAL_VIEW?????????? 0x0400
#define MDL_IO_SPACE??????????????? 0x0800
#define MDL_NETWORK_HEADER????????? 0x1000
#define MDL_MAPPING_CAN_FAIL??????? 0x2000
#define MDL_ALLOCATED_MUST_SUCCEED? 0x4000


// Declarations

#pragma pack(1)

typedef struct ServiceDescriptorEntry {

??????? unsigned int *ServiceTableBase;

??????? unsigned int *ServiceCounterTableBase;

??????? unsigned int NumberOfServices;

??????? unsigned char *ParamTableBase;

} SSDT;

#pragma pack()

__declspec(dllimport) SSDTKeServiceDescriptorTable;

PMDL? g_pmdlSystemCall;
PVOID *MappedSystemCallTable;

// save old system call locations
// Map the memory into our domain to change the permissions on
// the MDL
g_pmdlSystemCall = MmCreateMdl(NULL,
?????????????????? KeServiceDescriptorTable.ServiceTableBase,
?????????????????? KeServiceDescriptorTable.NumberOfServices*4);

if(!g_pmdlSystemCall)
?? return STATUS_UNSUCCESSFUL;

MmBuildMdlForNonPagedPool(g_pmdlSystemCall);

// Change the flags of the MDL
g_pmdlSystemCall->MdlFlags = g_pmdlSystemCall->MdlFlags |
???????????????????????????? MDL_MAPPED_TO_SYSTEM_VA;

MappedSystemCallTable = MmMapLockedPages(g_pmdlSystemCall, KernelMode);



MappedSystemCallTable就是SSDT的地址,現在可以放心的操作它吧!用完了最好MmFreePagesFromMdl。
?

總結

以上是生活随笔為你收集整理的如何写windows系统已保护的内存区域的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。