丨版權說明 : 《Android逆向之調試smali代碼》於當前CSDN博客和乘月網屬同一原創,轉載請說明出處,謝謝。
最近在研究Android逆向方面的知識,在這裏做個示例筆記
準備
項目 | 版本 |
---|---|
Android Studio | 3.1.2 |
JDK | 1.8.0_152 |
Apktool | 2.3.2 |
smalidea | 0.05 |
之所以列出版本號,一方面因爲調試工具需要用到Android Device Monitor
工具,而Android Studio 3.0開始棄用該工具,所以使用方法比較特殊,另一方面希望要通過本篇文章學習的童鞋,儘量跟着我的版本號來,防止出現不必要的問題。
開擼
做一個簡單的Android項目Demo
新建一個Android工程
然後我們編輯一個簡單的登錄佈局。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<EditText
android:id="@+id/et_username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="30dp"
android:hint="請輸入用戶名" />
<EditText
android:id="@+id/et_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="30dp"
android:hint="請輸入密碼"
android:inputType="textPassword" />
<Button
android:id="@+id/btn_login"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="登錄" />
</LinearLayout>
- 再編寫簡單的登錄java邏輯
......
public class MainActivity extends AppCompatActivity {
EditText et_username, et_password;
Button btn_login;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_username = findViewById(R.id.et_username);
et_password = findViewById(R.id.et_password);
btn_login = findViewById(R.id.btn_login);
btn_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String username = et_username.getText().toString().trim();
String password = et_password.getText().toString().trim();
checkLogin(username, password);
}
});
}
/**
* 登錄
*
* @param username
* @param password
*/
public void checkLogin(String username, String password) {
if ("cheny".equals(username) && "123456".equals(password)) {
Toast.makeText(this, "登錄成功!", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "登錄失敗!", Toast.LENGTH_SHORT).show();
}
}
}
編輯完畢後,先確保手機已經連接上Android Studio,然後編譯打包apk安裝到手機,再拖出apk包用來反編譯
利用apktool等逆向工具對apk包進行反編譯,反編譯結果如下圖
新建任意英文名文件夾,本文叫“DemoSmali”,將反編譯結果目錄下的
smali
文件夾copy到“DemoSmali”目錄下並重命名爲”src”,爲之後導入Android Studio作鋪墊。嗯哼?是不是很像一個名爲”DemoSmali”的項目?
關閉逆向工具,因爲可能會佔用adb或相關端口
着手Debug
1. 建立debug環境體系
- 進入
android sdk
的tools
目錄,即Android Device Monitor
所在的目錄,雙擊monitor.bat
文件開啓Monitor
注意:
- 目前所有Android Studio版本都可以通過此方式開啓Monitor
- Android Studio3.0之前版本是可以直接在Studio上的Tools菜單找到”Android Device Monitor”入口的
此時,會出現Monitor窗口
,窗口上會顯示你的手機設備。如果沒有顯示,檢查手機有沒有連接好Android Studio,如果顯示了但提示“Could not open Selected VM debug port (8700)”類似字樣,請檢查逆向工具以及其它會佔用adb
的軟件如某助手,某豆莢是否已經關閉。
cmd命令行
切換到android sdk
的platform-tools
目錄,即adb所在的目錄,執行命令
adb shell am start -D -n cn.icheny.demo/cn.icheny.demo.MainActivity
目的:調試MainActivity
格式: adb shell am start -D -n 應用包名/Activity具體類名
- 執行後,手機會出現debug彈窗,千萬別關閉。在Monitor窗口上也會多出一行,即紅色debug logo那一行,記錄以下紅圈兩個端口號
- 關閉
Monitor窗口
,因爲會佔用8700端口。cmd命令行
切換到adb所在的目錄,執行命令 adb forward tcp:8700 jdwp:19509
adb forward tcp:8700 jdwp:18896
格式: adb forward tcp:tcp端口 jdwp:設備Online端口
jdwp:Java Debug Wire Protocol,Java 調試線協議。
若cmd
窗口沒有提示說明成功了,若提示“cannot bind listener: cannot bind to 127.0.0.1:8700”類似字樣說明沒有關閉Monitor窗口
唄,咋這麼不聽話來!關閉後,重新執行一遍命令即可。
2. 配置調試
- 將
DemoSmali
目錄導入Android Studio
導入後工程視圖會自動切換爲“Android”,然而什麼都看不到,手動切換爲“Project”即可
右鍵
src
目錄,將其轉爲“Sources Root”
增加一個遠程調試配置
爲項目配置JDK
3. 調試
- 打斷點
不懂smali語法沒關係,從上圖可以看出斷點打在了“if (“cheny”.equals(username) && “123456”.equals(password)) {”位置附近。 - 開啓調試
- 在手機上輸入用戶名和密碼後點登錄按鈕,即可進入debug
嗯哼,是不是似曾相識的debug畫面?會smali語法的話,就可以愉快的玩耍了。
OK,到這裏就完全結束了,後面會不定期更新……