一、相關聲明
- 本文涉及的 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 寫的系列文章
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,還是要學習相關平台的知識,只是降低了語言成本罷了。