Android反编译和回编译

理想情况下以一个具备登录功能的Demo为例进行反编译工具和流程介绍、smali介绍和改包、重签名和回编译、其他作用介绍
 
工具使用:
组合工具:
Android Killer、Jadx-Gui
 
安全测试工具:
脱壳工具:
Xposed框架,VirtualXposed框架,FDex2,dumpDex
Hook Classloader,导出真正的dex
so调试工具:
010 Editor和IDA
====================================================================================
apk改为zip直接解压后的文件目录
debug版本
 
release版本
 
<1> assets目录:保留工程中的assets目录,其他工程下的jar包中的assets也会合并到该目录下
<2> lib目录:由于编译的时候jar文件已经合并到主工程中,所以lib目录下不会有jar文件但lib包中所有的so文件,会保留原有路径
<3> META-INF目录: 信息描述,签名等用途。删除原证书文件(META-INF 文件夹内的***.RSA、***.SF、***.MF三个文件)用于重签名
<4> res目录:工程的资源文件,以主工程为主,其他文件(jar包)会合并到该目录下;但values文件将不会出现在此目录下,因为已经将其编译到resource.arsc文件中;raw文件会保持原有内容不会被编译
<5> AndroidManifest文件: 配置清单。
<6> classes.dex文件: 虚拟机执行的文件。
<7> resources.arsc: 资源文件索引。
<8>freemarker和ftl文件:模板引擎,用于生成模板代码或者文件。
 
 
直接解压后的配置文件等都是乱码,无法直接查看
 
dex2jar和jd-gui的使用:
通过将apk改成压缩文件解压后,拿到虚拟机文件,然后将其放在dex2jar目录,当然也可以其他目录
D:\WorkForLlaria\AndroidHack\OriginHackTools\dex2jar-2.0\dex2jar-2.0\d2j-dex2jar --force D:\WorkForLlaria\AndroidHack\OriginHackTools\dex2jar-2.0\dex2jar-2.0\classes3.dex
 
编译成功后生成jar包,然后拖入jd-gui即可
 
但是这样会比较麻烦,可以使用工具Jadx-Gui:
可以直接编译整个apk或者部分dex文件
以上为常规操作,只是用于看代码,但是混淆后不容易阅读。
 
smali文件是改包关键,可以看做是Android虚拟机的汇编语言
1.apk文件
这是安卓应用安装包的文件格式,本质是一个压缩包,可以将后缀名改为zip直接解压,解压缩后会得到dex文件、资源文件、so文件等
2.dex文件
dalvik执行文件,通过apktool或者直接解压缩得到。
3.jar文件
是一种归档文件,以zip格式构建,包含java和一些元数与资源文件
4.smali文件
dalvik字节码文件,一种中间语言,相当于dalvik虚拟机的汇编语言
5.class文件
java虚拟机的可执行文件
 
ApkTool的使用:
 
bat文件中可以指定jar包版本
主要功能,就是反编译和重新打包。
apktool d D:\WorkForLlaria\AndroidHack\OriginHackTools\SignInAppForShowDebug.apk D:\WorkForLlaria\AndroidHack\HackOutput\SignAppForShow
-o 用于指定输出目录,若不指定,会报错
这样代表反编译成功,此时dex文件已经变成了smali文件
并且此时,配置清单文件和布局文件等均已可以直接打开,当然,如果只是为了看配置清单,可以直接拖动apk包到AS中查看。
 
 
 
Smali语法:
判断语句
if-eq 如果等于
if-ne 如果不等于
if-lt 如果小于
if-le 如果小于等于
if-gt 如果大于
if-ge 如果大于等于
if-eqz 如果等于零
if-nez 如果不等于0
if-ltz 如果小于零
if-lez 如果小于等于零
if-gtz 如果大于零
if-gez 如果大于等于零
 
