ajm3 发表于 2016-5-23 20:09

Net反编译之退出验证解除

本帖最后由 ajm3 于 2016-5-23 22:00 编辑

net教程少,楼主也不吝啬贡献一点点
blue发了几部,感觉都很浅,比如破解注册啥的就是改一个br.true 或者改一下 idc.i4.1啥的,不够新鲜。
今天发一个net程序退出验证的去除方法,只分析代码,不发程序了



public MainService()
{
    this.errMsg = "★★ 警告:★★\n\n系统异常,马上退出!";
}



在reflector里面搜索字符找到如图这段代码。


经过分析寻找this.errMsg,因为是经过分析寻找this.errMsg=XXXX,点击errMSG,(那就不能直接用Analyzer搜索ctor),右键,点击Analyzer得到下图




重点看 Initialize(),这个英文大家有经验的都知道是主窗体,所以重点在这里,然后分析一下代码看看哪里调用了这句删除即可


分析代码如下
public override void Initialize()
{
    base.Initialize();
    RootMenuNode parNode = new RootMenuNode();
    string webConfigKeyValue = AppUtils.GetWebConfigKeyValue("IMSwitch");
    base.Context["IMSwitch"] = webConfigKeyValue;
    base.Context["PollingTime"] = int.Parse(ConfigurationManager.AppSettings["PollineTime"].ToString());
    base.Context["isTop"] = !string.IsNullOrEmpty("910");
    using (DbHelper helper = AppUtils.CreateDbHelper())
    {
      int num2;
      this.setVersionInfo();
      int magicDogFlag = this.doMagicDogFlag();
      string message = string.Empty;
      base.Context["registerMessage"] = string.Empty;
      base.Context["registered"] = string.Empty;
      base.Context["OutputMessageAndClose"] = string.Empty;
      MenuHelper.CheckRemindDays(base.Context, ref message, out num2);
      base.Context["registerMessage"] = message;
      base.Context["registered"] = num2;
      base.Context["tryMessage"] = message;
      if ((string.IsNullOrEmpty(message) && SysData1.isSstages) && MenuHelper.CheckOnLineDogsOverDays(ref message))
      {
            base.Context["tryMessage"] = message;
      }
      base.Context["attendance"] = UserInfo.IsAdmin ? ((object) 0) : ((object) Limit.LIMIT_TIMEWORK_ADDDATA);
      if (MenuHelper.chkSysData() == 0)
      {
            AppUtils.OutputMessageAndClose(base.Context, this.errMsg);
      }
      int dogUserCount = 0;
      int loginUserCount = 0;
      int errorCode = 0;
      if (MenuHelper.CheckCurLoginUserCountForASP(helper, CurrUser.GetCode(), ref loginUserCount, ref dogUserCount, ref errorCode) != 0)
      {
            AppUtils.OutputMessageAndClose(base.Context, string.Format("█ █ █ █ 系统严重警告:█ █ █ █\n\n ★", (dogUserCount == 0) ? "单机" : ("(" + dogUserCount + ")用户"), loginUserCount));
      }
      else if (magicDogFlag < 0)
      {
            AppUtils.OutputMessageAndClose(base.Context, this.getErrorMagicMessage(magicDogFlag).ToString());
      }
      if (MenuHelper.checkSysdataData() == 1)
      {
            AppUtils.OutputMessageAndClose(base.Context, this.errMsg);
      }
      if (MenuHelper.checkSysdata1Data() == 1)
      {
            AppUtils.OutputMessageAndClose(base.Context, this.errMsg);
      }



出现3句
AppUtils.OutputMessageAndClose(base.Context, this.errMsg);
一样的代码,意思就是OutputMessageAndClose,输出message并且close。明白了吧
然后修改如下效果即可
public override void Initialize()
{
    base.Initialize();
    RootMenuNode parNode = new RootMenuNode();
    string webConfigKeyValue = AppUtils.GetWebConfigKeyValue("IMSwitch");
    base.Context["IMSwitch"] = webConfigKeyValue;
    base.Context["PollingTime"] = int.Parse(ConfigurationManager.AppSettings["PollineTime"].ToString());
    base.Context["isTop"] = !string.IsNullOrEmpty("910");
    using (DbHelper helper = AppUtils.CreateDbHelper())
    {
      int num2;
      this.setVersionInfo();
      int magicDogFlag = this.doMagicDogFlag();
      string message = string.Empty;
      base.Context["registerMessage"] = string.Empty;
      base.Context["registered"] = string.Empty;
      base.Context["OutputMessageAndClose"] = string.Empty;
      MenuHelper.CheckRemindDays(base.Context, ref message, out num2);
      base.Context["registerMessage"] = message;
      base.Context["registered"] = num2;
      base.Context["tryMessage"] = message;
      if ((string.IsNullOrEmpty(message) && SysData1.isSstages) && MenuHelper.CheckOnLineDogsOverDays(ref message))
      {
            base.Context["tryMessage"] = message;
      }
      base.Context["attendance"] = UserInfo.IsAdmin ? ((object) 0) : ((object) Limit.LIMIT_TIMEWORK_ADDDATA);
      if (MenuHelper.chkSysData() == 0)
      {
//AppUtils.OutputMessageAndClose(base.Context, this.errMsg);
      }
      int dogUserCount = 0;
      int loginUserCount = 0;
      int errorCode = 0;
      if (MenuHelper.CheckCurLoginUserCountForASP(helper, CurrUser.GetCode(), ref loginUserCount, ref dogUserCount, ref errorCode) != 0)
      {
            AppUtils.OutputMessageAndClose(base.Context, string.Format("█ █ █ █ 系统严重警告:█ █ █ █\n\n ★", (dogUserCount == 0) ? "单机" : ("(" + dogUserCount + ")用户"), loginUserCount));
      }
      else if (magicDogFlag < 0)
      {
            AppUtils.OutputMessageAndClose(base.Context, this.getErrorMagicMessage(magicDogFlag).ToString());
      }
      if (MenuHelper.checkSysdataData() == 1)
      {
//AppUtils.OutputMessageAndClose(base.Context, this.errMsg);
      }
      if (MenuHelper.checkSysdata1Data() == 1)
      {
//AppUtils.OutputMessageAndClose(base.Context, this.errMsg);
      }




//的意思就是删除这一行。这样这个提示和退出就没有了

这样就ok了。不知道大家看明白没有
教程简单,net本来就简单,复杂不起来,没办法,可能难就难在加壳和脱壳,目前很少软件能加壳net的,大家有没有什么好的加密解密方法可以分享出来



//楼下有朋友点评说退出没有任何提示要怎么弄,其实和有提示差不多,思路也是一样,找到窗口主体代码,AppUtils.OutputMessageAndClose(base.Context, this.errMsg);不同的就是少了msg。退出就是close,或者vb.net的end unload me之类的代码,找到他的引用,删除就可以了

ajm3 发表于 2016-5-23 23:48

Sound 发表于 2016-5-23 23:44
代码加密 和外壳 ,当然 常见的 TMD/WLenigmaSafengine 等 可以对net软件进行外壳保护。,
额。。。。能别复制粘贴吗
Agile.NET (aka CliSecure)
Babel.NET
CodeFort
CodeVeil
CodeWall
CryptoObfuscator
Confuser
ConfuserEx
DNGuard
DeepSea Obfuscator
Dotfuscator
.NET Reactor
Eazfuscator.NET
Goliath.NET
ILProtector
MaxtoCode
MPRESS
Obfuscator
Rummage
Skater.NET
SmartAssembly
Spices.Net
Xenocode


这些我全部试过,没一个行,广告就吹的很好很厉害,实际去下载,要么用不了,要么瞬间反出代码。。。。哎,我的要求其实不高,只要我不能反出代码,能用就行了。。。。。
enigmaSafengine 这些说是可以加net,实际上 下载好多个都只能加win32程序tmd也一样

ajm3 发表于 2016-5-23 23:39

Sound 发表于 2016-5-23 23:36
目前很少软件能加壳net的,大家有没有什么好的加密解密方法可以分享出来

很多保护器都可以对.net软件进 ...

哎。。。我找遍了整个百度和52,没有一个管用的,inlock还勉强凑合,但是不太好,说不出哪里不好。像.NET Reactor ,或者Skater .NET Obfuscator或者.Postbuild.混淆都没什么用,连我都可以瞬间反出代码,何况是别人,不知道你有没有什么好的推荐

A00 发表于 2016-5-23 20:54

支持支持可以交流吗

广州快乐神 发表于 2016-5-23 21:00

学习了,,,

topcookie 发表于 2016-5-23 21:02

对于.net确实还停留在最初级阶段,感谢楼主把思路和分析分享出来

ajm3 发表于 2016-5-23 21:18

A00 发表于 2016-5-23 20:54
支持支持可以交流吗

不可以,下午发了个帖子说交流的留个邮箱,结果被论坛的老大删了。看来还是不要交流好了,看看贴就好

新西兰天气晴 发表于 2016-5-23 21:38

爱飞的猫 发表于 2016-5-23 22:30

理想情况应该是继续跟进 “MenuHelper.checkSysdataData” 和 “MenuHelper.checkSysdata1Data” 了解为什么会退出,并针对这些情况修改返回值,因为软件可能在某个操作中调用这些函数检查。
如果是过自校验,最理想状态是伪造签名/校验值,让程序自己都不认为自己被改过,.net 程序的话分析起来应该方便一些。

个人想法,未经验证,欢迎吐槽 :D

Sound 发表于 2016-5-23 23:36

目前很少软件能加壳net的,大家有没有什么好的加密解密方法可以分享出来

很多保护器都可以对.net软件进行外壳保护,并且.net的混淆 软件也很多的。

Sound 发表于 2016-5-23 23:44



代码加密 和外壳 ,当然 常见的 TMD/WLenigmaSafengine 等 可以对net软件进行外壳保护。,
页: [1] 2 3
查看完整版本: Net反编译之退出验证解除