滴水中級班保護模式階段測試作業
// 保護模式階段測試第一題.cpp : Defines the entry point for the console application.
//
1給定一個線性地址,長度,讀取內容
2-9-9-12
#include "stdafx.h"
#include <Windows.h>
typedef struct PAGE{
DWORD PTELinkAddress;
DWORD PDELinkAddress;
DWORD PTELow;
DWORD PDELow;
};
char Buf[6];
PAGE Page;
void _declspec(naked) print(){
__asm{
pushad
pushf
mov eax,dword ptr ds:[Page.PTELinkAddress]
mov eax,dword ptr ds:[eax]
mov dword ptr ds:[Page.PTELow],eax
mov eax,dword ptr ds:[Page.PDELinkAddress]
mov eax,dword ptr ds:[eax]
mov dword ptr ds:[Page.PDELow],eax
popf
popad
retf
}
}
void Init(int LinkAddress){
Page.PDELinkAddress=0xC0600000+((LinkAddress>>18)&0x3ff8);
Page.PTELinkAddress=0xC0000000+((LinkAddress>>9)&0x7ffff8);
}
int MmIsAddressValid(int LinkAddress){
Init(LinkAddress);
__asm{
call fword ptr Buf;
}
if(0==Page.PDELow&0x1){ //PDE p位為1PTT無效
return 0;
}
if(0==Page.PTELow*0x1){ //PTE p位為1物理頁無效
return 0;
}
return true;
}
int ReadMemory(void* SrcAddress,DWORD DestAddresss,DWORD size){
int cout=((int)DestAddresss)%0x1000;
if(cout+size<=0x1000){ //訪問的資料在一個物理頁
if(0==MmIsAddressValid(((int)DestAddresss)&0xfffff000)){
return 0;
}
memcpy(SrcAddress,(void*)DestAddresss,size);
}
else{ //訪問的資料長度不在一個物理頁上
int n=(cout+size)/0x1000+1; //需要訪問這麼多個頁才能知道有沒有記憶體能不能讀
int RoundAddress=(((int)DestAddresss)&0xfffff000);
for(int i=0;i<n;i++){
if(0==MmIsAddressValid(((int)RoundAddress))){
return 0; //只要有一個頁沒有掛物理頁就返回失敗
}
RoundAddress+=0x1000;
}
memcpy(SrcAddress,(void*)DestAddresss,size);
}
return 1;
}
int main(int argc, char* argv[])
{
int* P=(int*)VirtualAlloc(NULL,0x1000,MEM_RESERVE | MEM_COMMIT,PAGE_READWRITE);
*((WORD*)&Buf[4])=0x48;
printf("%p\n",print);
if(0==ReadMemory((void*)P,0x300000,0x1000)){
MessageBox(0,0,"讀取記憶體失敗",0);
}
printf("Hello World!\n");
return 0;
}
保護模式階段測試第二題
#include "stdafx.h"
#include <Windows.h>
#define SRCADDRESS 0x1000
typedef struct PAGE{
DWORD SrcLinkAddress;
DWORD DestLinkAddress; //把目標地址線性的物理頁掛到原線性地址的屋裡也出
DWORD DestPDELinkAddress;
DWORD DestPTELinkAddress;
DWORD SrcPDELinkAddress;
DWORD SrcPTELinkAddress;
};
PAGE Page;
void Init(int* P){
Page.SrcLinkAddress=SRCADDRESS;
Page.DestLinkAddress=(int)P;
int a=(((Page.DestLinkAddress)>>18)&0x3ff8);
Page.DestPDELinkAddress=0xC0600000+((Page.DestLinkAddress>>18)&0x3ff8);
Page.DestPTELinkAddress=0xC0000000+((Page.DestLinkAddress>>9)&0x7ffff8);
Page.SrcPDELinkAddress=0xC0600000+((Page.SrcLinkAddress>>18)&0x3ff8);
Page.SrcPTELinkAddress=0xC0000000+((0x1000>>9)&0x7ffff8);
}//0001 000 0 0000 0000
void _declspec(naked) print(){
__asm{
pushad
mov edx,dword ptr ds:[Page.SrcPDELinkAddress] //原地址PDE的p位 判斷是否有
and edx,0x1
jne taolaod //P位不等於0
//如果把0x1000的PDE了會改變 2MB線性地址的物理頁全都錯亂
//如果VirtualAlloc分配的地址是上下有2GB線性地址沒有掛需要給src的線性地址掛上PTE
//這裡面是給0x1000線性地址如果該PDE堆疊就掛了 ring3堆疊就掛了 0x1000線性地址與ring3堆疊公有一個PTE,我曾經吃過虧
taolaod:
mov eax,dword ptr ds:[Page.DestPTELinkAddress]
mov ecx,dword ptr ds:[eax]
mov eax,dword ptr ds:[eax+4]
mov edx,ds:[Page.SrcPTELinkAddress]
mov dword ptr ds:[edx],ecx
mov dword ptr ds:[edx+4],eax
popad
retf
}
}
int main(int argc, char* argv[])
{
int i=0;
char Buf[6];
int* P=(int*)VirtualAlloc(NULL,0x1000,MEM_RESERVE | MEM_COMMIT,PAGE_READWRITE);
if(NULL==P){
MessageBox(NULL,0,"VirtualAlloc開闢記憶體失敗",0);
}
for(i=0;i<100;i++){
P[i]=(int)(P+i);
}
Init(P);
*((WORD*)&Buf[4])=0x48;
printf("%p\n",print);
int c=0;
__asm{
call fword ptr Buf;
}
int *a=(int*)0x1000;
for(i=0;i<100;i++){
if(i%5){
printf("%p\t",a[i]);
}else{
printf("\n");
}
}
printf("Hello World!\n");
return 0;
}
相關文章
- 企業級軟體測試階段 - 單元測試,SIT, UAT
- 保護模式:段機制模式
- 階段測試
- 建立DATAGUARD最大保護模式-測試手記模式
- 10g Data Guard三種保護模式測試模式
- 測試階段注意事項
- 保護模式模式
- 企業舉辦培訓班保護網路資訊保安
- H5測試||測試執行階段測啥H5
- 近階段測試工作小結:
- 軟體測試職業發展的幾個階段
- 19-作業系統安全保護作業系統
- 【等級保護】等級保護共分為幾級?保護物件是指什麼?物件
- java第三階段作業總結Java
- 效能測試流程各階段的工作
- 聊聊測試左移到開發階段
- 保護模式下的特權級檢查 (轉)模式
- 測試作業提交
- DG的保護模式模式
- 移動App安全等級保護測評防護要點APP
- 真實模式和保護模式模式
- 軟體效能測試的幾個階段
- 【等保知識】報業網路安全等級保護定級參考
- 作業測試總結
- 第三階段兩次PTA作業總結
- 結組作業,第一階段衝刺(4)
- 【科普】等級保護與分級保護的區別和聯絡!
- 單元測試階段的測試工作量自動預估
- 保護企業資訊保安,阿里雲滲透測試服務釋出阿里
- 保護性暫停模式模式
- dataguard三種保護模式模式
- DataGuard切換保護模式模式
- Windows的保護模式 (轉)Windows模式
- UI 測試的作業系統級別的錄製 / 回放UI作業系統
- 5.7 結組開發作業 第一階段展示
- 兩階段終止模式模式
- 自動化測試進階課程——Selenium自動化測試通關實戰班
- 【等保小知識】等級保護單項測評包括哪些專案?