无源码情况下修改.net应用程序

今天需要修改程序里的数据内容,本来很简单只用改config配置文件就可以了,数据是写在那里面的,结果那个程序作了保护,一旦修改config,就会报“文件遭到破坏,请于管理员联系!”。心想这下糟了,又没有源码,这怎么改啊。想起之前做项目的时候有人反汇编看源码的,自己硬着头皮尝试了一把,发现其实也不是特别难,就是改中间语言的时候迷茫了一会,还好这个保护做的实在是太简单了,分分钟搞定。下面说一下步骤。
用到的工具有:

  • .NET Reflector(做.net的应该都知道吧,强大的源码查看工具)
  • Ildasm(VS自带的反汇编工具,用于把exe/dll反汇编成中间语言文件,用于修改)
  • Ilasm(VS自带的汇编工具,用于把修改后的中间语言文件汇编成exe/dll)

首先先用.NET Reflector查找源码,既然是在程序一开始就提示错误信息,那一般就是在主窗口构造时进行的判断,所以在.NET Reflector里面要先找到主窗口的构造,经过一番查找,我发现它的主窗口名字叫FrmMain,双击这个窗口,在里面找到.ctor()这个就是它的默认构造了。
dotnet
我们来看看它的源码:

public FrmMain()
{
    this.type = 0;
    this.ArrayValue = new ArrayList();
    this.ArrayItem = new ArrayList();
    this.timerNow = 0;
    this.UserName = string.Empty;
    this.components = null;
    this.InitializeComponent();
    this.test();
    this.button2.Enabled = false;
    this.initfrm();
}

诶,好像这个test()有古怪,点进去看看吧:
dotnet2
原来真的是这个方法搞的鬼:

private void test()
{
    ...省略...
    if (str != "xxxxx")
    {
        MessageBox.Show("文件遭到破坏,请于管理员联系!");
        base.Close();
    }
}

既然已经找到了地方,现在我们开始动手修改吧,最简单的改动就是删除构造方法里调用test()方法的那一行:
首先需要打开Developer Command Prompt,所需的两个工具Ildasm和Ilasm都可以通过它直接使用。
如果您的计算机上已安装了 Visual Studio:在任务栏上依次单击 Start、All Programs、Visual Studio、Visual Studio Tools、Developer Command Prompt.

然后使用cd命令移动到exe所在的路径下

cd pathname

接着反汇编这个exe文件,使用命令:

ildasm exename.exe /output:temp.il

如果没什么问题的话,应该能在当前路径下看到temp.il这个il文件。用记事本打开它。
全文搜索关键字test,搜到了这么一段:

    IL_0036:  ldarg.0
    IL_0037:  call       instance void [System.Windows.Forms]System.Windows.Forms.Form::.ctor()
    IL_003c:  nop
    IL_003d:  nop
    IL_003e:  ldarg.0
    IL_003f:  call       instance void ParkLottery.FrmMain::InitializeComponent()
    IL_0044:  nop
    IL_0045:  ldarg.0
    IL_0046:  call       instance void ParkLottery.FrmMain::test()
    IL_004b:  nop
    IL_004c:  ldarg.0
    IL_004d:  ldfld      class [System.Windows.Forms]System.Windows.Forms.Button ParkLottery.FrmMain::button2
    IL_0052:  ldc.i4.0
    IL_0053:  callvirt   instance void 

对照.Net Relector查到的源码,应该就是我们要找的代码段:

    this.InitializeComponent();
    this.test();
    this.button2.Enabled = false;

因此把调用到test()的两行改成nop(不作任何操作)就可以了,改完后的代码如下:

IL_0036:  ldarg.0
    IL_0037:  call       instance void [System.Windows.Forms]System.Windows.Forms.Form::.ctor()
    IL_003c:  nop
    IL_003d:  nop
    IL_003e:  ldarg.0
    IL_003f:  call       instance void ParkLottery.FrmMain::InitializeComponent()
    IL_0044:  nop
    IL_0045:  nop
    IL_0046:  nop
    IL_004b:  nop
    IL_004c:  ldarg.0
    IL_004d:  ldfld      class [System.Windows.Forms]System.Windows.Forms.Button ParkLottery.FrmMain::button2
    IL_0052:  ldc.i4.0
    IL_0053:  callvirt   instance void 

好了,修改完毕,生成可执行文件吧,在刚才的命令行里输入:

ilasm temp

如果最后提示:Operation completed successfully说明汇编成功。在当前文件夹下你会找到一个叫做temp.exe的文件,双击它,大功告成。

博主开通了微信公众号,欢迎关注啦

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.