記錄一下自己學習windows系統呼叫機制的過程。
當呼叫乙個windows api時,系統會由使用者態切入到核心態,從ring3進入到ring0層。下面結合乙個例子來學習一下具體過程。
這是乙個demo程式,只呼叫了createfile,我們用ollydbg看一下,它的具體流程是怎樣的。
#include "pch.h"
#include #include #include int main()
for (int i = 0; i < 4; i++)
getchar();
getchar();
}
1. 在exe 中 呼叫 kernel32.readprocessmemroy函式
發現什麼也沒有做,就呼叫了kernel32中的readprocessmemory
2. 在kernel32 中 呼叫ntdll.zwreadvirtualmemroy函式
我們發現還是什麼也沒有做,繼續向下跟。
3.在ntdll中
我們發現,函式小的驚人,僅僅只是向eax中賦值了乙個常量,向edx賦值了乙個函式指標,然後就call了kifastsystemcall。
這個常量就是函式在ssdt表中的索引,kifastsystemcall就是從ring3進入ring0的關鍵。
我們來分析一下 0x7ffe0300這個位址
在windows中有這樣乙個結構體
該結構體看名字可知是用於核心層與使用者層來共享資料所使用的結構體。
kd > dt _kuser_shared_data
ntdll!_kuser_shared_data
+ 0x000 tickcountlowdeprecated : uint4b
+ 0x004 tickcountmultiplier : uint4b
+ 0x008 interrupttime : _ksystem_time
+ 0x014 systemtime : _ksystem_time
+ 0x020 timezonebias : _ksystem_time
+ 0x02c imagenumberlow : uint2b
+ 0x02e imagenumberhigh : uint2b
·······
1)在user層和kernel層分別定義了乙個_kuser_shared_data結構區域,用於user層和kernel層共享某些資料。
2)它們使用同一段頁,只是對映位置不同。雖然同一頁,但user唯讀,kernnel層可寫。
3)它們使用固定的位址值對映,_kuser_shared_data結構在user為:0x7ffe0000,在kernel層為:0xffdf0000。
1: kd> dd 0x7ffe0000
7ffe0000 00000000 0f99a027 20357ab3 00000009
7ffe0010 00000009 88aa9d60 01d62a9e 01d62a9e
7ffe0020 f1dcc000 ffffffbc ffffffbc 014c014c
7ffe0030 003a0043 0057005c 006e0069 006f0064
7ffe0040 00730077 00000000 00000000 00000000
7ffe0050 00000000 00000000 00000000 00000000
7ffe0060 00000000 00000000 00000000 00000000
7ffe0070 00000000 00000000 00000000 00000000
1: kd> dd 0xffdf0000
ffdf0000 00000000 0f99a027 20357ab3 00000009
ffdf0010 00000009 88aa9d60 01d62a9e 01d62a9e
ffdf0020 f1dcc000 ffffffbc ffffffbc 014c014c
ffdf0030 003a0043 0057005c 006e0069 006f0064
ffdf0040 00730077 00000000 00000000 00000000
ffdf0050 00000000 00000000 00000000 00000000
ffdf0060 00000000 00000000 00000000 00000000
ffdf0070 00000000 00000000 00000000 00000000
通過windbg我們可以觀察到這兩塊位址的內容完全相同。這個結構
1)_kuser_shared_data 在使用者層的位置為 0x7ffe0000,該位址為其+0x300位置
+0x300 systemcall : uint4b
2)該成員儲存著系統呼叫的函式入口,如果當前cpu支援快速呼叫。
則儲存著ntdll.dll!kifastsystemcall()函式位址;
如果不支援快速呼叫,則儲存著ntdll.dll!kiintsystemcall()函式位址
呼叫了kifastsystemcall後系統進入核心態,至此我們已經從ring3進入到ring0。但是還有乙個問題,那就是之前傳進來的只有乙個常量0x155,那麼是怎麼實現函式的準確呼叫的呢?這就需要到用到ssdt表的知識。下一節講解。
呼叫Windows系統功能
彈出對話方塊 首先呼叫windows.h這個標頭檔案 include 接下來我們呼叫 messagebox messagebox 0,你好,helloworld 0 第乙個引數設定為0,第乙個引數是依賴的視窗的編號,相當於誰彈出的視窗,0為系統彈出,第二個引數是對話方塊的內容,第三個引數是對話方塊的...
系統呼叫的工作機制
談起系統呼叫,不得不提一下linux下對檔案操作的兩種方式 系統呼叫 system call 和庫函式呼叫 library functions 系統呼叫實際上就是指最底層的乙個呼叫,在linux程式設計裡面就是底層呼叫的意思,面向的是硬體。而庫函式呼叫則面向的是應用開發的,相當於應用程式的api,採...
Runtime類呼叫Windows系統cmd命令
public class backupdb catch ioexception e public void backsafelog catch ioexception e runtime 類還有很多應用。如效能監控,你可以很方便地看見當前的記憶體情況long freememory runtime.g...