簡單的逆向破解過程

0x0 定位dex脫殼

反編譯之後,可以很明顯的發現源碼的Dex已經殼文件代替,主代碼被加密隱藏了起來。分析殼的代碼,DexClassLoader加載的形式:


那應該說明Dex是被整體加密或者隱藏了。通過分析本地文件,壓縮格式打開Assets文件夾下的he.jar包含了原來的Dex文件:


那麼,只需將he.jar中的classes.dex拖出來,替換到原來的apk中,再反編譯即可得到全部的源碼。
可能有些童靴比較草率,拿到Dex反編譯得到全部Smail以後,就直接刪除掉了清單文件中Application的android:name屬性,以至於回編、安裝測試的時候,程序閃退報錯:


額,致命錯誤,無法查找原因..其實,一般情況下會報Unable加載某個類的錯誤。原因是沒有考慮到源代碼中會有Application類的情況。修復方法是在Smali代碼中搜索“.super Landroid/app/Application;”,將其所在的類名替換掉原來的殼的類名。<開心消消樂>修改之後也就變成了:
<application android:debuggable="false"… android:name="com.happyelements.AndroidAnimal.MainApplication">

所謂的脫殼至此完成..


0x1 去簽名校驗

其實有一段時間,<開心消消樂>免費的破解版本都是比較少的,一方面它的簽名校驗放在加密的lua腳本里,破解技術要求比較高;更大一方面,很多會lua腳本解密的大牛都不動國內遊戲的,就Z大出手了一次。我這次磨出來的去驗證方法就對技術的要求低了哈哈~~高的我也不會o(╯□╰)o~~去校驗主要用了兩個關鍵點:


1.Hook本身的簽名信息

這個就很簡單啊,使用的是飄雲閣大神空道的Hook本身簽名的現成手法。不過需要注意的是添加的類要足夠多,我用這個方法的時候就是在儘量多的類裏面添加引用Hook的so,比較重要的有:Application、主Acitivity、主Activity繼承的所有類、getActivity方法所在的類、getContext方法所在類等等。<開心消消樂>需要添加的類有:
Lcom/happyelements/AndroidAnimal/MainApplication;、Lcom/happyelements/hellolua/MainActivity;
Lcom/happyelements/android/BaseActivity;
Lorg/cocos2dx/lib/Cocos2dxActivity;等等,

宜多不宜少啊..當然這是比較笨、無腦、怕出錯的做法咯..


2.驗證包路徑轉向

通過測試發現,只單純的使用空道的手段,遊戲仍然會提示“不是合法版本”。其實我也糾結了很久,最後才蒙出來繞過的方法。
見:http://blog.csdn.net/zihao2012/article/details/39891547
在Smali代碼中搜索sourceDir 和 getPackageCode,在可能會影響校驗結果的地方,將路徑指向正版包的SD卡路徑即可。


0x2 破除QQ和新浪的登錄接口限制

一般來說,一個程序要想支持QQ和新浪微博的接口登錄,都必須事先將自己簽名的MD5放到接口的後臺官網來申請登錄SDK,如果簽名不一致則拒接登錄,所以要解除它們的登錄限制就在反編譯的SDK的Smali文件中,讓它讀取正版包的簽名信息。具體的怎麼做用一張圖片來簡單的說明一下吧:


0x3 內購破解

我實現的方式是將IMSI轉向電信接口,然後就無支付窗口直接成功了。詳見:

http://blog.csdn.net/zihao2012/article/details/39693333


0x4 消費限額的去除

當時我記得好像是通過LogCat信息看出來每日消費的限額是在加密的lua腳本中寫的,一開始還覺得無能爲力,當我看了它的本地儲存文件時,看到了希望:

 


6050860..什麼的,很明顯是我隨機過的咯 沒隨機之前貌似是IMSI之類的東西。所以出現“每日限額“的提示時,重新打開遊戲就好了。


0x5 驗證包的處理

驗證包就是路徑指向的正版包,上面在sourceDir 和 破除接口登錄限制的時候,都提到了將路徑指向SD卡中的正版包。對於追求完美的人來說,破解還要再附帶一個膿腫的正版包一定是很不爽的。有一個參考的方案就是:


1.刪減文件,優化驗證包大小。

比如如果驗證包的作用只是獲取正版的簽名信息,那就只保留META-INF和

AndroidMainfest.xml文件,其他的刪除;如果驗證包的作用是驗證classes.dex的有效性,那就只保留其中的classes.dex和AndroidMainfest.xml文件等等。


2.將驗證包放到Assets。

將已經刪減的驗證包放在Assets文件下,在程序主Activity的onCreate()方法中添加一段將其複製到指定的目錄下,驗證時直接指向該目錄即可。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章