(1)在IDA的安裝路徑中找到android_server文件。

(2)將android_server拷貝到手機(jī)的/data/local/tmp目錄下面。

(3) 將手機(jī)插上電腦,打開(kāi)命令提示符,
先輸入”adb shell”,然后輸入”su root”獲取root權(quán)限。
接著輸入” chmod 777 /data/local/tmp/android_server” 給android_server加上相應(yīng)的權(quán)限。
接著輸入” /data/local/tmp/android_server”啟動(dòng)android_server。
如下圖所示:

(4)重新打開(kāi)一個(gè)命令提示符,
輸入”adb forward tcp:23946 tcp:23946”進(jìn)行tcp端口轉(zhuǎn)發(fā)

(5)adb root模式下執(zhí)行” am start -D -n com.example.testjniso/com.example.testjniso.MainActivity”
命令,啟動(dòng)所要調(diào)試的Activity。

app會(huì)彈出”Waitting for debugger”對(duì)話框,如下圖所示:

(6)啟動(dòng)ida pro,點(diǎn)擊”Debugger - > Attach -> Remote ArmLinux/Androiddebugger”,會(huì)看到以下對(duì)話框:

點(diǎn)擊”Debug options”按鈕,在”Suspend on process entry point”, ”Suspend on thread start/exit”, ”Suspend on library load/unload” 等選項(xiàng)的前面打上勾,如下圖所示:

點(diǎn)擊”ok”后會(huì)在以下對(duì)話框的hostname中填上”localhost”

在彈出的”Choose process to attach to”窗口中找到”com.example.testjniso”進(jìn)程,選中該進(jìn)程,然后點(diǎn)擊”ok”按鈕。

(7)打開(kāi)eclipse ddms在Devices窗口中可以看到以下內(nèi)容:

其中可以看到com.example.testjniso進(jìn)程的端口為8700。
(8)打開(kāi)命令提示符,輸入以下命令:jdb -connect com.sun.jdi.SocketAttach:port=8700,hostname=localhost
如下圖所示:

(9)點(diǎn)擊ida中的繼續(xù)執(zhí)行按鈕,下圖中的綠色三角形按鈕(或者按F9)。

在ida彈出的”Add map”窗口中,一律點(diǎn)擊”Cancle”按鈕。

(10)點(diǎn)擊app中的”點(diǎn)擊加載so文件”按鈕,確保so文件已經(jīng)加載到了手機(jī)內(nèi)存中。點(diǎn)擊ida中的”Debugger -> Debugger windows -> Module list ”。在”Modules”窗口中找到libTestJni.so

點(diǎn)擊ida中的暫停調(diào)試按鈕,暫停當(dāng)前的調(diào)試,如下圖所示:

右擊libTestJniSo.so文件,在彈出的框中點(diǎn)擊”Jump to module base”,跳轉(zhuǎn)到libTestJniSo.so文件的起始地址。
按下Alt+T,彈出查找對(duì)話框中輸入” Java_com_example_testjniso_MainActivity_helloFromJni” 如下圖所示:

點(diǎn)擊”ok”按鈕后,即可跳轉(zhuǎn)到 Java_com_example_testjniso_MainActivity_helloFromJni 函數(shù)所在的起始地址。
然后在地址處下斷點(diǎn):

再按F9重新開(kāi)始調(diào)試,點(diǎn)擊app中的”點(diǎn)擊加載so文件”按鈕重新加載libTestJniSo.so,即可看到程序成功地停在了斷點(diǎn)處:

到此處就可以正常地調(diào)試so文件了。
作者:會(huì)飛的大象_
鏈接:http://www.itdecent.cn/p/d2d28920940c
來(lái)源:簡(jiǎn)書(shū)
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
在android 5.0下,不能執(zhí)行android_server
Linker是什么?
Linker就是/system/lib/linker,它是進(jìn)程啟動(dòng)時(shí)第一個(gè)加載的模塊,它負(fù)責(zé)管理elf可執(zhí)行文件以及各個(gè)so文件的加載執(zhí)行,還參與了調(diào)試的一些東西。通俗地說(shuō),它是一個(gè)elf文件的解釋器。它可以加載elf可執(zhí)行文件及so動(dòng)態(tài)庫(kù)。
在android 5.0下,不能執(zhí)行android_server是因?yàn)閍ndroid5.0自帶的linker不支持加載非pie的elf文件,但如果自己實(shí)現(xiàn)一個(gè)可以加載pie的linker,不就可以解決這個(gè)問(wèn)題了嗎?對(duì)的,就是醬紫,補(bǔ)上自己的自定義linker在附件.
https://bbs.pediy.com/thread-206084.htm
