如我们熟知的advapi32.dll其中一部分函数移动了kernel32.dll中,另一部分包括kernel32.dll中的一些函数被移动到了KERNELBASE.dll中,并且出现了大量的新dll导入函数,这些dll的名称非常长,例如API-MS-Win-Core-LocalRegistry-L1-1-0.dll。
而这些名称非常长的新增加函数一般不独立导入使用,而是通过ADVAPI32和KERNEL32、一般支持的dll(如MFC42、MSVCRT和OLE32)、许多服务以及各种其他可执行文件完成的。而这种情况也不光发生在应用层,它们也适用于内核模式。NT内核本身(NTOSKRNL)以前只从HAL导入,现在从ext-ms-win-ntos-ksigningpolicy-l1-1-0.dll之类的dll中导入。
我们通过ida打开api-ms-win-crt-stdio-l1-1-0.dll,并查看其导出函数fread,其仅定义字符串ucrtbase.fread
.rdata:0000000180002835 public fread
.rdata:0000000180002835 ; size_t __cdecl fread(void *DstBuf, size_t ElementSize, size_t Count, FILE *File)
.rdata:0000000180002835 fread db 'ucrtbase.fread',0 ; DATA XREF: .rdata:off_180001088o
.rdata:0000000180002844 aFread_s db 'fread_s',0 ; DATA XREF: .rdata:off_180001304o
其实这里的ucrtbase.fread的含义是将该函数转发至ucrtbase.dll的fread函数中。
打开ucrtbase.dll,其确实导出了fread.dll函数。