程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 用dnSpy破解某旅游系統5.2版。,dnspy破解旅游5.2

用dnSpy破解某旅游系統5.2版。,dnspy破解旅游5.2

編輯:C#入門知識

用dnSpy破解某旅游系統5.2版。,dnspy破解旅游5.2


某系統是網上最常見也是目前最好用的旅游站系統之一,5.1版本之前采用的maxtocode加殼後可以用de4dot反混淆後破解。5.1版本以後用de4dot無法脫殼。

本文僅限學習和討論,請勿做侵權使用。

在這裡說一種不脫殼破解的辦法,我們分析早期版本的授權驗證方式,以5.0為例,我們看下install的驗證方法:

if (!flag || step2.smethod_0(this.key, lower))
                        {
                            //此處為安裝代碼,省略...
                            this.Response.Redirect("step3.aspx");
                        }
                        else
                        {
                            this.ClientScript.RegisterStartupScript(this.GetType(), "", "<script language='javascript'>alert('注冊碼錯誤!');</script>");
                        }

  

 public static bool smethod_0(string string_0, string string_1)
        {
            string str = "髆@b驖b~!蘯鸛0&饕)";
            return ((string_0.Equals(Utils.MD5(string.Concat("ωāр", string_1, str), 32).ToLower()) || string_0.Equals(Utils.MD5(string.Concat(string_1, str), 32).ToLower()) ? true : false) ? true : false);
        }

可以看出使用了一個Key和域名MD5以後生成序列號進行驗證。所以只要找到Key就可以算出序列號。

在不脫殼的前提下,如何找到這個Key?

我們再分析TourEx.Pages.Dll 找到 BasePage

private static void old_acctor_mc()
{
    __ENCList = new List<WeakReference>();
    LineOrderLock = RuntimeHelpers.GetObjectValue(new object());
    OrderLock = RuntimeHelpers.GetObjectValue(new object());
    WriteLock = RuntimeHelpers.GetObjectValue(new object());
    checkkey = "髆@b驖b~!蘯鸛0&饕)";
    includeWap = false;
}

當然這是分析舊版本脫殼後的代碼,如果沒有脫殼,就通過反射調用BasePage後輸出checkkey,就可以得到。

然後,我們悲催的發現5.1以後checkkey不見了,寫在了方法內部,這樣是沒法通過反射讀出來的。

到這裡,我們不得不介紹下dnSpy這款神器,這款神器是de4dot的作者開發,可以動態調試.net的EXE,非常強大。

我們先分析BasePage中的驗證方法:

// TourEx.Pages.BasePage
// Token: 0x0600005B RID: 91 RVA: 0x00007684 File Offset: 0x00005884
public static bool smethod_0()
{
	bool result;
	if (HttpContext.Current.Server.MapPath(HttpContext.Current.Request.Url.AbsolutePath).IndexOf("wap") != -1)
	{
		if (!(result = (Operators.CompareString(BaseConfig.WebKey, TourEx.Common.Utils.MD5("ωāр" + BaseConfig.WebDomain + BasePage.checkkey, 32).ToLower(), false) != 0)))
		{
			BasePage.includeWap = true;
		}
	}
	else if (result = (Operators.CompareString(BaseConfig.WebKey, TourEx.Common.Utils.MD5("ωāр" + BaseConfig.WebDomain + BasePage.checkkey, 32).ToLower(), false) != 0))
	{
		result = (Operators.CompareString(BaseConfig.WebKey, TourEx.Common.Utils.MD5(BaseConfig.WebDomain + BasePage.checkkey, 32).ToLower(), false) != 0);
	}
	else
	{
		BasePage.includeWap = true;
	}
	return result;
}

這個方法返回了驗證結果和includeWap,我嘗試用dnSpy寫了IL代碼

發現保存的時候失敗了。


既然我們找對了地方,那就可以想別的辦法,dnSpy有個很牛X的HEX編輯功能,可以找到方法對應的十六進制代碼

用舊的版本修改IL代碼,找到相關的十六進制分復制過來保存後,發現代碼成功修改了!


測試成功打開網頁,破解完成。
這個只是一個思路了,破解之道在於堅持不洩,找到洞洞,然後注入精華代碼。。嗯,就是這麼回事了~看起來是不是自然萬物是不是都一樣的道理?扯遠了。。

  1. 上一頁:
  2. 下一頁: