反编译
创建安卓项目,并编写示例代码,编译打包
- 布局代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:paddingStart="15dp"
android:paddingEnd="15dp"
android:orientation="vertical"
android:gravity="center"
tools:context=".MainActivity">
<EditText
android:hint="请输入用户名"
android:id="@+id/et_username"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<EditText
android:hint="请输入密码"
android:id="@+id/et_password"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/btn_login"
android:layout_marginTop="30dp"
android:text="登录"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
- 逻辑代码
package com.barray.helloandroid;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EditText etUsername = findViewById(R.id.et_username);
EditText etPassword = findViewById(R.id.et_password);
Button btnLogin = findViewById(R.id.btn_login);
btnLogin.setOnClickListener(view -> {
login(etUsername,etPassword);
});
}
private void login(EditText etUsername,EditText etPassword){
String username = etUsername.getText().toString().trim();
String password = etPassword.getText().toString().trim();
Toast.makeText(MainActivity.this,
"登录成功!!!\n用户名:" + username + "\n密码:" + password, Toast.LENGTH_SHORT).show();
}
}
- 生成签名
keytool -genkeypair -alias crazyit -keyalg RSA -validity 400 -keystore crazyit.jks
上面命令各选项说明如下:
-genkeypair:指定生成数字签名;
-alias:指定生成数字签名的别名;
-keyalg:指定生成数字签名的算法。使用RSA算法。
-validity:指定生成数字签名的有效期,单位天
-keystore:指定生成数字签名的存储路径。
- 查看签名信息
keytool -list -v -keystore jks文件的路径 -storepass 密码
反编译apk包
工具apktool下载
https://ibotpeaches.github.io/Apktool/install/
具体用法参照
https://ibotpeaches.github.io/Apktool/documentation/
- 反编译:
java -jar apktool_2.6.0.jar d app-release.apk
- 编译打包
// 打包生成的文件并没有签名,需要签名
java -jar apktool_2.6.0.jar b app-release -o unsign_new_app.apk
- 给未签名的应用签名
jarsigner –verbose –keystore new_hello.jks –signedjar new_app.apk unsign_new_app.apk new_hello
-verbose 输出签名详细信息
-keystore 指定密钥对的存储路径
-signedjar 后面三个参数分别是 签名后的APK包 未签名的APK包 和 密钥对的别名
修改smali文件
把 登录成功 修改成 我修改了登录
// 修改前
const-string v1, "\u767b\u5f55\u6210\u529f!!!\n\u7528\u6237\u540d\uff1a"
// 修改后
const-string v1, "\u6211\u4fee\u6539\u4e86\u767b\u5f55\u000d\u000a!!!\n\u7528\u6237\u540d\uff1a"
将dex文件变成可读jar文件
工具dex2jar下载
https://github.com/pxb1988/dex2jar
- 解压dex2jar.zip
- 解压需要反编译的apk文件,将dex文件复制到dex2jar的解压文件夹下
- 运行
d2j-dex2jar.bat classes.dex
// 执行后生成了classes-dex2jar.jar
dex2jar classes.dex -> .\classes-dex2jar.jar
打开jar文件
工具jadx-gui下载
https://github.com/skylot/jadx
反编译后的代码
/* loaded from: classes-dex2jar.jar:com/barray/helloandroid/MainActivity.class */
public class MainActivity extends AppCompatActivity {
private void login(EditText editText, EditText editText2) {
String trim = editText.getText().toString().trim();
String trim2 = editText2.getText().toString().trim();
Toast.makeText(this, "登录成功!!!\n用户名:" + trim + "\n密码:" + trim2, 0).show();
}
public /* synthetic */ void lambda$onCreate$0$MainActivity(EditText editText, EditText editText2, View view) {
login(editText, editText2);
}
/* JADX INFO: Access modifiers changed from: protected */
@Override // androidx.appcompat.app.AppCompatActivity, androidx.fragment.app.FragmentActivity, androidx.activity.ComponentActivity, androidx.core.app.ComponentActivity, android.app.Activity
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.activity_main);
final EditText editText = (EditText) findViewById(R.id.et_username);
final EditText editText2 = (EditText) findViewById(R.id.et_password);
((Button) findViewById(R.id.btn_login)).setOnClickListener(new View.OnClickListener() { // from class: com.barray.helloandroid._$$Lambda$MainActivity$LrykRW0rIDejJ4zylINKgM_Yd5g
@Override // android.view.View.OnClickListener
public final void onClick(View view) {
MainActivity.this.lambda$onCreate$0$MainActivity(editText, editText2, view);
}
});
}
}