常用android的smali注入代码,android smali代码注入 实战一
有同學(xué)在通服里面干活,最近一直忙著4g基站搭建的干活,測試設(shè)備(android)測量移動(dòng)網(wǎng)絡(luò)數(shù)據(jù),沒有自動(dòng)保存記錄的功能,只能手動(dòng)記錄各種測試參數(shù),不知道測試軟件供應(yīng)商是怎樣想的,竟然不提供的這樣的功能! 要我?guī)兔Π褱y試數(shù)據(jù)自動(dòng)導(dǎo)入excel表格中,我硬著頭皮去嘗試下。網(wǎng)上有smali的語法和注入的介紹,但參考價(jià)值不大,分享下自己的smali注入的過程和心得(這里smali語法就不講了)。
案例
1.需求
需要提取數(shù)據(jù)界面如下:
提取數(shù)據(jù)字段信息: 地點(diǎn)address 小區(qū)識(shí)別碼 cellId,區(qū)位碼aresId 信號(hào)強(qiáng)度rx
2.確定應(yīng)用數(shù)據(jù)中是否有需要的數(shù)據(jù)表,導(dǎo)出sqlite數(shù)據(jù)。
1) 手機(jī)沒有root權(quán)限,可以從smali 注入應(yīng)用內(nèi)部復(fù)制dada/data/xxxxx/的目錄文件的功能代碼。
2) ?手機(jī)有root權(quán)限,adb pull /data/data/inet.GDTEL.com/ e:\不成功(沒有權(quán)限),而adb shell中沒有pull,cp指令,當(dāng)然安裝下 busybox ?,先cp到sdcard中去,在pull到 ? ? ?電腦上去,或者通過手機(jī)助手pull電腦中去。
有相應(yīng)的表對(duì)應(yīng)需求數(shù)據(jù)實(shí)體,不必從界面提取,那可以從數(shù)據(jù)庫拿數(shù)據(jù),轉(zhuǎn)化為excel文檔;沒有,則從界面上一個(gè)個(gè)提取數(shù)據(jù),在轉(zhuǎn)excel文檔。
3.打開需要提取的界面,確定界面所在的activity,方法:查看手機(jī)當(dāng)前活動(dòng)activity,adb指令
adb shell dumpsys activity activities | sed -En -e ‘/Running activities/,/Run #0/p‘
查詢結(jié)果如下:
從查詢結(jié)果可以看出 這個(gè)界面所在項(xiàng)目進(jìn)程:inet.GDTEL.com,所在activity:com.wellcell.inet.Cust.CustTestActivity
4.apktool 反編譯apk,確定所需數(shù)據(jù)的數(shù)據(jù)來源
1)進(jìn)入com.wellcell.inet.Cust.CustTestActivity,搜索onCreate ,setContentView,確定layout.xml
比如:
.line 100
const v0, 0x7f03000f //layoutId
invoke-virtual {p0, v0}, Lcom/wellcell/inet/Cust/CustTestActivity;->setContentView(I)V
根據(jù)layoutId,在R(不存在的話,把反編譯的文件導(dǎo)入eclipse中,不管有沒有錯(cuò),運(yùn)行這個(gè)工程之后就生成R類,根據(jù)這個(gè)R類,可能有問題,我測試了,沒有問題)類中搜索 ? ? ? ? ?layouId對(duì)應(yīng)的layout.xml。
2)在eclipse中查看layout.xml界面,確定所需數(shù)據(jù)所在的控件的id name,再在R類中查詢控件id的具體數(shù)值。
3)在所在activity或者fragment中根據(jù)控件id確定控件的屬性名稱比如
4)根據(jù)控件名稱確定數(shù)據(jù)來源,搜索m_txLacGsm,setText
可知cellId,lacId來自TelStrengthInfo實(shí)體,其他數(shù)據(jù)類推。
5.注入代碼
1)注入代碼實(shí)現(xiàn):
方法1:直接根據(jù)smali語法寫注入的代碼
方法2:先按照注入的項(xiàng)目包名新建工程,根據(jù)注入的類名命名類,編寫注入功能的模塊代碼,并測試,然后反編譯apk,從smali文件的拷貝代碼到注入點(diǎn),再apktool打包即使對(duì)smali語法不行,也可以勝任.
2)常見錯(cuò)誤:
1.類的包名不對(duì)
比如:包命名混亂的時(shí)候就容易犯錯(cuò)
2.打包時(shí),屬性忘記申明定義
3. .line 行數(shù)(方法調(diào)用在java文件所在行數(shù)) 有重復(fù)
4.引用三方j(luò)ar包或者添加新類,忘記拷貝到反編譯項(xiàng)目中去。
6.smali調(diào)試
smali調(diào)試是個(gè)蛋疼的事,即使注入的代碼出問題了也不出崩潰。
調(diào)試方法:
1)通過eclipse 調(diào)試smali。過程好像比較麻煩,嘗試了下,會(huì)出現(xiàn)各種問題,jdk版本問題,遠(yuǎn)程jvm拒絕鏈接等,可能跟開發(fā)環(huán)境有關(guān)系。
2)通過強(qiáng)大的adb 功能,解決運(yùn)行時(shí)錯(cuò)誤,常用的三種方法,VFY的信息會(huì)給出Smali代碼出錯(cuò)的文件、函數(shù)以及錯(cuò)誤原因,dalvikvm的信息可以給出調(diào)用棧,以及上下文執(zhí)行過 ?程。
adb logcat > e:\log.txt | grep inet.GOTEL.com
adb logcat > e:\log.txt | grep dalvikvm
adb logcat > e:\log.txt | grep VFY
比如使用 adb logcat > e:\log.txt | grep inet.GOTEL.com
3)在注入點(diǎn)通常加入log,追蹤代碼路徑,和方法參數(shù),執(zhí)行結(jié)果等。
7.注入建議
1)盡量在注入點(diǎn),以函數(shù)調(diào)用一行代碼注入,且把注入的函數(shù)實(shí)現(xiàn)放在走后面,避免對(duì)其他原有代碼 .line 有影響。
2)把注入代碼封裝的成類,避免注入的時(shí)候,要手動(dòng)修改很多的.line。
參考網(wǎng)址:
原文:http://www.cnblogs.com/sihaixuan/p/4372625.html
總結(jié)
以上是生活随笔為你收集整理的常用android的smali注入代码,android smali代码注入 实战一的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android videoview属性,
- 下一篇: android 手动签名apk,记录手动