Android系統(tǒng)的Dex文件動(dòng)態(tài)調(diào)試指南
一、環(huán)境搭建
1. 安裝JDK

你需要搭建JAVA開發(fā)環(huán)境,具體步驟請(qǐng)自行查找相關(guān)資料進(jìn)行安裝。
2. 安裝Android SDK
下載Android SDK安裝包后,解壓到任意目錄。點(diǎn)擊運(yùn)行SDK Manager.exe,然后選擇你需要的版本進(jìn)行安裝。
3. 安裝Eclipse集成開發(fā)環(huán)境
選擇適合移動(dòng)開發(fā)的Eclipse版本進(jìn)行下載,解壓到任意目錄即可。

二、創(chuàng)建虛擬調(diào)試環(huán)境
動(dòng)態(tài)調(diào)試可以使用真實(shí)手機(jī)或虛擬機(jī)作為調(diào)試環(huán)境。這里我們采用虛擬機(jī)環(huán)境。
1. 打開Eclipse,進(jìn)入“Android Virtual Device”。
2. 點(diǎn)擊“Create”,選擇相應(yīng)的參數(shù)以創(chuàng)建虛擬機(jī)。
三、安裝輔助調(diào)試工具

1. 安裝APK改之理
這是一款輔助調(diào)試軟件,請(qǐng)自行搜索下載并安裝。
2. 安裝IDA6.6
為了進(jìn)行安卓APP指令的調(diào)試,需要安裝IDA6.6。現(xiàn)該版本已提供免費(fèi)下載安裝,請(qǐng)自行搜索并安裝。
四、Dalvik指令動(dòng)態(tài)調(diào)試

1. 準(zhǔn)備工作
安卓APP應(yīng)用程序是一個(gè)壓縮包,后綴為apk。將其后綴改為rar并打開,找到其中的classes.dex文件,它包含所有的Dalvik指令。
使用APK改之理打開apk文件,軟件會(huì)自動(dòng)進(jìn)行反編譯。反編譯后生成的文件保存了APP的Dalvik指令。
在APK改之理中打開AndroidManifest.xml文件,在application標(biāo)簽內(nèi)添加android:debuggable="true",然后保存并重新編譯生成新的apk文件。
2. 安裝調(diào)試

在Eclipse中啟動(dòng)創(chuàng)建的虛擬機(jī),運(yùn)行新編譯的apk文件。如果遇到Eclipse啟動(dòng)失敗的問題,可以嘗試修改配置文件的相關(guān)參數(shù)。
使用SDK安裝目錄下的adb shell工具進(jìn)行命令行調(diào)試。將adb.exe注冊(cè)到系統(tǒng)環(huán)境變量中,在DOS命令行窗口執(zhí)行adb shell即可進(jìn)入APP命令行調(diào)試環(huán)境。
在DOS命令行下執(zhí)行adb install命令,安裝重新編譯好的APK文件。
五、注意事項(xiàng)
在進(jìn)行動(dòng)態(tài)調(diào)試過程中,可能會(huì)遇到一些問題,比如文件路徑錯(cuò)誤、權(quán)限問題等。遇到這些問題時(shí),請(qǐng)檢查相關(guān)設(shè)置和路徑是否正確,并確認(rèn)你的操作符合Android系統(tǒng)的相關(guān)規(guī)定。為了獲得更好的調(diào)試效果,建議對(duì)Android系統(tǒng)有一定的了解,并熟悉相關(guān)開發(fā)工具的使用。利用IDA動(dòng)態(tài)調(diào)試APP的詳細(xì)步驟

====================
一、解壓APP包并導(dǎo)入IDA
將APP包中的classes.dex文件解壓至任意目錄,然后將其拖入IDA Pro動(dòng)態(tài)調(diào)試軟件中。等待IDA加載分析完畢。
二、設(shè)置調(diào)試選項(xiàng)
在IDA界面中點(diǎn)擊“Debugger”菜單,選擇“Debugger Options”。按照?qǐng)D示勾選“在進(jìn)程入口掛起”,然后點(diǎn)擊“Set specific options”。在打開的窗口中填入APP包的名稱和入口activity。這些信息可以從APK的AndroidManifest.xml文件中獲取。

