APK反编译破解方法与加密措施

2023-11-07


所谓APK指的是Android操作系统的应用程序安装文件。所谓Crack,简单地理解为“破解”。我具体指的是反编译APK文件进行汇编级的代码分析,并修改或插入自己的代码,重新签名打包为APK文件,以达到改变程序原有行为的目的。

由以上的说明可知,我们要Crack一个APK文件,主要流程有三步:反编译、代码分析、重新打包签名。

基本准备

我们需要一些基本的工具进行一些主要的工作。如果你是一个会做Android APK汉化的朋友,那么你应该对这些工具非常熟悉:

第一个工具是android-apktool,A tool for reengineering Android apk files 。这个工具是我们完成APK Crack的核心,利用它实现APK文件的反编译和重新打包。它是Google Code上一个非常著名的开源项目,大家可以在Google Code的网页上获取它和它的Wiki、源码及其他相关信息。网址是:http://code.google.com/p/android-apktool/ 。

第二个工具是Auto-sign。这个工具实现的是APK打包后的签名工作,属于一个小工具。

除了这些基本工具外,为了更好的分析代码,你可能还需要用到一些其他工具,例如:dex2jar和jd-gui等,这里不做详述。

反编译

如果你是一个经常汉化APK程序的朋友,那么反编译这一步你肯定不会陌生。不过,既然这篇文章侧重于基本流程讲解,那么这一步想来是不能省掉的。所以,觉得罗嗦的朋友,请跳过。首先我们需要有一个待反编译的APK。这里我自己写了一个HelloWorld的APK,代码如下:

 

 

package com.zh_weir.helloworld;import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);
     }
}

 

我们通过android-apktool对这个APK进行反编译。对于android-apktool的使用,我就不做太多翻译的工作,直接给出说明文档吧。简单一句话,就是命令行执行。

Apktool v1.3.2 - a tool for reengineering Android apk files
	Copyright 2010 Ryszard Wi?niewski <brut.alll@gmail.com>
	
	Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
	Usage: apktool [-v|--verbose] COMMAND [...]

	COMMANDs are:
	    d[ecode] [OPTS] <file.apk> [<dir>]
	        Decode <file.apk> to <dir>.
	        
	        OPTS:
	        -s, --no-src
	            Do not decode sources.
	        -r, --no-res
	            Do not decode resources.
	        -d, --debug
	            Decode in debug mode. Check project page for more info.
	        -f, --force
	            Force delete destination directory.
	        -t <tag>, --frame-tag <tag>
	            Try to use framework files tagged by <tag>.
	        --keep-broken-res
	            Use if there was an error and some resources were dropped, e.g.:
	            "Invalid config flags detected. Dropping resources", but you
	            want to decode them anyway, even with errors. You will have to
	            fix them manually before building.
	            
	    b[uild] [OPTS] [<app_path>] [<out_file>]
	        Build an apk from already decoded application located in <app_path>.
	        It will automatically detect, whether files was changed and perform
	        needed steps only.
	        If you omit <app_path> then current directory will be used.
	        If you omit <out_file> then <app_path>/dist/<name_of_original.apk>
	        will be used.

	        OPTS:
	        -f, --force-all
	            Skip changes detection and build all files.
	        -d, --debug
	            Build in debug mode. Check project page for more info.

	    if|install-framework <framework.apk> 
	        Install framework file to your system.

	For additional info, see: http://code.google.com/p/android-apktool/


通过apktool d HelloWorld.apk的命令,我们就完成了一个简单的APK的反编译工作。得到了一个叫做“HelloWorld”的文件夹。你可以看见文件夹下有Manifest文件,有反编译出的res资源文件。这些东西都是平时汉化特别关心的,而不是我们要注意的重点。我们需要注意的是一个叫做“smali”的文件夹。

仔细观察,你会发现这个文件夹下的文件组织结构和我们的Android工程中java源码的组织结构几乎一致。只不过Java文件被.smali的文件取而代之了。我们用文本编辑器打开这些.smali文件,你会发现它们都是可识别的、并且非常“整齐”的文本文件,大致如下:

.class public Lcom/zh_weir/helloworld/MainActivity;
	.super Landroid/app/Activity;
	.source "MainActivity.java"
	# direct methods
	.method public constructor <init>()V
	    .locals 0
	    .prologue
	    .line 6
	    invoke-direct {p0}, Landroid/app/Activity;-><init>()V
	    return-void
	.end method

	# virtual methods
	.method public onCreate(Landroid/os/Bundle;)V
	    .locals 1
	    .parameter "savedInstanceState"
	    .prologue
	    .line 10
	    invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
	    .line 11
	    const/high16 v0, 0x7f03
	    invoke-virtual {p0, v0}, Lcom/zh_weir/helloworld/MainActivity;->setContentView(I)V
	    .line 12
	    return-void
	.end method


