手把手教您搞懂Android反编译

背景

近日直接在复习计网基础,为了强化自己的领会,所以决定通过写博客的花样来开展总括。而小说的始末不会写得万分详尽,紧借使指向部分相比广泛的商议,希望因此通俗易懂的教学来打探计算机网络每一层的工作规律,从而让大家对电脑网络有一个总体的回味。

微机互联网系列

那篇小说不打算讲实际的情商,而是对一切电脑互联网进行概述。

手把手教您搞懂Android反编译

转载时请务必注脚出处:http://www.iosxxoo.com/2016/06/29/2016-06-29/

微机互联网现身的背景

胚胎,总结机是以单机形式被广大应用。可是随着电脑的不停进步,人们已不再限于单机形式,而是将一个个总括机连接在一齐,形成一个电脑网络。连接多台总括机可以兑现音信共享,同时仍可以在两台物理地方较远的机器之间即时传递新闻。

为此,总计机互连网的向上时不我待,想要在逐个不一致的地方的处理器可以通讯不是一件不难的事,所以就须求大家来定制统一的磋商,那样才能在互动通讯中可见互为“领会”。就象是世界上把葡萄牙共和国语作为国际通用语言一样,方便了我们的关系。

前言

反编译外人的次序不是怎么着值得炫耀的事,希望大家最为只是兴趣探索,而不是利益驱动。本文首要目标是绕开一个几乎的激活程序。

OSI七层模型

为了化解上述难题,ISO指定了一个万国标准OSI,对通讯系统开展标准。OSI七层模型就因此暴发。

怎么是反编译

大家领略,Android的程序打包后会生成一个APK文件,那些文件能够直接设置到任何Android手机上,由此,反编译就是对那几个APK进行反编译。Android的反编译分成两个部分:

  1. 一个是对代码反编译,也就是java文件的反编译。
  2. 一个是对资源反编译,也就是res文件的反编译。

为什么要分层呢?

最首即使电脑互连网的指定是一个极度复杂的连串,协议分层就像计算机软件中的模块化开发,可以将每个分层独立行使,就算系统中一些分层爆发变化,也不会涉嫌整个种类,因此就足以创设一个增添性和灵活性都比较强的系统。其余,通过分支还是可以分开通讯作用,更便于单独已毕每个分层的商议,并限量各样分支的有血有肉义务和职务。

用电脑领域最通俗的一言以蔽之,没有什么样总结机难点是无法经过一个中间层解决的。而OSI的正统是七层。

所需的工具

图片 1

反编译代码的工具:

反编译资源的工具:

各层的职能

图片 2

OSI七层模型

切实每一层的听从我就不详细表明了,后续的文山会海作品我会按照每一层来详细讲解。

热身准备

第一大家必要一个APK,那里我自己写了一个,源码下载地址:http://download.csdn.net/detail/u012891055/9671973,打包成APK后下载到手机上。

它的严重性作用是效仿邮箱激活,假诺大家输入了错误的多寡则无从透过激活。所以我们的目的很不难,就是让那一个判断逻辑失效。

图片 3

TCP/IP协议

尽管有了OSI七层模型,可是出于它根本照旧用来反驳钻探,在市面上的实用价值并不高,反而前边暴发的TCP/IP协议占领了市场,现在我们利用的微机网络,大致都是TCP/IP协议。

图片 4

TCP/IP与OSI参考模型

TCP/IP协议将OSI模型举行了咬合,整个TCP/IP协议的行事流程大约如下图所示:

图片 5

TCP/IP各层对邮件的收发处理

如上所示,当发送数据的时候,每一层对数据开展该层的应和处理,然后转交给下一层,直到物理层举办数据传输,然后接收方接收数据的时候从下往上对每一层进行数量处理,那样就能得到发送方的固有内容。

万事电脑网络模型大约就介绍这么多,后续我讲依照TCP/IP协议对每一层进行详尽讲解。

重大源码表明:

第51行仓储的没错的三个激活号码,通过:将账号密码隔开,如下

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

当今唯有激活码正确才能由此激活。

第331行是Execute函数,逻辑判断的有些。

    @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文件):

  • d2j_invoke.sh
  • d2j-dex2jar.sh
  • lib

图片 6

AndroidStudio打包好的APK文件的后缀,需改为.zip,然后解压。从解压的文本中找到classes.dex文件,并将其放入dex2jar无异于目录下,如下:

图片 7

并在cmd中也进入到同样的目录,然后实施:

sh d2j-dex2jar.sh classes.dex

履行如下:

图片 8

下一场大家会赢得一个classes-dex2jar.jar文件,大家借助JD-GUI工具打开即可,打开如下:

图片 9

能够见到代码分外清晰,那样大家就足以看出任何APP的代码逻辑了。

反编译资源

apktool下载落成后有一个.sh文件和.jar文件,大家把APK放进来,如下:

图片 10

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

sh apktool.sh apktool d FooApp.apk

d是decode的意趣,表示大家要对FooApp解码,结果如下:

图片 11

下一场你会惊喜的觉察多了一个FooApp文件夹。

图片 12

重在目录表达:

  • AndroidManifest.xml:描述文件
  • res:资源文件
  • smail:反编译出来的所有代码,语法与java分化,类似汇编,是Android虚拟机所利用的寄存器语言

修改App icon

开辟大家的讲述文件,高清无码:

图片 13

能够见到我们的App
icon名称为ic_launcher,大家找到所有mipmap先导的公文夹,替换成下图即可:

图片 14

ic_launche

图片 15

在终极重复打包后我们的App
icon就会被改动了,不过在再一次包装在此之前,大家还有最根本的一件事从未做,那就是修改激活码判断逻辑。

修改逻辑

俺们透过源码或者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行

    图片 16

  3. ok,就是那里了,然后将if-eqz修改成if-nez,他们对应Java的语法如下:

Smail 语法 Java 语法
if-eqz v0, if(v0 == 0)
if-nez v0, if(v0 != 0)

ok,水到渠成,现在就可以再度打包了。关于smail语法,有趣味的一直谷歌就行了。

重复打包

我们大概修改后四个地方,其实重新包装也卓越简易,在cmd中实践以下命令即可:

sh apktool.sh b FooAPP -o NewFooApp.apk

里头b是build的情致,表示我们要将FooAPP文件夹打包成APK文件,-o用于指定新转变的APK文件名,那里新的文本叫作NewFooApp.apk。执行结果如下图所示:

图片 17

然后你会发觉同级目录下生成了新的apk文件:

图片 18

不过要留心,那些apk现在仍旧无法设置的,因为大家从不对它举办签字,重新签名后它就是个名副其实的盗版软件了,我们肯定要分明声讨那种表现。

双重签名

再一次签名也是很简单的,我一直用的一个已有签名文件,使用Android
Studio或者Eclipse都足以极度不难地生成一个签名文件。

在cmd中实践格式如下:

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

然后大家就足以用这一个apk进行设置了,为了追求更快的运转速度,大家可以对其进展五回字节对齐,那里就不说了。

选用盗版APK

我们用NewFooApp.apk安装好盗版app后,发现图标变成了篮球,并且随便输入数据都能因此激活了:

图片 19

1

何以?总的来说依然挺好玩的吧,然则别用歪了。

参照链接:

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

Android安全技术解密与预防 –
周圣韬

Done

作者:
@biggergao
私家博客: Mr.码了大漠

2016年06月29日

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图