忽略抛出C#.NET的特定异常

时间:2018-07-04 03:18:54

标签: c# .net exception clr reverse-engineering

是否可以使.NET CLR忽略某些异常?例如,将仅跳过该抛出操作,然后函数继续运行,就好像什么都没发生?

是否可以执行此操作而无需修改从何处抛出代码?该软件是.NET 4.6.1 WinForms。

原因是由于对具有数千个校验和例程的恶意软件进行了逆向工程,我需要修改MSIL代码并更改校验和,通过dnlib脚本删除所有例程将是非常耗时的任务。如果我可以阻止特定的异常,则可以避免执行此耗时的任务。

编辑:我记得在某些WinForms应用程序中看到“发生了异常,您要继续还是退出?”如果我可以有效地拒绝该异常并继续执行,就好像它从未发生过,那么肯定是我所需要的。

这里是一个例子。如何启用此功能? enter image description here

示例: 请注意,我不是在编写代码。我正在用dnspy编辑一个已编译的exe,所以我不能轻易更改代码,我必须手动编辑MSIL字节代码。

public void Test(){
  throw new ArgumentException("ignore this");

  MessageBox.Show("Successfully ignored exception");

}

2 个答案:

答案 0 :(得分: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?

答案 1 :(得分:0)

您显然可以在Catch中放入if检查,以对特定异常进行自定义功能-

            try
            {
                // function which you will operate
            }
            catch (Exception ex)
            {
                if (ex is StackOverflowException) //(Type your exception type here)
                {
                    //log this if you want
                }
                else
                {
                    throw; //or handle as per your requirement
                }

            }