青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運轉,開心的工作
簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

淺析本機API

Posted on 2009-10-24 22:24 S.l.e!ep.¢% 閱讀(207) 評論(0)  編輯 收藏 引用 所屬分類: RootKit
創建時間:2005-03-09
文章屬性:轉載
文章提交:cisocker (cisocker_at_163.com)

by sunwear [E.S.T]??
2004/10/02??
shellcoder@163.com

此文只能說是一篇筆記,是關于本機API的.本機API是除了Win32 API,NT平臺開放了另一個基本接口。本機API也被很多人所熟悉,因為內核模式模塊位于更低的系統級別,在那個級別上環境子系統是不可見的。盡管如此,并不需要驅動級別去訪問這個接口,普通的Win32程序可以在任何時候向下調用本機API。并沒有任何技術上的限制,只不過微軟不支持這種應用開發方法。??
????User32.dll,kernel32.dll,shell32.dll,gdi32.dll,rpcrt4.dll,comctl32.dll,advapi32.dll,version.dll等dll代表了Win32 API的基本提供者。Win32 API中的所有調用最終都轉向了ntdll.dll,再由它轉發至ntoskrnl.exe。ntdll.dll是本機 API用戶模式的終端。真正的接口在ntoskrnl.exe里完成。事實上,內核模式的驅動大部分時間調用這個模塊,如果它們請求系統服務。Ntdll.dll的主要作用就是讓內核函數的特定子集可以被用戶模式下運行的程序調用。Ntdll.dll通過軟件中斷int 2Eh進入ntoskrnl.exe,就是通過中斷門切換CPU特權級。比如kernel32.dll導出的函數DeviceIoControl()實際上調用ntdll.dll中導出的NtDeviceIoControlFile(),反匯編一下這個函數可以看到,EAX載入magic數0x38,實際上是系統調用號,然后EDX指向堆棧。目標地址是當前堆棧指針ESP+4,所以EDX指向返回地址后面一個,也就是指向在進入NtDeviceIoControlFile()之前存入堆棧的東西。事實上就是函數的參數。下一個指令是int 2Eh,轉到中斷描述符表IDT位置0x2E處的中斷處理程序。

反編匯這個函數得到:

mov eax, 38h

lea edx, [esp+4]

int 2Eh

ret 28h

當然int 2E接口不僅僅是簡單的API調用調度員,他是從用戶模式進入內核模式的main gate。

W2k Native API由248個這么處理的函數組成,比NT 4.0多了37個。可以從ntdll.dll的導出列表中很容易認出來:前綴Nt。Ntdll.dll中導出了249個,原因在于NtCurrentTeb()為一個純用戶模式函數,所以不需要傳給內核。令人驚奇的是,僅僅Native API的一個子集能夠從內核模式調用。而另一方面,ntoskrnl.exe導出了兩個Nt*符號,它們不存在于ntdll.dll中: NtBuildNumber, NtGlobalFlag。它們不指向函數,事實上,是指向ntoskrnl.exe的變量,可以被使用C編譯器extern關鍵字的驅動模塊導入。Ntdll.dll和ntoskrnl.exe中都有兩種前綴Nt*,Zw*。事實上ntdll.dll中反匯編結果兩者是一樣的。而在ntoskrnl.exe中,nt前綴指向真正的代碼,而zw還是一個int 2Eh的stub。也就是說zw*函數集通過用戶模式到內核模式門傳遞的,而Nt*符號直接指向模式切換以后的代碼。Ntdll.dll中的NtCurrentTeb()沒有相對應的zw函數。Ntoskrnl并不導出配對的Nt/zw函數。有些函數只以一種方式出現。

2Eh中斷處理程序把EAX里的值作為查找表中的索引,去找到最終的目標函數。這個表就是系統服務表SST,C的結構SYSTEM_SERVICE_TABLE的定義如下:清單也包含了結構SERVICE_DESCRIPTOR_TABLE中的定義,為SST數組第四個成員,前兩個有著特別的用途。

typedef NTSTATUS (NTAPI *NTPROC) ( ) ;

typedef NTPROC *PNTPROC;

#define NTPROC_ sizeof (NTPROC)

typedef struct _SYSTEM_SERVICE_TABLE

{ PNTPROC ServiceTable; // 這里是入口指針數組

PDWORD CounterTable; // 此處是調用次數計數數組

DWORD ServiceLimit ; // 服務入口的個數

PBYTE ArgumentTable; // 服務參數字節數的數組

) SYSTEM_SERVICE_TABLE ,

* PSYSTEM_SERVICE_TABLE ,

