反编译
创建安卓项目,并编写示例代码,编译打包
- 布局代码
<?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"