關(guān)于NDK開發(fā)的入門,這里有一篇我剛開始做NDK開發(fā)和逆向相關(guān)工作時(shí)候的總結(jié),現(xiàn)在看,相比一些水文還是有一丟丟的內(nèi)容的。關(guān)于編譯的入門就說這么多,下面講一點(diǎn)補(bǔ)充的內(nèi)容。
1、關(guān)于線上native的崩潰捕獲:
這一部分原理性的知識(shí)可以看下騰訊bugly的思路。主要是利用linux提供的系統(tǒng)調(diào)用sigaction對(duì)崩潰signal進(jìn)行處理。我們自己的應(yīng)用也是接入的bugly,不論是提供的服務(wù),還是適配性、穩(wěn)定性都是非常好的。
這里把實(shí)現(xiàn)中遇到的問題簡單描述一下:
a、關(guān)于unwind 可以參考這篇文章的實(shí)現(xiàn)。
b、如果崩潰的位置是java層調(diào)用下來的,則java層和native層的線程是同一個(gè),都是linux系統(tǒng)提供的。
c、關(guān)于打印出對(duì)應(yīng)java堆棧,可以嘗試使用setjmp()保存可靠的java環(huán)境信息,然后調(diào)用longjmp(),最后利用jni回調(diào)java層來打印堆棧的方式,我做了嘗試是可行的。
其實(shí)把這部分做的穩(wěn)定,并且適配性很好是非常難的。
2、關(guān)于native的hook:
主要介紹PLT hook,同樣這部分的原理性內(nèi)容可以看愛奇藝的技術(shù)分享,這一部分的內(nèi)容可以參考文章開始提供的總結(jié),以及利用010edit去打開一個(gè)so來看。這里只做一點(diǎn)補(bǔ)充說明,使用PLT hook只能實(shí)現(xiàn)對(duì)外部調(diào)用的hook,比如libc.so提供的功能的hook,而so內(nèi)部函數(shù)的hook則沒有辦法實(shí)現(xiàn)。這部分內(nèi)容還是相當(dāng)有價(jià)值的,像微信 Android 終端內(nèi)存優(yōu)化實(shí)踐就把PLT hook libc的malloc、free、new、delete等函數(shù)作為檢測native是否有申請了內(nèi)存沒釋放的手段。