* * PPSYSTEM_SERVICE_TABLE ;

/ / _ _ _ _ _ _ _ _ _ _ _ _

typedef struct _SERVICE_DESCRIPTOR_TABLE

{ SYSTEM_SERVICE_TABLE ntoskrnl ; // ntoskrnl所實現的系統服務,本機的API}

SYSTEM_SERVICE_TABLE win32k; // win32k所實現的系統服務

SYSTEM_SERVICE_TABLE Table3; // 未使用

SYSTEM_SERVICE_TABLE Table4; // 未使用

} SERVICE_DESCRIPTOR_TABLE ,

* PSERVICE_DESCRIPTOR_TABLE,

* PPSERVICE_DESCRIPTOR_TABLE ;

ntoskrnl通過KeServiceDescriptorTable符號,導出了主要SDT的一個指針。內核維護另外的一個SDT,就是KeServiceDescriptorTableShadow。但這個符號沒有導出。要想在內核模式組件中存取主要SDT很簡單,只需兩行C語言的代碼:

extern PSERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTable;

PSERVICE_DESCRIPTOR_TABLE psdt= KeServiceDescriptorTable;

NTPROC為本機 API的方便的占位符,他類似于Win32編程中的PROC。Native API正常的返回應該是一個NTSTATUS代碼,他使用NTAPI調用約定,它和_stdcall一樣。ServiceLimit成員有在ServiceTable數組里找到的入口數目。在2000下,默認值是248。ArgumentTable為BYTEs的數組,每一個對應于ServiceTable的位置并顯示了在調用者堆棧里的參數比特數。這個信息與EDX結合,這是內核從調用者堆棧copy參數到自己的堆棧所需的。CounterTable成員在free buid的2000中并沒有使用到,在debug build中,這個成員指向代表所有函數使用計數的DWORDS數組,這個信息能用于性能分析。
????可以使用這個命令來顯示:dd KeServiceDescriptorTable,調試器把此符號解析為0x8046e0c0。只有前四行是最重要的,對應那四個SDT成員。
????運行這個命令:ln 8046e100,顯示符號是KeServiceDescriptorTableShadow,說明第五個開始確實為內核維護的第二個SDT。主要的區別在于后一個包含了win32k.sys的入口,前一個卻沒有。在這兩個表中,Table3與Table4都是空的。Ntoskrnl.exe提供了一個方便的API函數。這個函數的名字為:

????KeAddSystemServiceTable
此函數去填充這些位置。

2Eh的中斷處理標記是KisystemService()。這也是ntoskrnl.exe沒有導出的內部的符號,但包含在2k符號文件中。關于KisystemService的操作如下:

1 從當前的線程控制塊檢索SDT指針

2 決定使用SDT中4個SST的其中一個。通過測試EAX中遞送ID的第12和13位來決定。ID在0x0000-0x0fff的映射至ntoskrnl表格,ID在

0x1000與0x1ffff的分配給win32k表格。剩下的0x2000-0x2ffff與

0x3000-0x3ffff則是Table3和Table4保留。

3 通過選定SST中的ServiceLimit成員檢查EAX的0-11位。如果ID超過了范圍,返回錯誤代碼為STATUS_INVALID_SYSTEM_SERVICE。

4 檢查EAX中的參數堆棧指針與MmUserProbeAddress。這是一個ntoskrnl導出的全局變量。通常等于0x7FFF0000,如果參數指針不在這個地址之下,返回STATUS_ACCESS_VIOLATION。

5 查找ArgumentTable中的參數堆棧的字節數,從調用者的堆棧copy所有的參數至當前內核模式堆棧。

6 搜索serviceTable中的服務函數指針,并調用這個函數。

7 控制轉到內部的函數KiserviceExit,在此次服務調用返回之后。

從對SDT的討論可以看到與本機API一起還有第二個內核模式接口。這個接口把Win32子系統的圖形設備接口和窗口管理器和內核模式組件Win32k連接起來。Win32k接口一樣是基于int 2eh。本機API的服務號是從0x0000到0x0fff,win32k的服務號是從0x1000到0x1fff。(ddW32pServiceTable認定win32k.sys的符號可用。)win32k總共包含639個系統服務。


2Eh的處理過程沒有使用全局SDT KeServiceDescriptorTable。

而是一個與線程相關的指針。顯然,線程可以有不同得SDT相關到自身。線程初試化的時候,KeInitializeThread()把KeServiceDescriptorTable寫到線程的控制塊。盡管這樣,這個默認設置之后可能被改變為其它值,例如KeServiceDescriptorTableShadow。


