跟着鬼哥學so修改,四,實例第一篇

跟着鬼哥學so修改,四,實例第一篇

圖/文  聽鬼哥說故事


---------------------------------------------分割線--------------------------------------------



這篇文章是前段時間的文章,最近這個系列的so分析剛好可以做爲一個實例教程,所以就補充拿回來了。

前三篇沒看的,請繼續關注博客,看完前面三篇。


趁熱打鐵,加深對so的分析過程,於是就有了這篇文章的補充························

另,此文章需要對android反編譯逆向有一定基礎,簡單瞭解so的作用,有任何疑惑,可去羣裏和論壇或自行google搜索解決。


文章受www.pd521.com 站長邀請,首發在其論壇,大家可以過去關注,很多基礎資料,方便新手學習。



請大家自己動手去練習!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!



---------------------------------------------分割線--------------------------------------------



今天我們來分析的是小黃人快跑,小黃人的形象從電影上面一直都蠻好的,現在都拍到了第二部了,所以我們找到這個遊戲來進行分析。



第一層次分析:


拿到遊戲,首先我們得先安裝看看有什麼地方是值得破解的。

通過觀察,我們發現遊戲中主要的消費方式在香蕉和金幣上面,既然這樣,那麼我們就先看看支付上面是否可以直接破解內購。購買截圖如下圖所示:





和遊戲支付的方式,那麼就查詢相關資料,例如以前我的教程中對onPayFailed方法的修改,對onBillingFinish方法的修改,在這裏可能是對移動支付進行了升級,沒法直接那樣操作。既然這樣,那麼我們就查看下Logcat,看看有無有價值的信息。



通過多次測試,我們發現在點擊進入遊戲支付的時候有這行輸出,那麼好,我們就跟進觀察這行代碼,這行代碼後面肯定是啓動支付流程的相關代碼。





對於smali代碼不熟悉的同學,那麼直接使用jd-gui打開jar文件查看吧,如下:




搜索找到我們發現的特徵字符,如下:



搜索找到我們發現的特徵字符,如下:




我們可以發現,doBilling方法,按照名稱來想,我們也感覺就是購買的時候使用的,所以我們追尋它去。
全文搜索doBilling效果不太理想,所以我們可以直接找GameInterface這個類的相關調用方式了。




好了,到了這個類,根據接口名稱,我們可以猜到,這個是支付的回調函數。回調函數的意思,也就是判斷是否支付了,然後返回相關數據,由其他算法來進行香蕉或金幣數量的增加。

Game.nativeBillingDone,看到這個native方法,我們就需要對so文件進行分析操作了,我們找到Game類,看看是調用的哪個so文件,搜索system.loadlibrary



曉得了so的名稱,那麼我們就掛起idajava可以直接調用使用的肯定都是export導出函數,所以我們在export中搜索nativeBillingDone:




然後看到這個方法:




B是調用方法的意思,這裏調用addCash方法,所以我們更清楚的明白,這個就是增加金幣阿,名字都這麼通俗易懂了,再猜不到就對不起人家作者了。

先大致瀏覽一下方法是幹什麼的:






好,大致看懂第一段代碼後,我們往下翻翻:





通過圖片中的文字說明,我們也簡單能夠明白,我們需要做的,就是先測試一下,將這個addcash(int)方法的傳入參數設置爲8會怎麼樣,是不是會增加金幣。所以我們回到最初分析的時候,看這裏:






通過圖片中的文字說明,我們也簡單能夠明白,我們需要做的,就是先測試一下,將這個addcash(int)方法的傳入參數設置爲8會怎麼樣,是不是會增加金幣。所以我們回到最初分析的時候,看這裏:






阿門,感謝作者,看到這行輸出,這個是我們點擊支付界面的返回按鈕產生的,因爲支付過程中會將遊戲聲音暫停,所以纔會產生這個情況,方便開發者觀察數據。

起來,我們是可以通過自己在主類Game.smali中自己尋找其他地方的,能看到log只是更加方便了我們的分析速度而已,我們手動尋找代碼也是可以的。所以沒有發現log,只是在時間上面花費會多一點,其他影響是不大的。
好,那麼我們就直接找到這行log的打印地方,在它上面調用nativeBillingDone方法:




第一行,設置v1=8,第二行,調用我自己的方法打印int數據看是否賦值成功,同學們可以忽略掉的,第三行調用natveBillingDone方法。

然後回編譯,打包測試.....................
發現初始化金幣真的爲18888,然後點擊商店,支付頁面,按返回鍵:




好了,到了這裏,我們的第一層次的目的就完成了。

需要說明的是,IDA的使用,同學們自己查資料,ARM語法,自己查資料即可,網上有很多教程的,自己動手,掌握更深入。



第二層次分析:


進行完第一層次分析後,我們知道已經分析對了位置。So文件中的算法也找對了,那麼,我們初始化多增加點金幣多好,於是,我們繼續開始分析




關鍵點就在addcash方法中的這一行對R1複製的代碼上面,我們打開16進制看一眼:





只有四個字節,通過這4個字節實現將18888賦值給R1,4個字節最大的數字爲0xffff,要看這個函數接收的是無符號,還是有符號類型的int16,現在最大數值可能就是0xffff對應換算到十進制爲65535
好,那麼我們就看看怎麼來修改數據吧,立即數,我們就可以直接操作修改字節了。
C8 19 04 E3  ,這行代碼原本爲MOV R1, #0x49C8
關於指令命令本人也不太熟悉,所以直接慢慢試着改一下






因爲那個本身的立即數,通過觀察發現原本的指令剛好反過來爲E3 04 19 C8  ,那麼對照0x49C8,我直接修改爲如上圖所示:






發現直接修改成功了,好了,這樣就更給力了,我們直接使用010Editor或者UE,操作so文件



前面藍色部分爲內存地址,我們使用ctrl + g 命令跳轉地址,直接對應修改這四個字節碼即可。
然後重新打包,測試。。
結果自己可以看到,一切正常,初始化65535。。
支付頁面,返回,增加金幣。。


我們這次測試的是香蕉的增加方式,所以還有金幣的增加噢,這個就留給感興趣的同學們自己嘗試了,自己動手,多多練習~~~
此文僅供交流,請勿做其他商業使用。。

排版看的不舒服的,直接看文檔即可,相關附件地址:

鏈接:http://pan.baidu.com/s/1eQILJkI 密碼:7kyr



其實此遊戲還有很多方式去破解的,這裏只是介紹一兩種而已,大家可以自行補充~


轉載請註明出處~~~~~~~~~~






發佈了61 篇原創文章 · 獲贊 16 · 訪問量 31萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章