某系統是網上最常見也是目前最好用的旅游站系統之一,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代碼,找到相關的十六進制分復制過來保存后,發現代碼成功修改了!


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