您好,登錄后才能下訂單哦!
LUA逆向中如何用idaPro調試so庫獲取xxtea解密key,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
首先我們需要獲取apk里面的腳本資源,可以直接用360好壓解壓縮apk安裝包,會得到如下目錄:
其中,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將端口映射至電腦,如果電腦與手機在同一局域網內,則可不用映射。如下圖:
手機端運行大神app :
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中:
一個是在luaLoadBuffer中:
從函數名,我們應該可以猜到一個是在解壓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解密l的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。