使用JEB調試Android App

1. 開發App

我們首先開發一個簡單的App,輸入123456就提示成功,否則提示失敗。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.testButton).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EditText testEditText=findViewById(R.id.testEditText);
                if (testEditText.getText().toString().equals("123456")){
                    Toast.makeText(MainActivity.this,"成功",Toast.LENGTH_SHORT).show();
                }else{
                    Toast.makeText(MainActivity.this,"失敗",Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">



    <EditText
        android:id="@+id/testEditText"
        android:layout_width="200dp"
        android:layout_height="50dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>

    <Button
        android:id="@+id/testButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="test"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/testEditText" />

</android.support.constraint.ConstraintLayout>

2. 反編譯apk

使用apktool反編譯apk,修改AndroidManifest.xml中的android:debuggable字段爲“true”。

java -jar apktool.jar d app.apk

找到Activity或Application入口,在最前面加上Debug.waitForDebugger的smali代碼,這步其實可以省略,因爲有其它方法使App在入口處斷下來。

invoke-static{}, Landroid/os/Debug;->waitForDebugger()V

3. 回編譯apk

使用apktool把修改完成的文件夾編譯成apk,然後簽名。

java -jar apktool.jar b app -o newapp.apk

4. 調試App

在手機或模擬器中安裝apk,確定手機或模擬器開啓了USB調試,執行命令adb devices檢查是否連接到了手機或模擬器,如果沒有檢測到設備請嘗試關閉Android Studio然後執行命令adb kill-server和adb start-server。

C:\Users\Administrator>adb devices
* daemon not running; starting now at tcp:5037
* daemon started successfully
List of devices attached
emulator-5554   device

使用JEB打開apk,在關鍵代碼處下斷點,然後在手機或模擬器中運行apk,點擊調試器=>開始,附加apk即可開始調試,如果界面空白請嘗試關閉Android Studio然後執行命令adb kill-server和adb start-server。點擊按鈕,斷點斷下來後修改局部變量的值然後運行(有些版本的JEB貌似顯示不了局部變量),就可以使錯誤的值也顯示成功。



除了在入口處添加Debug.waitForDebugger外,還可以使用下面的命令啓動app,也能使app在入口處斷下來。

adb shell am start -D -S -n com.xy.testcrack/com.xy.testcrack.MainActivity
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章