android逆向手冊-idapro其它指令_第1頁
android逆向手冊-idapro其它指令_第2頁
android逆向手冊-idapro其它指令_第3頁
android逆向手冊-idapro其它指令_第4頁
android逆向手冊-idapro其它指令_第5頁
已閱讀5頁,還剩125頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

其它指令自行腦補(bǔ)去,可以參考Addison

Wesley

-

ARM

Architecture

ReferenceManual

(2nd

Edition)IDA

PRO使用IDA

Pro

靜態(tài)分析Android

程序摘至《Android

安全與逆向分析》http

.cn/article/26962如何操作以5.2節(jié)的crackme0502.apk為例,首先解壓出classes.dex文件,然后打開IDAPro,將classes.dex拖放到IDAPro的主窗口,會彈出加載新文件框,如圖5-4所示,IDA

Pro解析出了該文件屬于“Android

DEX

File”,保持默認(rèn)的選項,點擊OK按鈕,稍等片刻IDAPro就會分析完dex文件。圖5-4使用IDAPro加載classes.dex文件IDA

Pro支持結(jié)構(gòu)化形式顯示數(shù)據(jù)結(jié)構(gòu),因此,

有必要先整理一下反匯編后的數(shù)據(jù)。dex

文件的數(shù)據(jù)結(jié)構(gòu)大部分在

Android

系統(tǒng)源碼中

dalvik\libdex\DexFile.h

文件中,筆者將其中的結(jié)構(gòu)整理為

dex.idc

,在分析

dex

文件時直接導(dǎo)入即可使用。導(dǎo)入的方法為

點擊

IDA

Pro

的菜單項“File→Script

file”,然后選擇

dex.idc

即可。點擊

IDA

Pro

主界面的

Structures

選項

卡,如圖

5-5

所示。[+]查看原圖圖

5-5

導(dǎo)入

dex.idc點擊IDAView-A選項卡,回到反匯編代碼界面,然后點擊菜單項“Jump→Jumptoaddress”,或者按下快捷鍵G,彈出地址跳轉(zhuǎn)框,輸入

0

IDA

Pro

跳轉(zhuǎn)到

dex

文件開頭。將鼠標(biāo)定位到注釋“#

Segment

type:

Pure

data”所在的行,然后點擊菜單項“Edit→Structs→Structvar”,或者按下快捷鍵

ALT+Q,彈出選擇結(jié)構(gòu)類型

框,如圖

5-6

所示,選擇

DexHeader

后點擊

OK按鈕返回。此時,dex文件開頭的0x70個字節(jié)就會格式化顯示,效果如圖5-7所示。同樣,讀者可以手動對dex文件中其它的結(jié)構(gòu)進(jìn)行整理,如DexHeader下面的DexStringId結(jié)構(gòu)。圖5-6選擇結(jié)構(gòu)類型[+]查看原圖圖

5-7

格式化后的

DexHeader

結(jié)構(gòu)點擊菜單項“Jump→Jump

to

segment”,或者按下快捷鍵

CTRL+S,彈出段選擇

框,如圖

5-8

所示,IDA

Pro

將dex文件一共分成了

9

個段,其中前

7

個段由

DexHeader結(jié)構(gòu)給出,最后

2

個段可以通過計算得出。仔細(xì)查看段名,可以發(fā)現(xiàn)

IDA

Pro

對其命名不是很好,有

3

個HEADER段與

2

個CODE段,筆者覺得第

3個段改名為

PROTOS更合適一些,還有第

6個段改名為

CLASSDEFS

好,IDAPro

為什么這樣命名

不得而知,不過,

需要知道每個段具體所代表的含義。[+]查看原圖圖

5-8

dex

文件的

9

個段dex文件中所有方法可以點擊

Exports選項卡查看。方法

名規(guī)則為“類名.方法名@方法

”。在

Exports

選項卡中隨便選擇一項,如

SimpleCursorAdapter.swapCursor@LL,然后雙擊跳轉(zhuǎn)到相應(yīng)的反匯編代碼處,該處的代碼如下。CODE:0002CFCCCODE:0002CFCCCODE:0002CFCCCODE:0002CFCCCODE:0002CFCCMethod2589(0xa1d):publicandroid.database.Cursorandroid.support.v4.widget.SimpleCursorAdapter.swapCursor(android.database.Cursorp0)

#方法this=v2

#thisCODE:0002CFCCCODE:0002CFCCp0=v3invoke-super#第一個參數(shù){this,p0},<refResourceCursorAdapter.swapCursor(ref)

imp.@_def_ResourceCursorAdapter_swapCursor@LL>CODE:0002CFD2CODE:0002CFD4CODE:0002CFD8move-result-object

v0iget-objectinvoke-directv1,this,SimpleCursorAdapter_mOriginalFrom{this,v1},<voidSimpleCursorAdapter.findColumns(ref)SimpleCursorAdapter_findColumns@VL>CODE:0002CFDECODE:0002CFDECODE:0002CFDECODE:0002CFDElocret:return-objectMethodEndv0IDAPro的反匯編代碼使用

ref

關(guān)鍵字來表示非

Java標(biāo)準(zhǔn)類型的

,如方法第

1行的

invoke-super

指令的前半部分如下。invoke-super {this,

p0},

<refResourceCursorAdapter.swapCursor(ref)前面的ref是swapCursor()方法的返回類型,后面括號中的ref是參數(shù)類型。后半部分的代碼是IDAPro智能識別的。IDA

Pro能智能識別AndroidSDK的API函數(shù)并使用imp關(guān)鍵字標(biāo)識出來,如第1行的invoke-super指令的后半部分如下。imp.@_def_ResourceCursorAdapter_swapCursor@LLimp表明該方法為

AndroidSDK中的

API,@后面的部分為

API的

,類名與方法名之間使用下劃線分隔。IDA

Pro能識別隱式傳遞過來的

this

,在

smali

語法中,使用

p0

寄存器傳遞

this

指針,此處由于

this取代了

p0,所以后面的寄存器命名都依次減了1。IDA

Pro能識別代碼中的循環(huán)、switch分支與Try/Catch結(jié)構(gòu),并能將它們以類似高級語言的結(jié)構(gòu)形式顯示出來,這在分析大型程序時對了解代碼結(jié)構(gòu)有很大的幫助。具體的代碼反匯編效果讀者可以打開5.2節(jié)使用到的SwitchCase.apk與TryCatch.apk的

classes.dex文件自行查看。定位關(guān)鍵代碼——使用

IDA

Pro

進(jìn)行 的實例使用IDAPro定位關(guān)鍵代碼的方法整體上與定位smali關(guān)鍵代碼差不多。第