Windows 2000運行時庫

Ntdll.dll至少導出了不少于1179個符號。其中的249/248是屬于Nt*/zw*集合。所以還有682個函數不是通過int 2eh門中轉。很顯然,這么多的函數不依靠2k的內核。

其中一些是和c運行時庫幾乎一樣的函數。其實ntoskrnl也實現了一些類似C運行時庫的一些函數。可以通過ddk里的ntdll.lib來鏈接和使用這些函數。反匯編ntdll.dll與ntoskrnl.exe的C運行時函數能發現,ntdll.dll并不是依賴ntoskrnl.exe。這兩個模塊各自實現了這些函數。

除了C運行時庫外,2000還提供了一個擴展的運行時函數集合。再一次,ntdll.dll與ntoskrnl.exe各自實現了它們。同樣,實現集合有重復,但是并不完全匹配。這個集合的函數都是以Rtl開頭的。2000運行時庫包括一些輔助函數用于C運行時候無法完成的任務。例如有些處理安全事務,另外的操縱2000專用的數據結構,還有些支持內存管理。微軟僅僅在DDK中記錄了很有用的406個函數中的115個函數。

Ntdll.dll還提供了另外一個函數集合,以__e前綴開頭。實際上它們用于浮點數模擬器。

還有很多的函數集合,所有這些函數的前綴如下:

__e(浮點模擬),Cc(Cache管理),Csr(c/s運行時庫),Dbg(調試支持),Ex(執行支持),FsRtl(文件系統運行時),Hal(硬件抽象層),Inbv(系統初試化/vga啟動驅動程序bootvid.dll),Init(系統初試化),Interlocked(線程安全變量操作),Io(IO管理器),Kd(內核調試器支持),Ke(內核例程),Ki(內核中斷處理),Ldr(映象裝載器),Lpc(本地過程調用),Lsa(本地安全授權),Mm(內存管理),Nls(國際化語言支持),Nt(NT本機API),Ob(對象管理器),Pfx(前綴處理),Po(電源管理),Ps(進程支持),READ_REGISTER_(從寄存器地址讀),Rtl(2k運行時庫),Se(安全處理),WRITE_REGISTER_(寫寄存器地址),Zw(本機API的替換叫法),<其它>(輔助函數和C運行時庫)。

當編寫從用戶模式通過ntdll.dll或內核模式通過ntoskrnl.exe和2000內核交互的軟件的時候,需要處理很多基本的數據結構,這些結構在Win32世界中很少見到。

常用數據結構

l???? 整數

ANSI字符是有符號的,而Unicode WCHAR是無符號的

MASM的TBYTE是80位的浮點數,用于高精度浮點運算單元操作,注意它與Win32的TBYTE(text byte)完全不同。

TABLE 2-3. Equivalent Integral Data Types

BITS????MASM?? FUNDAMENTAL????ALIAS #1????ALIAS #2??SIGNED

8?????? BYTE????unsigned char??UCHAR???????????????? CHAR
16??????WORD????unsigned short USHORT???? WCHAR??????SHORT

32??????DWORD?? unsigned long??ULONG???????????????? LONG

32??????DWORD?? unsigned int????UINT???????????????? INT

64??????QWORD?? unsigned _int64 ULONGLONG DWORDLONG LONGLONG

80??????TBYTE????N/A

typedef union _LARGE_INTEGER

{??struct{

ULONG LowPart;

LONG HighPart;};

LONGLONG QuadPart;

}

LARGE_INTEGER , * PULARGE_INTEGER ;

typedef union _ULARGE_INTEGER{

struct{

ULONG LowPart;

ULONG HighPart;}

ULONGLONG QuadPart;

}ULARGE_INTEGER, *PULARGE_INTEGER;

l???? 字符

????Win32編程中PSTR用戶CHAR*,PWSTR用于WCHAR*。取決于是否定義了UNICODE,PTSTR解釋為PSTR或者PWSTR。在2k內核模式下,常用的數據類型是UNICODE_STRING,而STRING用來表示ANSI字符串:

typedef struct _UNICODE_STRING{

USHORT Length; //當前字節長度,不是字符!!!

USHORT MaximumLength; //Buffer的最大字節長度

PWSTR Buffer;}UNICODE_STRING , * PUNICODE_STRING ;

typedef struct _STRING{

USHORT Length;

USHORT MaximumLength;

PCHAR Buffer;}STRING, *PSTRING;

typedef STRING ANSI_STRING, *PANSI_STRING;

typedef STRING OEM_STRING, *POEM_STRING;

??操縱函數:RtlCreatUnicodeString(),RtlInitUnicodeString(),

