windows 根據特徵碼查詢核心任意函式

2022-03-12 16:17:31 字數 3063 閱讀 8478

在windows平台做逆向、外掛程式等,經常需要呼叫很多未匯出的核心函式,怎麼方便、快速查詢了?可以先用ida等工具檢視硬編碼,再根據硬編碼定位到需要呼叫的函式。整個思路大致如下:

1、先查詢目標模組

遍歷模組的方式有多種。既然通過驅動在核心程式設計,這裡選擇遍歷driverobject的driversection欄位來遍歷核心所有模組,核心**如下:

1/*2

可以用來動態查詢核心模組的基址,後續用於:

31、pte\pde等base計算

42、其他函式、變數精確位置的計算(ida靜態分析只能查到偏移)5*/

6pvoid findmould(pdriver_object pdriverobject, pwchar moudname, pulong psize)730

31}32//

下乙個33 pdriverdata = (pldr_data_table_entry)pdriverdata->inloadorderlinks.flink;

3435 } while (pfirstdriverdata !=pdriverdata);

3637

return

null;

38 }

傳入driverobject、模組名稱,得到模組基址(返回值)和模組長度(引數);

2、得到模組基址後,再進一步根據特徵碼查詢目標函式:

1

pvoid findfun(pvoid psearchbeginaddr, ulong ulsearchlength, puchar pspecialcode, ulong ulspecialcodelength)219

//匹配特徵碼

20if (*(puchar)(i + j) !=pspecialcode[j])

2124}25

//匹配成功

26if (j >=ulspecialcodelength)

2731}32

33return

pdestaddr;

34 }

3、用法舉例:強行殺死執行緒時,需要呼叫 pspterminatethreadbypointer 函式,但此函式並未匯出,可以通過ida檢視彙編**,也可以在windbg通過u pspterminatethreadbypointer,如下:

kd> u nt!pspterminatethreadbypointer 

nt!pspterminatethreadbypointer:

fffff803`d01c6210 48895c2408      mov     qword ptr [rsp+8],rbx

fffff803`d01c6215 48896c2410      mov     qword ptr [rsp+10h],rbp

fffff803`d01c621a 4889742418      mov     qword ptr [rsp+18h],rsi

fffff803`d01c621f 57              push    rdi

fffff803`d01c6220 4883ec30        sub     rsp,30h

fffff803`d01c6224 8b81d0060000    mov     eax,dword ptr [rcx+6d0h]

fffff803`d01c622a 418ae8          mov     bpl,r8b

fffff803`d01c622d 488bb920020000  mov     rdi,qword ptr [rcx+220h]

由於大多數函式剛開始都是初始化堆疊**,這裡特徵碼重合度較高,為了避免找到其他函式,建議從稍微靠後幾行**處提取特徵碼,比如這裡從第7行開始提取 418ae8488bb920020000 10個位元組,找到後再減去26位元組就回到了pspterminatethreadbypointer入口;

1

ntstatus driverentry(pdriver_object pdriverobject, punicode_string pregpath)211

12 ulong mouldsize = 0

;13 pwchar mouldname = l"

ntkrnlmp.exe";

14 pvoid mouldbase = findmould(pdriverobject, mouldname, &mouldsize);

1516

17 dbgprint("

mould name = %ws ; mould base = 0x%p; mould size = 0x%x\n

", mouldname, mouldbase, mouldsize);

1819 uchar pspecialcode[256] = ;

20/*

418ae8488bb920020000

*/21 pspecialcode[0] = 0x41

;22 pspecialcode[1] = 0x8a

;23 pspecialcode[2] = 0xe8

;24 pspecialcode[3] = 0x48

;25 pspecialcode[4] = 0x8b

;26 pspecialcode[5] = 0xb9

;27 pspecialcode[6] = 0x20

;28 pspecialcode[7] = 0x02

;29 pspecialcode[8] = 0x00

;30 pspecialcode[9] = 0x00;31

32 pvoid funaddress = findfun(mouldbase, mouldsize, pspecialcode, 4

);33 dbgprint("

finally function address = 0x%p;\n

", funaddress-26

);34

35return

status;

36 }

機器特徵碼

在計算機硬體裝置中 cpu id bios 主機板 記憶體 硬碟 卷sn,網絡卡mac位址可作為機器特徵碼,通過硬體檢測工具如everest可以看到這一點。cpu id cpu id並不具備唯一性,同一批號的cpu其id可能相同 1 wmi select processorid from win32...

C 特徵碼定位

include include include bool getprocessmodulehandle dword pid,const char szmodulename,moduleentry32 pmodule 獲取模組資訊的 bool stringtobyte const char inbuf...

根據內容查儲存過程

1.oracle中下面這麼寫 按名查詢儲存過程 select from user objects where object type procedure and object name like upper p 按內容查詢儲存過程 select from all source where type ...