kernel32.dll!API调用流程分析

用IDA, OD分析kernel32.dll的API调用流程,知其所以然。


1.用CreateFileW,CreateFileA函数来分析


CreateFileA 整个流程:

kernel32.dll!CreateFileA流程
kernel32.dll!Basep8BitStringToDynamicUnicodeString
kernel32.dll!CreateFileWImplementation ; 实际就是 kernel32.dll导出表 CreateFil 地址
kernel32.dll!RtlFreeUnicodeString


每个流程的包含流程:
A. kernel32.dll!CreateFileWImplementation流程
ds:RtlInitUnicodeStringEx
BaseIsThisAConsoleName
API-MS-Win-Core-File-L1-1-0.CreateFileW ; 实际就是 kernel32.dll导入表 CreateFileW 地址


B. API-MS-Win-Core-File-L1-1-0.CreateFileW流程
ntdll.SbSelectProcedure
ntdll.dll!zwCreateFile
调用完成, CreateFileA返回.....

C. ntdll.dll!zwCreateFile流程
ntdll.dll!ntCreateFile
ntdll.dll!KiFastSystemCall
sysenter ;sysenter指令切入内核

 /*-------------------------------------------------------------------------------------------------*/

CreateFileW整个流程:
kernel32.dll!CreateFileWImplementation ; 实际就是 kernel32.dll导出表 CreateFil 地址

 /*----------------------------------------------------------------------------------------------------------*/

流程描述:
1. 调用 CreateFileA后 会转换成UNICODE版本, 然后直接调用CreateFileW(就是导出表的CreateFileW地址)
2. 然后在调用 CreateFileW(就是导入表CreateFileW地址, API-MS-Win-Core-File-L1-1.dll理解为转换调用下)
3. 导入表的CreateFileW才是函数的实现, 继续调用a,b,c

a. xxx初始api, ntdll.dll!zwCreateFile, ntdll.dll!ntCreateFile
b. ntdll.dll!KiFastSystemCall
c. sysenter指令切入内核
....................
内核函数调用
....................
......................
省略xxxxxxxxx

 


总结一下心得:
1. 如果API为A版本. 先转换为W版本, W版本不用转换, CreateFileA和CreateFileW的流程都一样, 前者比后者多了一个unicode转换。
2. 通过 导出表的相应API地址 调用API, 经过若干个初始化功能函数调用
3. 通过 导入表的相应API地址 在调用API, 经过ntdll.dll!zwAPI 到ntdll.dll!ntAPI 的若干个调用后, 通过汇编指令
sysenter切入内核
4. 内核函数调用, 省略xxxxxxxxx

posted @ 2016-04-19 16:16  鑫鑫1  阅读(3449)  评论(0编辑  收藏  举报