win7 到 win10 用户层API调用变化

自己的笔记,不一定正确,切勿照搬

从win7到win10,很多KERNEL32中的函数都搬家到了KERNELBASE中,比如CreateProcess之类的,而Kernel32中则只留下了一个存根函数CreateProcessWStub,上windbg附加另一个windbg,下断 bp kernel32!createprocesswstub果然断下了,kn回溯看到如下:

dbgeng!DebugCreate-->kernel32!CreateProcessWStub-->kernelbase!CreateProcessW


(这就是以前的CreateProcessW)

反汇编一下 kernel32!createprocesswstub:

KERNEL32!CreateProcessWStub:
00007ffe`8ff53b00 4c8bdc          mov     r11,rsp<span style="white-space:pre">			</span>
00007ffe`8ff53b03 4883ec58        sub     rsp,58h<span style="white-space:pre">			</span>//局部变量占用58h字节
00007ffe`8ff53b07 488b8424a8000000 mov     rax,qword ptr [rsp+0A8h]<span style="white-space:pre">	</span>//复制参数作为下个函数的参数
00007ffe`8ff53b0f 498943f0        mov     qword ptr [r11-10h],rax
00007ffe`8ff53b13 488b8424a0000000 mov     rax,qword ptr [rsp+0A0h]
00007ffe`8ff53b1b 498943e8        mov     qword ptr [r11-18h],rax
00007ffe`8ff53b1f 488b842498000000 mov     rax,qword ptr [rsp+98h]
00007ffe`8ff53b27 498943e0        mov     qword ptr [r11-20h],rax
00007ffe`8ff53b2b 488b842490000000 mov     rax,qword ptr [rsp+90h]
00007ffe`8ff53b33 498943d8        mov     qword ptr [r11-28h],rax
00007ffe`8ff53b37 8b842488000000  mov     eax,dword ptr [rsp+88h]
00007ffe`8ff53b3e 89442428        mov     dword ptr [rsp+28h],eax
00007ffe`8ff53b42 8b842480000000  mov     eax,dword ptr [rsp+80h]
00007ffe`8ff53b49 89442420        mov     dword ptr [rsp+20h],eax
00007ffe`8ff53b4d ff152d260500    call    qword ptr [KERNEL32!_imp_CreateProcessW (00007ffe`8ffa6180)]
00007ffe`8ff53b53 4883c458        add     rsp,58h
00007ffe`8ff53b57 c3              ret


反正就是对参数做了些处理然后就调用KernelBase!CreateProcessW了,你说没看到? 这里的KERNEL32!_imp_CreateProcessW就是

0:004>dq 7ffe8ffa6180
00007ffe`8ffa6180  00007ffe`8dcbc960 00007ffe`8dce7950

0:004>uf 00007ffe`8dcbc960
KERNELBASE!CreateProcessW:

对,就是输入表里指向的KernelBase!CreateProcessW!

然后它又调用了KERNELBASE!CreateProcessInternalW,而且是原封不动地调用,自己什么都没做

就不贴代码了,太长,期间两个重要的函数贴出来


DbgUiConnectToDbg DbgUiGetThreadDebugObject
</pre>最后处理完后调用了ntdll!NtCreateUserProcess:<p></p><p>代码:</p><pre name="code" class="plain">00007ffe`90c86520 4c8bd1          mov     r10,rcx
00007ffe`90c86523 b8bb000000      mov     eax,0BBh
00007ffe`90c86528 f604250803fe7f01 test    byte ptr [SharedUserData+0x308 (00000000`7ffe0308)],1
00007ffe`90c86530 7503            jne     ntdll!NtCreateUserProcess+0x15 (00007ffe`90c86535)
00007ffe`90c86532 0f05            syscall
00007ffe`90c86534 c3              ret
00007ffe`90c86535 cd2e            int     2Eh
00007ffe`90c86537 c3              ret

这个简单了,因为参数都已经布置好了,eax中放入服务号,如果支持快速系统服务就syscall否则int 2e,剩下的就是内核的事情了。

总结一下,KERNELBASE!CreateProcessInternalW做了几乎所有的用户层工作,ntdll!NtCreateUserProcess负责把调用传进内核,KERNELBASE!CreateProcessW和KERNEL32!CreateProcessWStub完全就是路过,啥都不做,只是传递了一下参数。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: api-ms-win-core-libraryloader是Windows 7操作系统中的一个动态链接库(DLL)文件,它提供了关于加载和卸载动态链接库的功能。 在Windows 7中,通过使用api-ms-win-core-libraryloader可以方便地加载和卸载动态链接库,以便在应用程序中使用其中的函数和变量。这个库提供了一组函数,用于加载动态链接库并获取其中导出的函数的指针。通过这些函数,应用程序可以动态地加载和调用其他模块(DLL)中的函数,从而实现不同模块之间的交互和通信。 使用api-ms-win-core-libraryloader的函数,我们可以根据动态库的路径或名称来加载它们。一旦动态库加载成功,就可以使用GetProcAddress函数获取其中函数的地址,并通过函数指针调用相应的函数。在使用完成后,可以使用FreeLibrary函数来卸载动态库,释放相应的资源。 api-ms-win-core-libraryloader在Windows 7中起到了至关重要的作用。它使得在应用程序开发中,我们能够方便地进行模块化的设计和实现,将不同的功能划分为不同的DLL,从而提高代码的可维护性和灵活性。同时,它也为不同模块之间的通信和交互提供了方便的途径。 总之,api-ms-win-core-libraryloader是Windows 7操作系统中提供动态链接库加载和卸载功能的重要组件,为应用程序的开发和运行提供了便利。 ### 回答2: api-ms-win-core-libraryloader是Windows 7操作系统中的一个API(应用程序编程接口),用于加载和卸载动态链接库(DLL)文件。在Windows 7中,DLL文件被广泛应用于软件开发中,用于提供可重用的功能和资源。 api-ms-win-core-libraryloader通过提供一组函数来管理DLL文件的加载和卸载。这些函数包括LoadLibrary、FreeLibrary和GetProcAddress等。LoadLibrary函数用于加载DLL文件到进程的内存中,使得该DLL中的函数可以被其他模块调用。FreeLibrary函数用于卸载DLL文件并释放相关的资源。GetProcAddress函数用于获取DLL文件中指定函数的地址,以便能够直接调用该函数。 使用api-ms-win-core-libraryloader可以实现一些功能,如动态加载外部库、插件和扩展,以实现程序的模块化和灵活性。此外,它还可以帮助解决不同DLL版本冲突的问题,通过动态加载具体版本的DLL来避免冲突。 总之,api-ms-win-core-libraryloader是一个重要的API,它在Windows 7操作系统中扮演着管理DLL文件加载和卸载的角色,为软件开发者提供了方便的功能和灵活性,同时也有助于解决DLL版本冲突的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值