Android逆向之調試smali代碼

版權說明 : 《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 sdktools目錄,即Android Device Monitor所在的目錄,雙擊monitor.bat文件開啓Monitor
    注意:
    1. 目前所有Android Studio版本都可以通過此方式開啓Monitor
    2. Android Studio3.0之前版本是可以直接在Studio上的Tools菜單找到”Android Device Monitor”入口的

此時,會出現Monitor窗口,窗口上會顯示你的手機設備。如果沒有顯示,檢查手機有沒有連接好Android Studio,如果顯示了但提示“Could not open Selected VM debug port (8700)”類似字樣,請檢查逆向工具以及其它會佔用adb的軟件如某助手,某豆莢是否已經關閉。

  • cmd命令行切換到android sdkplatform-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端口
  jdwpJava 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,到這裏就完全結束了,後面會不定期更新……

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章