一个行网后台进不去的解决方法修改il重编

事由

某个行业网站在登录过程显示请调整服务器设置,以保证网站的正常运行,网站负责人找开发商,结果开发商人都找不到了,没有解决方案,网站也成为死站,辛苦这么多年结果可知。

那么为什么进不去呢,是因为进入管理后台必须去开发商的网站认证一下,开发商认证网站倒了,所以就管理后台就进不去,这个就恶心了。破解的方法也就是让它不通过开发商网站认证,绕开它,通过反编译dll生成il代码,然后修改il把认证的代码删除,重新编译生成dll,然后替换。

首先下载反编译工具进行反编译 dnSpy

下载地址:Latest release: https://github.com/0xd4d/dnSpy/releases
D:\tools\dnSpy-netcore-win64

反编译找出问题代码

根据URL大致判断地址

  1. 按钮点击代码
protected void btnlogin_Click(object sender, EventArgs e)
		{
			if (this.txtVerifyCode.Text != UserManageAdmin.VerifyCode)
			{
				base.Response.Write("<script>alert('校验码错误!')</script>");
				this.txtVerifyCode.Text = "";
			}
			else
			{
				int num = 0;
				***UserManageAdminInfo byName = UserManageAdmin.GetByName(this.TbxUserName.Text.Trim(),HttpContext.Current.Request.Url.AbsoluteUri, out num);***
				if (num != 0)
				{
					base.Response.Write("<script>alert('请调整服务器设置,以保证网站的正常运行')</script>");
					UserManageAdmin.SetVerifyCode();
				}
				else if (byName == null)
				{
					base.Response.Write("<script>alert('无此用户!')</script>");
					UserManageAdmin.SetVerifyCode();
				}
				else if (SecurityUtility.Encrypt("", this.TbxPassword.Text) != byName.ManagerPassWord)
				{
					base.Response.Write("<script>alert('用户密码不正确!')</script>");
					UserManageAdmin.SetVerifyCode();
				}
				else
				{
					UserManageAdmin.Login(byName);
					byName.LoginCount++;
					byName.LoginIP = base.Request.UserHostAddress;
					byName.LastLoginDate = DateTime.Now;
					UserManageAdmin.Update(byName);
					base.Response.Redirect(UrlUtility.GetBaseURL() + "/admin/index.htm");
				}
			}
		}
  1. 看看得到用户信息 UserManageAdmin.GetByName,看看这个代码怎样的。
public static UserManageAdminInfo GetByName(string AdminName, string UserUrl, out int ErrorInt)
				{
					ErrorInt = 0;
					IUserManageAdmin userManageAdmin = UserManageAdmin.Create();
					UserManageAdminInfo userManageAdminInfo = null;
					SmartsiteVerify smartsiteVerify = new SmartsiteVerify();
					UserManageAdminInfo result;
					if (smartsiteVerify.UserMasterLogin(UserUrl.ToLower())){
userManageAdminInfo = userManageAdmin.GetByName(AdminName);
						result = userManageAdminInfo;}
					else{
						ErrorInt = -1;
						result = userManageAdminInfo;
					}
					return result;
				}
  1. 原来要验证smartsiteVerify.UserMasterLogin,看看这是怎样的
namespace TradeSite.UserMaster
{
	// Token: 0x02000002 RID: 2
	public class SmartsiteVerify
	{
		// Token: 0x06000001 RID: 1 RVA: 0x000020D0 File Offset: 0x000010D0
		public bool UserMasterLogin(string strUrl)
		{
			Site5verify site5verify = new Site5verify();
			string text = this.DecryptGuid(ConfigurationSettings.AppSettings["Guid"]);
			string rnumber = "";
			bool result;
			if (text == "")
			{
				result = false;
			}
			else
			{
				string mainoneSmartsite = this.EncryptGuid(this.xmlPublicKey, text);
				try
				{
					string b = site5verify.**VerifyMainone**(mainoneSmartsite, out rnumber);
					if (text != b)
					{
						return false;
					}
					if (!site5verify.Validatepath(strUrl, text, rnumber))
					{
						return false;
					}
				}
				catch
				{
					return false;
				}
				result = true;
			}
			return result;
		}
  1. 验证函数 VerifyMainone 是怎样的呢,原来通过webserivce 调研远程服务认证。
// Token: 0x06000012 RID: 18 RVA: 0x0000243C File Offset: 0x0000143C
        [SoapDocumentMethod("http://tempuri.org/VerifyMainone", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)]
        public string VerifyMainone(string MainoneSmartsite, out string RNumber)
        {
            object[] array = base.Invoke("VerifyMainone", new object[]
            {
                MainoneSmartsite
            });
            RNumber = (string)array[1];
            return (string)array[0];
        }

解决方法就是把上面第二步分析的代码修改绕过认证

public static UserManageAdminInfo GetByName(string AdminName, string UserUrl, out int ErrorInt)
        {
            ErrorInt = 0;
            IUserManageAdmin userManageAdmin = UserManageAdmin.Create();
            UserManageAdminInfo userManageAdminInfo = null;
            SmartsiteVerify smartsiteVerify = new SmartsiteVerify();
            UserManageAdminInfo result;
            if (smartsiteVerify.UserMasterLogin(UserUrl.ToLower()))
            {
                userManageAdminInfo = userManageAdmin.GetByName(AdminName);
                result = userManageAdminInfo;
            }
            else
            {
                ErrorInt = -1;
                result = userManageAdminInfo;
            }
            return result;
        }

修改成