法是搜索特征字符串。首先按下快捷鍵

CTRL+S打開段選擇

框,雙擊

STRINGS

段跳轉(zhuǎn)到字符串段,然后點擊菜單項“Search→text”,或者按下快捷鍵

ALT+T,打開文本搜索

框,在

String旁邊的文本框中輸入要搜索的字符串后點擊

OK按鈕,稍等片刻就會定位到搜索結(jié)果。不過目前IDA

Pro對中文字符串的顯示與搜索都不支持,如果字符串中的中文字符顯示為亂碼,需要編寫相關(guān)的字符串處理插件來解決,這個工作就交給讀者去完成了。第二種方法是搜索關(guān)鍵API。首先按下快捷鍵CTRL+S打開段選擇框,雙擊第一個CODE段跳轉(zhuǎn)到數(shù)據(jù)起始段,然后點擊菜單項“Search→text”,或者按下快捷鍵ALT+T,打開文本搜索框,在String旁邊的文本框中輸入要搜索的API名稱后點擊OK按鈕,稍等片刻就會定位到搜索結(jié)果。如果API被調(diào)用多次,可以按下快捷鍵CTRL+T來搜索下一項。第三種方法是通過方法名來判斷方法的功能。這種辦法比較笨拙,對于

過的代碼,定位關(guān)鍵代碼比較

。比如,

知道crackme0502.apk

程序的主

Activity類為

MainActivity,于是在

Exports

選項卡頁面上輸入

Main,代碼會自動定位

到以

Main

開頭的所在行,如圖

5-9所示,可粗略判斷出每個方法的作用。圖

5-9

定位

MainActivity下面

來嘗試

一下

crackme0502.apk。首先安裝運(yùn)行

apk

程序,程序運(yùn)行后有兩個按鈕,點擊“獲取注解”按鈕會

Toast彈出3

條信息。在文本框中輸入任何字符串后,點擊“檢測

碼”按鈕,程序彈出 碼錯誤的提示信息。這里

以按鈕事件響應(yīng)為突破口來查找關(guān)鍵代碼,通過圖

5-9

可以發(fā)現(xiàn)有兩個名為

OnClick()的方法,那具體是哪一個呢?

分別進(jìn)去看看。前者調(diào)用了MainActivity.access$0()方法,在

IDAPro

的反匯編界面雙擊

MainActivity_access

可以看到它其實調(diào)用了

MainActivity

的getAnnotations()方法,

看到這里應(yīng)該可以明白,MainActivity$1.onClick()方法是前面按鈕的事件響應(yīng)代碼。接下來查看

MainActivity$2.onClick()方法,雙擊代碼行,來到相應(yīng)的反匯編代碼處,按下空格鍵切換到IDA

Pro

的流程視圖,如圖

5-10

所示,代碼的“分水嶺”就是“if-eqz

v2,

loc_2D0DC”。圖中左邊紅色箭頭表示條件不滿足時執(zhí)行的路線,右邊的綠色箭頭是條件滿足時執(zhí)行的路線。IDA

動態(tài)調(diào)試SO(6.1.x)0×1將要調(diào)試的apk以及ida根下的android_server利用adbpush命令放入模擬器同一位置(data/local/tmp)查看下0×2設(shè)置成777權(quán)限0×3啟動ida的android調(diào)試服務(wù)器新開一個cmd,進(jìn)行端口轉(zhuǎn)發(fā)0×4打開idaDebugger→A

tach→RemoteArmLinux/Androiddebuggerida進(jìn)入調(diào)試器界面0×5把so文件解壓到本地,新開一個ida載入so文件。找到關(guān)鍵函數(shù)的代碼:.text:00001148EXPORT_example_strtest_MainActivity_strtest.text:00001148_example_strtest_MainActivity_strtestPUSH

{R4-R7,LR}MOV R7,R8PUSH

{R7}.text:00001148

F0

B5.text:0000114A

47

46.text:0000114C80B4.text:0000114E26

4DLDRR5,=(_GLOBAL_OFFSET_TABLE_

-

0x1158).text:0000115026

49LDRR1,

=0x34.text:00001152

C4

B0SUBSP,

SP,

#0x110.text:000011547D

44ADDR5,

PC

;_GLOBAL_OFFSET_TABLE_.text:000011566B

58LDRR3,

[R5,R1].text:0000115888

46MOVR8,R1.text:0000115A

00

21MOVSR1,#0.text:0000115C1B

68LDRR3,

[R3].text:0000115E06

1CMOVSR6,R0可以看出關(guān)鍵代碼起始處位于(偏移地址):0×1148處。0×6回到調(diào)試器窗口Ctrl+S打開段選擇器框,直接輸入so文件名稱,查找動態(tài)庫的址。址是:0x477C6000那么內(nèi)存地址就是址+偏移地址。0x477C6000+0×1148=0x477C71480×7按下快捷鍵G,打開地址跳轉(zhuǎn)框,輸入0x477C7148來到這個地址處:可以看到,和

靜態(tài)加載時的代碼是一樣的,說明找對了地方。在這個地方下好斷點。0×8觸發(fā)斷點這時候,程序就斷在了下好的斷點位置。接下里就可以進(jìn)行單步調(diào)試了http://0

/?p=339android

JNI_OnLoad

函數(shù)下斷點動態(tài)調(diào)試

so

庫一般來說,很多APK的校驗代碼,都會在程序運(yùn)行的時候自動加載一些動態(tài)so庫,然后執(zhí)行這些庫中的校驗代碼。所以為了能夠通過程序的校驗,

須在執(zhí)行這些函數(shù)之前下斷點——理想的方法就是在

JNI_OnLoad

函數(shù)下斷點。在2.3.3模擬器中詳細(xì)步驟如下:①在控制臺輸入

adbs

進(jìn)入

,然后使用 am

start

-D

-n

包名/類名,以等待調(diào)試的模式啟動

APK

應(yīng)用;這里需要說明的是“包名/類名”的書寫方法:#amstart-D-n{包(package)名}/{包名}.{活動(activity)名稱}程序的

類可以從每個應(yīng)用的

AndroidManifest.xml

的文件中得到,以計算器(calculator)為例,它的<manifestxmlns:android="http://s

/apk/res/android"

…package="com.android.calculator2"…>…由此計算器(calculator)的啟動方法為:#am

start-D-ncom.andro對于 oActivity

這個示例工程,AndroidManifest.xml

如下所示:<manifest

…package="com.example.android. oactivity"

…>由此它的啟動方法為:.android.calculator2.Calculator#amstart-D-ncom.example.android.example.android.oactivity.oActivity的/data/local/tmp②使用

