標籤:
一、相關聲明
- 本文涉及的 Xamarin 系列軟體的著作權為 Xamarin Inc. 所有
- 以本文涉及的思路和方法破解的軟體,禁止用於商業用途
- 如無必要,學習和研究時最好以正版為準
- 團隊或土豪等若覺得 Xamarin 非常適合自身的業務,請務必支援正版
- 本文禁止轉載擴散
- 之後應該不會發相關破解了,太耗時間
二、相關背景 2.1 材料背景
2014年年底,微軟在 Connect 開發人員大會上宣布了一系列展望,其中就有一個是 Visual Studio “通用平台”(跨平台開發)的進程,在這裡,Xamarin 開始走入更多人的視野裡。之後,微軟在開源的道路上不斷前行,同時,也不停地打磨 Windows 10 和 Visual Studio,終於將在 2015 年夏,正式推出 Windows 10 、Visual Studio 2015 等一系列軟體;而今,Visual Studio 2015 已搶先發布了 RTM 版。
2.2 破解背景
- 首先,本人懶,每個平台都學一門新的語言,我累,而且吃了太多文法糖,對 Java 等不怎麼中意;
- 其次,Xamarin 免費版功能限制太多,試用版就一個月;
- 第三,網上的破解都太過陳舊;
- 最最重要的是,正版授權費對個人而言太貴了。
本文將以 Visual Studio 2015 RTM 版帶的 Xamarin for Visual Studio 3.11.372 為說明藍本,以 Xamarin.Android 為說明對象,介紹 Xamarin for Visual Studio 的破解思路。
三、前期準備
破解之前,我們應該裝備有以下武器,為我們的破解之路掃清障礙(這裡預設對這些工具都會簡單的操作,本文不會展開如何使用;若對某些工具不熟悉,建議到相關網站查看操作,基本都很簡單,差不多一看就會;建議使用正版軟體,Reflector 和 IDA Pro 等的破解請自行尋找):
- Visual Studio 2010+ 或 Xamarin Studio
- 一份各項安裝完備的 Xamarin
- 一款反編譯軟體,ILSpy 或 Reflector
- Reflexil 外掛程式,一般選擇相應“AIO”版本(All-in-One?我猜的)
- IDA Pro
- @BinSys 寫的 IDA 外掛程式
- Mono(非必要)
- Process Explorer (非必要)
- 抓包工具(非必要)
四、破解思路 4.1 大概運行一遍正版的流程,確認相關驗證範圍,在此過程中可抓包 4.1.1 建立一個 Xamarin.Android 項目,如 Blank App,將產生輸出詳細資訊層級設為“詳細”以上;同時可用 Process Explorer 查看 devenv (VS)總共調用了多少 Xamarin 的 dll(預備技能:需知 Visual Studio 外掛程式一般安裝在哪個目錄下)
4.1.2 開啟項目屬性
4.1.3 現直接產生項目,會彈出登入帳號,點擊“取消”,會有錯誤提醒
4.1.4 再次點擊產生,並隨便登入一個帳號後(預設許可權為 Starter),會開始產生。同時,用 Process Explorer 工具查看,產生過程中 devenv (VS)調用了哪些程式,查看所在位置
4.1.5 結論
通過抓包可知,在 Xamarin.Android 產生過程中,不涉及網路驗證,且僅在登入過程中擷取了許可權資訊;通過 Process Explorer 資訊可知,在產生過程中會調用 mandroid.exe,同時能知曉,VS涉及到了 Xamarin 的 dll 有哪幾個。退出 Xamarin 帳號,並關閉Visual Studio,接下來就要枯燥的排除工作了。
4.2 確認授權驗證相關 4.2.1 “站在巨人的肩膀上”
一般來說,破解之前都會搜尋一下是否有人破解過某款軟體,思路如何,需要修改的檔案是哪幾個,我們依樣畫葫蘆……我找不到我看得那個網頁了,記得是一篇 blogspot 的文章,那個確實有說哪裡要搞。
4.2.2 “小子,我看好你哦”
如果沒人搞過,或者思路沒給清楚,那就麻煩多了,一種思路是,把涉及到的 Xamarin dll 都拖到 ILSpy 中,用之前得到的幾個提醒內容,提取關鍵字來“搜尋字串”,如 Enterprise 或 Starter 等,這裡我們以 Enterprise 為例。
然後,不斷分析這兩個方法以及內容以及各引用,可以判斷用 XamarinEdition 來指示 Xamarin 的許可權。
接著,就來分析 XamarinEdition 被哪些調用了,再不斷分析這些調用,大概就能確定一般情況下大都最終都會調用 XamarinEntitlements 類。
用 Reflexil 修改 XamarinEntitlements 類,因為 set 為私人,所以用 C# 一般直接產生不了,切換到 IL,改 IL,修改完畢後,請記得 Update ILSpy object model(ILSpy能立即更新顯示,以前Reflector是不能的,不知道現在如何)。
細節方面,自己改,你可以把set清空,把欄位也刪了,這樣也順便把自訂Attribute也刪了,當然不僅僅是這一個屬性,其他相關屬性一樣的道理,然後全部改完後,點擊“驗證”,沒提示錯誤,就可以直接儲存了,他會提示強簽名什麼的 ,我一般都是選第一個的(需要將sn.exe放到環境變數 PATH 中)。
修改 源檔案以及補丁名稱。
4.3 驗證目前的修改是否正確 4.3.1 重啟 Visual Studio,開啟之前的項目
還是彈出來 Welcome(→_→因為我們之前只是改了許可權,沒改是否登入,忽略)
4.3.2 重建項目,發現可以直接產生了,說明這修改還是有作用的。 4.3.3 現在,開啟項目屬性,我們要來試試,需要 Enterprise 許可權的功能之“打包程式集”。
注意,要在 Release 模式下,勾選“Bundle assemblies into native code”,然後,重建並點擊“Export Android Package”。(Debug 模式下,沒有打包成 apk 這個選項,除非點得是“開始調試”才會自動打包)
然而,它竟然彈出了一個提醒框:
然後,我們可以這個提示錯誤的步驟名為“SignAndroidPackage”,然後,退出Visual Studio,我們要開始硬來了。
4.4 掌握產生驗證入口 4.4.1 搜尋 “SignAndroidPackage”,分析相關方法 4.4.2 對函數過程不斷分析,縮小範圍,然後得到 IServiceProvider、XamarinAndroidPackage 之類的一系列東西,最終得到 mandroid.exe(一般我都是用 Process Explorer 直接看是否調用了其他東西)
4.5 分析 mandroid.exe
沒啥好說的, 我水平有限,具體分析請閱讀,@BinSys 寫的系列文章
- MonoTouch 二三事(一)
- MonoTouch 二三事(二)
- MonoTouch 二三事(三)
4.6 分析 mandroid-win.exe 4.6.1 找到 Main 入口,並分析
4.6.2 用 Reflexil 修改儲存相關資料,並將其壓入mandroid.exe中(可用指令碼、代碼或手動mkbundle),這裡就不展開了 4.7 重新開啟先前的項目,並點擊“Export Android Package”,沒有出錯
現在,我們可以對比一下, 打包與沒打包的區別。
打包:
沒打包:
額,對了,再來看看 Layout:
五、寫在最後
至此,基本的破解算完成了,當然小問題還是有,大多還是細節體驗方面,Log 輸出不一致,帳號要登入(不登入的話每次都彈 Welcome 覺得不爽)。而對於 Xamarin.IOS 來說,涉及的範圍更大。
PS:使用 Xamarin,還是要學習相關平台的知識,只是降低了語言成本罷了。
Xamarin for Visual Studio 破解日誌