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