Smali文件其实就是dalvik虚拟机运行的dex字节码文件对应的汇编文件了。如果你了解Java虚拟机的汇编语言Jasmin的话,你会发现两者的语法非常相似。关于smali的语法等问题就不深入下去了,如果你想了解更多,可以访问Google Code上Smali项目主页:http://code.google.com/p/smali/ 。

代码分析与修改

即使你不会Jasmin语法,你也能很容易看明白上面的汇编代码。需要指出的是,apktool反编译出来的汇编代码同样也是面向对象的,而不是面向过程的。这点和C++的反汇编可能有所不同。

根据上面的代码,我们可以看出,这个MainActivity的类有两个成员方法。一个是默认的构造函数;另一个就是我们重载的OnCreate方法了。

在java汇编中,每个成员方法需要首先申明自己所使用的局部变量的个数,以便实现分配存储空间。例如OnCreate使用了一个局部变量,就声明:.locals 1 。后面则使用v0表示。

在一个非静态的成员方法中,p0代表的是这个类本身的引用,相当于this,p1开始才是函数的参数;而对于静态方法,由于没有this指针,所以p0就是函数的第一个参数。(其实本身this指针就是作为一个隐含的参数传递给非静态成员函数的)。

通过分析上面Oncreate的汇编代码,我们可以知道,它首先是调用super类的onCreate方法,然后再setContentView设置显示。其中I、V等表示的是函数的参数和返回变量的类型,这是通用做法,这里就不多做说明了。

分析到这一步,你是否发现一个问题?那就是如果我们按照同样的语法修改或者增删一个语句,是否就可以实现对程序的修改了呢?答案是肯定的。

例如,我们希望这个APK程序在运行时会弹出一个Toast,提示它被破解了。用Java的话,应该这样表述:

Toast.makeText(this, "I'm Cracked!", Toast.LENGTH_LONG).show();

而用Java汇编的话,则应该表述为这样:const-string v0, "I\'m Cracked!"

 

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


OK,只要我们将这段代码插入到原来程序的OnCreate中,再重新打包程序,我们就能实现在这个程序运行时弹出Toast了。

改之后的代码,大致如下:

 

 

	# virtual methods

	.method public onCreate(Landroid/os/Bundle;)V
	    .locals 2
	    .parameter "savedInstanceState"
	    .prologue
	    .line 11
	    invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
	    .line 12
	    const/high16 v0, 0x7f03
	    invoke-virtual {p0, v0}, Lcom/zh_weir/helloworld/MainActivity;->setContentView(I)V
	    .line 14
	    const-string v0, "I\'m Cracked!"
	    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 15
	    return-void

	.end method


 来自:http://www.unpack.cn/forum.php?mod=viewthread&tid=68732

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

