闲来无事,用IDA, windbg, OD分析kernel32.dll函数调用流程笔记
1.先用分析 CreateFileW,CreateFileA 函数:
CreateFileA流程:
kernel32.dll!CreateFileA 流程
kernel32.dll!Basep8BitStringToDynamicUnicodeString
kernel32.dll!CreateFileWImplementation ; 实际就是导出表 CreateFil 地址
kernel32.dll!RtlFreeUnicodeString
kernel32.dll!CreateFileWImplementation 流程
ds:RtlInitUnicodeStringEx
BaseIsThisAConsoleName
API-MS-Win-Core-File-L1-1-0.CreateFileW ; 实际就是导入表 CreateFileW 地址
API-MS-Win-Core-File-L1-1-0.CreateFileW 流程
ntdll.dll!zwCreateFile
ntdll.dll!KiFastSystemCall
sysenter ;sysenter指令切入内核
1. 调用 CreateFileA后 会转换成UNICODE版本, 然后直接调用CreateFileW (CreateFileW的导出表地址)
2. 然后在调用 CreateFileW(CreateFileW的导入表地址, API-MS-Win-Core-File-L1-1.dll个人理解为转换层)
3. 导入表CreateFileW才是函数的实现, 继续调用
a. ntdll.dll!zwCreateFile
b. ntdll.dll!KiFastSystemCall sysenter
c. sysenter指令切入内核
....................
内核函数调用
....................
......................
省略xxxxxxxxx
CreateFileW流程:
kernel32.dll!CreateFileWImplementation ; 实际就是导出表 CreateFil 地址
kernel32.dll!CreateFileWImplementation
ds:RtlInitUnicodeStringEx
BaseIsThisAConsoleName
API-MS-Win-Core-File-L1-1-0.CreateFileW ; 实际就是导入表 CreateFileW 地址
API-MS-Win-Core-File-L1-1-0.CreateFileW
ntdll.dll!zwCreateFile
ntdll.dll!KiFastSystemCall
sysenter ;sysenter指令切入内核
总结一下,API调用过程
1. 如果API为A版本. 先转换为W版本, W版本不用转换
2. 通过 导出表的相应API地址 调用API, 经过若干个初始化功能函数调用
3. 通过 导入表的相应API地址 在调用API, 经过ntdll.dll!zwAPI 到ntdll.dll!ntAPI 的若干个调用后, 通过汇编指令
sysenter切入内核
4. 内核函数调用, 省略xxxxxxxxx