数据类型:
B---byte
C---char
D---double
F---float
I---int
J---long
S---short
V---void
Z---boolean
[XXX---array
Lxxx/yyy---object
数组的表示方式是:在基本类型前加上前中括号“[”,例如int数组和float数组分别表示为:[I、[F;对象的表示则以L作为开头,格式是LpackageName/objectName;(注意必须有个分号跟在最后),例如String对象在smali中为:Ljava/lang/String;,其中java/lang对应java.lang包,String就是定义在该包中的一个对象。
LpackageName/objectName$subObjectName;。也就是在内部类前加“$”符号
 
Android虚拟机是基于寄存器的
本地寄存器用v开头数字结尾的符号来表示,如v0、v1、v2、...参数寄存器则使用p开头数字结尾的符号来表示,如p0、p1、p2、...特别注意的是,p0不一定是函数中的第一个参数,在非static函数中,p0 代指“this”,p1表示函数的第一个参数,p2代表函数中的第二个参数…而在static函数中p0才对应第一个参数(因为Java的static方法中没有this方法)。
static fields和instance fields均为成员变量,格式是:.field public/private [static] [final] varName:<类型>。然而static fields和instance fields还是有区别的,当然区别很明显,那就是static fields是static的,而instance则不是。根据这个区别来获取这些不同的成员变量时也有不同的指令。一般来说,获取的指令有:iget、sget、iget-boolean、sget-boolean、iget-object、sget-object等,操作的指令有:iput、sput、iput-boolean、sput-boolean、iput-object、sput-object等。没有“-object”后缀的表示操作的成员变量对象是基本数据类型,带“-object”表示操作的成员变量是对象类型,特别地,boolean类型则使用带“-boolean”的指令操作
direct method就是private函数,其余的public和protected函数都属于virtual method
invoke-static:顾名思义就是调用static函数的
invoke-super:调用父类方法用的指令
invoke-direct:调用private函数的
invoke-virtual:用于调用protected或public函数
move-result(返回基本数据类型)和move-result-object(返回对象)
 
注解
# annotations
.annotation [ 注解属性] < 注解类名>
    [ 注解字段 =  值]
.end annotation
私有方法
# direct methods                //添加的注释
.method <访问权限> [ 修饰关键字] < 方法原型>
    <.locals>                   //指定了使用的局部变量的个数
 [.parameter]                   //指定了方法的参数
 [.prologue]                    //指定了代码的开始处,混淆过的代码可能去掉了该指令
 [.line]                    //指定了该处指令在源代码中的行号
<代码体>
.end method
实例
# instance fields
.field < 访问权限> [ 修饰关键字] < 字段名>:< 字段类型>
package/name/ObjectName;->methodName(III)Z
package/name/ObjectName:一个类 
methodName:方法名 
III:参数类型 
Z:返回值

可以做的事:

1、通过修改smali跳过登录

2、拿到代码中的token

3、汉化

通过修改values文件夹中语言或者直接替换smali中的Unicode码来完成。

4、去广告

跳过广告页或者将广告布局设置0dp

package com.jxd.pangolinadtest;
 
import android.content.Intent;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.View;
import android.widget.LinearLayout;
 
import androidx.annotation.MainThread;
import androidx.appcompat.app.AppCompatActivity;
 
import com.bytedance.sdk.openadsdk.AdSlot;
import com.bytedance.sdk.openadsdk.TTAdNative;
import com.bytedance.sdk.openadsdk.TTAdSdk;
import com.bytedance.sdk.openadsdk.TTSplashAd;
 
/**
 * 开屏广告
 */
public class SplashActivity extends AppCompatActivity {
    private LinearLayout mSplashContainer = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
 
        initViews();
 
        initData();
    }
 
    private void initViews() {
        mSplashContainer = findViewById(R.id.splash_container);
    }
 
    private void initData() {
        //创建TTAdNative对象,createAdNative(Context context) context需要传入Activity对象
        TTAdNative mTTAdNative = TTAdSdk.getAdManager().createAdNative(this);
        DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
        AdSlot adSlot = new AdSlot.Builder()
                .setCodeId("887446435")
                .setImageAcceptedSize(displayMetrics.widthPixels, displayMetrics.heightPixels)
                .build();
 
        mTTAdNative.loadSplashAd(adSlot, new TTAdNative.SplashAdListener() {
            //请求广告失败
            @Override
            @MainThread
            public void onError(int code, String message) {
                //开发者处理跳转到APP主页面逻辑
                gotoMain();
            }
 
            //请求广告超时
            @Override
            @MainThread
            public void onTimeout() {
                //开发者处理跳转到APP主页面逻辑
                gotoMain();
            }
 
            //请求广告成功
            @Override
            @MainThread
            public void onSplashAdLoad(TTSplashAd ad) {
                if (ad == null) {
                    return;
                }
                ad.setSplashInteractionListener(new TTSplashAd.AdInteractionListener() {
 
                    //点击回调
                    @Override
                    public void onAdClicked(View view, int type) {
 
                    }
 
                    //展示回调
                    @Override
                    public void onAdShow(View view, int type) {
 
                    }
 
                    //跳过回调
                    @Override
                    public void onAdSkip() {
                        //开发者处理跳转到APP主页面逻辑
                        gotoMain();
                    }
 
                    //超时倒计时结束
                    @Override
                    public void onAdTimeOver() {
                        //开发者处理跳转到APP主页面逻辑
                        gotoMain();
                    }
                });
                //获取SplashView
                View view = ad.getSplashView();
                if (view != null && mSplashContainer != null && !SplashActivity.this.isFinishing()) {
                    mSplashContainer.removeAllViews();
                    //把SplashView 添加到ViewGroup中,注意开屏广告view:width =屏幕宽;height >=75%屏幕高
                    mSplashContainer.addView(view);
                    //设置不开启开屏广告倒计时功能以及不显示跳过按钮,如果这么设置,您需要自定义倒计时逻辑
                    //ad.setNotAllowSdkCountdown();
                }else {
                    //开发者处理跳转到APP主页面逻辑
                    gotoMain();
                }
            }
        }, 4000);
 
 
    }
 
    private void gotoMain() {
        startActivity(new Intent(SplashActivity.this,MainActivity.class));
    }
}

=============================================================================================

以登录页为例:

可以看到点击登录按钮后,如果密码错误,会提示登录失败,对应的Unicode码是\u767b\u5f55\u5931\u8d25,

在工程中进行搜索,可以找到对应的代码

 

//基本信息
.class public Lsun/sundy/signinapp/LoginActivity;
.super Landroidx/appcompat/app/AppCompatActivity;
.source "LoginActivity.java"

//静态常量
# static fields
.field private static final TAG:Ljava/lang/String; = "LoginActivity"


# instance fields
.field btnRegisterLogin:Landroid/widget/Button;
    .annotation runtime Lbutterknife/BindView;
        value = 0x7f090057
    .end annotation
.end field

.field cbTeacherOrStudent:Landroidx/appcompat/widget/AppCompatCheckBox;
    .annotation runtime Lbutterknife/BindView;
        value = 0x7f09005c
    .end annotation
.end field

.field etPassword:Landroid/widget/EditText;
    .annotation runtime Lbutterknife/BindView;
        value = 0x7f09009e
    .end annotation
.end field

.field etPasswordSecond:Landroid/widget/EditText;
    .annotation runtime Lbutterknife/BindView;
        value = 0x7f09009f
    .end annotation
.end field

.field etUserName:Landroid/widget/EditText;
    .annotation runtime Lbutterknife/BindView;
        value = 0x7f0900a0
    .end annotation
.end field

.field private isLogin:Z

.field llUserName:Landroid/widget/LinearLayout;
    .annotation runtime Lbutterknife/BindView;
        value = 0x7f0900d4
    .end annotation
.end field

.field llUserPassword:Landroid/widget/LinearLayout;
    .annotation runtime Lbutterknife/BindView;
        value = 0x7f0900d5
    .end annotation
.end field

.field llUserPasswordSecond:Landroid/widget/LinearLayout;
    .annotation runtime Lbutterknife/BindView;
        value = 0x7f0900d6
    .end annotation
.end field

.field private studentOrTeacherEntityDao:Lsun/sundy/signinapp/database/gen/StudentOrTeacherEntityDao;

.field tvPassword:Landroid/widget/TextView;
    .annotation runtime Lbutterknife/BindView;
        value = 0x7f0901a0
    .end annotation
.end field

.field tvPasswordSecond:Landroid/widget/TextView;
    .annotation runtime Lbutterknife/BindView;
        value = 0x7f0901a1
    .end annotation
.end field

.field tvRegisterOrLogin:Landroid/widget/TextView;
    .annotation runtime Lbutterknife/BindView;
        value = 0x7f0901a2
    .end annotation
.end field

.field tvTitle:Landroid/widget/TextView;
    .annotation runtime Lbutterknife/BindView;
        value = 0x7f0901a4
    .end annotation
.end field

.field tvUserName:Landroid/widget/TextView;
    .annotation runtime Lbutterknife/BindView;
        value = 0x7f0901a5
    .end annotation
.end field

.field viewDividerOne:Landroid/view/View;
    .annotation runtime Lbutterknife/BindView;
        value = 0x7f0901ab
    .end annotation
.end field

.field viewDividerThree:Landroid/view/View;
    .annotation runtime Lbutterknife/BindView;
        value = 0x7f0901ac
    .end annotation
.end field

.field viewDividerTwo:Landroid/view/View;
    .annotation runtime Lbutterknife/BindView;
        value = 0x7f0901ad
    .end annotation
.end field


# direct methods
.method public constructor <init>()V
    .locals 1

    .line 29
    invoke-direct {p0}, Landroidx/appcompat/app/AppCompatActivity;-><init>()V

    .line 64
    const/4 v0, 0x1

    iput-boolean v0, p0, Lsun/sundy/signinapp/LoginActivity;->isLogin:Z

    return-void
.end method

.method static synthetic access$000(Lsun/sundy/signinapp/LoginActivity;)Z
    .locals 1
    .param p0, "x0"    # Lsun/sundy/signinapp/LoginActivity;

    .line 29
    iget-boolean v0, p0, Lsun/sundy/signinapp/LoginActivity;->isLogin:Z

    return v0
.end method

.method static synthetic access$002(Lsun/sundy/signinapp/LoginActivity;Z)Z
    .locals 0
    .param p0, "x0"    # Lsun/sundy/signinapp/LoginActivity;
    .param p1, "x1"    # Z

    .line 29
    iput-boolean p1, p0, Lsun/sundy/signinapp/LoginActivity;->isLogin:Z

    return p1
.end method

.method static synthetic access$100(Lsun/sundy/signinapp/LoginActivity;)V
    .locals 0
    .param p0, "x0"    # Lsun/sundy/signinapp/LoginActivity;

    .line 29
    invoke-direct {p0}, Lsun/sundy/signinapp/LoginActivity;->submitRegister()V

    return-void
.end method

.method static synthetic access$200(Lsun/sundy/signinapp/LoginActivity;)V
    .locals 0
    .param p0, "x0"    # Lsun/sundy/signinapp/LoginActivity;

    .line 29
    invoke-direct {p0}, Lsun/sundy/signinapp/LoginActivity;->submitLogin()V

    return-void
.end method

.method private initData()V
    .locals 3

    .line 158
    nop

    .line 159
    invoke-static {p0}, Lkr/co/namee/permissiongen/PermissionGen;->with(Landroid/app/Activity;)Lkr/co/namee/permissiongen/PermissionGen;

    move-result-object v0

    .line 160
    const/16 v1, 0x13

    invoke-virtual {v0, v1}, Lkr/co/namee/permissiongen/PermissionGen;->addRequestCode(I)Lkr/co/namee/permissiongen/PermissionGen;

    move-result-object v0

    const-string v1, "android.permission.WRITE_EXTERNAL_STORAGE"

    const-string v2, "android.permission.READ_EXTERNAL_STORAGE"

    filled-new-array {v1, v2}, [Ljava/lang/String;

    move-result-object v1

    .line 161
    invoke-virtual {v0, v1}, Lkr/co/namee/permissiongen/PermissionGen;->permissions([Ljava/lang/String;)Lkr/co/namee/permissiongen/PermissionGen;

    move-result-object v0

    .line 165
    invoke-virtual {v0}, Lkr/co/namee/permissiongen/PermissionGen;->request()V

    .line 166
    invoke-static {}, Lsun/sundy/signinapp/database/utils/BizDaoManager;->getInstance()Lsun/sundy/signinapp/database/utils/BizDaoManager;

    move-result-object v0

    invoke-virtual {v0}, Lsun/sundy/signinapp/database/utils/BizDaoManager;->getDaoSession()Lsun/sundy/signinapp/database/gen/DaoSession;

    move-result-object v0

    invoke-virtual {v0}, Lsun/sundy/signinapp/database/gen/DaoSession;->getStudentOrTeacherEntityDao()Lsun/sundy/signinapp/database/gen/StudentOrTeacherEntityDao;

    move-result-object v0

    iput-object v0, p0, Lsun/sundy/signinapp/LoginActivity;->studentOrTeacherEntityDao:Lsun/sundy/signinapp/database/gen/StudentOrTeacherEntityDao;

    .line 167
    return-void
.end method

.method private initListener()V
    .locals 2

    .line 84
    iget-object v0, p0, Lsun/sundy/signinapp/LoginActivity;->tvRegisterOrLogin:Landroid/widget/TextView;

    new-instance v1, Lsun/sundy/signinapp/LoginActivity$1;

    invoke-direct {v1, p0}, Lsun/sundy/signinapp/LoginActivity$1;-><init>(Lsun/sundy/signinapp/LoginActivity;)V

    invoke-virtual {v0, v1}, Landroid/widget/TextView;->setOnClickListener(Landroid/view/View$OnClickListener;)V

    .line 104
    iget-object v0, p0, Lsun/sundy/signinapp/LoginActivity;->btnRegisterLogin:Landroid/widget/Button;

    new-instance v1, Lsun/sundy/signinapp/LoginActivity$2;

    invoke-direct {v1, p0}, Lsun/sundy/signinapp/LoginActivity$2;-><init>(Lsun/sundy/signinapp/LoginActivity;)V

    invoke-virtual {v0, v1}, Landroid/widget/Button;->setOnClickListener(Landroid/view/View$OnClickListener;)V

    .line 131
    return-void
.end method
//以此为例
.method private initView()V
    .locals 2

    .line 79
    iget-object v0, p0, Lsun/sundy/signinapp/LoginActivity;->llUserPasswordSecond:Landroid/widget/LinearLayout;

    const/16 v1, 0x8

    invoke-virtual {v0, v1}, Landroid/widget/LinearLayout;->setVisibility(I)V

    .line 80
    iget-object v0, p0, Lsun/sundy/signinapp/LoginActivity;->cbTeacherOrStudent:Landroidx/appcompat/widget/AppCompatCheckBox;

    invoke-virtual {v0, v1}, Landroidx/appcompat/widget/AppCompatCheckBox;->setVisibility(I)V

    .line 81
    return-void
.end method
//以此为例
.method private submitLogin()V
    .locals 5

    .line 134
    iget-object v0, p0, Lsun/sundy/signinapp/LoginActivity;->studentOrTeacherEntityDao:Lsun/sundy/signinapp/database/gen/StudentOrTeacherEntityDao;

    invoke-virtual {v0}, Lsun/sundy/signinapp/database/gen/StudentOrTeacherEntityDao;->queryBuilder()Lorg/greenrobot/greendao/query/QueryBuilder;

    move-result-object v0

    .line 135
    .local v0, "queryBuilder":Lorg/greenrobot/greendao/query/QueryBuilder;, "Lorg/greenrobot/greendao/query/QueryBuilder<Lsun/sundy/signinapp/entity/StudentOrTeacherEntity;>;"
    sget-object v1, Lsun/sundy/signinapp/database/gen/StudentOrTeacherEntityDao$Properties;->Name:Lorg/greenrobot/greendao/Property;

    iget-object v2, p0, Lsun/sundy/signinapp/LoginActivity;->etUserName:Landroid/widget/EditText;

    invoke-virtual {v2}, Landroid/widget/EditText;->getText()Landroid/text/Editable;

    move-result-object v2

    invoke-virtual {v2}, Ljava/lang/Object;->toString()Ljava/lang/String;

    move-result-object v2

    invoke-virtual {v2}, Ljava/lang/String;->trim()Ljava/lang/String;

    move-result-object v2

    invoke-virtual {v1, v2}, Lorg/greenrobot/greendao/Property;->eq(Ljava/lang/Object;)Lorg/greenrobot/greendao/query/WhereCondition;

    move-result-object v1

    const/4 v2, 0x1

    new-array v2, v2, [Lorg/greenrobot/greendao/query/WhereCondition;

    sget-object v3, Lsun/sundy/signinapp/database/gen/StudentOrTeacherEntityDao$Properties;->Password:Lorg/greenrobot/greendao/Property;

    iget-object v4, p0, Lsun/sundy/signinapp/LoginActivity;->etPassword:Landroid/widget/EditText;

    .line 136
    invoke-virtual {v4}, Landroid/widget/EditText;->getText()Landroid/text/Editable;

    move-result-object v4

    invoke-virtual {v4}, Ljava/lang/Object;->toString()Ljava/lang/String;

    move-result-object v4

    invoke-virtual {v4}, Ljava/lang/String;->trim()Ljava/lang/String;

    move-result-object v4

    invoke-virtual {v3, v4}, Lorg/greenrobot/greendao/Property;->eq(Ljava/lang/Object;)Lorg/greenrobot/greendao/query/WhereCondition;

    move-result-object v3

    const/4 v4, 0x0

    aput-object v3, v2, v4

    .line 135
    invoke-virtual {v0, v1, v2}, Lorg/greenrobot/greendao/query/QueryBuilder;->where(Lorg/greenrobot/greendao/query/WhereCondition;[Lorg/greenrobot/greendao/query/WhereCondition;)Lorg/greenrobot/greendao/query/QueryBuilder;

    .line 137
    invoke-virtual {v0}, Lorg/greenrobot/greendao/query/QueryBuilder;->build()Lorg/greenrobot/greendao/query/Query;

    move-result-object v1

    invoke-virtual {v1}, Lorg/greenrobot/greendao/query/Query;->unique()Ljava/lang/Object;

    move-result-object v1

    check-cast v1, Lsun/sundy/signinapp/entity/StudentOrTeacherEntity;

    .line 138
    .local v1, "entity":Lsun/sundy/signinapp/entity/StudentOrTeacherEntity;
    if-eqz v1, :cond_0

    .line 139
    new-instance v2, Landroid/content/Intent;

    const-class v3, Lsun/sundy/signinapp/MainActivity;

    invoke-direct {v2, p0, v3}, Landroid/content/Intent;-><init>(Landroid/content/Context;Ljava/lang/Class;)V

    .line 140
    .local v2, "intent":Landroid/content/Intent;
    invoke-virtual {v1}, Lsun/sundy/signinapp/entity/StudentOrTeacherEntity;->getName()Ljava/lang/String;

    move-result-object v3

    const-string v4, "loginName"

    invoke-virtual {v2, v4, v3}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;

    .line 141
    invoke-virtual {v1}, Lsun/sundy/signinapp/entity/StudentOrTeacherEntity;->getIsTeacher()I

    move-result v3

    const-string v4, "isTeacher"

    invoke-virtual {v2, v4, v3}, Landroid/content/Intent;->putExtra(Ljava/lang/String;I)Landroid/content/Intent;

    .line 142
    invoke-virtual {p0, v2}, Lsun/sundy/signinapp/LoginActivity;->startActivity(Landroid/content/Intent;)V

    .line 143
    .end local v2    # "intent":Landroid/content/Intent;
    goto :goto_0

    .line 144
    :cond_0
    const-string v2, "\u767b\u5f55\u5931\u8d25\uff0c\u7528\u6237\u4e0d\u5b58\u5728\u6216\u5bc6\u7801\u9519\u8bef\uff01"

    invoke-static {v2}, Lsun/sundy/signinapp/utils/ToastUtils;->showToast(Ljava/lang/String;)V

    .line 146
    :goto_0
    return-void
.end method

.method private submitRegister()V
    .locals 2

    .line 149
    new-instance v0, Lsun/sundy/signinapp/entity/StudentOrTeacherEntity;

    invoke-direct {v0}, Lsun/sundy/signinapp/entity/StudentOrTeacherEntity;-><init>()V

    .line 150
    .local v0, "entity":Lsun/sundy/signinapp/entity/StudentOrTeacherEntity;
    iget-object v1, p0, Lsun/sundy/signinapp/LoginActivity;->etUserName:Landroid/widget/EditText;

    invoke-virtual {v1}, Landroid/widget/EditText;->getText()Landroid/text/Editable;

    move-result-object v1

    invoke-virtual {v1}, Ljava/lang/Object;->toString()Ljava/lang/String;

    move-result-object v1

    invoke-virtual {v1}, Ljava/lang/String;->trim()Ljava/lang/String;

    move-result-object v1

    invoke-virtual {v0, v1}, Lsun/sundy/signinapp/entity/StudentOrTeacherEntity;->setName(Ljava/lang/String;)V

    .line 151
    iget-object v1, p0, Lsun/sundy/signinapp/LoginActivity;->etPassword:Landroid/widget/EditText;

    invoke-virtual {v1}, Landroid/widget/EditText;->getText()Landroid/text/Editable;

    move-result-object v1

    invoke-virtual {v1}, Ljava/lang/Object;->toString()Ljava/lang/String;

    move-result-object v1

    invoke-virtual {v1}, Ljava/lang/String;->trim()Ljava/lang/String;

    move-result-object v1

    invoke-virtual {v0, v1}, Lsun/sundy/signinapp/entity/StudentOrTeacherEntity;->setPassword(Ljava/lang/String;)V

    .line 152
    iget-object v1, p0, Lsun/sundy/signinapp/LoginActivity;->cbTeacherOrStudent:Landroidx/appcompat/widget/AppCompatCheckBox;

    invoke-virtual {v1}, Landroidx/appcompat/widget/AppCompatCheckBox;->isChecked()Z

    move-result v1

    invoke-virtual {v0, v1}, Lsun/sundy/signinapp/entity/StudentOrTeacherEntity;->setIsTeacher(I)V

    .line 153
    iget-object v1, p0, Lsun/sundy/signinapp/LoginActivity;->studentOrTeacherEntityDao:Lsun/sundy/signinapp/database/gen/StudentOrTeacherEntityDao;

    invoke-virtual {v1, v0}, Lsun/sundy/signinapp/database/gen/StudentOrTeacherEntityDao;->insertOrReplace(Ljava/lang/Object;)J

    .line 154
    const-string v1, "\u6ce8\u518c\u6210\u529f\uff01"

    invoke-static {v1}, Lsun/sundy/signinapp/utils/ToastUtils;->showToast(Ljava/lang/String;)V

    .line 155
    return-void
.end method


# virtual methods
.method public doFailSomething()V
    .locals 2
    .annotation runtime Lkr/co/namee/permissiongen/PermissionFail;
        requestCode = 0x13
    .end annotation

    .line 179
    const-string v0, "LoginActivity"

    const-string v1, "doSomething: \u6743\u9650\u83b7\u53d6\u5931\u8d25"

    invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

    .line 180
    invoke-virtual {p0}, Lsun/sundy/signinapp/LoginActivity;->finish()V

    .line 181
    return-void
.end method

.method public doSomething()V
    .locals 2
    .annotation runtime Lkr/co/namee/permissiongen/PermissionSuccess;
        requestCode = 0x13
    .end annotation

    .line 172
    const-string v0, "LoginActivity"

    const-string v1, "doSomething: \u6743\u9650\u83b7\u53d6\u6210\u529f"

    invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

    .line 173
    invoke-static {}, Lsun/sundy/signinapp/database/utils/BizDaoManager;->getInstance()Lsun/sundy/signinapp/database/utils/BizDaoManager;

    move-result-object v0

    invoke-virtual {v0}, Lsun/sundy/signinapp/database/utils/BizDaoManager;->init()Lorg/greenrobot/greendao/database/Database;

    .line 174
    return-void
.end method

.method protected onCreate(Landroid/os/Bundle;)V
    .locals 1
    .param p1, "savedInstanceState"    # Landroid/os/Bundle;
    .annotation system Ldalvik/annotation/MethodParameters;
        accessFlags = {
            0x0
        }
        names = {
            "savedInstanceState"
        }
    .end annotation

    .line 70
    invoke-super {p0, p1}, Landroidx/appcompat/app/AppCompatActivity;->onCreate(Landroid/os/Bundle;)V

    .line 71
    const v0, 0x7f0c001c

    invoke-virtual {p0, v0}, Lsun/sundy/signinapp/LoginActivity;->setContentView(I)V

    .line 72
    invoke-static {p0}, Lbutterknife/ButterKnife;->bind(Landroid/app/Activity;)Lbutterknife/Unbinder;

    .line 73
    invoke-direct {p0}, Lsun/sundy/signinapp/LoginActivity;->initView()V

    .line 74
    invoke-direct {p0}, Lsun/sundy/signinapp/LoginActivity;->initData()V

    .line 75
    invoke-direct {p0}, Lsun/sundy/signinapp/LoginActivity;->initListener()V

    .line 76
    return-void
.end method

重新编译打包:

 apktool b D:\WorkForLlaria\AndroidHack\HackOutput\SignAppForShowDebug

提示报错

此时的apk是无法安装的,因为签名问题。

利用JDK工具中的jarsigner重新签名:

jarsigner -keystore D:\WorkForLlaria\AndroidHack\HackOutput\SignAppForShowDebug\dist\debug.jks -signedjar D:\WorkForLlaria\AndroidHack\HackOutput\SignAppForShowDebug\dist\android_sign.apk D:\WorkForLlaria\AndroidHack\HackOutput\SignAppForShowDebug\dist\SignInAppForShowDebug.apk debugkey

实际很多apk还会加壳和关键代码打包入so

脱壳、so的反编译:

https://blog.csdn.net/xiangzhihong8/article/details/93738211

 
 
 
 
 
 
 
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值