apk 反编译 源码-教你如何理解Android反编译

来源:

前言

反编译别人的程序并不是什么值得炫耀的事情。 希望大家只是有探索的兴趣,而不是被利益所驱使。 本文的主要目的是绕过简单的激活过程。

哪些是反编译的

我们知道Android程序打包后会生成一个APK文件,这个文件可以直接安装在任何Android手机上。 因此,反编译就是反编译APK。 Android反编译分为两部分:

1、一种是反编译代码,即java文件的反编译。

2、一种是反编译资源,即反编译res文件。

所需工具

反编译代码工具:

反编译资源工具:

热身计划

首先,我们需要一个APK。 这里我自己写了一篇。 源码下载地址:,打包成APK下载到手机上。

其主要功能是模拟邮箱激活。 如果我们输入错误的数据,它将无法激活。 所以我们的目的很简单,就是让这个决策逻辑失效。

apk 反编译 源码-教你如何理解Android反编译

主要源码说明:

正确的两个激活码保存在第51行,pass: 来分隔账户密码,如下

private static final String[] DUMMY_CREDENTIALS = new String[]{            "foo@163.com:20135115", 
      "bar@163.com:20135115"
};

现在只有正确的激活码才能激活。

第331行是执行函数,逻辑判断部分。

    @Override
    protected void onPostExecute(final Boolean success) {
        mAuthTask = null;
        showProgress(false);        
   if (success) {            
   new AlertDialog.Builder(LoginActivity.this)                    .setTitle("恭喜您")                    .setMessage("成功激活!")                    .show();//
               finish();
       } else {            mPasswordView.setError(getString(R.string.error_incorrect_password));            mPasswordView.requestFocus();        }    }

反编译代码

dex2jar解压出来的文件很多。 在mac上,我们需要使用dex2jar来完成这三件事(在windows上使用bat文件):

AndroidStudio打包的APK文件后缀需要改为.zip,然后解压。 从解压后的文件中找到classes.dex文件apk 反编译 源码,将其倒入与dex2jar同一目录下,如下:

并在cmd中单步进入同一目录,然后执行:

  sh d2j-dex2jar.sh classes.dex

执行如下:

然后我们会得到一个classes-dex2jar.jar文件,我们可以使用JD-GUI工具打开它,如下所示:

可以看到代码非常清晰,所以我们可以看到整个APP的代码逻辑。

反编译资源

apktool下载完成后,有一个.sh文件和一个.jar文件,我们把APK放进去,如下:

在cmd中进入apktool目录,执行命令:

sh apktool.sh apktool d FooApp.apk

d是decode的意思,意思是我们要解码FooApp,结果如下:

之后你会惊喜地发现多了一个FooApp文件夹。

apk 反编译 源码-教你如何理解Android反编译

主目录说明:

更改应用程序图标

打开我们的描述文件,高清且未经审查:

可以听到我们的Appicon名称是ic_launcher,我们找到所有以mipmap开头的文件夹,并将其替换为右侧的文件夹:

最后重新打包之后,我们的Appicon就会被改变,但是在重新打包之前,我们还有最重要的事情要做,就是改变激活码判断逻辑。

改变逻辑

我们可以通过源码或者JD-GUI查看反编译代码,可以看到激活码判断逻辑如下:

   @Override
    protected void onPostExecute(final Boolean success) {
        mAuthTask = null;
        showProgress(false);
          if (success) {            // 激活码正确            new AlertDialog.Builder(LoginActivity.this)                    .setTitle("恭喜您")                    .setMessage("成功激活!")                    .show();//
               finish();
       } else {            mPasswordView.setError(getString(R.string.error_incorrect_password));            mPasswordView.requestFocus();        }    }

所以我们只需要找到反编译后的if(success)语句,将其改为if(!success)即可,如下:

if (success)//修改成if(!success)
{ ... } else { ... }

这样,我们就成功扭转了之前的逻辑。 如果我们输入错误的激活码,会被判断为正确。 很简单,对吧?

现在让我们手动更改它:

1. 在smail中打开LoginActivity$UserLoginTask.smali文件。

2、全局搜索if-eqz,使用AlertDialog关键字辅助定位,发现在228行:

ok,就这样了,然后把if-eqz改成if-nez,它们对应的Java句型如下:

好的,你已经完成了,现在你可以重新打包了。 关于smail句型,有兴趣的话Google一下就可以了。

重新包装

我们改变了最后两个地方,虽然重新打包也很简单,在cmd中执行以下命令即可:

sh apktool.sh b FooAPP -o NewFooApp.apk

其中,b表示build,表示我们要将FooAPP文件夹打包成一个APK文件apk 反编译 源码,而-o则用于指定新生成的APK文件的名称,这里的新文件名为NewFooApp.apk。 执行结果如右图所示:

