某系統是網上最常見也是目前最好用的旅游站系統之一,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代碼,找到相關的十六進制分復制過來保存後,發現代碼成功修改了!
測試成功打開網頁,破解完成。
這個只是一個思路了,破解之道在於堅持不洩,找到洞洞,然後注入精華代碼。。嗯,就是這麼回事了~看起來是不是自然萬物是不是都一樣的道理?扯遠了。。