【发布时间】:2021-11-20 04:09:13
【问题描述】:
我试图弄清楚为什么添加到路径 AddDllDirectory() 而不是退出进程 PATH 不会让我加载在 VBA 函数中使用的 dll。所以想知道LoadLibraryExW()的第三个参数是什么。
第一个问题是我正确加载了符号。我的符号服务器缓存充满了 pdb 文件。但是,没有找到 kernelbase.dll 的符号。
进程监视器显示堆栈跟踪,但不显示符号。
我在 WinDbgPreview 中为kernelbase!LoadLibraryExW 设置了一个断点,但我不确定如何读取堆栈跟踪。在这个例子中,这些十六进制值之一应该是第三个参数吗?还是当我想要堆栈时来自寄存器?
# Child-SP RetAddr : Args to Child : Call Site
00 00000051`184fe648 00007ffe`e30b5ae5 : 00007ffe`e3431380 00000000`00000060 00000051`184feac0 00000000`00000008 : KERNELBASE!LoadLibraryExW
01 00000051`184fe650 00007ffe`e30b5a45 : 00000051`184fe704 1103aa3e`00000001 00000000`00000008 00000000`00000007 : mso20win32client!Ordinal104+0x295
02 00000051`184fe690 00007ffe`e3090bb1 : 000001df`179f4860 00000000`02000000 00000000`00000008 00000000`00000000 : mso20win32client!Ordinal104+0x1f5
03 00000051`184fe6d0 00007ffe`e3091c11 : 00000051`184feb10 000001df`179f4860 00000000`00000000 00000051`184feaf0 : mso20win32client!Ordinal67+0x1f71
04 00000051`184fea50 00007ffe`d808e62a : 000001df`179f4860 00007ffe`d9c34730 000001df`17f7b1c0 00000000`00000000 : mso20win32client!Ordinal1818+0x8c1
05 00000051`184fead0 00007ffe`d808f3c3 : 000001df`179f4860 00007ffe`d9c34730 000001df`17f7b1c0 00007ffe`d9c33a10 : mso!Ordinal2534+0x51a
06 00000051`184feb10 00007ffe`d808f347 : 000001df`182fb2c0 000001df`00000001 000001df`182fb2c0 00000000`00000000 : mso!Ordinal2534+0x12b3
07 00000051`184feb50 00007ffe`d8153c24 : 000001df`182fb2c0 00000000`00000000 000001df`17f7b1c0 000001df`17f7b1c0 : mso!Ordinal2534+0x1237
08 00000051`184feb80 00007ffe`d80b1c8e : 00000051`184ff290 00000000`0001d4c0 000001df`17ed3700 00000051`184ff360 : mso!Ordinal1436+0x16b4
09 00000051`184ff0d0 00007ffe`d80b1925 : 000001df`12529600 00000000`00000000 000001df`17ca9430 000001df`12529600 : mso!Ordinal921+0xe6e
0a 00000051`184ff340 00007ffe`e2fe3c3c : 00000051`184ff488 00000051`184ff440 00000000`00000000 00000000`00000000 : mso!Ordinal921+0xb05
0b 00000051`184ff3d0 00007ffe`e2fe413b : 000001df`01849818 00000000`00000000 000001df`01849800 00000000`00000144 : mso20win32client!Ordinal1756+0xbc
0c 00000051`184ff460 00007ffe`e2fe3c3c : 000001df`11d96b90 000001df`17823c68 000001df`17ca9430 00007fff`88aa7551 : mso20win32client!Ordinal1756+0x5bb
0d 00000051`184ff4f0 00007ffe`e311741d : 000001df`1284a6a0 00000000`00000000 00000051`184ff790 00000000`00000000 : mso20win32client!Ordinal1756+0xbc
0e 00000051`184ff580 00007ffe`e3050e6e : 000001df`1284a6a0 00000000`00000000 000001df`1284a601 000001df`01a18f80 : mso20win32client!Ordinal1700+0x28d
0f 00000051`184ff5b0 00007ffe`e3051ed5 : 00000051`184ff710 000001df`1284a6a0 000001df`01a18f80 000001df`1284a6a0 : mso20win32client!Ordinal347+0x23e
10 00000051`184ff610 00007ffe`e305c2d6 : 000001df`017c9470 00000000`00000000 000001df`017c9470 00000000`00000000 : mso20win32client!Ordinal1966+0x6e5
11 00000051`184ff770 00007fff`873854e0 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : mso20win32client!Ordinal2633+0x686
12 00000051`184ff7e0 00007fff`88a8485b : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : KERNEL32!BaseThreadInitThunk+0x10
13 00000051`184ff810 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!RtlUserThreadStart+0x2b
有没有办法获取kernlbase.pdb?它适用于旧版本的 Windows 吗?有没有可以读取参数的 WinDbg 命令?
【问题讨论】:
-
在 x64 上,前四个参数在寄存器中。
rcx、rdx、r8和r9。所以第三个参数在r8。更一般地说,要调试 DLL 加载问题,您可以打开 loader snaps。 -
加载符号后,您可以使用
kp命令。 Symbols for Windows debugging 解释了如何做到这一点。 -
@ThomasWeller iirc 它是 /HIGHENTROPYVA 链接器开关
-
@ThomasWeller 你就去做吧。使用
VirtualQuery遍历地址空间,使用VirtualAlloc保留每个低于4GB 且标记为空闲的块。 -
未死使用日期标记并在重定向的页脚中搜索以找到 earlier discussion,因为我记得它讨论过 highentroyva