忽略在 C# .NET 中抛出的特定异常
Posted
技术标签:
【中文标题】忽略在 C# .NET 中抛出的特定异常【英文标题】:Ignore specific exception from throwing in C# .NET 【发布时间】:2018-12-12 09:35:56 【问题描述】:是否可以让 .NET CLR 忽略某些异常?例如,throw 将被简单地跳过,函数继续执行,就好像什么都没发生一样?
是否可以在不修改代码从哪里抛出的情况下做到这一点?该软件是.NET 4.6.1 WinForms。
原因是由于对某些具有数千个校验和例程的恶意软件进行逆向工程,我需要修改 MSIL 代码并因此更改校验和,通过 dnlib 脚本删除所有例程将是非常耗时的任务。如果我可以阻止特定的异常,我可以避免这个耗时的任务。
编辑:我记得在某些 WinForms 应用程序中看到“发生异常,您要继续还是退出?”如果我能有效地拒绝异常并继续,就好像它从未发生过一样,这当然是我所需要的。
这是一个例子。我该如何启用它?
示例: 请注意,我不是在编写代码。我正在用 dnspy 编辑一个已编译的 exe,所以我不能轻易更改代码,我必须手动编辑 MSIL 字节码。
public void Test()
throw new ArgumentException("ignore this");
MessageBox.Show("Successfully ignored exception");
【问题讨论】:
如果您能提供minimal reproducible example,那就太好了。 是否可以通过添加一个异常处理程序来以某种方式返回到原始抛出? 对不起,我不明白你的意思...REing
是什么?还有malware which has thousands of checksum routines
是什么意思?虽然这听起来像是对异常进行全局忽略的错误方法(即使你能做到,我认为你做不到)
REing = 逆向工程。我有一个 .net 恶意软件样本,我正在尝试对其进行逆向工程。我需要修改 MSIL 代码以使其运行,但这会破坏内置的校验和例程。我可以修改所有 2000 个校验和例程,但这会很耗时。如果我可以简单地禁用未处理的特定异常,那么我可以很容易地“禁用”所有校验和例程。这个或修改大量例程是我可以修改代码并运行它的唯一方法。
这些总是相同的例外吗?然后你可能只是 nop 出相应的字节模式。
【参考方案1】:
您不能以您想要的方式“忽略”异常。但是,如果您要遍历例程,则始终可以跳过引发异常的一次迭代...例如:
while(condition)
try
// your iteration
catch (Exception)
/* don't do a catch, so it will jump back to your while statement and just
try the next one */
这应该具有您想要的效果,因为它只会忽略否则会阻止您的程序运行的迭代。 希望这会有所帮助!
编辑:
您可以从那里反编译代码并更改源代码。看看 GEOCHET 关于如何做到这一点的答案:
How do I decompile a .NET EXE into readable C# source code?
【讨论】:
我不是在写代码。我不能只是编辑它。有 2000 个静态构造函数需要通过 MSIL 字节码修补进行编辑。【参考方案2】:您显然可以在 Catch 中放置一个 if 检查,以针对特定异常操作自定义功能 -
try
// function which you will operate
catch (Exception ex)
if (ex is ***Exception) //(Type your exception type here)
//log this if you want
else
throw; //or handle as per your requirement
【讨论】:
我不是在写代码。我不能只是编辑它。有 2000 个静态构造函数需要通过 MSIL 字节码修补进行编辑。以上是关于忽略在 C# .NET 中抛出的特定异常的主要内容,如果未能解决你的问题,请参考以下文章