通過程式碼掛上物理頁
給0地址掛上物理頁,吧VirtualAlloc函式開闢的線性地址物理頁給0地址掛上,這樣這兩個線性地址訪問的就是同一個物理頁,
記憶體對映的本質就是相同或者不同程式的兩個線性地址,使用同一個物理頁
這個是2-9-9-12分頁的,如果10-10-12分頁會更簡單,程式碼可以在此基礎上改
這裡我將只提幾個需要注意到的問題
1.memset填充是為了 VirutalAlloc開闢記憶體後,線性地址並不會馬上掛上物理頁,PTE沒有指向物理頁需要注意
2.那個裸函式註釋掉的程式碼需要注意,雖然說要把那個線性地址PDE和PTE給0掛上,但是0本身有PDE而且一張PTT表(
寫可以找到2MB的實體記憶體)異常 而ring3堆疊 在0x0013XXXX 所以ring3堆疊訪問的時候需要依賴0線性地址本身的PDE
一個PDE項可以訪問2MB,0-0x00200000 這段線性地址公有一個PDE,所以如果給0地址掛上PDE直接就掛了,訪問堆疊的指令就全都完了,我除錯了大半天在才發現這第2個錯誤需要大家注意
#include "stdafx.h"
#include <Windows.h>
typedef struct AddresSegment{
DWORD PDPI;
DWORD PDEI;
DWORD PTEI;
}ADDRESSSEGMENT;
//將目標線性地址開始的一個頁,掛到源地址上上
typedef struct PageAttrib{
DWORD PTELOW;
DWORD PTEHIGH;
DWORD PDELOW;
DWORD PDEHIGH;
DWORD SrcAddress; //源地址線性地址
DWORD DestAddress; //目標線性地址
DWORD PDESrcAddress;
DWORD PTESrctAddress;
DWORD PDEDestAddress;
DWORD PTEDestAddress;
ADDRESSSEGMENT DestSeg;
ADDRESSSEGMENT SrcSeg;
}PAGEATTRIB;
PAGEATTRIB Page;
void InitAddress(){
Page.DestAddress=0x10000000;
Page.SrcAddress=0x0;
Page.DestSeg.PDPI =((Page.DestAddress&0xC0000000)>>30);
Page.DestSeg.PDEI =((Page.DestAddress&0x3FE00000)>>21); //0011 1111 1110
Page.DestSeg.PTEI =((Page.DestAddress&0x001FF000)>>12);
Page.SrcSeg.PDPI =((Page.SrcAddress&0xC0000000)>>30);
Page.SrcSeg.PDEI =((Page.SrcAddress&0x3FE00000)>>21);
Page.SrcSeg.PTEI =((Page.SrcAddress&0x001FF000)>>12);
Page.PDESrcAddress =0xC0600000+((Page.SrcAddress>>18)&0x3FF8);
Page.PTESrctAddress=0xC0000000+((Page.SrcAddress>>9)&0x7ffff8);
Page.PDEDestAddress=0xC0600000+((Page.DestAddress>>18)&0x3FF8);
Page.PTEDestAddress=0xC0000000+((Page.DestAddress>>9)&0x7ffff8);
}
void _declspec(naked) print(){
__asm{
pushad
pushfd
mov eax,dword ptr ds:[Page.PDEDestAddress]
mov ecx,dword ptr ds:[Page.PTEDestAddress]
mov ebx,[eax]
mov edx,[eax+4]
mov dword ptr ds:[Page.PDELOW],ebx
mov dword ptr ds:[Page.PDEHIGH],edx //獲得目標 物理頁 PDE
mov ebx,[ecx]
mov edx,[ecx+4]
mov dword ptr ds:[Page.PTELOW],ebx
mov dword ptr ds:[Page.PTEHIGH],edx
#if 0
mov eax,Page.PDELOW
mov ecx,Page.PDEHIGH
mov edx,Page.PDESrcAddress
mov dword ptr ds:[edx],eax
mov dword ptr ds:[edx+4],ecx
#endif
mov eax,Page.PTELOW
mov ecx,Page.PTEHIGH
mov edx,Page.PTESrctAddress
mov dword ptr ds:[edx],eax
mov dword ptr ds:[edx+4],ecx
popfd
popad
retf
}
}
int main(int argc, char* argv[])
{
char buf[6];
char* Addr=(char*)VirtualAlloc((void*)0x10000000,0x1000,MEM_RESERVE | MEM_COMMIT,PAGE_READWRITE);
if(NULL==Addr){
MessageBox(0,0,"開闢記憶體失敗",0);
}
memset(Addr,0x66,0x1000);
*(WORD*)&buf[4]=0x48;
InitAddress();
printf("Address=%p\n",print);
__asm{
call fword ptr buf;
mov ax,0x3b
mov fs,ax
}
int* p=NULL;
*p=0x1231435;
printf("Hello World!\n");
return 0;
}
相關文章
- 使用Megacli64對伺服器物理磁碟做Raid並通過uuid方式掛載伺服器AIUI
- 有沒有通過網頁線上使用的CRM?網頁
- [禁止chrome頁面翻譯程式碼塊]chrome外掛Chrome
- 通過釘釘網頁上的js學習xss打cookie網頁JSCookie
- windows上通過IDA遠端除錯linux程式Windows除錯Linux
- python+selenium 通過新增cookies或token解決網頁上驗證碼登入問題PythonCookie網頁
- Android通過程式碼修改圖片顏色Android
- [轉載] python通過反射執行程式碼Python反射行程
- 如何透過Python程式碼旋轉PDF頁面Python
- spring boot(二)整合mybatis plus+ 分頁外掛 + 程式碼生成Spring BootMyBatis
- 通過PageBean+Thymeleaf完成分頁Bean
- 通過行為引數化傳遞程式碼
- XSS挑戰之旅(通過看程式碼解題)
- 通過ajax上傳excelExcel
- dcat-admin 通過 composer 配置外掛
- 通過程式找sqlSQL
- 線上直播原始碼,通過手機號簡訊接收驗證碼原始碼
- ajax與json通過程式碼的簡單應用JSON
- 通過Rxjs五行程式碼實現EventBusJS行程
- 詳解Dart中如何通過註解生成程式碼Dart
- APEX重定向頁(通過分支判斷)
- 無需程式設計,通過配置零程式碼生成CRUD RESTful API程式設計RESTAPI
- 如何提取網頁上的顏色,網頁顏色程式碼提取工具ColorWell網頁
- 安卓應用安全指南5.4.1通過HTTPS的通訊示例程式碼安卓HTTP
- js2D物理引擎外掛JS
- 通過7個函式解密區塊鏈(附程式碼)函式解密區塊鏈
- 無需debug,通過抽象模型快速梳理程式碼核心流程抽象模型
- python3 通過 pybind11 使用Eigen加速程式碼Python
- 網頁程式碼(主頁)(初始版):網頁
- 網頁黑白程式碼網頁
- 沒用過這些 IDEA 外掛?怪不得寫程式碼頭疼Idea
- 網站防止被舉報程式碼舉 QQ 上的網頁報入口隱藏 QQ 上的網頁網站網頁
- Spark程式碼在叢集上執行過程理解Spark
- 通過 App Groups 實現程式間通訊APP
- Safari網頁敏感文字過濾外掛:Profanity Filter for Mac網頁FilterMac
- Ace editor 線上網頁版的vscode!程式碼編輯器網頁VSCode
- 通過TCP碼流識別編碼TCP
- 構建vscode的vue元件程式碼補全外掛以及上傳VSCodeVue元件