您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)如何利用IDA Python來枚舉Windows的系統(tǒng)調(diào)用表的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。
Windows系統(tǒng)中所有發(fā)生的系統(tǒng)調(diào)用都會(huì)被分配一個(gè)ID,這個(gè)ID是一個(gè)唯一值,用于標(biāo)識(shí)一個(gè)系統(tǒng)調(diào)用在執(zhí)行時(shí)具體使用的是哪一個(gè)函數(shù)。在不同的Windows版本中,這些ID的變化可能會(huì)非常大,對于Windows 10來說,每一個(gè)發(fā)行版本中的這些ID都不同。但是對于普通應(yīng)用程序而言,由于使用的是用戶模式下的代碼庫,因此ID不會(huì)變化。
在解析系統(tǒng)調(diào)用表時(shí)我們還有三個(gè)重要的符號(hào)需要識(shí)別:表的基址、表的大小和參數(shù)在棧中所占的字節(jié)大小。對于ntoskrnl.exe來說,這三個(gè)參數(shù)的名稱分別為:KiServiceTable、KiServiceLimit和KiArgumentTable。對于win32k.sys來說,這三個(gè)參數(shù)就變成了W32pServiceTable、W32pServiceLimit和W32pArgumentTable。在32位系統(tǒng)架構(gòu)中,這些符號(hào)名稱中都會(huì)包含下劃線。
比如說,我們來看一看Windows 7 64位版本中ntoskrnl.exe(版本6.1.7601.24117)的信息。KiServiceLimit數(shù)據(jù)如圖1所示:
根據(jù)這些信息,我們可以看到這里有401個(gè)系統(tǒng)調(diào)用(0x191)。KiServiceTable數(shù)據(jù)如圖2所示:
根據(jù)圖2的數(shù)據(jù),我們就可以將函數(shù)和它們的ID手動(dòng)映射出來了。其中,NtMapUserPhysicalPagesScatter對應(yīng)的ID為0x0000,NtWaitForSingleObject對應(yīng)的ID為0x0001,NtCallbackReturn對應(yīng)的ID為0x0002,后面的依此類推。
這里有兩種特殊情況需要專門處理。如果我們分析的是win32k.sys,在枚舉函數(shù)ID時(shí)需要在表地址上加0x1000。同樣的,對于64位Windows10(build 1607)我們也需要進(jìn)行不同的處理。在這個(gè)版本的系統(tǒng)中,系統(tǒng)調(diào)用表包含了四個(gè)字節(jié)的函數(shù)偏移量。
下面給出的是版本號(hào)為10.0.17134.48的ntoskrnl.exe信息。KiServiceTable數(shù)據(jù)如圖3所示:
這也就意味著,我們需要每次讀取四個(gè)字節(jié)的值,然后將它們與基地址相加。
首先我們來看一看需要調(diào)用的IDA函數(shù):
1. idaapi.get_imagebase:這個(gè)函數(shù)將會(huì)在我們所查看的模塊中返回基地址。
2. idc.GetInputFile:該函數(shù)可以返回IDB加載的文件名稱。
3. idc.BADADDR:這是一個(gè)值為-1(無符號(hào)整形)的常量,我們還可以用它來判斷當(dāng)前系統(tǒng)為32位還是64位模式。
4. idc.Name:該函數(shù)可以返回給定地址的名稱。
5. idc.LocByName:它的功能跟idc.Name正好相反,它用于返回給定名稱的地址。
6. idc.Dword:該函數(shù)能返回給定地址的四字節(jié)值。
7. idc.Qword:該函數(shù)可返回給定地址的八字節(jié)值。
8. idautils.DataRefsFrom:該函數(shù)可根據(jù)任意數(shù)據(jù)引用枚舉給定地址。
首先,我們需要確定正在分析的對象是ntoskrnl.exe還是win32k.sys:
接下來,我們需要判斷使用哪一個(gè)符號(hào)名稱,并判斷是否需要在變量中添加下劃線:
如果表不存在,LocByName將返回BADADDR,所以我們就可以利用這一點(diǎn)來測試符號(hào)名稱是否存在或是否需要添加下劃線。
得到了正確的符號(hào)名稱之后,我們需要獲取表的實(shí)際大?。?/p>
首先獲取LocByName的地址,然后利用Dword獲取地址值。下面給出的是64位Windows 10的處理方法:
DataRefsFrom將會(huì)利用數(shù)據(jù)引用來遍歷表的基地址,但如果目標(biāo)是新版本的Windows 10系統(tǒng),我們就需要在基地址上加上相應(yīng)的值。接下來需要做的就是從表的基地址開始讀取連續(xù)的值。我們可以使用Qword函數(shù)處理64位版本,用Dword處理32位版本。下面給出的是輸出結(jié)果樣本:
感謝各位的閱讀!關(guān)于“如何利用IDA Python來枚舉Windows的系統(tǒng)調(diào)用表”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。