您現在的位置:網站首頁答辯論文論文指導實戰方法

如何寫windows系統已保護的內存區域

  • 簡介:windows系統在某些版本下對某些內存區域啟用了寫保護的功能,因為這些區域一般合法程序是不可能修改其內容的,那么我們如何來寫這些內存呢?
    • 請與管理員聯系購買資料 QQ:5739126
  • 論文簡介
  • 相關論文
  • 論文下載
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。

查看評論 已有0位網友發表了看法
  • 驗證碼:
四川三人麻将