RtlCopyUnicodeString()等等

l???? 結構

許多內核API函數需要一個固定大小的OBJECT_ATTRIBUTES結構,比如NtOpenFile()。對象的屬性是OBJ_*值的組合,可以從ntdef.h中查到。

IO_STATUS_BLOCK結構提供了所請求操作結果的信息,很簡單,status成員包含一個NTSTATUS代碼, 如果操作成功 information成員提供特定請求的信息。

還有一個結構是LIST_ENTRY,這是一個雙向環鏈表。

typedef struct _OBJECT_ATTRIBUTES

{

ULONG Length;

HANDLE RootDirectory;

PUNICODE_STRING ObjectName;

ULONG Attributes;

PVOID SecurityDescriptor;

PVOID SecurityQualityOfService;

} OBJECT_ATTRIBDTES, *POBJECT_ ATTRIBUTES;

typedef struct _IO_STATUS_BLOCK

{

NTSTATDS Status;

ULONG Information;

}IO_STATUS_BLOCK , * PIO_STATUS_BLOCK ;

typedef struct _LIST_ENTRY

{

Struct _LIST_ENTRY *Flink;

Struct _LIST_ENTRY *Blink;

}LIST_ENTRY, *PLIST_ENTRY;

雙向鏈表的典型例子就是進程和線程鏈。內部變量PsActiveProcessHead是一個LIST_ENTRY結構,在ntoskrnl.exe的數據段中,指定了系統進程列表的第一個成員。

CLIENT_ID結構由進程和線程ID組成。

typedef struct _CLIENT_ID

{ HANDLE UniqueProcess;

HANDLE UniqueThread;

)CLIENT_ID, *PCLIENT_ID;

想要從用戶模式調用ntdll.dll中的API函數,必須考慮到以下四點:

1 SDK頭文件沒有包括這些函數的原型

2 這些函數使用的若干基本數據類型沒有包括在SDK文件中

3 SDK和DDK頭文件不兼容,不能在win32的c源文件包含ntddk.h中

4 ntdll.lib沒有包括在VC的默認導入庫列表中。

第4個很容易解決:#progma comment(linker,“/defaultlib:ntdll.lib”)

缺失的定義比較難解決,最簡單的方法是寫一個自定義的頭文件,剛剛包含需要調用ntdll.dll中函數的定義。幸運的是,已經在光盤的w2k_def.h文件中做了這個工作。因為這個頭文件將用于用戶模式和內核模式程序,所以必須在用戶模式代碼中,#include<w2k_def.h>之前#define _USER_MODE_,使得DDK中出現而SDK中沒有的定義可用。


