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位的引數不進行零...