adb

將IDA( 是

6.1)中的

android_server傳入adb

pushandroid_server

/data/local/tmp#

再賦予權(quán)限中:adbscd/data/local/tmpod777android_server#運(yùn)行android_server框,在hostname./android_server③另起一個

cmd

窗口,使用命令adbforwardtcp:23946 tcp:23946進(jìn)行窗口轉(zhuǎn)發(fā)④啟動IDA主程序,點擊菜單Debugger->Attach->Remote

ArmLinux/Android

debugger,打開調(diào)試程序一欄輸入localhost,點擊ok,然后在IDA彈出的窗口中,選擇自己要附加的進(jìn)程后點擊OK即可。⑤點擊菜單Debugger->Debugger

Opitions在彈出的Debugger

setup窗口的Events中選擇stop

on

thread

start/exit以及stoponlibraryload/unload,再點擊OK退出。通過此操作可以設(shè)置程序在創(chuàng)建新線程和加載so時自動中斷。,然后使用jdb-connectcom.sun.jdi.SocketAttach:hostname=,port=XXXX⑥通過DDMS獲取相應(yīng)進(jìn)程的端(DDMS查詢到的端

);,這個時候應(yīng)該已經(jīng)斷在新線程,或者加載so處⑦連接成功后,按

F9

上的“waiting

for

debugger"提示會自動了。⑧現(xiàn)在就可以在IDA中按下快捷鍵CTRL+S來查看要調(diào)試的so是否已經(jīng)加載了,如果沒有就F9,直到加載了為止;如果已經(jīng)有了,就記下該so的start位置,然后另開一個ida分析.so庫,找到JNI_ONLOAD的偏移地址,那么該JNI_OnLoad函數(shù)在進(jìn)程中的

址就是so.start+JNI_OnLoad_Offset。這里需要說明的是:有可能在快捷鍵

CTRL

+

S跳出的窗口中有兩個同名的

so,

應(yīng)當(dāng)選擇權(quán)限為

RX

的這個,RX

一般是代碼段,RW一般是數(shù)據(jù)段。得到

址后,在

IDA中按下快捷鍵

G跳轉(zhuǎn)到這個地址,然后按下快捷鍵

F2

就完成在

JNI_OnLoad

函數(shù)

處下斷點了。

/wanyuanchun/p/3760825.htmlAndroid

逆向之動態(tài)調(diào)試總結(jié)一、在SO

中關(guān)鍵函數(shù)上下斷點剛學(xué)逆向調(diào)試時。大多都滿足于在SO中某關(guān)鍵函數(shù)上下斷點。然后通過操作應(yīng)用程序,去觸發(fā)這個斷點,然后進(jìn)行調(diào)試詳細(xì)的步驟可以參見非蟲大大的《Android

安全與逆向分析》簡單說:在libsyclover.so文件中有一個函數(shù)jnicall1。每次單擊按鈕的時候,便會調(diào)用此函數(shù)。1.靜態(tài)載入此so

文件,找到函數(shù)的偏移地址為:0x132C2.執(zhí)行android_server3.端口轉(zhuǎn)發(fā)adb

forward

tcp:23946

tcp:239464.運(yùn)行程序5.IDA

附加然后會彈出點擊OK

之后,在彈出的列表框中選擇需要附加的進(jìn)程即可6.下斷點附加完成之后,會停在libc.so

這個模塊中。此時按下Ctrl+S,彈出模塊列表框,搜索so

文件名。記錄下

址:0×76072000

(RX

權(quán)限)和靜態(tài)分析時得到的偏移地址0x132C

相加得到0x7607332CG

跳轉(zhuǎn)到此位置F2

下好斷點!7.觸發(fā)斷點下好斷點,便F9

執(zhí)行,此時狀態(tài)是runing此時,去應(yīng)用中單擊按鈕,程序便會斷在剛剛下好的斷點處~ok~

這種調(diào)試方法局限性很大,適合于比較初級的調(diào)試。這種調(diào)試手法在現(xiàn)在已經(jīng)滿足不了需求了。二、在JNI_OnLoad

函數(shù)上下斷點發(fā)生了JNI_OnLoad

函數(shù)大概功能就是在程序加載so

的時候,會執(zhí)行JNI_OnLoad

函數(shù),做一系列的準(zhǔn)備工作。很多時候,程序猿們會將一些重要信息放在此函數(shù)中,而不是通過某種事件來重復(fù)觸發(fā)。包括說將反調(diào)試函數(shù)放置在此函數(shù)中。因此,調(diào)試改變,上述調(diào)試方法基本上被淘汰。1.靜態(tài)分析,找到JNI_OnLoad

函數(shù)的偏移:0×15042.執(zhí)行android_server3.端口轉(zhuǎn)發(fā)adb

forward

tcp:23946

tcp:23946以調(diào)試模式啟動程序adb

s am

start

-D

-n

com.example.mytestcm/.MainActivity此時,

界面會出現(xiàn)

Waiting

For

Debugger

頁面打開ddms

或者Eclipse

(必要,為了使用jdb

命令)IDA

附加7.設(shè)置調(diào)試選項Debugger

Debugger

Options8.F9

運(yùn)行程序IDA

中,F(xiàn)9

運(yùn)行程序,此時是runing

狀態(tài)。在命令行中執(zhí)行:jdb-connect

com.sun.jdi.SocketAttach:hostname=,port=8700

其中port=8700

是從ddms

中看到的。此時程序會斷下來9.下斷點Ctrl+S

然后搜索到so

文件名記錄下

址是:0×76118000加上JNI_OnLoad

函數(shù)的偏移地址0×1504

為0×76119504G

跳轉(zhuǎn)到0×76119504,下斷點A.觸發(fā)斷點下好斷點之后,直接F9

運(yùn)行吧,就能斷在JNI_OnLoad

函數(shù)處~當(dāng)這種調(diào)試手法出現(xiàn)之后,將特殊函數(shù),或者反調(diào)試函數(shù)放在JNI_OnLoad

中也不是那么的安全了。此時,程序猿們通過分析系統(tǒng)對SO文件的加載過程發(fā)現(xiàn),JNI_OnLoad

函數(shù)并不是最開始執(zhí)行的。在JNI_OnLoad

函數(shù)執(zhí)行之前,還會執(zhí)行init

段和init_array

中的一系列函數(shù)。因此,現(xiàn)在的調(diào)試方法,都是將斷點下在init_array中~至于下斷點的方法,可以類比于在

JNI_OnLoad

中下斷點的方法,在init_array

的函數(shù)中下斷點。還有

法便是通過在

