說說思路吧,如果給出的線性位址+讀取的長度沒有超過0x1000。那麼這種情況很好處理,判斷pde和pte的p都為1就行了
// readpageattr.cpp : 定義控制台應用程式的入口點。
//呼叫門描述符 eq 8003f048 0041ec00`00081087
#include
"stdafx.h"
#include
dword dwpdt_index=0;
dword dwptt_index=0;
dword dwpageindex=0;
dword result=0;
bool bread=
false
;//位址是否可讀標誌 true為可正常讀
void
callgate()
;void
_declspec
(naked)
test()
}void
parsepage
(dword dwaddr)
void
callgate()
;*(dword*
)&buffer[0]
=0;*
(word*
)&buffer[4]
=0x4b
; _asm }
bool
readmemory
(out void
*buffer,in dword dwaddr,in dword
dwlength)}}
else
}return
false;}
int_tmain
(int argc, _tchar* ar**)
;printf
(,test)
;int
*p=(
int*
)0x11ffc
;*p=
0x12345678
; bool bret=
readmemory
(buf,
0x11ffc,4
);if(bret)
}else
getchar()
;return0;
}
**記錄一下,兩道題肝了我5個小時,還好做出來了 **
// protect2.cpp : 定義控制台應用程式的入口點。
//呼叫門描述符 eq 8003f048 0041ec00`00081087
#include
"stdafx.h"
#include
dword dwpdt_index=0;
dword dwptt_index=0;
dword dwpageindex=0;
dword dwpde;
dword dwpte;
void
callgate()
;*(dword*
)&buffer[0]
=0;*
(word*
)&buffer[4]
=0x4b
; _asm }
void
_declspec
(naked)
test()
}void
parsepage
(dword dwaddr)
int_tmain
(int argc, _tchar* ar**)
parsepage
((dword)dwaddr)
;//3:定義乙個指標,指向0x1000 使用指標列印出陣列的值。
dwaddr=
(dword*
)0x1000
;for
(int i=
0;i<
100;i++
)getchar()
;return0;
}
滴水保護模式測試
工具 vc 6 windbg 注意點 下面採用的都是pae分頁 2 9 9 12 公式 pde dwaddr 21 3 0x3ff8 0xc0600000 2 9 pte dwaddr 12 3 0x7ffff8 0xc0000000 2 9 9 第一題難點在於計算pde pte include s...
進入保護模式
本文為 每個描述符佔8位元組,下圖中,上面位高32位,下面為低32位 disk boot ata channel 0 first hd cd on channel 0 type of disk image這個選項是vpc,我用2.6.2配置時選vpc無法啟動,得選flat才可以,2.6.0貌似選vp...
進入保護模式
以下圖2,圖4和圖5截自intel手冊 每個描述符佔8位元組,下圖中,上面位高32位,下面為低32位 disk boot ata channel 0 first hd cd on channel 0 type of disk image這個選項是vpc,我用2.6.2配置時選vpc無法啟動,得選fl...