我有一个可执行文件,它使用托管代码和非托管代码。我没有它的源代码,但我可以反编译它。
我所知道的是,在某些时候它会读取一个注册表项,然后根据注册表中的程序集名称加载一个管理的DLL。因此,我想在读取的注册表项上设置一个断点,无论它是在托管代码中读取还是在非托管代码中读取,然后查看(希望管理的)堆栈跟踪。我的计划是使用ILSpy从那里开始逐步执行反编译代码,然后观察有问题的DLL。
这可以通过Visual Studio调试器,windbg或其他调试器实现吗?我对WinDbg不太满意,但如果我要使用它,我会的。
答案 0 :(得分:1)
我已经到了一半。可以通过a special syntax调试Win32 API函数。
{,,FOO.DLL}_FunctionName@N
除非它是64位DLL,否则没有装饰:
{,,FOO.DLL}FunctionName
我的进程是32位。我无法使用以下任何一个获取功能装饰列表:
dumpbin /exports c:\Windows\SysWOW64\advapi32.dll
我认为这是由于SxS加载了错误的dll版本。
但是,this post on Zach Burlingame's blog枚举了注册表项。
我需要设置的断点是{,, Advapi32.dll} _RegOpenKeyExW @ 20。
现在我需要在注册表路径上设置断点。
答案 1 :(得分:1)
WinDBG的:
检查符号:
x advapi32!RegOpenKeyExW
如果符号没有问题,请设置断点:
bp advapi32!RegOpenKeyExW
如果windbg看不到符号,请尝试:
.symfix
.reload /f advapi32.dll