a、引用keservicedescriptortable表
b、通過servicetablebase+偏移讀出當前函式位址
c、用windbg測試讀取的值
系統服務描述符表 在ntoskrnl.exe匯出keservicedescriptortable 這個表
typedef
struct _servicedescriptortable
*pservicedescriptortable;
//由ssdt索引號獲取當前函式位址
//ntopenprocess [[keservicedescriptortable]+0x7a*4]
//匯出系統服務描述符表ssdt的指標
extern pservicedescriptortable keservicedescriptortable;
方法1 純彙編讀取
ulong ssdt_ntopenprocess_addr;
//[[keservicedescriptortable]+0x7a*4]
__asm
kdprint((
"讀取ssdt_ntopenprocess_addr=%x +++++++\n"
,ssdt_ntopenprocess_addr));
//讀取ssdt_ntopenprocess_addr=8058270a +++++++
//ssdt_ntopenprocess_cur_addr=8058270a
方法2:用指標讀取
long *ssdt_adr,ssdt_ntopenprocess_cur_addr,t_addr;
kdprint((
"驅動成功被載入中.............................\n"))
;//讀取ssdt表中索引值為0x7a的函式
//poi(poi(keservicedescriptortable)+0x7a*4)
t_addr=
(long)keservicedescriptortable-
>servicetablebase;
kdprint((
"當前servicetablebase位址為%x \n"
,t_addr));
ssdt_adr=
(plong)
(t_addr+
0x7a*4
);kdprint((
"當前t_addr+0x7a*4=%x \n"
,ssdt_adr));
ssdt_ntopenprocess_cur_addr=
*ssdt_adr;
kdprint((
"當前ssdt_ntopenprocess_cur_addr位址為%x \n"
,ssdt_ntopenprocess_cur_addr));
當前servicetablebase位址為804e58a0
當前t_addr+
0x7a*4
=804e5a88
當前ssdt_ntopenprocess_cur_addr位址為8058270a
a、getnt_curaddr函式
b、mmgetsystemroutineaddress
c、書寫getnt_oldaddr函式
d、測試結果
pvoid mmgetsystemroutineaddress
__in punicode_string systemroutinename
ulong getnt_oldaddr();
ulong getnt_curaddr() //獲取當前ssdt_ntopenprocess的當前位址
long *ssdt_adr,ssdt_ntopenprocess_cur_addr,t_addr;
kdprint((「驅動成功被載入中…\n」));
//讀取ssdt表中索引值為0x7a的函式
//poi(poi(keservicedescriptortable)+0x7a*4)
t_addr=(long)keservicedescriptortable->servicetablebase;
kdprint((「當前servicetablebase位址為%x \n」,t_addr));
ssdt_adr=(plong)(t_addr+0x7a*4);
kdprint((「當前t_addr+0x7a*4=%x \n」,ssdt_adr));
ssdt_ntopenprocess_cur_addr=*ssdt_adr;
kdprint((「當前ssdt_ntopenprocess_cur_addr位址為%x \n」,ssdt_ntopenprocess_cur_addr));
return ssdt_ntopenprocess_cur_addr;
ulong getnt_oldaddr()
unicode_string old_ntopenprocess;
ulong old_addr;
rtlinitunicodestring(&old_ntopenprocess,l"ntopenprocess");
old_addr=(ulong)mmgetsystemroutineaddress(&old_ntopenprocess);//取得ntopenprocess的位址
kdprint(("取得原函式ntopenprocess的值為 %x",old_addr));
return old_addr;
a、jmp位址轉換公式推導
b、計算實際位址函式realjmp_addr
c、測試
jmp 0xe9
jmp 88881234 //e9 88881234
定義jmp結構
typedef struct _jmpcode
byte e9;
ulongjmpaddr;//88881234=b
}jmpcode,*pjmpcode;
a b c
c-a-5=b //實際要寫入位址
// 5b 52 65 dc
if (cur!=old)
基礎知識點
1 inline block布局 2 table布局 3 justify的末行不對齊 4 兩個圖示之間有空格 換行 5 背景中的的 路徑的 全部斜槓都為 不是 命令列下的這種 doctype html html head meta charset utf 8 title xx title head ...
erlang基礎知識點
1 變數是不可改變的,必須以首字母大寫開頭 2 字串就是小寫字母,或者單引號引起來的字串 3 賦值可以使用匹配模式 4 資料結構有元組,取值用匹配模式來取值 就能取到x,b的值 5 資料結列表 ss,aa,取值是用 head foot 的形式取值 頭和尾的形式匹配 6 字串只能用雙引號表示 7 函式...
ios基礎知識點
1.記憶體管理 用記憶體引用計數來進行管理 alloc,retain,copy會使記憶體引用計數立即 1 當物件使用結束後要對它進行釋放 release 立即 1 autorelease 未來 1 autorelease的物件會把這個物件放置到離它最近的自動釋放池裡,自動釋放池釋放的時候才會把自動釋...