linker

模塊中,通過對其中函數(shù)下斷點,然后也能單步到init_array

中下面便詳細(xì)介紹下如何給任意系統(tǒng)函數(shù)下斷點三、給任意系統(tǒng)函數(shù)下斷點需要準(zhǔn)備的有:與你調(diào)試環(huán)境一致的系統(tǒng)源碼,這個也可以在

http

/

查閱。root

之后

機(jī),方便將系統(tǒng)的一些

so

文件

dump

至本地,靜態(tài)獲取到系統(tǒng)函數(shù)的偏移地址流程執(zhí)行android_server端口轉(zhuǎn)發(fā)adb

forward

tcp:23946

tcp:23946調(diào)試模式啟動程序

adb

s am

start

-D

-n

包名/類名IDA

附加靜態(tài)找到目標(biāo)函數(shù)對應(yīng)所在模塊的偏移地址Ctrl+S

找到對應(yīng)模塊的

址,兩個地址相加得到最終地址G

跳轉(zhuǎn)至地址,然后下斷F9

運(yùn)行執(zhí)行jdb-connectcom.sun.jdi.SocketAttach:hostname=,port=8700斷下,進(jìn)行調(diào)試四、在dvmDexFileOpenPartial

函數(shù)下斷點,dump

出明文dex發(fā)展至今,從去年到現(xiàn)在,apk

的加

發(fā)展非常迅速。國內(nèi)出現(xiàn)了很多針對

apk

的加殼保護(hù)方案。主要也體現(xiàn)在對

dex

的保護(hù)和對

so

的保護(hù)!針對

dex

的保護(hù),很長一段時間,都能通過對

dvmDexFileOpenPartial

函數(shù)下斷點,從而

dump

出明文

dex

文件。以這次alictf

的第三題為例子,展示下如何對dvmDexFileOpenPartial

函數(shù)下斷點!其他步驟都是一樣的,這兒主要說下如何找到dvmDexFileOpenPartial

函數(shù)位置1.查看源碼dvmDexFileOpenPartial

函數(shù)在rewriteDex

這個函數(shù)中被調(diào)用??梢钥吹疥P(guān)鍵字符串信息是:Unable

to

create

DexFile此時,從

的/system/lib

下得到

libdvm.so2.

載入IDA,搜索字符串:Unable

to

create

DexFile得到偏移地址是:0x0005AE8A3.下斷點搜索模塊libdvm.so址是0×41492000加上偏移地址為0x414ECE8AG

跳轉(zhuǎn)至此位置,下好斷點,即可4.dump

明文dex

文件下好斷點之后,F(xiàn)9

運(yùn)行,執(zhí)行jdb-connect

com.sun.jdi.SocketAttach:hostname=,port=8700程序斷下此時,看到寄存器窗口中的值為:R0

保存dex

的起始地址,R1

便是dex

的長度直接dump

即可!5.后續(xù)dump

出來的dex

就可以進(jìn)行反編。效果如下:五、寫在最后的分析難度。同時,在整個攻防的過程中,對攻防兩端的人都帶來了非常棒隨著現(xiàn)在技術(shù)的發(fā)展,對apk

的保護(hù)是越來越好!大大增加了逆向分析體驗。雙方都取得了長足的進(jìn)步!也促使了整個加固方向水平的提升!其中,動態(tài)調(diào)試手法在整個過程中是必不可少的。http

/thread-293648-1-1.html動態(tài)調(diào)試Android

so

庫函數(shù)的方法-[移動安全]: 時請以超 形式標(biāo)明文章原始出處和作者信息及本http

/riusksk-logs/271566148.html1、amstart-D-n包名/類名,以等待調(diào)試的模式啟動APK應(yīng)用;2、以su權(quán)限開啟android_server,然后adbforward轉(zhuǎn)發(fā)端口,并用IDA附加相應(yīng)進(jìn)程;3、通過

DDMS獲取相應(yīng)進(jìn)程的端

,然后使用

jdb-connectcom.sun.jdi.SocketAttach:hostname=,port=8700(DDMS查詢到的端

);4、連接成功后,按

F9

上的“waiting

fordebugger"提示會自動

;5、此時在so庫的JNI_Onload函數(shù)上下斷點,可通過Ctrl+S找到對應(yīng)so庫的基址,然后加上JNI_Onload的文件偏移量,即可找到JNI_Onload函數(shù)的內(nèi)存地址,然后按F9運(yùn)行后即可斷下。下圖是使用上述方法,斷在某so庫JNI_Onload函數(shù)的截圖:【

】IDA6.1

調(diào)試

Android

JNI-STEP

By

STEP調(diào)試;步驟

1:通過”adbpush$(IDA-DIR)\android_server/data/local/”安裝服務(wù)程序;步驟

2:通過” od

755

/data/local/android_server”更改服務(wù)程序執(zhí)行權(quán)限;步驟3:以root方式運(yùn)行/data/local/android_server(不以root的方式將獲取不到App的進(jìn)程列表);步驟4:在PC命令行執(zhí)行”adb

forward

tcp:23946

tcp:23946”命令,讓IDA

可以連接本地端口進(jìn)行

步驟5:啟動一個IDA-ANA,加載并分析需要調(diào)試的JNI

動態(tài)庫,比如libgikir_demo.so;步驟

6:在

端啟動加載上述

JNI

動態(tài)庫的App,比如

com.gikir.demo;步驟7:啟動另一個IDA-DBG,執(zhí)行Debugger/Attach/Remote

ARMlinux/android

debugger

菜單設(shè)置Hostname為localhost,Port

為23946

確定后在進(jìn)程列表中找到com.gikir.demo

進(jìn)程,attach并記下pid,此時會斷在libc.so

的模塊空間中;步驟

8:在

PC

命令行依次執(zhí)行”adb

s

”,”su”,”cat/proc/pid/maps”,找到

libgikir_demo.so

的基址,并記下

base;步驟9:在IDA-ANA

中定位需要調(diào)試的函數(shù)偏移offset;步驟10:在IDA-DBG

中利用g

命令跳轉(zhuǎn)到需要調(diào)試的函數(shù)起始地址(base+offset),并執(zhí)行c

命令得到匯編代碼,下斷點并F9

運(yùn)行;步驟

11:在

App

中操作直到上述斷點被

;步驟12:Have

Fun

!請教下,怎么斷so最簡單的辦法:將函數(shù)呢函數(shù)打上死循環(huán)的補(bǔ)丁,Attach

上去后改回原來的代碼進(jìn)行正常調(diào)試。[Android]

[實例]利用

IDA

Pro分析

Android