AndroidManifest.xml示例:
```xml

```
三、設(shè)置調(diào)試端口

點(diǎn)擊“Debugger”菜單,然后選擇“Process Options”。在端口設(shè)置中,將默認(rèn)端口改為8700。這個(gè)端口用于后續(xù)的調(diào)試通信。端口號(hào)的選擇可以根據(jù)實(shí)際需要調(diào)整。
四、獲取調(diào)試端口信息
通過Android SDK中的DDMS工具,可以監(jiān)視APP的運(yùn)行狀態(tài)和結(jié)果,從而獲取調(diào)試端口信息。在DDMS中選中相應(yīng)的進(jìn)程后,可以看到其調(diào)試端口注釋,本機(jī)通常為8700。
五、開始調(diào)試
準(zhǔn)備工作完成后,可以開始調(diào)試APP。在APK源碼中定位到感興趣的函數(shù),例如getPwdFromPic(),在IDA中搜索該函數(shù)字符串。找到相關(guān)函數(shù)后,可以在其調(diào)用位置下斷點(diǎn)。通過點(diǎn)擊綠色三角形按鈕啟動(dòng)調(diào)試。

在調(diào)試過程中可能會(huì)遇到端口被占用的問題。如果出現(xiàn)“can’t bind socket”的提示,可能是因?yàn)镈DMS占用了端口。此時(shí)可以關(guān)閉Eclips并重新啟動(dòng)虛擬機(jī),以釋放端口資源。
以一個(gè)crackme應(yīng)用為例,用戶需要輸入密碼才能進(jìn)入正確界面。通過IDA動(dòng)態(tài)調(diào)試,可以跟蹤APP的運(yùn)行,深入理解其工作原理,找出可能的漏洞或?qū)崿F(xiàn)特定功能的方式。反匯編調(diào)試實(shí)踐:理解并追蹤程序流程
====================
一、IDA中的本地變量窗口與流程跟蹤
當(dāng)我們輸入特定的數(shù)字如“123”,并點(diǎn)擊登陸時(shí),IDA中斷在我們?cè)O(shè)置斷點(diǎn)的地方。這時(shí),我們需要開啟IDA的調(diào)試功能來追蹤程序的流程。具體操作步驟如下:

選擇ida->debugger->use source level debugger,然后,點(diǎn)擊ida->debugger->debugger windows->locals打開本地變量窗口。這個(gè)窗口可以幫助我們實(shí)時(shí)觀察到程序運(yùn)行過程中變量的變化情況。例如,我們輸入的“123”可能被轉(zhuǎn)化為特定的密碼如“么廣亡”,同時(shí)pw變量也顯示出了正確的密碼。這時(shí),我們已經(jīng)可以很容易地判斷出正確的密碼了。
通過F7或F8單步跟蹤程序流程,我們可以在圖形視圖中看到整個(gè)APP執(zhí)行的流程圖。這樣,我們可以直觀地理解程序的運(yùn)行邏輯和流程。
二、Android原生動(dòng)態(tài)鏈接庫的動(dòng)態(tài)調(diào)試
為了保護(hù)代碼和數(shù)據(jù),有時(shí)APP會(huì)調(diào)用動(dòng)態(tài)鏈接庫文件(以so為后綴)。為了調(diào)試這些原生庫,我們需要采用動(dòng)態(tài)附加的方式。下面詳細(xì)介紹調(diào)試步驟:
準(zhǔn)備工作:

將IDA中的dbgsrv目錄下的android_server拷貝到虛擬機(jī)里,并賦予其可執(zhí)行權(quán)限。具體操作DOS命令如下:
1. adb shell pull d: android_server/data/data/sv
2. adb shell chmod 755 /data/data/sv
接下來,啟動(dòng)調(diào)試服務(wù)器android_server,默認(rèn)監(jiān)聽23946端口。然后重新打開DOS窗口進(jìn)行端口轉(zhuǎn)發(fā)。
利用IDA進(jìn)行動(dòng)態(tài)調(diào)試:

