摘要:你如果是從中間插過來看的,請仔細閱讀羽夏看系統內核簡述,方便學習本教程。看此教程之前,問一個問題,你明確學系統調用的目的了嗎沒有的話就不要繼續了,請重新學習羽夏看系統內核系統調用篇里面的內容。華麗的分割線的全稱是,意為系統服務描述符表。
??此系列是本人一個字一個字碼出來的,包括示例和實驗截圖。由于系統內核的復雜性,故可能有錯誤或者不全面的地方,如有錯誤,歡迎批評指正,本教程將會長期更新。 如有好的建議,歡迎反饋。碼字不易,如果本篇文章有幫助你的,如有閑錢,可以打賞支持我的創作。如想轉載,請把我的轉載信息附在文章后面,并聲明我的個人信息和本人博客地址即可,但必須事先通知我。
你如果是從中間插過來看的,請仔細閱讀 羽夏看Win系統內核——簡述 ,方便學習本教程。
??看此教程之前,問一個問題,你明確學系統調用的目的了嗎? 沒有的話就不要繼續了,請重新學習 羽夏看Win系統內核——系統調用篇 里面的內容。
?
???? 華麗的分割線 ????
?
??SSDT
的全稱是System Services Descriptor Table
,意為系統服務描述符表。在32位XP
中,我們可以通過ETHREAD
結構體加偏移的方式進行訪問。在內核文件中,有一個變量是導出的:KeServiceDescriptorTable
。通過它我們可以訪問SSDT
。
??我們在WinDbg
看一看SSDT
是什么樣子:
kd> dd KeServiceDescriptorTable80553fa0 80502b8c 00000000 0000011c 8050300080553fb0 00000000 00000000 00000000 0000000080553fc0 00000000 00000000 00000000 0000000080553fd0 00000000 00000000 00000000 0000000080553fe0 00002730 bf80c0b6 00000000 0000000080553ff0 bad6da80 ba0deb60 89c3e0f0 ba6bf8e880554000 00000000 00000000 00000000 0000000080554010 0ceb6c40 01d7db79 00000000 00000000
??SSDT
有四個成員,每個成員都是一張系統服務表。根據系統服務表的結構,它有四個四字節的成員,第一個是函數地址表,第二個是調用次數,第三個是函數個數,最后一個是參數個數表,我們之前用過ReadProcessMemory
做的實驗,它的服務號是0xBA
,我們做一下測試:
kd> dd 80502b8c+ba*480502e74 805aa712 805c99e0 8060ea76 8060c43c80502e84 8056f0d2 8063ab56 8061aca8 8061d33280502e94 8059b804 8059c7cc 8059c1d4 8059baee80502ea4 805bf456 80598d62 8059908e 805bf26480502eb4 806064b6 8051ee82 8061cc3e 805cbd4080502ec4 805cbc22 8061cd3a 8061ce20 8061cf4880502ed4 8059a07c 8060db50 8060db50 805c892a80502ee4 8063d80e 8060be28 80607fb8 8060882akd> uf 805aa712805aa712 6a1c push 1Ch805aa714 68d8a44d80 push offset nt!MmClaimParameterAdjustDownTime+0x90 (804da4d8)805aa719 e8f2e7f8ff call nt!_SEH_prolog (80538f10)805aa71e 64a124010000 mov eax,dword ptr fs:[00000124h]805aa724 8bf8 mov edi,eax805aa726 8a8740010000 mov al,byte ptr [edi+140h]805aa72c 8845e0 mov byte ptr [ebp-20h],al805aa72f 8b7514 mov esi,dword ptr [ebp+14h]805aa732 84c0 test al,al805aa734 7466 je nt!NtReadVirtualMemory+0x8a (805aa79c) Branchkd> db 80503000+ba805030ba 14 04 08 0c 14 08 08 0c-08 10 14 08 04 08 0c 04 ................805030ca 08 0c 0c 04 08 08 0c 0c-24 08 08 08 0c 04 08 04 ........$.......805030da 10 08 04 04 04 14 14 10-10 10 10 10 10 08 14 18 ................805030ea 04 04 10 0c 08 14 0c 0c-08 08 1c 0c 04 18 14 04 ................805030fa 10 04 04 04 08 18 08 08-08 00 10 10 04 04 08 14 ................8050310a 10 08 08 10 14 0c 04 04-24 24 18 14 00 10 0c 10 ........$$......8050311a 10 00 00 00 00 00 cc cc-cc cc cc cc cc cc 0f 57 ...............W8050312a c0 b8 40 00 00 00 0f 2b-41 00 0f 2b 41 10 0f 2b ..@....+A..+A..+
??是不是逐個對應起來了?那么我們如何在驅動程序使用呢?我們只需要在驅動程序輸入這行代碼聲明即可。
extern PKSERVICE_TABLE_DESCRIPTOR KeServiceDescriptorTable;
??注意,PKSERVICE_TABLE_DESCRIPTOR
是自己構造的系統服務表指針,結構體需要自行編寫,我們來測試一下:
#include extern ULONG KeServiceDescriptorTable; //只是為了訪問地址,就不寫那個結構體了NTSTATUS UnloadDriver(PDRIVER_OBJECT DriverObject){ DbgPrint("卸載成功!!!");}NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath){ DriverObject->DriverUnload = UnloadDriver; DbgPrint("SSDT 的地址:%X", KeServiceDescriptorTable); return STATUS_SUCCESS;}
??演示效果如下:
??如果你細心地發現,咱操作系統系統服務表不是用了兩個嗎?的確,但SSDT
并沒有導出與GUI
相關的服務表。那么如何別的方式找到呢?接下來我們來介紹SSDTShadow
。
??SSDTShadow
和SSDT
不一樣的是它并沒有從內核文件導出。不過我們還是可以從WinDbg
找到它:
kd> dd KeServiceDescriptorTableShadow80553f60 80502b8c 00000000 0000011c 8050300080553f70 bf999b80 00000000 0000029b bf99a89080553f80 00000000 00000000 00000000 0000000080553f90 00000000 00000000 00000000 0000000080553fa0 80502b8c 00000000 0000011c 8050300080553fb0 00000000 00000000 00000000 0000000080553fc0 00000000 00000000 00000000 0000000080553fd0 00000000 00000000 00000000 00000000
??它的結構和SSDT
是一模一樣的,只不過它多了一張表,就是少的那個與GUI
相關的服務表。那么我們能不能直接用驅動訪問這張表呢?答案是不行,我們用WinDbg
測試一下。
kd> dd bf999b80ReadVirtual: bf999b80 not properly sign extendedbf999b80 ???????? ???????? ???????? ????????bf999b90 ???????? ???????? ???????? ????????bf999ba0 ???????? ???????? ???????? ????????bf999bb0 ???????? ???????? ???????? ????????bf999bc0 ???????? ???????? ???????? ????????bf999bd0 ???????? ???????? ???????? ????????bf999be0 ???????? ???????? ???????? ????????bf999bf0 ???????? ???????? ???????? ????????
??嘿嘿,是不是人傻了?根本看不到,是為什么呢?根據我們學過的段頁的知識很容易地判斷出沒有掛物理頁。并不是每一個應用程序都是有GUI
,有的是后臺沒界面的。我們綁定一個GUI
進程看一看:
kd> !process 0 0**** NT ACTIVE PROCESS DUMP ****(***省略無關進程***)Failed to get VadRootPROCESS 89b28768 SessionId: 0 Cid: 06cc Peb: 7ffd9000 ParentCid: 05d8 DirBase: 157001a0 ObjectTable: e1d763f8 HandleCount: 44. Image: notepad.exekd> .process 89b28768ReadVirtual: 89b28780 not properly sign extendedImplicit process is now 89b28768WARNING: .cache forcedecodeuser is not enabledkd> dd bf999b80ReadVirtual: bf999b80 not properly sign extendedbf999b80 bf935f7e bf947b29 bf88ca52 bf93f6f0bf999b90 bf949140 bf936212 bf9362b7 bf83b4cdbf999ba0 bf948a67 bf934a17 bf94905f bf90f2f4bf999bb0 bf902318 bf809fdf bf948f31 bf94a72dbf999bc0 bf900c15 bf893b44 bf94900f bf94a860bf999bd0 bf820f34 bf8dcb55 bf87a2e4 bf8c29a0bf999be0 bf91052f bf80e2c5 bf8dc7fd bf94a525bf999bf0 bf94b430 bf813a71 bf80cf90 bf8d14e4
??是不是可以正常訪問了?我們隨便u
一個試試:
kd> u bf935f7eReadVirtual: bf935f7e not properly sign extendedbf935f7e ?? ??? ^ Memory access error in u bf935f7e
??發現不成功,并不代表每一個函數不行,我們再隨便u
一個試試:
kd> u bf949140ReadVirtual: bf949140 not properly sign extendedbf949140 6a5c push 5ChReadVirtual: bf949150 not properly sign extendedbf949142 68804599bf push offset win32k!`string+0x4dc (bf994580)ReadVirtual: bf949152 not properly sign extendedbf949147 e8bc7aebff call win32k!_SEH_prolog (bf800c08)bf94914c 33db xor ebx,ebxbf94914e 43 inc ebxbf94914f 33f6 xor esi,esibf949151 8975e4 mov dword ptr [ebp-1Ch],esibf949154 39750c cmp dword ptr [ebp+0Ch],esi
??SSDTShadow
就介紹到這里了,感興趣地自行繼續研究。
本節的答案將會在下一節的正文給出,務必把本節練習做完后看下一個講解內容。不要偷懶,實驗是學習本教程的捷徑。
??俗話說得好,光說不練假把式,如下是本節相關的練習。如果練習沒做好,就不要看下一節教程了,越到后面,不做練習的話容易夾生了,開始還明白,后來就真的一點都不明白了。本節練習只有一個,請保質保量的完成。
1?? 寫代碼保護指定進程(比如記事本),防止別人關閉它,而自己關閉正常退出。
??系統調用篇——總結與提升
本文來自博客園,作者:寂靜的羽夏,一個熱愛計算機技術的菜鳥,轉載請注明原文鏈接:https://www.cnblogs.com/wingsummer/p/15563970.html
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/123649.html
摘要:今天小編就來分享一份華為剛剛首發的響應式微服務實戰這份主要包含響應式微服務架構實現過程中所應具備的技術體系和工程實踐,在組織結構上分如下篇。 今天小編就來分享一份華為剛剛首發的Spring響應式微服務(Spring Boot 2+Spring 5+Spring Cloud實戰)! 這份PDF...
摘要:源碼分析開門篇生命周期入口文件用戶發起的請求都會經過應用的入口文件,通常是文件。注冊錯誤和異常機制執行注冊錯誤和異常處理機制。由三部分組成應用關閉方法錯誤處理方法異常處理方法注冊應用關閉方法是為了便于攔截一些系統錯誤。 源碼分析—開門篇 thinkphp生命周期 1、入口文件 用戶發起的請求都會經過應用的入口文件,通常是 ==public/index.php==文件。當然,你也可以更改...
閱讀 713·2023-04-25 19:43
閱讀 3910·2021-11-30 14:52
閱讀 3784·2021-11-30 14:52
閱讀 3852·2021-11-29 11:00
閱讀 3783·2021-11-29 11:00
閱讀 3869·2021-11-29 11:00
閱讀 3557·2021-11-29 11:00
閱讀 6105·2021-11-29 11:00