驅動過遊戲保護基礎知識點

2021-10-20 11:53:39 字數 3150 閱讀 3431

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的物件會把這個物件放置到離它最近的自動釋放池裡,自動釋放池釋放的時候才會把自動釋...