本文部分翻譯于一篇電子書<win api about>.也感謝朋友GameHunter這位英語極好的朋友幫忙.與Free的指導
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美va天堂va视频va在线| 国产精品视频xxxx| 亚洲精品一线二线三线无人区| 欧美成人影音| 亚洲国产二区| 亚洲国产毛片完整版| 牛人盗摄一区二区三区视频| 亚洲第一页在线| 91久久久久| 99热免费精品| 亚洲制服欧美中文字幕中文字幕| 性色av一区二区三区在线观看| 久久精品女人天堂| 欧美激情视频一区二区三区免费| 亚洲精品久久久一区二区三区| 亚洲最新在线| 欧美有码视频| 欧美日韩大片| 国产一区清纯| 日韩一区二区精品葵司在线| 午夜一区在线| 亚洲国产精品高清久久久| 亚洲一区二区3| 模特精品在线| 国产亚洲毛片在线| 99视频在线精品国自产拍免费观看| 午夜免费电影一区在线观看| 亚洲第一精品久久忘忧草社区| 亚洲午夜国产成人av电影男同| 久久网站免费| 国产精品一二一区| 亚洲精品免费一二三区| 久久99在线观看| 日韩视频在线观看国产| 久久久国产一区二区| 欧美午夜在线观看| 91久久在线播放| 久久免费黄色| 亚洲欧美伊人| 国产精品久久久久久久久久免费| 在线免费高清一区二区三区| 欧美一区二区三区在线视频| 99视频在线精品国自产拍免费观看| 久久久中精品2020中文| 国产女精品视频网站免费| 一本色道久久加勒比88综合| 鲁大师影院一区二区三区| 午夜精品久久久久久久| 国产精品国产三级国产专播品爱网 | 欧美国产视频日韩| 性欧美videos另类喷潮| 欧美日一区二区三区在线观看国产免| 亚洲第一狼人社区| 久久久久88色偷偷免费| 亚洲男女自偷自拍| 国产精品久久久久久五月尺| 中文欧美在线视频| 亚洲精品日本| 久久久久久久999| 国产九区一区在线| 一本色道久久综合亚洲精品不卡| 久久精品九九| 欧美亚洲三级| 国产精品视区| 午夜亚洲视频| 午夜伦理片一区| 国产欧美日韩在线| 欧美制服第一页| 欧美一区二区三区的| 国产一区二区三区四区在线观看| 久久精品国内一区二区三区| 欧美影视一区| 亚洲国产精品第一区二区三区| 欧美黄污视频| 欧美日韩大陆在线| 午夜在线视频观看日韩17c| 亚洲一区日韩在线| 国产欧美日韩专区发布| 久久久精品一区| 麻豆久久久9性大片| 亚洲老司机av| 亚洲深爱激情| 激情欧美一区二区| 亚洲国内高清视频| 国产精品日本| 免费美女久久99| 欧美激情自拍| 小黄鸭精品密入口导航| 久久久精品免费视频| 亚洲欧洲午夜| 亚洲欧美日韩一区二区| 亚洲成人在线网站| 99国内精品久久久久久久软件| 国产精品夜色7777狼人| 欧美1区2区视频| 国产精品国产自产拍高清av| 久久在线视频在线| 欧美四级在线观看| 欧美成人资源| 国产日韩三区| 亚洲级视频在线观看免费1级| 国产精品久久久久久久久久妞妞| 免费在线亚洲欧美| 国产精品超碰97尤物18| 免费亚洲一区二区| 国产精品高潮粉嫩av| 欧美国产日韩一区二区| 国产欧美日韩视频一区二区| 最近中文字幕日韩精品| 在线成人av| 性做久久久久久免费观看欧美| 日韩一本二本av| 久久亚洲色图| 久久色在线播放| 欧美系列电影免费观看| 欧美二区在线| 国产一区二区中文| 亚洲一二三四区| 亚洲一区二区三区在线播放| 久久久一区二区三区| 久久国产精品一区二区三区| 欧美日韩三级一区二区| 性欧美激情精品| 亚洲欧美日韩国产一区| 久久久久综合一区二区三区| 亚洲性视频h| 欧美日本国产在线| 亚洲黄色在线观看| 亚洲欧洲精品一区二区三区不卡| 欧美在线播放视频| 欧美一区中文字幕| 国产精品一区免费在线观看| 国产精品99久久久久久久久| 亚洲深夜影院| 欧美午夜久久| 一区二区三区四区五区精品| 亚洲网站在线| 国产精品久久久久久久一区探花| 一区二区日韩伦理片| 国产精品99久久久久久www| 欧美精品电影在线| 日韩网站在线观看| 亚洲永久字幕| 国产麻豆精品久久一二三| 亚洲在线黄色| 久久久另类综合| 亚洲第一在线综合网站| 老司机精品久久| 亚洲电影激情视频网站| 日韩视频精品在线观看| 欧美日韩999| 亚洲一区三区视频在线观看| 久久成人免费| 亚洲国内精品在线| 欧美成人xxx| 一本色道久久综合亚洲精品高清| 亚洲自拍偷拍福利| 国产一区二区三区免费观看| 久久九九久久九九| 亚洲第一福利视频| 亚洲新中文字幕| 国产欧美日韩亚洲精品| 久久精品在线观看| 亚洲人被黑人高潮完整版| 亚洲曰本av电影| 国外成人在线| 欧美aaaaaaaa牛牛影院| 亚洲九九精品| 久久久精品一区二区三区| 亚洲人成亚洲人成在线观看| 国产精品久久久久久超碰| 久久精品国产一区二区三区免费看 | 欧美韩日一区二区| 99re视频这里只有精品| 久久成人精品电影| 亚洲人成绝费网站色www| 国产精品啊啊啊| 美女主播视频一区| 亚洲一区二区三区中文字幕在线| 久久综合久久综合久久| 亚洲视频在线免费观看| 一区二区三区自拍| 欧美日韩精品欧美日韩精品一| 欧美一二三区在线观看| 亚洲三级视频在线观看| 久久五月激情| 亚洲在线播放| 亚洲精品一区二区网址| 国内成+人亚洲+欧美+综合在线| 午夜在线成人av| 欧美国产激情| 欧美在线一级视频| 一区二区高清在线| 牛人盗摄一区二区三区视频| 午夜免费久久久久| 一片黄亚洲嫩模| 亚洲区国产区| 伊人成人在线视频| 国产日韩欧美黄色| 国产精品你懂的在线|