跟著鬼哥學so修改,二,進行篇,so
圖/文 聽鬼哥說故事
繼續上文的內容----------------------------------
0x1:測試檔案的編寫
經過上一篇文章的基礎學習,現在我們開始進行是用的部分。
既然我們可以在so中定義String字串了,那麼我們當然也可以定義int類型的資料了,那麼,我們在此定義一個getCoin方法,返回值為int類型。如下:
JNIEXPORT jint JNICALL Java_com_ggndktest1_JniGg_getCoin
(JNIEnv * env, jobject this)
{
int c=100;
return c;
}
同時編寫java代碼:
static public native int getCoin();
這兩個方法的添加,可以繼續在我們上一篇文章的基礎上進行補充即可,當然,為了熟練建立ndk工程,也可以重新建立工程的。
然後我們在shell下切換到工程根目錄:
這樣成功產生so檔案。
然後我們簡單在xml定義下布局,簡單的,直接在layout下
<TextView
android:id="@+id/coin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="" />
添加一個TextView,設定id為coin,然後就可以在主類進行引用。
這樣我們運行一下程式,查看一下效果。
0x2:任務明確
我們現在需要做一個任務,就是修改上文程式中的金幣數量。
我們直接在工程的bin目錄下拿出來未簽名的apk,分析時可以先不管簽名,我們把lib/armeabi下的so檔案拿出來,拖進IDA進行分析。
0x3:掛起IDA,進行分析
(假設,當前我們的狀態是不知道程式源碼)
通過上文啟動並執行,我們可以分析到,有關鍵字“Current Coin ”,我們在對反編譯後的程式分析搜尋,發現只存在於so檔案中,這樣,我們就直接在IDA中搜尋字串去。
快速鍵 Shift + F12
找到它的引用
這個沒啥好解釋的,載入字串而已,沒啥重要訊息,發現不出來金幣在哪裡定義了,那麼我們就看下引用。
發現在so檔案中,並沒有函數對此方法進行調用,那麼我們就返回java中,看看java語句中是怎麼對它進行的調用,其上下文都是什麼東西。
經過查看printhello方法在JniGg.smali中是定義,在MainActivity是調用,我們詳細看下代碼:
貼上簡單的說明,大家就可以看的清楚了。
我們在這裡發現一個關鍵函數,getCoin方法,通過向上追尋,發現也是在so檔案中的,那麼現在我們再次回到IDA中:
在Options開啟General,也就是第一個選項,設定如下:
然後我們可以看到:
這個是Thumb的指令,那麼我們修改,也要使用Thumb。
一個位元組來定義數值,我們只能用最大ff了,即255,那麼在16進位編輯器開啟,跳轉到c04的位置,修改為FF 20,然後放回程式,簽名,運行。
好了,說明我們的修改成功。
0x4:反思一下
既然我們是自己寫的源碼,那麼我們就可以很好的來對比思考了,這個過程留給同學們自己來思考,請花上10分鐘時間,對比一下代碼裡面編寫的方法,與在so中反組譯碼的代碼的聯絡,增強一下熟悉的感覺。
另:
上面的apk,還有其他破解方法,即我們找到java層的調用了,那麼直接修改java層調用方法的返回值,效果也一樣,可以修改為無限大的數值。
相關附件地址:
http://pan.baidu.com/s/1i3wzetf
文章同時也交由www.pd521.com 首發,轉載請註明出處。