基礎(chǔ)說明:本《Android的方法及工具均

特為整理出來,新自看雪移動區(qū)版主@非蟲的程求高手指點啊O(∩_∩)O安全與逆向分析》#5.6.3#框-->雙擊Strings,跳到字符串段-->菜單項========使用IDA

Pro定位關(guān)鍵代碼的方法:1、搜索特征字符串。具體操作為:①快捷鍵Ctrl+S,打開搜索類型選擇“Search-->Text”;搜索

框,在

String文本框中輸入要搜索的字符串點擊

OK即可;②快捷鍵Alt+T,打開文本不過目前IDAPro對中文字符串的顯示和搜索都不支持,需要編寫相關(guān)的字符串處理插件來解決。2、搜索關(guān)鍵的API。搜索方法與上面的是一樣的。Tips:AndroidAPI(可供調(diào)用的系統(tǒng)接口)可以分為:可選

API、Wi-FiAPI、定位服務(wù)、多 API、圖形

API等;過的代碼,定位關(guān)鍵代碼比較。下面的CrackMe就可以通過方3、通過方法名來判斷方法的功能。這種方法比較笨拙對于法名來定位關(guān)鍵代碼。========下面

就以一個

CrackMe

為實例來演示

IDAPro分析

Android的流程。首先安裝運(yùn)行APK程序可以看到主界面上有兩個按鈕,點擊第一個按鈕“獲取注解”會Toast彈出三條信息;點擊第二個按鈕碼”碼錯誤”。很顯然

第一個按鈕是

視聽的。“檢測則會顯示“Tips:直接將IDAPro是直接分析Android程序的主體dex文件所以需要將dex文件從原程序中分離出來可以用RAR壓縮解壓縮dex從apk中拉出來,修改修復(fù)以后再借助它壓縮進(jìn)去即可。所以

就可以按鈕事件的響應(yīng)為突破口來查找關(guān)鍵代碼。很容易知道該CrackMe.apk的主Activity類為MainActivity,于是在Exports選項卡頁面上輸入Main,代碼會自動定位到以Main開頭的所在行其中的方法也就一目了然了。Tips:一個Android程序是由一個或多個的Activity以及其他組件組成每個Activity都是相同級別的,不同的Activity實現(xiàn)不同的功能。每個Activity都是Android程序的一個顯示“頁面”主要負(fù)責(zé)數(shù)據(jù)的處理及展示工作。每個Android程序有且僅有一個主Activity(隱藏程序除外)它是程序啟動的第一個Activity通常標(biāo)識為“ent.action.MAIN”.通過圖

可以看到有兩個名為

OnClick()的方法

可以試試它們分別是對應(yīng)哪一個。分別雙擊這兩個代碼行

會來到相應(yīng)的反匯編代碼(IDA

View-A)處,按下空格鍵切換到流程圖。從而容易得出第二個OnClick()方法是關(guān)鍵且可以看到代碼的分水嶺就是“if-eqz

v2,loc_2D0DC”。左邊紅色箭頭表示不滿足時執(zhí)行的路線;右邊表示條件滿足時執(zhí)行的路線。將鼠標(biāo)定位到指令“if-eqzv2,loc_2D0DC”,然后點擊IDAPro主界面上的“Hex

View-A”選項卡,知偏移地址為0x2D0BE相應(yīng)的字節(jié)碼為“38020f00”,所以只需將if-eqz的OpCode值38改為if-nez的OpCode值39即可。(說明:也就是利用十六進(jìn)制編輯器將偏移地址0x2D0BE的“38

02

0f”改為“39

02

0f”,具體什么OpCode我不明白了o(╯□╰)o)修改好之后的修復(fù)dex文件的所以就借助@非蟲的工具修復(fù)好之后拖進(jìn)RAR解壓壓縮測試了。并刪除其中的簽名文件夾“META-INF”,這時CrackMe.apk的就完成了簽名安裝就可以如何使用ida

在apk

執(zhí)行前動態(tài)調(diào)試其so

中的函數(shù)am

start-D-n

包名/類名IDA

pro

attach

進(jìn)程,設(shè)置新線程,加載so時斷點,continue打開ddms,查看調(diào)試端口,jdb

attach

port4

這個時候應(yīng)該已經(jīng)斷在新線程,或者加載so

處了,在你感的so

處停下來5

另外用

ida

打開

so,查看你感

的函數(shù)偏移,

加上你感 的

so

址,打上斷點,continue,

就大功告成了。開始調(diào)試選項那個好像得針對eng

Build

的機(jī)型,置為

waitdebugger

啥的,

看了下理論但是沒有實踐過。不過我最近也遇到這種問題,迫于時間壓力沒時間研究那個waitdebugger

了,想了個相對好上手的辦法:1、解包對方APK,

一個:對應(yīng)SMALI:android.os.SystemClock.sleep(20000);const-wide/16

v0,0x2710#20

秒invoke-static

{v0,

v(X-1)},

Landroid/os/SystemClock;->sleep(J)V這里(X-1)對應(yīng).local

X,

你懂該怎么寫的2、另外有的包在你要調(diào)試的那個SO

里面有簽名保護(hù),反正你重新打了包之后會導(dǎo)致程序運(yùn)行,這個相比JAVA修改些,建議你用那個簽名來打包。事實上我調(diào)試那個

SO

也遇到過這樣,然后打了個簽名

的包嵌入的延時函數(shù)就大丈夫了你是windows

吧,jdb

-connect

com.sun.jdi.SocketAttach:port=xxxxAndroid

逆向so

文件,調(diào)試加解讀標(biāo)題:【作者:lu】Android

逆向so

文件,調(diào)試加解讀liu時間:2014-10-16,19:10:19:

ht

/showthread.php?t=193353本科剛畢業(yè),實在無聊想學(xué)學(xué)

,還是個弱菜,接觸

ida

還不到

2

個月,

程序都不到

5

個,但是還是很努力的在玩

,無聊時看到這個apk,開始這個文件的。的,非常,大概源文件用psb