在虛擬機(jī)里啟動(dòng)要調(diào)試的APP后,啟動(dòng)IDA并連接到遠(yuǎn)程Armlinux/andoid debugger。端口改為23946后,點(diǎn)擊OK并選中要調(diào)試的APP的數(shù)據(jù)包名。正常情況下,IDA會(huì)把APP進(jìn)程掛起。
由于當(dāng)前程序不是在動(dòng)態(tài)鏈接庫領(lǐng)空,我們需要重新打開一個(gè)IDA來打開需要調(diào)試的so文件。找到需要下斷的位置的文件偏移后關(guān)閉這個(gè)IDA。在原IDA界面按下ctrl+s鍵找到需要調(diào)試的so文件并記錄其加載基址。然后跳轉(zhuǎn)到SO文件需要下斷的地方并設(shè)置斷點(diǎn)。當(dāng)APP執(zhí)行到此處時(shí)便可以被調(diào)試。在此過程中需注意程序加載so時(shí)會(huì)執(zhí)行JNI_OnLoad函數(shù)并可能包含反調(diào)試功能。如果被檢測(cè)到了調(diào)試器可能會(huì)自動(dòng)退出這時(shí)需改變調(diào)試策略重新進(jìn)行調(diào)試。通過這些步驟我們能夠順利地對(duì)Android原生動(dòng)態(tài)鏈接庫進(jìn)行動(dòng)態(tài)調(diào)試分析程序的運(yùn)行情況并進(jìn)行適當(dāng)?shù)恼{(diào)整和優(yōu)化工作以提升軟件性能和安全水平達(dá)到良好的開發(fā)效果同時(shí)在這個(gè)過程中也有助于深入理解軟件的運(yùn)行原理和結(jié)構(gòu)提升開發(fā)技能和能力水平為未來的開發(fā)工作奠定堅(jiān)實(shí)基礎(chǔ)。Android應(yīng)用調(diào)試流程與軟鍵盤狀態(tài)監(jiān)聽
一、應(yīng)用調(diào)試啟動(dòng)流程
在完成4.1第3步后,我們需要在DOS命令行執(zhí)行特定的命令來啟動(dòng)應(yīng)用。命令如下:
```bash

adb shell am start -D -n com.yaotong.crackme/com.yaotong.crackme.MainActivity
```
這條命令的目的是以調(diào)試模式啟動(dòng)APP,如圖所示:
其中,“com.yaotong.crackme”是應(yīng)用的包名,“com.yaotong.crackme.MainActivity”是我們要執(zhí)行的入口點(diǎn)。這些信息可以通過APK改之理工具來查看。
由于應(yīng)用還未運(yùn)行,反調(diào)試函數(shù)暫時(shí)不發(fā)揮作用。按照4.2中的第2步,我們將應(yīng)用掛起。IDA會(huì)中斷在某個(gè)位置。

接下來,我們需要設(shè)置debugger選項(xiàng)。點(diǎn)擊debugger->debugger opitions,按照界面引導(dǎo)設(shè)置完畢后,點(diǎn)擊OK。隨后按F9運(yùn)行APP。
再在DOS命令下執(zhí)行:
```bash
jdb-connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
```

執(zhí)行這條命令后,APP會(huì)暫停運(yùn)行。然后按照4.2中的步驟3、4、5找到JNI_OnLoad函數(shù)的地址并設(shè)置斷點(diǎn)。按F9后,程序會(huì)在該點(diǎn)中斷,這樣我們就可以繼續(xù)動(dòng)態(tài)地進(jìn)行跟蹤和調(diào)試分析了。
二、Android手機(jī)軟鍵盤的彈起和關(guān)閉的監(jiān)聽
在Android App開發(fā)過程中,我們經(jīng)常需要監(jiān)聽軟鍵盤的彈起和關(guān)閉狀態(tài),但Android官方API并沒有提供直接的監(jiān)聽方法。這里我為大家提供一個(gè)簡單實(shí)用的方案。
為了實(shí)現(xiàn)對(duì)軟鍵盤狀態(tài)的監(jiān)聽,我們可以利用全局布局的變化來判斷。當(dāng)軟鍵盤彈起時(shí),會(huì)導(dǎo)致窗口布局的高度發(fā)生變化。我們可以通過監(jiān)聽這個(gè)變化來判斷軟鍵盤的狀態(tài)。
具體實(shí)現(xiàn)方式是在需要監(jiān)聽的Activity的`onWindowResize`方法中,添加對(duì)窗口高度變化的監(jiān)聽邏輯。當(dāng)窗口高度發(fā)生變化時(shí),即可判斷軟鍵盤的彈起和關(guān)閉狀態(tài)。通過這種方式,我們可以實(shí)現(xiàn)軟鍵盤狀態(tài)的實(shí)時(shí)監(jiān)聽,并根據(jù)需求進(jìn)行相應(yīng)的業(yè)務(wù)處理。

需要注意的是,這種方法雖然簡單有效,但并非官方推薦的API,因此可能存在某些特殊情況下的不穩(wěn)定性。在實(shí)際開發(fā)中,建議根據(jù)具體需求和項(xiàng)目要求,選擇合適的方法來監(jiān)聽軟鍵盤的狀態(tài)。 Android開發(fā)中Manifest文件中Activity的軟鍵盤模式設(shè)置指南
一、基礎(chǔ)知識(shí)介紹
在Android開發(fā)中,為了優(yōu)化用戶體驗(yàn),特別是在處理輸入內(nèi)容時(shí),了解并合理設(shè)置Activity的軟鍵盤模式至關(guān)重要。這通常在應(yīng)用的Manifest文件中進(jìn)行配置。
二、軟鍵盤模式的屬性概覽
在manifest文件的Activity標(biāo)簽中,我們可以設(shè)置`android:windowSoftInputMode`屬性,該屬性決定了當(dāng)軟鍵盤出現(xiàn)時(shí),Activity窗口如何響應(yīng)。常見的屬性值及其含義如下:

1. stateUnspecified:軟鍵盤狀態(tài)未指定,系統(tǒng)根據(jù)主題設(shè)置選擇合適的狀態(tài)。
2. stateUnchanged:Activity出現(xiàn)時(shí),保持上一個(gè)Activity的軟鍵盤狀態(tài)。
3. stateHidden:用戶選擇Activity時(shí),軟鍵盤總是被隱藏。
4. stateAlwaysHidden:Activity主窗口獲取焦點(diǎn)時(shí),軟鍵盤也始終被隱藏。
5. stateVisible:軟鍵盤通常是可見的。

6. stateAlwaysVisible:用戶選擇Activity時(shí),軟鍵盤始終顯示。
7. adjustUnspecified:系統(tǒng)自行決定軟鍵盤的顯示或隱藏。
8. adjustResize:Activity調(diào)整屏幕大小以留出軟鍵盤空間。
9. adjustPan:自動(dòng)移動(dòng)窗口內(nèi)容,確保輸入焦點(diǎn)不被鍵盤覆蓋,用戶可看到輸入內(nèi)容。
三、實(shí)際案例解析

假設(shè)我們有一個(gè)名為`com.zy.project.MainActivity`的Activity,我們想在Manifest文件中設(shè)置其軟鍵盤模式。下面是一個(gè)實(shí)際的例子:
```xml
android:name="com.zy.project.MainActivity" android:label="@string/app_name" android:windowSoftInputMode="stateAlwaysHidden|adjustResize">
```
在這個(gè)例子中,我們?cè)O(shè)置了`android:windowSoftInputMode`為`stateAlwaysHidden|adjustResize`。這意味著當(dāng)軟鍵盤彈出時(shí),Activity窗口會(huì)滾動(dòng)以適應(yīng)屏幕空間,同時(shí)軟鍵盤始終被隱藏。這使得用戶可以輕松瀏覽整個(gè)界面內(nèi)容。
四、總結(jié)
合理設(shè)置軟鍵盤模式對(duì)于提升用戶體驗(yàn)至關(guān)重要。開發(fā)者應(yīng)根據(jù)應(yīng)用的實(shí)際需求和用戶體驗(yàn)考慮選擇合適的軟鍵盤模式。通過正確配置Manifest文件,我們可以確保軟鍵盤與Activity窗口的互動(dòng)達(dá)到最佳效果。軟鍵盤彈起與關(guān)閉的監(jiān)聽實(shí)現(xiàn)

