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