apk 反编译 源码-教你如何理解Android反编译

之后你会发现在同目录下生成了一个新的apk文件:

不过需要注意的是,这个apk现在仍然无法安装,因为我们还没有对其进行签名,重新签名后就是名副其实的盗版软件,您必须强烈抗议这些行为。

辞职

重新签名也很简单。 我直接使用已有的签名文件,AndroidStudio或者Eclipse都可以轻松生成签名文件。

cmd中的执行格式如下:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore 签名文件名 -storepass 签名密码 待签名的APK文件名 签名的别名

之后我们就可以使用这个apk来安装了。 为了追求更快的运行速度,我们可以对其进行字节对齐,这里就不讲了。

使用盗版APK

当我们安装盗版应用程序NewFooApp.apk后,我们发现图标变成了一个足球,我们可以通过输入任何数据来激活它:

如何? 总的来说,这很有趣,但不要误会。

参考链接:

Android安全攻防战,反编译与混淆技术全解析(上)——郭琳

Android安全技术揭秘与防范-周胜涛

1.什么是编译

1.使用编译器将源语言编译的源程序形成目标程序的过程。

2、与编译器形成目标程序的动作。 编译就是将高级语言变成计算机可以识别的二进制语言。 计算机只理解1和0,编译器用2的补码替换了人们熟悉的语言。 编译器将源程序翻译成目标程序的工作过程分为五个阶段:词法分析; 语法分析; 语义检测和中间代码生成; 代码优化; 目标代码生成。 主要进行词法分析和句型分析,也称为源程序分析。 分析过程中,如果出现句型错误java 源码编译,则会给出提示信息。

2.什么是反编译

apk 反编译 源码-教你如何理解Android反编译

计算机软件逆向工程(Reverse Engineering),又称计算机软件恢复工程,是指对他人软件的目标程序(可执行程序)进行“逆向分析研究”,以推导出他人软件产品所使用的信息的工作。 。 思想、原理、结构、算法、处理流程、运行方式等设计元素在某些情况下可以推断出源代码。 将其反编译作为自己开发软件时的参考,或者直接在自己的软件产品中使用。

3.Java类的编译与反编译

我们刚学习Java的时候,会接触到两个命令:javac和java。 当时我们就知道javac是用来编译Java类的,也就是把我们写的helloworld.java文件编译成helloworld。 类文件。

apk 反编译 源码-教你如何理解Android反编译

类文件打破了C或C++等语言所遵循的传统。 用这种传统语言编写的程序通常首先被编译,然后链接到专门支持特定硬件平台和操作系统的单独的二进制文件中。 通常,一个平台上的二进制可执行文件无法在其他平台上运行。 Java类文件是一个二进制文件,可以运行在任何支持Java虚拟机的硬件平台和操作系统上。

所以反编译就是通过helloworld.class文件得到java文件(或者程序员能看懂的java文件)

四、什么时候会用到反编译

apk 反编译 源码-教你如何理解Android反编译

1、我们只有一个类的class文件,但是我们看不懂Java的class文件,那么我们可以将其反编译成我们能看懂的文件。

2.在学习Java的过程中,每个版本的JDK都会添加越来越多的句子糖。 有时候我们想了解Java的一些实现细节,就可以使用反编译。

五、反编译工具

1. javap

2. Jad:官方网站(墙裂推荐)

客户:

您可以从官网下载可执行文件,找到对应操作系统的对应版本,然后安装使用。

由于我使用的是Linux操作系统,所以我下载了Linux版本的工具。 该工具下载后,会有一个可执行文件。 只要在可执行文件所在目录执行./jad helloworld.class,就会在当前目录生成helloworld。 .jad文件,也就是我们熟悉的Java代码。

Eclipse 插件:

下载地址 在官网下载该插件的jar包,然后将jar包放到eclipse的plugins目录下打开Eclipsejava 源码编译,Eclipse->Window->Preferences->Java,你会发现会有比以前多了一个 JadClipse。 Option,点击,在Path to decompiler中输入刚才放置jad.exe的位置,也可以指定临时文件的目录。 当然,JadClipse下还有一些子选项,比如Debug、Directives等,按照默认配置即可。 基本配置完成后,我们可以查看class文件默认的打开方式,Eclipse->Window->Preferences->General->Editors->File Associations,可以看到有两种打开class文件的方式、JadClipse 和 Eclipse 都带有 Class File Viewer,而 JadClipse 是默认的。 一切配置完成,现在我们可以查看源码了,选择要查看的类,按F3即可查看源码。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 源码编译 apk 反编译 源码-教你如何理解Android反编译 https://www.wkzy.net/game/125720.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务