一、背景介紹
在Android開發(fā)中,監(jiān)聽軟鍵盤的彈起與關(guān)閉是一個(gè)常見的需求。特別是在一些需要適應(yīng)軟鍵盤彈起狀態(tài)的界面布局中,如輸入框位于頁面底部時(shí),軟鍵盤的彈起可能導(dǎo)致輸入框被遮擋。為此,我們需要監(jiān)聽軟鍵盤的狀態(tài)變化,以便做出相應(yīng)的布局調(diào)整。
二、核心代碼分析
2.1 設(shè)置外層布局文件的id
在activity的最外層布局文件中,設(shè)置一個(gè)id,如"root_layout",以便在Activity中通過findViewById獲取該視圖。

2.2 在Activity中設(shè)置監(jiān)聽
在MainActivity中,我們繼承了Activity類,并實(shí)現(xiàn)了OnLayoutChangeListener接口。這樣,當(dāng)外層布局的大小發(fā)生變化時(shí),我們可以監(jiān)聽到。
2.3 獲取屏幕高度和軟鍵盤彈起高度閥值
在onCreate方法中,我們獲取屏幕高度,并設(shè)置軟鍵盤彈起后所占高度的閥值為屏幕高度的1/3。
2.4 添加布局變化監(jiān)聽器

