今天需要修改程序里的数据内容,本来很简单只用改config配置文件就可以了,数据是写在那里面的,结果那个程序作了保护,一旦修改config,就会报“文件遭到破坏,请于管理员联系!”。心想这下糟了,又没有源码,这怎么改啊。想起之前做项目的时候有人反汇编看源码的,自己硬着头皮尝试了一把,发现其实也不是特别难,就是改中间语言的时候迷茫了一会,还好这个保护做的实在是太简单了,分分钟搞定。下面说一下步骤。
用到的工具有:
- .NET Reflector(做.net的应该都知道吧,强大的源码查看工具)
- Ildasm(VS自带的反汇编工具,用于把exe/dll反汇编成中间语言文件,用于修改)
- Ilasm(VS自带的汇编工具,用于把修改后的中间语言文件汇编成exe/dll)
首先先用.NET Reflector查找源码,既然是在程序一开始就提示错误信息,那一般就是在主窗口构造时进行的判断,所以在.NET Reflector里面要先找到主窗口的构造,经过一番查找,我发现它的主窗口名字叫FrmMain,双击这个窗口,在里面找到.ctor()这个就是它的默认构造了。
我们来看看它的源码:
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()有古怪,点进去看看吧:
原来真的是这个方法搞的鬼:
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的文件,双击它,大功告成。