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