在onResume方法中,我們?yōu)橥鈱硬季痔砑恿薕nLayoutChangeListener監(jiān)聽器。
2.5 監(jiān)聽布局變化并處理
在onLayoutChange方法中,我們比較布局變化前后的底部坐標(biāo),判斷軟鍵盤的彈起與關(guān)閉。當(dāng)控件將Activity向上推的高度超過1/3屏幕高時(shí),認(rèn)為軟鍵盤彈起;反之,則認(rèn)為軟鍵盤關(guān)閉。根據(jù)這一變化,我們可以做出相應(yīng)的提示或布局調(diào)整。
三、實(shí)際效果
通過以上的代碼實(shí)現(xiàn),我們可以有效地監(jiān)聽軟鍵盤的彈起與關(guān)閉狀態(tài)。當(dāng)軟鍵盤狀態(tài)發(fā)生變化時(shí),我們可以顯示Toast提示,或者根據(jù)實(shí)際需求進(jìn)行其他操作,如調(diào)整輸入框的位置等。

四、總結(jié)
本篇文章介紹了如何在Android開發(fā)中監(jiān)聽軟鍵盤的彈起與關(guān)閉。通過對(duì)外層布局的變化進(jìn)行監(jiān)聽,我們可以實(shí)時(shí)獲取軟鍵盤的狀態(tài),并據(jù)此進(jìn)行布局調(diào)整。這種技術(shù)對(duì)于提高用戶體驗(yàn)和界面友好性非常有幫助。在實(shí)際項(xiàng)目中,可以根據(jù)需求進(jìn)行更復(fù)雜的處理,如動(dòng)態(tài)調(diào)整輸入框位置、滾動(dòng)頁面等。
五、參考資料
六、注意事項(xiàng)
1. 在實(shí)際使用中,需要注意不同設(shè)備的屏幕大小和分辨率差異,以及不同Android版本的行為差異。

2. 監(jiān)聽軟鍵盤狀態(tài)的變化只是一種手段,具體的布局調(diào)整策略需要根據(jù)實(shí)際需求進(jìn)行設(shè)計(jì)和實(shí)現(xiàn)。
3. 在進(jìn)行布局調(diào)整時(shí),要注意保持界面的簡潔和易用性,避免過多的復(fù)雜操作影響用戶體驗(yàn)。