APK反编译破解方法与加密措施 的相关文章

  • Android - 保存动态更改布局的状态

    我有一个布局 用户可以在其中添加按钮并将其放置在他们想要的位置 我想允许用户保存他们的布局 以便下次打开应用程序时加载它 有谁知道我是否可以将文件保存到 SD 卡上 或者 我可以使用某种layout getXml 方法并将其放入我的应用程序
  • Android - 如何一次只允许播放一个 MediaPlayer 实例?

    我正在尝试创建一个简单的 Sound board Android 应用程序 使用 ListView 项目作为按钮 顺便说一句 我是一个新手程序员 我的想法是 我按下一个按钮 就会播放一个特定的声音文件 如果我在播放声音时按下任何按钮 它应该
  • 从 Throwable 获取错误代码 - Android

    我怎样才能从错误代码可投掷 https developer android com reference java lang Throwable html public void onFailure Throwable exception 我
  • Android 应用程序在后台运行时保存数据

    目前我正在开发 xmmp 客户端 当应用程序位于前台时 该客户端工作得很好 但由于事实上 当应用程序处于后台时 我在 Application 类中保存了大量数据 复杂的 ArrayList 字符串和布尔值作为公共静态 每个字段都被垃圾收集
  • 与 Admob 广告单元 ID 混淆

    我跟着tutorial https developers google com admob android quick start在我的应用程序中创建广告横幅 到目前为止 这有效 我可以看到测试广告 但是 本教程指示我在两个不同的位置使用两
  • 如何将安卓手机从睡眠状态唤醒?

    如何以编程方式将 Android 手机从睡眠状态唤醒 挂起至内存 我不想获取任何唤醒锁 这意味着手机在禁用 CPU 的情况下进入 真正的 睡眠状态 我想我可以使用某种RTC 实时时钟 机制 有人有例子吗 Thanks 为了让Activity
  • Phonegap - 如何将.txt文件保存在Android手机的根目录中

    我正在尝试使用phonegap 将 txt 文件保存在Android 手机的根目录中 我已经安装了这些插件 cordova plugin file 和 cordova plugin file transfer 在 config xml 文件
  • Android:“dp”到“px”转换?

    我正在读这篇文章 http developer android com guide practices screens support html http developer android com guide practices scre
  • RxJava、Proguard 和 sun.misc.Unsafe

    我有以下问题RxJava 1 1 0 使用时Proguard 我没有更改 RxJava 版本或其 pro文件 但更新后OkHttp我无法编译使用Proguard因为我有关于sun misc Unsafe不在场 rxJava pro keep
  • TextView 之间有分隔线

    我正在尝试在 android studio 中创建以下布局 因为我对 android 东西还很陌生 所以我第一次尝试使用 LinearLayout 并认为这可能无法实现 现在我正在尝试使用RelativeLayout 我已经用颜色创建了这个
  • ROOM迁移过程中如何处理索引信息

    CODE Entity tableName UserRepo indices Index value id unique true public class GitHubRepo PrimaryKey autoGenerate true p
  • 检查 Android 手机上的方向

    如何查看Android手机是横屏还是竖屏 当前配置用于确定要检索的资源 可从资源中获取Configuration object getResources getConfiguration orientation 您可以通过查看其值来检查方向
  • 使用 Matrix.setPolyToPoly 选择位图上具有 4 个点的区域

    我正在 Android 上使用位图 在使用 4 个点选择位图上的区域时遇到问题 并非所有 4 点组都适合我 在某些情况下 结果只是一个空白位图 而不是裁剪后的位图 如图所示 并且 logcat 中没有任何错误 甚至是内存错误 这是我用来进行
  • 如何在不更改手机语言的情况下更改Android应用程序语言?

    我希望用户在应用程序内选择一种语言 选择语言后 我希望字符串使用特定语言 如果我更改手机语言 那么我的应用程序将以设置的语言运行 我无法找到任何在不更改手机语言的情况下设置语言的方法 此外 一旦设置了语言 更改就应该反映出来 有人可以建议一
  • 如何创建像谷歌位置历史记录一样的Android时间轴视图?

    我想设计像谷歌位置历史这样的用户界面 我必须为我正在使用的应用程序复制此 UIRecyclerView 每行都是水平的LinearLayout其中包含右侧的图标 线条和视图 该线是一个FrameLayout具有圆形背景和半透明圆圈Views
  • Android中webview的截图方法

    我在 webview 中的 html5 canvas 上画了一些线 并尝试使用下面的代码截取 webview 的屏幕截图 WebView webView WebView findViewById R id webview webView s
  • 用于推送通知的设备令牌

    我正在实施推送通知服务 我需要创建一个数据库来存储 4 个移动平台的所有设备令牌 我想根据他们的平台 iOS Android BlackBerry WP7 来组织它们 但是有什么方法可以区分平台 这样如果我只想向 Android 用户发送消
  • android Accessibility-service 突然停止触发事件

    我有一个 AccessibilityService 工作正常 但由于开发过程中的某些原因它停止工作 我似乎找不到这个原因 请看一下我的代码并告诉我为什么它不起作用 public class MyServicee extends Access
  • 如何将图像从 Android 应用程序上传到网络服务器的特定文件夹中

    如何将图像从 android 移动到 Web 服务器上的指定文件夹 这是我的安卓代码 package com example bitmaptest import java io ByteArrayOutputStream import ja
  • 为什么Android的ImageReader类这么慢?

    我尝试了适用于 Android 3 4 1 的全新 OpenCVJavaCamera2View但它太慢了 仅显示相机视图约 15 fps 当我尝试较旧的JavaCameraView相反 它给了我很好的结果 30fps 这是我相机的极限 我想

