【译】Android技术栈,1#架构葡京娱乐官方app

再一次打包

咱俩大体修改后多少个地点,其实重新包装也相当简练,在cmd中实践以下命令即可:

sh apktool.sh b FooAPP -o NewFooApp.apk

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

葡京娱乐官方app 1

下一场您会发现同级目录下生成了新的apk文件:

葡京娱乐官方app 2

不过要专注,那么些apk现在仍然无法设置的,因为大家从不对它举行签字,重新签名后它就是个名副其实的盗版软件了,我们一定要肯定声讨这种表现。

概述##

这种布局可以被分开为五个紧要层次:

  • presentation
  • model
  • domain

Presentation
Presentation层负责提供数据并显示图形化界面。

Model
Model层将承受提供音信,这一层并不知道Presentation层和Domain,它亦可与数据库,REST
API或者此外可持久化数据等实现连接。

在这一层,也得以兑现部分应用程序的实体类,用来表示,电影,连串等等。

Domain
Domain层完全独立于Presentation层之外,这一层专门处理事务逻辑。

手把手教您搞懂Android反编译

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

架构:##

架构的宏图基于Model View
Presenter

,它是Model View
Controller

设计格局的一个变种。

这种规划试图抽象Presentation层的事务逻辑,在Android中这是很重要的,因为自身Framework
提倡这两局部与数量层解耦合,一个引人注目标例子就是AdaptersCursorLoaders

这种架构促使业务逻辑层和数据层不再随着视图层的转换而变更,这样无论Domain层的代码复用依旧例如Database或者REST
API
等数据源的改观,都变得简单起来。

反编译资源

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

葡京娱乐官方app 3

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

sh apktool.sh apktool d FooApp.apk

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

葡京娱乐官方app 4

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

葡京娱乐官方app 5

首要目录表达:

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

Presentation module##

即便Android应用自身,包括resources, assets, 逻辑等等。

它与执行usecaseDomain举办交互,比如可以用来得到某一时刻的影片列表,或者从某个电影中获取特殊的多少。

本条模块只包含PresenterView

每一个ActivityFragmentDialog都实现MVPView接口,它指定了有些在View上开展呈现,隐藏,呈现信息等操作。

比如,PopularMoviesView通过点名一些操作展示当前影片列表,然后MoviesActivity实现它。

public interface PopularMoviesView extends MVPView {

    void showMovies (List<TvMovie> movieList);

    void showLoading ();

    void hideLoading ();

    void showError (String error);

    void hideError ();
}

MVP设计形式就是让View变得硬着头皮的大概,由Presenter决定它们的表现。(译者注:View层应反映KISS条件,感兴趣的同桌可以领悟一下Keep
it simple stupid

public class MoviesActivity extends ActionBarActivity implements
    PopularMoviesView, ... {

    ...
    private PopularShowsPresenter popularShowsPresenter;
    private RecyclerView popularMoviesRecycler;
    private ProgressBar loadingProgressBar;
    private MoviesAdapter moviesAdapter;
    private TextView errorTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        ...
        popularShowsPresenter = new PopularShowsPresenterImpl(this);
        popularShowsPresenter.onCreate();
    }

    @Override
    protected void onStop() {

        super.onStop();
        popularShowsPresenter.onStop();
    }

    @Override
    public Context getContext() {

        return this;
    }

    @Override
    public void showMovies(List<TvMovie> movieList) {

        moviesAdapter = new MoviesAdapter(movieList);
        popularMoviesRecycler.setAdapter(moviesAdapter);
    }

    @Override
    public void showLoading() {

        loadingProgressBar.setVisibility(View.VISIBLE);
    }

    @Override
    public void hideLoading() {

        loadingProgressBar.setVisibility(View.GONE);
    }

    @Override
    public void showError(String error) {

        errorTextView.setVisibility(View.VISIBLE);
        errorTextView.setText(error);
    }

    @Override
    public void hideError() {

        errorTextView.setVisibility(View.GONE);
    }

    ...
}

这个usecase通过Presenter调用,并且Presenter接过相应结果,然后处理View上的表现。

前言

反编译别人的次第不是怎么着值得炫耀的事,希望我们最为只是兴趣探索,而不是利益驱动。本文紧要目标是绕开一个简短的激活程序。

通信##

对于那多少个类型,我采用了Message
Bus
(译者注:音信总线)系统,这多少个体系对此播放事件,或者在五个零件之间建立通信是非凡实惠的,尤其特别适用于子孙后代。

基本上,通过Bus发送事件,对事件感兴趣的类,需要订阅Bus,才能消费非常事件。

适用这些序列可以减低模块间的耦合度。

为了实现这么些系统总线,我利用Square出品的Otto类库。

本人定义了五个Bus,一个用来使usecase和REST
API举行通信,另一个用来发送事件至Presentation
层。

REST_BUS动用任意线程处理事件,UI_BUS接纳默认线程发送事件,这些线程就是主线程。

public class BusProvider {

    private static final Bus REST_BUS = new Bus(ThreadEnforcer.ANY);
    private static final Bus UI_BUS = new Bus();

    private BusProvider() {};

    public static Bus getRestBusInstance() {

        return REST_BUS;
    }

    public static Bus getUIBusInstance () {

        return UI_BUS;
    }
}

以此类经过common
module管理。因为具备的模块都亟待拜访它,从而与Bus展开互动。

