• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Android反编译和二次打包实战

Android反编译和二次打包实战

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了android项目实战,android开发实战经典,android项目实战视频,android studio实战,android应用开发实战等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Android反编译和二次打包实战


作为Android开发者,工作中少不了要反编译别人的apk,当然主要目的还是为了学习到更多,取彼之长,补己之短。今天就来总结一下Android反编译和二次打包的一些知识。首先声明本文的目的是为了通过例子讲解反编译和二次打包的原理和方法,继而作为后续讲解防止二次打包和App安全的依据,并不是鼓励大家去重新打包别人的App,盗取他人劳动成果。

本文首先介绍几种Android反编译工具的使用,然后实现在不需要知道源代码的情况下,仅通过修改反编译得到的smali文件实现修改apk逻辑功能的目的。

Android中常用的反编译工具有三个:dex2jar、jd-gui和apktool,这三个工具的作用如下:

dex2jar:将apk中的classes.dex文件转换成jar文件。

jd-gui:查看由dex2jar转换成的jar文件,以界面的形式展示反编译出来的Java源代码。

apktool:反编译生成smali字节码文件,提取apk中的资源文件。

为了尽可能的把问题讲清楚,我们来实现一个很简单的例子。首先创建一个工程DecompileDemo,在MainActivity中定义一个布局,其中包含一个Button,点击会打印一段日志。

 

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private static final String TAG = "MainActivity";
    private Button btn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn = (Button) findViewById(R.id.btn);
        btn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Log.d(TAG,"Button is clicked");
    }
}
将这个工程编译生成的apk解压,取出其中的classes.dex放在dex2jar工具的目录下,然后执行命令

 

\

会在当前目录下生成class-dex2jar.jar文件

\

然后打开jd-gui,将class-dex2jar.jar文件拖进去,就可以看到反编译出来的源代码。

\

可以看到反编译的代码和原本的代码差别不大,主要差别是原来的资源引用全都变成了数字。

下面我们来修改这个apk的内容。

首先我们将apk拷贝到apktool工具目录下,执行命令apktool d app-release.apk。

\

生成的目录中包含smali文件夹

\

然后找到我们的主要的类MainActivity.smali,文件内容如下:

 

.class public Lcom/viclee/decompiledemo/MainActivity;
.super Landroid/support/v7/app/AppCompatActivity;
.source "MainActivity.java"

# interfaces
.implements Landroid/view/View$OnClickListener;
?

# static fields
.field private static final TAG:Ljava/lang/String; = "MainActivity"


# instance fields
.field private btn:Landroid/widget/Button;


# direct methods
.method public constructor ()V
    .locals 0

    .prologue
    .line 9
    invoke-direct {p0}, Landroid/support/v7/app/AppCompatActivity;->()V

    return-void
.end method


# virtual methods
.method public onClick(Landroid/view/View;)V
    .locals 2
    .param p1, "v"    # Landroid/view/View;

    .prologue
    .line 23
    const-string v0, "MainActivity"

    const-string v1, "Button is clicked"

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

    .line 24
    return-void
.end method

.method protected onCreate(Landroid/os/Bundle;)V
    .locals 1
    .param p1, "savedInstanceState"    # Landroid/os/Bundle;

    .prologue
    .line 14
    invoke-super {p0, p1}, Landroid/support/v7/app/AppCompatActivity;->onCreate(Landroid/os/Bundle;)V

    .line 15
    const v0, 0x7f040019

    invoke-virtual {p0, v0}, Lcom/viclee/decompiledemo/MainActivity;->setContentView(I)V

    .line 17
    const v0, 0x7f0c0050

    invoke-virtual {p0, v0}, Lcom/viclee/decompiledemo/MainActivity;->findViewById(I)Landroid/view/View;

    move-result-object v0

    check-cast v0, Landroid/widget/Button;

    iput-object v0, p0, Lcom/viclee/decompiledemo/MainActivity;->btn:Landroid/widget/Button;

    .line 18
    iget-object v0, p0, Lcom/viclee/decompiledemo/MainActivity;->btn:Landroid/widget/Button;

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

    .line 19
    return-void
.end method

其中36-40行是打印日志的位置,文件内容很清晰,每个区域的意义如下:

.class 类名

.super 父类名

.source 文件名

.implements 这个类实现的接口

.field 成员变量

.method 方法

然后新建一个工程,在这个工程中实现想要替换的代码,我们这里是希望将原始工程中打印日志的地方替换为弹出一个Toast。

 

public class MainActivity extends AppCompatActivity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        showToast();
    }

    public void showToast() {
        Toast.makeText(this,"我是反编译后进行的修改。",Toast.LENGTH_LONG).show();
    }
}

然后像前面一样执行apktool命令,生成的smali文件内容如下:

 

 

