版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年旅游公司浮動抵押合同
- 個人住宅租借押金及季度租金合同樣本(2024版)一
- 二零二五年度專業(yè)印刷品設(shè)計、印刷與打印服務(wù)合同3篇
- 事業(yè)單位基本建設(shè)粉刷工程分包合同2024版B版
- 2025年度烘焙連鎖面包磚供應(yīng)鏈合作協(xié)議4篇
- 二零二五年度干股虛擬股分紅激勵方案合同范本
- 2025年度玩具貨物運(yùn)輸委托服務(wù)協(xié)議
- 二零二五年度物業(yè)小區(qū)個人承包社區(qū)物業(yè)服務(wù)綜合解決方案協(xié)議
- 2025年度家用空調(diào)拆裝安全操作規(guī)范及應(yīng)急處理合同
- 二零二五年度家政服務(wù)公司保姆雇傭協(xié)議
- 海外資管機(jī)構(gòu)赴上海投資指南(2024版)
- 山東省青島市2023-2024學(xué)年七年級上學(xué)期期末考試數(shù)學(xué)試題(含答案)
- 墓地銷售計劃及方案設(shè)計書
- 從偏差行為到卓越一生3.0版
- 優(yōu)佳學(xué)案七年級上冊歷史
- 鋁箔行業(yè)海外分析
- 紀(jì)委辦案安全培訓(xùn)課件
- 超市連鎖行業(yè)招商策劃
- 城市道路智慧路燈項目 投標(biāo)方案(技術(shù)標(biāo))
- 【公司利潤質(zhì)量研究國內(nèi)外文獻(xiàn)綜述3400字】
- 工行全國地區(qū)碼
評論
0/150
提交評論