2

我需要调试一个用 .NET C# 编写的程序。

具体来说——我只需要查看函数调用后返回的内容。我发现我可以为此目的使用 Microsoft Visual Studio——它理解 IL。我使用 ILDASM 获得了该 exe 文件的源代码。比我获取 pdb 文件并使用 ILASM 从 IL 代码获取 exe 文件。但原始 exe 文件与我在 ILASM 之后获得的 exe 文件不同。

程序启动但我有 AccessViolation ц当我尝试执行该函数时,我需要查看其结果。程序没有被混淆。

我做错了什么或者我需要做什么才能获得成功的结果?

4

4 回答 4

3

exe->il->exe 可能无法工作的原因有多种。除了您提到的(混淆的 IL)之外,还有一些是还包含本机代码的可执行文件,或者是(直接或间接)检查其自己的签名的数字签名的可执行文件。

一些调试器可以单步执行 IL,而无需重新构建应用程序。就个人而言,我喜欢为此使用ILSpy。请注意,最新版本的二进制文件不包含调试所需的位,您需要为此从源代码构建它。

一个替代方案应该是 MDbg:Mike Stall 报告早在 2005 年就将 IL 步进添加到 GUI 。我没有这方面的经验。

于 2012-12-08T11:23:44.700 回答
1

几年前我使用过 DILE:http: //sourceforge.net/projects/dile/,它让我在调试器中单步执行 IL 做得非常好。

于 2013-02-05T01:04:03.843 回答
0

hvd已经解释了执行 exe -> IL -> exe 时可能出现的问题,我不打算详述。但是,我将给您一个提示,如何以非侵入性方式检查函数的返回值。首先,您需要为您的项目启用本机调试器:

C# 应用程序:

在此处输入图像描述

ASP.NET:

在此处输入图像描述

然后在方法的最后一行放置一个断点,打开即时窗口并输入(这需要在每个调试会话中执行一次):

.load sos

然后退出函数(Shift+F11)并复制eax(或rax)注册表的值(Debug->Windows->Registers)。如果您的函数的返回类型是值类型(int、byte 等),则该值就在您的指尖(您可以将其粘贴到 Watch Window 以将其转换为十进制值)。如果它是参考值,则 e(r)ax 包含堆中对象的地址。为了查看它回到立即窗口并输入:

!do [您复制的 e(r)ax 值]

该对象将在即时窗口中显示其所有属性和字段。对于字符串,您也可以使用 Debug->Windows->Memory 窗口。

于 2012-12-10T11:50:59.513 回答
0

根据@Jason-Haley 的建议,研究 Dile,我发现它已经过时并且不再构建。

屏幕截图看起来很有希望,所以我恢复了旧的源代码,将其升级到 VS2107、NETFXSDK\4.7.2 和 Windows 10 SDK Kit(该项目目前具有 Windows 依赖项)。

在修复了一些错误并消除了一些编译器错误之后,我设法让它工作并发布了一个新的 GIT 存储库。https://github.com/alexhiggins732/DILE-MSIL-DEBUGGER

于 2019-04-23T06:39:20.713 回答