開頭壓縮后用(psb

開頭加密apk

地址

ht

/s/1eQ29ypk這是個android

程序,程序本事很大,主要是里面的.psb.m

文件(請教大神這是啥引擎),這個文件是被壓縮后后用mfl。程序拿到手,弱菜(就是我)第一反應(yīng)是

dex2jar-5

jd-gui.exe

然后配合

apktool

修改,

看到

jar

里面沒啥值錢的東西~~~.psb.m

這字段都木有,也不在

string

里面,懷疑是

so

文件內(nèi)實現(xiàn)的~~~~(非常不敢懷疑

so

文件比

smali

難多了),打開

lib-main.so(非常大)面有~~~只能硬著頭皮看了~~~里面疑似加密的文件太多~~看需要花好長時間~~~看了半天一個函數(shù)(具體不好意思說),發(fā)現(xiàn)不里面很像加密 ,所有文件也在數(shù)據(jù)是相關(guān)代碼~~~決定開始動態(tài)調(diào)試~~~一開始準(zhǔn)備用下面這個方法調(diào)試

ht

/showthread.php?t=178659&highlight=android+%E5%90%AF%E5%8A%A8+%E5%8A%A8%E5%89%8D。發(fā)現(xiàn)進(jìn)不去,根本就沒有l(wèi)ib-main.so,是不是沒有加載,這個還請大神解答我賭他不是一開始就把所有文件處理完,所以用《已解答:關(guān)于用ida調(diào)試android

native

c

的so

文件的問題》這個帖子的方法端打開程序(若打不開請裝谷歌配件)然后進(jìn)23946

端口~~其中有個解析太慢直接canelShift+f2找Code段~~~(也只有code

段這么大)然后在所有你懷疑的地方加偏移7547b000(有些人不是這偏移)下斷點放f2,f9

后按按屏幕,然后f9

配合f7,f2

調(diào)試在13a258

這個函數(shù)發(fā)現(xiàn)目標(biāo)mfl

字段怎么找到13a258~~這只能說函數(shù)樣子和名字找的~~其實我一開始是查找,psb.m

字段~~然后發(fā)現(xiàn)那函數(shù)不對~~花了很大代價~~~這個得請教大神在這個函數(shù)的末尾

13a298

也設(shè)下斷點,按一下

f9

mlf

對應(yīng)的hex

view

立即變成(psb,確定是

函數(shù)。這個函數(shù)也太大了~~~~無奈二分查看~~~神馬時候hex

view

改變發(fā)現(xiàn)是這些vld

造成的鎖定vld段互相異或,中間多數(shù)是數(shù)組下標(biāo)判斷越界的改變~~~不停的調(diào)試和看代碼還像就是從第8

位源文件和一個Dump

出 段

shift+f2搜索d9Gd

發(fā)現(xiàn)源文件是font_ahoge_main.psb.m(也可以dump)嘗試寫了異或程序發(fā)現(xiàn)成功(這句話說起來簡單,嘗試+調(diào)試了好幾次呢)現(xiàn)在關(guān)鍵是

段是怎么來的發(fā)現(xiàn)雖然前面的代碼很長,但是很快跳到了(這個我沒花很長時間~現(xiàn)在想起來真是僥幸)這一行,在這一行前面下斷點發(fā)現(xiàn)r1

是對應(yīng)這一段跳到755b54ec

這段上時,這是r0

指向的棧我以前手動編過md5

的加密~~很熟悉這就是標(biāo)準(zhǔn)的md5

加密~~不熟悉的也可以自己看到了755b5508就成了Rj9Pegoh4font_ahoge_main.psb.m(不斷嘗試可以知道都是Rj9Pegoh4+小寫文件名)的md5值~~yeah然后就到了這個函數(shù)~~~f9

后發(fā)現(xiàn)很重要(大多數(shù)函數(shù)我都是跳過后才發(fā)現(xiàn)很重要再回頭看)這中間函數(shù)也很重要F5發(fā)現(xiàn)是調(diào)試時發(fā)現(xiàn)傳入的參量為0x12bd6aa

和位置Dump

下寫了個相同的模擬出來后面也都是體力活f5

后再調(diào)試~~模擬出_ZN7MRandomC1EPKjj再模擬同樣模擬出這個最后最后段終于好了~~~~yeah就好了~~~在加密回去時mfl

頭文件還有4

個字節(jié)是解壓縮后的大小~~~關(guān)于怎么解壓縮我就不說了~~反正也是這種方法~~~~還請各位的愉快~~~不錯,其實很多事情,只要肯投入去做,總會找到解決方法的,即使之前從來沒遇到過。其實呢~整篇文章,沒看懂。樓主寫文章,完全沉浸在自己解決的過程中了。對于大多數(shù)人而言,并不關(guān)心你怎么

的,關(guān)心的是你通過什么,收集到了什么信息,然后如果根據(jù)這些信息做判斷,從而進(jìn)行下一步操作。所以如果文章增加一些對環(huán)境的介紹,以及自己的思考過程的話,會更好。說點實際的,如果在jar里面沒有發(fā)現(xiàn)關(guān)鍵內(nèi)容的話,就要注意jar里面的native函數(shù)以及Loadlibrary操作,從而可以判斷出加載了哪些so,調(diào)用了什么函數(shù),就不會出現(xiàn)判斷不出是不是加載了lib-main.so的情況了。IDA

調(diào)試的時候,只要勾選 加載

so

pause ,通過

so

路徑,就能很容易判斷出來是不是

apk

自帶的

so

文件了,attach

是法,但是很多情況下關(guān)鍵點是在加載過程中的,很容易漏掉。之后的內(nèi)容就太模糊了,建議花點篇幅介紹一下

vld 指令,反正我是第一次見,看完還是沒明白這是什么意思?;揪瓦@樣,已經(jīng)做得很不錯了,樓主繼續(xù)加油吧。嗯(總算等到大神)~~~第一次寫文章~~~事后發(fā)現(xiàn)真的沒寫書天賦~~~~還沒怎么學(xué)

~~~那個

ida

調(diào)試還是自己剛學(xué)會的~~~至于

vld

指令~~可以查

arm

的文檔的~~應(yīng)該在這里

http://i

/help/in

.arm.doc.dui0204ic/Chdhcfbc.html非常感謝大神指導(dǎo)~~~~~ht

/showthread.php?t=193353[

]撤銷IDA

中的字符串地址轉(zhuǎn)換/**

作者:0x明天去要飯*:

/kgdiwss*

原文:htt

/?p=82*請注明出處*/IDA中,當(dāng)在字符串上右鍵再點擊左邊的“=”或“(”時,IDA會自動把字符串的地址轉(zhuǎn)換成計算后的,如圖:轉(zhuǎn)換前轉(zhuǎn)換后撤銷轉(zhuǎn)換的方法為:點擊轉(zhuǎn)換后的數(shù)字,比如這里是

0x168C,右鍵選擇“撤銷轉(zhuǎn)換”或按快捷鍵“U”,此時反匯編代碼會變成

格式,如下:然后選中亂碼的最上面一行(這里是.text:00000CF4),右鍵選擇“轉(zhuǎn)換為代碼”或按快捷鍵“C”即可恢復(fù)正常。但是這樣恢復(fù)后,原來自定義的注釋就會丟失。Reverse

Engineering

Android

NDK

程式(*.so)本篇僅供教學(xué)用途】為了要保護(hù)自己的

AndroidApp,開發(fā)者有時會把「付費(fèi)註冊、序號處理、加

」等重要的程式碼使用

C/C++來撰寫,因為C/C++無法反編譯,只能反組譯,因此較難要Java程式碼較簡單,只要熟悉dalvikbytecode就好了,參考資料:http://s

/devices/tech/dalvik/dalvik-bytecode.html

opcodes.html但要具:C/C++程式碼其實也沒這麼難(若是程式的流程規(guī)劃不好,則C/C++甚至比Java簡單),以下是必要基礎(chǔ)或工熟悉

ARM

指令集(https

.tw/items/1558608745?item

id=22049)IDA

Pro

6.4

或更新版本(逆向工程ARM

組語用)Arm_Asm-slam80(如果不會將ARM

指令集轉(zhuǎn)為hex,則該工具可以幫忙)Hex

Editor

Neo(修改hex

用)的步驟大致上是:取得apk

中的.so使用IDA

Pro

找到關(guān)鍵點(以下是範(fàn)例):3.4.

通常開發(fā)者要判斷「是否已註冊」或「是否正確」都會透過一個判斷式,若有判斷則會進(jìn)行Branch

指令,BEQ

則代表condition

是EQual

的找到對應(yīng)的hex,如「CMP

R0,#0」對應(yīng)「0028」,BEQ

要進(jìn)去的branch

是當(dāng)?shù)舻呐袛嗍剑?dāng)然就可以將上一個指令「CMP

R0,#0」改為「CMP

R0,#1」,就不會進(jìn)入判斷式或「就會進(jìn)入付費(fèi)版模式」(僅舉例,實際情況依不同的.so

而定)透過工具算出hex