随机推荐

  • Mayor's posters

    点击打开链接 Description The citizens of Bytetown AB could not stand that the candidates in the mayoral election campaign have
  • Hive-SQL取一个月用户留存率、留存用户数

    一 最基础版 次日留存率 代码如下 select date count count B user id as rate from select user id date from app launch where date 2022 08
  • 大数据论文_03_BigTable(个人总结)

    声明 1 本文为我的个人复习总结 并非那种从零基础开始普及知识 内容详细全面 言辞官方的文章 2 由于是个人总结 所以用最精简的话语来写文章 3 若有错误不当之处 请指出 BigTable 一 出现的原因 没有BigTable时 如MySQ
  • C/C++ 使用librdkafka库实现的生产者

    Installing prebuilt packages On Mac OSX brew install librdkafka On Debian and Ubuntu apt install librdkafka dev On RedHa
  • Ubuntu18.04下的宝塔+Flarum网站迁移

    Ubuntu18 04下的宝塔 Flarum网站迁移 前言 迁移环境 一 备份文件 二 重新部署Flarum 三 恢复数据 四 重装插件 四 完成 前言 最近学校在组织搭建校内树洞 为了方便调试同时不影响论坛的正常运营 我打算将整个网站迁移
  • 全球及中国3D打印产业投资价值调研及未来竞争趋势研究报告2021-2027年版

    全球及中国3D打印产业投资价值调研及未来竞争趋势研究报告2021 2027年版 HS HS HS HS HS HS HS HS HS HS HS HS HS HS HS 修订日期 2021年10月 搜索鸿晟信合研究院查看官网更多内容 第一章
  • 贪心算法初步

    一 什么是贪心算法 贪心算法的定义 贪心算法是指在对问题求解时 总是做出在当前看来是最好的选择 也就是说 不从整体最优上加以考虑 只做出在某种意义上的局部最优解 贪心算法不是对所有问题都能得到整体最优解 关键在于贪心策略的选择 选择的贪心策
  • 安装与卸载JDK8

    前言 学习Java的第一步需要先配置好JDK环境 而JDK8是目前使用最广泛的JDK版本 本文讲解了如何下载安装和卸载JDK8 以下环境为Windows10 下载JDK安装包 Oracle官网 所有JDK版本 Oracle官网 JDK8 O
  • 关键字解释

    条件变量 线程中的条件变量是等待共享数据内的某个条件出现 不是等待的互斥锁 条件变量特别适用于多个线程等待某个条件的发生 auto与std function 在实际使用中都用 auto 关键字来代替std function 这一长串了 st
  • 介绍一个免费的虚拟显示器的解决方案

    这几天鼓捣我的弛为小主机 装了个win10 2021 lstc作小服务器用 远程软件todesk和向日葵 登录后 发现分辨率极低 todesk提示让我购买虚拟显示器 像我这种技术 铁公鸡 怎么能花钱呢 搜了半天开源虚拟显示器 极少 要么收费
  • 第六章 运行时数据结构

    1 a out assembler output 汇编程序输出 的缩写形式 2 段的概念 1 在UNIX中 段表示一个二进制相关的内容块 命令 size test 可执行程序 返回文件中的三个段 text data bss dec hex
  • SQL Server的数据库文件保存在哪儿?

    1 数据库文件类型 数据库分2个文件 一个主数据文件 一个日志文件 主数据文件后缀名为 MDF 日志文件后缀名为 Log 如数据库Test Test mdf 与test log 2 数据库文件保存位置 1 在SQL Server Manag
  • 云计算实验——OpenStack的安装与使用

    实验目的 1 掌握Linux虚拟机的安装方法 2 掌握OpenStack的单机安装方法 3 熟悉OpenStack的核心组件 实验环境 Windows10 20H2 VirtualBox 6 1 18 r142142 Ubuntu 18 0
  • 目标检测常用特征类型提取

    本文介绍图像识别和目标检测中常用的特征 分别是Haar 哈尔 特征 LBF local binary pattern 特征 HOG histogram of orientation gradient 特征共 三种 一 Haar特征 参考链接
  • 数组根据对象id去重的几种方法

    arr id 1 name 张一 age 20 id 1 name 张一 age 20 id 2 name 张二 age 20 id 3 name 张三 age 20 方法一 通过forEach再通过some方法判断数组是否包含当前对象id
  • 【Linux】解决Linux挂载的磁盘突然没有权限修改的问题

    可能由于异常关机导致磁盘挂在错误 我这的解决办法是 gt sudo ntfsfix dev sda3 Mounting volume The disk contains an unclean file system 0 0 Metadata
  • 网站服务器发生故障,全国DNS服务器发生故障

    关键词 DNS故障 网页打不开 上不去网 DNS 网站故障 从今天下午三点左右开始中心接受用户反映故障数十起 用户均反映网页打开有问题 中心客服人员调查后发现全国出现了大范围的DNS故障 导致大量网站域名解析不正常 此次DNS故障可能是国外
  • windows

    简介 RabbitMQ是一套开源 MPL 的消息队列服务软件 是由 LShift 提供的一个 Advanced Message Queuing Protocol AMQP 的开源实现 由以高性能 健壮以及可伸缩性出名的 Erlang 写成
  • rsa生成公钥秘钥中产生的问题

    解决 module object has no attribute newkeys 1 需要导入模块rsa 自己在学习的过程中遇到了以下的错误 显示没有这个属性 解决办法 1 检查是否有rsa模块 如果没有就下载该模块 进入cmd后输入py
  • APK反编译破解方法与加密措施

    所谓APK指的是Android操作系统的应用程序安装文件 所谓Crack 简单地理解为 破解 我具体指的是反编译APK文件进行汇编级的代码分析 并修改或插入自己的代码 重新签名打包为APK文件 以达到改变程序原有行为的目的 由以上的说明可知