使用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
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页