為「0128」7.當(dāng)然您也可以自己算hex,請參考:ohttp:/

/questions/11785973/converting-very-simple-arm-instructions-to-binary-hex使用Hex

Editor

NEO

修改為新的hex,再儲存即可把修改後的.so

丟進(jìn)去apk,再重新compile

與sign找到的修改點不一定正確,因此可能需要嘗試數(shù)次,若成功了就把關(guān)鍵點拿掉了http:

.tw/cheng/archive/2014/03/09/144307.aspx[Android]記一次安卓(分析代碼全過程)IDA,">關(guān)于安卓

思路分析貼轉(zhuǎn)帖地址

ht

/showthread.php?t=170132起因:CatWar2,鉆石不夠,而且用八門修改之后,鉆石數(shù)會自動清0線索:順藤摸瓜,搜索bg_sysmsgoworld.so

文件中發(fā)現(xiàn)其被 于

lib:.so

文件是動態(tài)庫文件,相當(dāng)于win

下的.dll

文件于是操起IDA,ALT+T

搜索bg_sysmsg經(jīng)過一番觀察,根據(jù)函數(shù)名,來到了:ShopScene2::init(void)出現(xiàn)在初始化里,然后在函數(shù)列表里找到ShopScene2::ShowSysMsg(int)。:.text:000E864A.text:000E864EMOVS R0,

0x3F800000BL

_ZN7cocos2d11CCDelayTime18actionWithDurationEf

;

cocos2d::CCDelayTime::actionWithDuration(float)用了延遲,第一張圖的提示,也是顯示一段時間就

了了。猜測就是調(diào)用這個函數(shù),顯示信息。再次查找進(jìn)入第一個函數(shù),這個函數(shù)了一個很可疑的函數(shù):WRIntEncrypt::Get(void):BL_ZN12WRIntEncrypt3GetEv;

WRIntEncrypt::Get(void)看一下這個類的所有函數(shù),目測就是要找的了。來到構(gòu)造函數(shù):(PS:R0

是this指針):.text:000F1260PUSH{R4-R6,LR}.text:000F1262MOVSR5,

#0.text:000F1264STRR5,

[R0].text:000F1266MOVSR4,

R0.text:000F1268BLXlrand48.text:000F126CSTRR5,

