cocos2d-LUA逆向之用idaPro除錯so庫獲取xxtea解密key
其中,lib目錄含有我們需要除錯的so庫檔案,檔名一般是libcocos2dlua.so或帶有cocos字樣,當然也有例外,我們需要破解的這個app就有些不一樣,名字為libgame.so,不論名字如何變化,拖到idaPro中便知是否用的cocos2dlua框架了。assets目錄中含有lua加密指令碼及資源。
動態除錯app,需要準備app執行環境,真機或模擬器,不建議用模擬器,坑太多,我試用過幾個模擬器(雷電、天天、mumu)進行除錯環境的搭建幾乎都是失敗的,但是安卓官方模擬器是可以的(有幾次是成功的,也有失敗的),需要安裝Android-sdk、Android-ndk,但是速度非常慢,所以建議直接上真機,真機需要root許可權。
接下來,需要下載adb Android除錯工具 並將其加入path變數,手機通過usb連線後,可通過adb命令操作手機,開啟cmd,輸入adb即可看到幫助命令:
找到電腦idaPro的安裝路徑中android_server檔案,用adb將其拷貝至手機並賦權:
如果程式執行後附加程序調式,需要手機端執行idaPro的 android_server,並 用adb將埠對映至電腦,如果電腦與手機在同一區域網內,則可不用對映。如下圖:
idaPro遠端除錯附加程序:
如果是區域網內除錯,沒有用到adb forward對映,則將ip地址換成你手機ip地址:
然後,在模組檢視中選擇要除錯下斷的模組,這裡是libgame.so,下面的程式記憶體檢視可以選擇與上面的反彙編檢視同步:
有的app破解時,需要在程式入口處就除錯,則要多做一些操作,網上大多是先需要以下幾個步驟:首先確保apk內的mainframexml檔案的application節點的android:debuggable屬性值為1,這就需要將apk先反編,修改值之後再編譯進去,並找到app的包名及入口函式,以上這些可以用有現成的工具,當也可以用命令(eg:檢視aapt dump xmltree dashen.apk AndroidManifest.xml >manifest.xml 回編譯:java -jar apktool.jar b -d out -o dashen.apk);之後需要以除錯模式開啟app(adb shell am start -D -ncom.yaotong.crackme/.MainActivity),手機會出現除錯介面:
此時,程式停在程式入口,之後用idapro附加除錯,然後用jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700通知程式繼續執行,idapro這邊就可以繼續除錯了。
這裡提供另一種方法,將Android 根目錄下的default.prop的ro.debuggable設定為1(getprop、setprop),強制所有app都可以進行除錯,這樣就不用修改app並重新打包了。這裡要說明一點,jdbconnect失敗時,如圖所示:
有說是apk android:debuggable屬性的原因,我這邊測試,其真正的原因應該是沒有開啟DDMS(DalvikDebug Monitor Service)虛擬機器除錯監控服務,埠號8700是其預設服務埠號,服務不開當然連不上VM,所以需要開啟DDMS,Android sdk tools目錄下有開啟DDMS的指令碼,我們開啟DDMS:
我們要除錯的程序埠號有8626/8700,所以我們用jdb連線這兩個任一埠都是可以的。
除錯過程中,還需要注意一點,要關閉SELinux,setenforce 0
idaPro除錯就說到這裡,接下來我們利用idaPro破解大神app,大神app是基於cocos2dlua,cocos2dlua用的xxtea加密,我們可以下載原始碼,用vs開啟:
我們在vs中,Shift+F12追蹤xxtea_decrypt的呼叫:
可以看到一個是在luaLoadChunksFromZIP中:
從函式名,我們應該可以猜到一個是在解壓zip檔案是進行解密,一個是在解壓字串buffer是解密,這個我們不討論,我們只須在這兩個函式下斷,在函式呼叫xxtea_decrypt時即可破解xxtea解密用的key,現在我們已經知道破解大神app的關鍵了,就是xxtea_decrypt及直接相關的luaLoadBuffer、luaLoadChunksFromZIP函式。
接下來,我們來看大神apk,解壓大神apk,將lib目錄下的libgame.so拖拽至idaPro開啟:
一般cocos2dluaapp不對xxtea加密強化的話,有一種取巧獲取xxtea解密key的方法,按照網上說的,直接開啟加密的lua檔案,得到sign,然後開啟idaPro的string檢視,搜尋sign,雙擊進去,在sign附近會有xxtea的key,可以試出來,網上有詳細的步驟,在此我們就不再多述。我們破解的大神app是經過安全優化的,上面的方法不適用。
繼續,剛才我們看cocos2d原始碼瞭解到破解大神app的突破口函式xxtea_decrypt及直接相關的luaLoadBuffer、luaLoadChunksFromZIP,我們在idaPro中檢視函式匯出表,確認函式名是否與原始碼中一致。匯出表如下:
沒有與xxtea相關的匯出函式。我們再搜LoadChunk:
發現也沒有,進一步確認是經過安全優化的,我們在來看loadbuf:
我們看到有三個,很明顯第一個與我們在原始碼中看到的那個長得像:
我們在前面瞭解到,luaLoadBuffer這個函式會呼叫xxtea_decrypt來解密指令碼,雖然這個app經過安全優化,已經看不到xxtea_decrypt函式名了,但是必然會有與xxtea_decrypt等效的解密函式,我們F5反編譯,進去詳細看看:
很明顯_byds_d_就是我們要找的與xxtea_decrypt等效的加密函式,我們在進_byds_d_函式看,
再結合coco2dlua原始碼看一下xxtea_decrypt函式原始碼:
很顯然,函式體效果是相同的,至此,我們已經確定下除錯app時突破口:_byds_d_、luaLoadBuffer,在動態除錯時,在這兩個函式下斷,不出意外的話,應該是能得到破解xxtea的key的。我們知道在cocos2dlua中,與app互動主要考lua,lua執行時載入,所以,手機端執行app後直接附加除錯即可。
依照前面所講,用idaPro對大神app程序(com.qipai.n1)附加除錯,並在modules視窗搜尋libgame模組:
雙擊進入,會顯示此模組內的函式表,搜尋luaLoadBuffer、_byds_d_:
分別點進去下斷,並設定記憶體視窗與程式視窗同步:
然後手機端操作程式,我們來看,_byds_d_的實參值:
我們知道函式的第三個引數即a3是我們要的key值,而c++呼叫規範中,引數是從右至左,暫存器R2就是存放我們key的地方,我們看到R2是一個記憶體地址,所以我們需要檢視R2所代表的記憶體去看值。其實我們把滑鼠放在R2上會自動出現其記憶體中存放的值,但是不全,所以我們通過記憶體視窗同步到R2,即可檢視R2地址處的值了:
至此,我們已經將xxtea解密lua指令碼的key獲取到了,可以用xxtea解密演算法解密lua指令碼了。
轉載連結:http://www.freebuf.com/column/173217.html