X64ssdt 列舉函式偏移位址

2021-09-09 05:39:31 字數 1879 閱讀 4282

emmmmm 這個其實  和windows x86差不多~~~~~

這裡參考了 看雪論壇分享的 資料  作者是 tesla.angela(gdut.hwl) 

下面是** 

#include #include #pragma intrinsic(__readmsr)

typedef struct _system_service_table system_service_table, *psystem_service_table;

psystem_service_table ssdt;

ulonglong getssdt()

} return 0;

}ulonglong getfunctionaddress(ulonglong index)

void driverunload(pdriver_object driver)

ntstatus driverentry(in pdriver_object driverobject, in punicode_string registrypath)

ssdt = (psystem_service_table)addr;

kdprint(("sstd :%d\n", ssdt->numberofservices));

for (i = 0; i < ssdt->numberofservices; i++)

driverobject->driverunload = driverunload;

return status_success;

}

這是效果圖 

然後 這裡說一下 總結吧

其實這裡也是一步一步除錯出來的

因為x64的ssdt 表沒有匯出  所以需要動態匯出ssdt 表 這個比較坑爹  

不過 看教程  比較厲害的是通過讀取 c0000082 暫存器,能夠得到 kisystemcall64 的位址, 這個雖然不知道前輩們怎麼得出來的 但是可以肯定的是,這個幫了我們的大忙 

fffff800`03cc7ff2 4c8d1547782300  lea     r10,[nt!keservicedescriptortable 

然後我們的 keservicedescriptortable 的特徵碼就是 4c8d15

而  我們換一下特徵碼(4c8d1d),就能獲得 keservicedescriptortableshadow 的位址了。 

然後 這樣我們就能得出 他們的位址了 然後就可以列舉位址了

然後 至於 根據 服務號 然後推斷出 位址的

mov rax, rcx ;rcx=native api 的 index 

lea r10,[rdx] ;rdx=ssdt 基址

mov edi,eax

shr edi,7

and edi,20h

mov r10, qword ptr [r10+rdi]

movsxd r11,dword ptr [r10+rax]

mov rax,r11

sar r11,4

add r10,r11

mov rax,r10 ret

(以上**是 作者tesla.angela(gdut.hwl)  所總結)

但是驅動不支援彙編  那麼只能 轉化成 c或者 shellcode 了  

c的呢 我上面有  

下面shellcode 我直接放出 tesla.angela(gdut.hwl) 的**了

void init***x()

也沒有什麼東西~~

x64 x86 64 x64三者的區別

x86是指intel的開發的一種32位指令集,從386開始時代開始的,一直沿用至今,是一種cisc指令集,所有intel早期的cpu,amd早期的cpu都支援這種指令集,ntel官方文件裡面稱為 ia 32 x84 64是x86 cpu開始邁向64位的時候,有2選擇 1 向下相容x86。2 完全重新...

x64內聯彙編

建立 asm,寫入測試彙編 code asmadd proc mov rax,rcx add rax,rdx retasmadd endp end整形引數順序 rcx,rdx,r8,r9,rsp 浮點引數順序 xmm1,xmm2,xmm3.混合引數順序 第乙個引數整形 rcx,第二個引數浮點 xmm...

X64呼叫規範

1.由於位址長度為64位,因此call指令把rsp 堆疊指標 暫存器的值減去8.2.第一批傳遞子程式的四個引數依次存放於暫存器rcx rdx r8 r9。因此,如果只傳遞乙個引數就會放到rcx暫存器中。如果還有第二引數就會將其放入rdx暫存器中,其他引數從右至左入棧。3.長度不足64位的引數不進行零...