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