   public static UserManageAdminInfo GetByName(string AdminName, string UserUrl, out int ErrorInt)
        {
            ErrorInt = 0;
            IUserManageAdmin userManageAdmin = UserManageAdmin.Create();
            return userManageAdmin.GetByName(AdminName);
        }

通过微软的反编译工具编辑指令

“C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\ildasm.exe”

然后转储为 il和res文件

或者执行命令行:“C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\ildasm.exe” TradeSite.UserManage.Component.dll /output: TradeSite.UserManage.Component.il

编辑il文件

.method public hidebysig static class TradeSite.UserManage.Model.UserManageAdminInfo
GetByName(string AdminName,
string UserUrl,
[out] int32& ErrorInt) cil managed
{
// 代码大小 61 (0x3d)
.maxstack 2
.locals init (class TradeSite.UserManage.IDAL.IUserManageAdmin V_0,
class TradeSite.UserManage.Model.UserManageAdminInfo V_1,
class [TradeSite.UserMaster]TradeSite.UserMaster.SmartsiteVerify V_2,
class TradeSite.UserManage.Model.UserManageAdminInfo V_3,
bool V_4)
IL_0000: nop
IL_0001: ldarg.2
IL_0002: ldc.i4.0
IL_0003: stind.i4
IL_0004: call class TradeSite.UserManage.IDAL.IUserManageAdmin TradeSite.UserManage.DALFactory.UserManageAdmin::Create()
IL_0009: stloc.0
IL_000a: ldnull
IL_000b: stloc.1
IL_000c: newobj instance void [TradeSite.UserMaster]TradeSite.UserMaster.SmartsiteVerify::.ctor()
IL_0011: stloc.2
IL_0012: ldloc.2
IL_0013: ldarg.1
IL_0014: callvirt instance string [mscorlib]System.String::ToLower()
IL_0019: callvirt instance bool [TradeSite.UserMaster]TradeSite.UserMaster.SmartsiteVerify::UserMasterLogin(string)
IL_001e: ldc.i4.0
IL_001f: ceq
IL_0021: stloc.s V_4
IL_0023: ldloc.s V_4
IL_0025: brtrue.s IL_0034
IL_0027: nop
IL_0028: ldloc.0
IL_0029: ldarg.0
IL_002a: callvirt instance class TradeSite.UserManage.Model.UserManageAdminInfo TradeSite.UserManage.IDAL.IUserManageAdmin::GetByName(string)
IL_002f: stloc.1
IL_0030: ldloc.1
IL_0031: stloc.3
IL_0032: br.s IL_003b
IL_0034: ldarg.2
IL_0035: ldc.i4.m1
IL_0036: stind.i4
IL_0037: ldloc.1
IL_0038: stloc.3
IL_0039: br.s IL_003b
IL_003b: ldloc.3
IL_003c: ret
} // end of method UserManageAdmin::GetByName

找到相关代码并修改成如下

.method public hidebysig static class TradeSite.UserManage.Model.UserManageAdminInfo
GetByName(string AdminName,
string UserUrl,
[out] int32& ErrorInt) cil managed
{
// 代码大小 61 (0x3d)
.maxstack 2
.locals init (class TradeSite.UserManage.IDAL.IUserManageAdmin V_0,
class TradeSite.UserManage.Model.UserManageAdminInfo V_1,
class [TradeSite.UserMaster]TradeSite.UserMaster.SmartsiteVerify V_2,
class TradeSite.UserManage.Model.UserManageAdminInfo V_3,
bool V_4)
IL_0000: nop
IL_0001: ldarg.2
IL_0002: ldc.i4.0
IL_0003: stind.i4
IL_0005: call class TradeSite.UserManage.IDAL.IUserManageAdmin TradeSite.UserManage.DALFactory.UserManageAdmin::Create()
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: ldarg.0
IL_0009: callvirt instance class TradeSite.UserManage.Model.UserManageAdminInfo TradeSite.UserManage.IDAL.IUserManageAdmin::GetByName(string)
IL_000e: stloc.1
IL_000f: ldloc.1
IL_0010: stloc.2
IL_0011: br.s IL_0013
IL_0013: ldloc.2
IL_0014: ret
} // end of method UserManageAdmin::GetByName

重新编译

Framework64,注意.net 版本
“C:\Windows\Microsoft.NET\Framework64\v2.0.50727\ilasm.exe” /dll /resource=TradeSite.UserManage.Component.res TradeSite.UserManage.Component.il /output:TradeSite.UserManage.Component.dll

替换dll文件

幸运的是TradeSite.UserManage.Component.dll 没有强签, 强签了也没有什么办法了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值