2025年3月29日 星期六 甲辰(龙)年 月廿八 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 加密解密

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

时间:11-27来源:作者:点击数:89

今天需要修改程序里的数据内容,本来很简单只用改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的文件,双击它,大功告成。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门