.class public Lcom/viclee/decompiledemo/MainActivity;
.super Landroid/support/v7/app/AppCompatActivity;
.source "MainActivity.java"


# direct methods
.method public constructor ()V
    .locals 0

    .prologue
    .line 7
    invoke-direct {p0}, Landroid/support/v7/app/AppCompatActivity;->()V

    return-void
.end method


# virtual methods
.method protected onCreate(Landroid/os/Bundle;)V
    .locals 1
    .param p1, "savedInstanceState"    # Landroid/os/Bundle;

    .prologue
    .line 10
    invoke-super {p0, p1}, Landroid/support/v7/app/AppCompatActivity;->onCreate(Landroid/os/Bundle;)V

    .line 11
    const v0, 0x7f040019

    invoke-virtual {p0, v0}, Lcom/viclee/decompiledemo/MainActivity;->setContentView(I)V

    .line 13
    invoke-virtual {p0}, Lcom/viclee/decompiledemo/MainActivity;->showToast()V

    .line 14
    return-void
.end method

.method public showToast()V
    .locals 2

    .prologue
    .line 17
    const-string v0, "\u6211\u662f\u53cd\u7f16\u8bd1\u540e\u8fdb\u884c\u7684\u4fee\u6539\u3002"

    const/4 v1, 0x1

    invoke-static {p0, v0, v1}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;

    move-result-object v0

    invoke-virtual {v0}, Landroid/widget/Toast;->show()V

    .line 18
    return-void
.end method

上面代码中,33、39-56行就是弹出Toast的代码部分。将上面整个showToast方法拷贝到原始工程的smali文件中,这里要特别注意修改行号,这个行号表示的是代码在原始Java文件中的行号,需要参考两个smali文件的行号来修改。我认为只要保证方法内的行号不乱序,并且方法之间的行号不冲突就可以。然后,需要将原始工程中打印日志的代码替换为显示Toast的代码,也就是将原始smali文件中36-40行修改为新建工程中33、39-56行的内容。修改后的内容如下,主要关注下面内容中36行、75-91行与原始smali文件的差异。

 

.class public Lcom/viclee/decompiledemo/MainActivity;
.super Landroid/support/v7/app/AppCompatActivity;
.source "MainActivity.java"

# interfaces
.implements Landroid/view/View$OnClickListener;


# static fields
.field private static final TAG:Ljava/lang/String; = "MainActivity"


# instance fields
.field private btn:Landroid/widget/Button;


# direct methods
.method public constructor ()V
    .locals 0

    .prologue
    .line 9
    invoke-direct {p0}, Landroid/support/v7/app/AppCompatActivity;->()V

    return-void
.end method


# virtual methods
.method public onClick(Landroid/view/View;)V
    .locals 2
    .param p1, "v"    # Landroid/view/View;

    .prologue
    .line 23
    invoke-virtual {p0}, Lcom/viclee/decompiledemo/MainActivity;-&g



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 9套Android实战经典项目资料分享给大家,9套android
  • Android 急速发布项目到 JitPack,androidjitpack
  • Android反编译和二次打包实战
  • 【项目篇】Android团队项目开发之统一代码规范
  • Android实战技巧之五十:App的系统签名
  • Android实战技巧之四十九:Usb通信之USB Host
  • android 项目 分享图片到微信

相关文章

  • 2017-05-26集成websocket即时通讯 java聊天源码 代码下载 java后台框架源码 websocket源码 IM,websocket即时通讯
  • 2017-05-26android中使用图文并茂的按钮,android图文并茂
  • 2017-05-26Android 涂鸦最佳实践
  • 2017-05-26[android] 手机卫士手势滑动切换屏幕,android手势
  • 2017-05-26EventBus简单使用教程
  • 2017-05-26硅谷新闻8--TabLayout替换ViewPagerIndicator,tablayoutindicator
  • 2017-05-26Android中View实现弹性滑动的方法——Android开发艺术探索笔记
  • 2017-05-26Android中使用Notification实现进度通知栏(示例三),notification进度条
  • 2017-05-26基于Pacemaker的PostgreSQL一主多从读负载均衡集群搭建
  • 2017-05-26获取Android当前网络类型(2g、3g、4g、wifi)以及手机型号、版本号

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Android生命周期,activity生命周期
    • andriod arcgis加载影像TIF,andriodarcgis
    • nagios分组出图代码实现讲解[1]
    • android studio导入PullToRefresh教程
    • Android EditText只有下面有一条横线问题
    • Android学习笔记(34):Android菜单
    • 硅谷商城第二版6--购物车模块,6--购物车
    • Android 手机卫士--是否有密码区分对话框类型,android卫士
    • 不带数据和返回的Activity跳转,返回activity跳转
    • Android音乐播放器源码(歌词.均衡器.收藏.qq5.0菜单.通知),android.qq5.0

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有