dependencies {
    compile 'com.squareup:otto:1.3.5'
}

说到底,想象一下以此情形,当用户打开应用,显示最受欢迎的影片。

View调用onCreate()方法时,Presenter订阅UI_BUS收纳事件。当onStop()格局被调用的时候Presenter撤回订阅。Presenter运行GetMoviesUseCase这个usecase

@Override
    public void onCreate() {

        BusProvider.getUIBusInstance().register(this);

        Usecase getPopularShows = new GetMoviesUsecaseController(GetMoviesUsecase.TV_MOVIES);
        getPopularShows.execute();
    }

    ...

    @Override
    public void onStop() {

        BusProvider.getUIBusInstance().unregister(this);
    }
}

为了接收事件,Presenter亟待实现一个艺术,那多少个方法所承受参数的数据类型必须与Bus发送的风波的数据类型一致,兵器必须运用表明:@Subscribe

@Subscribe
    @Override
    public void onPopularMoviesReceived(PopularMoviesApiResponse popularMovies) {

        popularMoviesView.hideLoading();
        popularMoviesView.showMovies(popularMovies.getResults());
    }

何以是反编译

我们通晓,Android的次序打包后会生成一个APK文件,这个文件可以直接设置到任何Android手机上,由此,反编译就是对这一个APK举行反编译。Android的反编译分成六个部分:

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

正文是何许开发一款具备扩大性,维护性和测试性的Android应用专题的首先篇。本专题将会提到到部分设计情势和类库的使用办法,缩短Android
Developer
普通开支的苦恼。

重新签名

双重签名也是很粗略的,我一贯用的一个已有签名文件,使用Android
Studio或者Eclipse都得以相当简单地生成一个签名文件。

在cmd中进行格式如下:

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

下一场我们就可以用这么些apk举行设置了,为了追求更快的运转速度,我们得以对其进展两回字节对齐,这里就背着了。

简介:##

作为例子,我将拔取以下这一个类型,事实上就是一个简单的影视概念目录,可以称为视图或者另外。

有关影片的消息方可从一个称呼Themoviedb的当众API中得到,在这个版块中Apiary可以找到科学的文档表达。

花色基于Model View
Presenter

设计形式,也参照了部分Material
Design

设计规范,比如转场,(界面)结构,动画,配色等等。

富有代码都足以从Github中拿走,所以请随意看,这里同样有一个视频用来显示App。

Paste_Image.png

修改App icon

开拓我们的讲述文件,高清无码:

葡京娱乐官方app 6

可以看看我们的App
icon名称为ic_launcher,我们找到所有mipmap起初的文书夹,替换成下图即可:

葡京娱乐官方app 7

ic_launche

葡京娱乐官方app 8

在最终再一次包装后我们的App
icon就会被涂改了,然而在再一次包装以前,我们还有最要紧的一件事从未做,这就是修改激活码判断逻辑。

资源:##

Done

作者:
@biggergao
民用博客: Mr.码了大漠

2016年06月29日

重点源码表达:

第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();
        }
    }

实现##

Domain层和Model层被放到五个java module中,app
module也就是Android应用代表Presentation层,这里还有其余一个common
module,用来存放一些集体类库和工具类们。

Domain module

Domain
module存放着部分usecase和它们的兑现类,它们是应用程序的作业逻辑。

本条module完全独立于Android framework

借助于它的模块有model module和common module。

一个usecase可以用来收获不同序列电影的总评分,看一看哪个品种的影片最受欢迎,usecase内需获取音信然后做出总计,所有这个音讯都由Model层提供。

dependencies {
    compile project (':common')
    compile project (':model')
}

热身准备

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

它的根本意义是人云亦云邮箱激活,如若我们输入了错误的数量则不可以通过激活。所以大家的目标很粗略,就是让这一个判断逻辑失效。

葡京娱乐官方app 9

Model module##

model
module负责处理消息,查询,保存,删除等等,我只处理了从API获取电影详情的操作。

也落实了一部分实体类,比如TvMovie,用来突显一部影视。

它近来只倚重common
module,通过这多少个类库处理API请求,在这么些例子中本人动用Square出品的Retrofit,我将在接下去的博客中介绍Retrofit。

dependencies {
    compile project(':common')
    compile 'com.squareup.retrofit:retrofit:1.9.0'
}

修改逻辑

我们通过源码或者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行

    葡京娱乐官方app 10

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

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

ok,大功告成,现在就足以重新打包了。关于smail语法,有趣味的直白Google就行了。

应用盗版APK

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

葡京娱乐官方app 11

1

哪些?总的来说如故挺有意思的啊,可是别用歪了。

参照链接:

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

Android安全技能解密与防范 –
周圣韬

反编译代码

dex2jar解压下来文件过多,在mac上我们需要用到dex2jar的是这多少个东西(windows上对应用bat文件):

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

葡京娱乐官方app 12

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

葡京娱乐官方app 13

并在cmd中也跻身到均等的目录,然后实施:

sh d2j-dex2jar.sh classes.dex

推行如下:

葡京娱乐官方app 14

接下来我们会收获一个classes-dex2jar.jar文件,我们赖以JD-GUI工具打开即可,打开如下:

葡京娱乐官方app 15

可以见见代码十分清楚,这样大家就足以阅览所有APP的代码逻辑了。

所需的工具

葡京娱乐官方app 16

反编译代码的工具:

反编译资源的工具: