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之类的代码,找到他的引用,删除就可以了
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也一样
Sound 发表于 2016-5-23 23:36
目前很少软件能加壳net的,大家有没有什么好的加密解密方法可以分享出来
很多保护器都可以对.net软件进 ...
哎。。。我找遍了整个百度和52,没有一个管用的,inlock还勉强凑合,但是不太好,说不出哪里不好。像.NET Reactor ,或者Skater .NET Obfuscator或者.Postbuild.混淆都没什么用,连我都可以瞬间反出代码,何况是别人,不知道你有没有什么好的推荐 支持支持可以交流吗 学习了,,, 对于.net确实还停留在最初级阶段,感谢楼主把思路和分析分享出来 A00 发表于 2016-5-23 20:54
支持支持可以交流吗
不可以,下午发了个帖子说交流的留个邮箱,结果被论坛的老大删了。看来还是不要交流好了,看看贴就好 理想情况应该是继续跟进 “MenuHelper.checkSysdataData” 和 “MenuHelper.checkSysdata1Data” 了解为什么会退出,并针对这些情况修改返回值,因为软件可能在某个操作中调用这些函数检查。
如果是过自校验,最理想状态是伪造签名/校验值,让程序自己都不认为自己被改过,.net 程序的话分析起来应该方便一些。
个人想法,未经验证,欢迎吐槽 :D 目前很少软件能加壳net的,大家有没有什么好的加密解密方法可以分享出来
很多保护器都可以对.net软件进行外壳保护,并且.net的混淆 软件也很多的。
代码加密 和外壳 ,当然 常见的 TMD/WLenigmaSafengine 等 可以对net软件进行外壳保护。,