忽略在 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 中抛出的特定异常的主要内容,如果未能解决你的问题,请参考以下文章

在线程中处理在 catch 块中抛出的异常的最佳实践。 (。网)

是否可以捕获 JavaScript 异步回调中抛出的异常?

如果在“等待”之后抛出,则从任务中抛出的异常被吞下

是否有可能捕获JavaScript异步回调中抛出的异常?

C#如何在中间层类中抛出异常时获得控制焦点

在 PHP Try Catch 块中抛出异常