[R4,#8].text:000F126ESTRR0,

[R4,#4].text:000F1270BLXlrand48.text:000F1274STRR0,

[R4,#0xC].text:000F1276STRR5,

[R4,#0x10].text:000F1278MOVSR0,

R4.text:000F127APOP{R4-R6,PC}確定這個類成員有5

個,初始化之后+0

0+4

隨機(jī)數(shù)1+8

0+c

隨機(jī)數(shù)2+10

0再看WRIntEncrypt::Set(int)(PS:R1

是參數(shù),就是要設(shè)置的數(shù)值):.text:000F1118LDRR3,

[R0,#4].text:000F111ASTRR1,

[R0,#0x10].text:000F111CEORSR3,

R1.text:000F111ESTRR3,

[R0].text:000F1120LDRR3,

[R0,#0xC].text:000F1122EORSR1,

R3.text:000F1124STRR1,

[R0,#8].text:000F1126BXLR從這里就看到+0

未加密值異或隨機(jī)數(shù)1+4

隨機(jī)數(shù)1+8

未加密值異或隨機(jī)數(shù)2+c

隨機(jī)數(shù)2+10

未加密值struct

EncryptInt{int

eint1;//加密數(shù)值int

key1;//隨

鑰int

eint2;//加密數(shù)值int

key2;//隨

鑰int

realint;//原始數(shù)值};也就是說,

保存了三份數(shù)據(jù),二份是加密過,一次是未加密的。再看看WRIntEncrypt::Get(void):.text:000F120C.text:000F120E.text:000F1210.text:000F1212.text:000F1214.text:000F1216.text:000F1218.text:000F121A.text:000F121C.text:000F121E.text:000F1220.text:000F1222.text:000F1224.text:000F1226.text:000F1228.text:000F1228

loc_F1228.text:000F1228.text:000F1228.text:000F122APUSH

{R4,LR}LDR R3,

[R0,#EncryptInt]LDR R2,

[R0,#EncryptInt.key1]LDR R1,

[R0,#EncryptInt.key2]MOVS R4,

R0EORS R2,

R3LDR R3,

[R0,#EncryptInt.eint2]EORS R3,

R1LDR R1,

[R0,#EncryptInt.realint]MOVS R0,

#1CMP R3,R1BEQ

loc_F123CCMP R2,R3BEQ

loc_F1246;

CODE

XREF:

WRIntEncrypt::Get(void)+38j;

WRIntEncrypt::Get(void)+3EjMOVS R0,

R4BL

_ZN12WRIntEncrypt8CheatingEv;

WRIntEncrypt::Cheating(void)與加密的數(shù)值做了比較,不相等就進(jìn)入知道了加密怎么處理,就很容易了?;氐教幚鞼RIntEncrypt::Cheating(void),八門

定位到realintstruct

EncryptInt{int

eint1;int

key1;int

eint2;int

key2;int

realint;};然后eint1,eint2,realint

都改為0xFFFFFF,key1,key2

清零。任何數(shù)值異或0

都不變。會清0.可能還有別的地方有驗證。不過修改完鉆石,把升級之后,基本就無不會APKDIY,只能先這樣了。最后發(fā)現(xiàn),鉆石退出以后,重新進(jìn)入敵了。也算是夠用了。IDA

調(diào)試dex

代碼初體驗IDA 6.6新添加了對dex文件的調(diào)試支持,由于工作原因,我第一時間拿到了這個版本,下面就是針對這個功能的一些簡單體驗。IDA對這個新功能提供了一個

PDF文檔進(jìn)行說明,按照

一步步來就可以完成對例子程序的調(diào)試,我這里選

sina

作例子簡單講一下實際調(diào)試的流程。準(zhǔn)備工作根據(jù)

android

文檔,如果要調(diào)試一個

App里面的

dex

代碼,必須滿足以下兩個條件中的任何一個:1)2)App

的AndroidManifest.xml

中Application

包含屬性

android:debuggable=true/p中ro.debuggable的值為1由于正常的 發(fā)布時都不會把

android:debuggable

設(shè)置為

true,所以要達(dá)成條件

1)需要對

app

進(jìn)行重新打包,這不僅每次分析一個

App

都重復(fù)操作,而且很多 會對自身進(jìn)行校驗,重打包后執(zhí)行會被檢測到,所以想辦法滿足第

2)個條件是個一勞永逸的辦法,我實際使用的方法就是滿足第

二個條件。由于

p

是保存在

boot.img

ramdisk

中,這部分每次重新啟動都會重新從

rom

中加載,所以要到目的必須修改boot.img

中的

ramdisk

并重新刷到設(shè)備中。我測試使用的設(shè)備為

Nexus 7,修改步驟如下:從 到

boot.img,使用工具(abootimg,gunzip, cpio)把

boot.img

完全解開,獲取到

p修改p把修改后的文件重新打包成boot_new.img使用

fastboot

工具把

boot_new.img

刷入設(shè)備(fastboot

flash

boot

boot_new.img)a)b)c)d)e)實際調(diào)試解壓縮sina后按照IDA的圖

1 修改后的

p

內(nèi)容的

apk,把

dex

文件拖到

ida

中進(jìn)行分析(非常慢,文件會到

6G

多,估計

IDA

dex

加載器有

BUG),分析完成對

Debugger Options

進(jìn)行設(shè)置。圖

2

Debugger Options

設(shè)置Activity——.SplashActivity,

在SplashActivity_OnCreate方法設(shè)置斷點.設(shè)置后找到App的圖

3

sinaActivity定義圖

4 在

SpalshActivity

OnCreate

方法設(shè)置斷點點擊執(zhí)行或者按

F9

即可開始運(yùn)行

App,由于在 Activity

的OnCreate方法設(shè)置了斷點,所以

App

執(zhí)行后就會停在剛才設(shè)置的斷點處等待用戶操作。圖

5 執(zhí)行后程序中斷在設(shè)置的斷點處How

to

break

on

an

Android

JNI

function

with

IDA

Pro

DebuggerIf

the

java

code

is

run

only

when

the

application

starts

up,

how

can

I

break

in

the

function_example_ojni_oJni_stringFromJNI?TherearetwooptionsIcansee.StarttheDalvikVMmanuallyusingapp_process.Thecommandlineseemstobesomethinglike(seeam

scriptsource):app_process

/system/bin mands.am.Am

start

-a

<ACTION>PutanendlessloopinthebeginningofyourJNImethod,runtheapp,attachtothenewprocessand

skiptheloopmanuallyinthedebugger.動態(tài)調(diào)試SO

之在.init_array

段下斷點前言由前面的分析可以知道,so被加載之后最開始執(zhí)行的是.init_array段的代碼。然后才會去執(zhí)行jni_onload那么,在.init_array處斷下來便是很有必要的前期準(zhǔn)備:android系統(tǒng)中位于/system/bin/的linkerida6.4android_servermytestcm.apk準(zhǔn)備工作做好之后,下面正式開始調(diào)試0×1pushandroid_server到tmp下,給權(quán)限,然后以root執(zhí)行。adbforward端口轉(zhuǎn)發(fā)IDAattach對應(yīng)進(jìn)程0×2新開一個IDA,載入linkerShift+F12

打開字符串窗口,搜索字符串:dlopen定位到:找到dlopen函數(shù)的偏移0xF30動態(tài)調(diào)試的IDA中,G跳轉(zhuǎn)到:400D3000+F30=400D3F30處,下好斷點搜索字符串:calling定位到:得到偏移:0×2720來到動態(tài)調(diào)試的ida,G跳轉(zhuǎn)到:400D3000=400D5720處,下斷點往下:400D574CBLXR4處就是調(diào)用init段代碼的地方!直接跟進(jìn)就能看到0×3按F9運(yùn)行然后打開Eclipse或者ddms執(zhí)行jdb-connect

com.sun.jdi.SocketAttach:hostname=,port=8700程序就會斷在第一個斷點處,F(xiàn)9幾次就段在blxR4處F7跟進(jìn)就來到init段代碼處:這是你自己寫的apk可以查找到dlopen,對于找不到的怎么辦?根據(jù)自己

的系統(tǒng)版本,找到對應(yīng)的安卓源碼。然后再去找對應(yīng)的

linker

部分源代碼。根據(jù)你的源代碼里的信息,去定位dlopen。http://0

/?p=649調(diào)試init.array

段中函數(shù)方法環(huán)境:rom包4.4.3:Nexus4源碼文件路徑:/dalvik/vm/Native.cpp,bionic/linker/linker.cpp此文的作用,大家應(yīng)該都知道,話不多說就是干。定位到/dalvik/vm/Native.cpp

文件中的dvmLoadNativeCode函數(shù),此函數(shù)完成對so加載,初始化工作。1.

0318

bool

dvmLoadNativeCode(const

char*

pathName,

Object*classLoader,char**detail)2.

03193.

0320

{4.

03215.

03226.

03237.

03248.03259.032610.032711.032812.032913.033014.033115.033216.033317.033418.033519.033620.033721.0338SharedLib*pEntry;void*handle;boolverbose;/*

reduce

noiseby

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論