反编译
创建安卓项目,并编写示例代码,编译打包
<?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
dex2jar classes.dex -> .\classes-dex2jar.jar
打开jar文件
工具jadx-gui下载 https://github.com/skylot/jadx 反编译后的代码
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 void lambda$onCreate$0$MainActivity(EditText editText, EditText editText2, View view) {
login(editText, editText2);
}
@Override
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() {
@Override
public final void onClick(View view) {
MainActivity.this.lambda$onCreate$0$MainActivity(editText, editText2, view);
}
});
}
}
反编译之资源包
|