Android 逆向工程之步骤

PS:本系列文章中所涉及到的技术、数据和接口地址,仅供学习交流,务必不可做坏事或者是用于商业用途!否则后果自负!

来源:http://blog.csdn.net/zhaokaiqiang1992

  • 逆向工程
  • 代码框架解析
  • TcpDump抓包
  • WireShake分析数据包

逆向工程

既然是做高仿,当然需要逆向工程了,由于Android是基于Java的,所以反编译的难度并不大,各种资料很丰富,所以这里就简单介绍。

我们在反编译的时候,可以按照下面的流程进行

  • 使用apktool将apk进行反编译,获取到res中的布局文件、drawable中的图片资源,AndroidManifest.xml中的组件声明和权限声明,values中的常量值等数据
  • 将apk改为zip后缀,解压获取到classes.dex文件,然后使用dex2jar工具将其反编译,获取到classes.jar文件,然后使用JD-GUI进行查看即可

这个是通常的反编译流程,但是呢,我还要介绍一些其他的东西。第一步流程中,没有太多东西,一般都能获取到我们想要的资源,但是在把dex转化成jar的过程中,使用上面的做法可以查看到java源码,但是,dex2jar对Android中的switch语句解析的不是很完全,所以看起来会非常费劲,我们以“煎蛋”逆向工程之后的某个类举例,下面是使用dex2jar,然后使用JD-GUI查看的com.danielstudio.app.wowtu.a.ae类中的方法a

protected void a(g paramg)
  {
    if (isCancelled());
    do
    {
      return;
      w.e().remove(this.b.a);
    }
    while (!(h.a(paramg));
    String str1 = (String)paramg.c();
    String str2 = str1.split("\\|")[1];
    if (!(str1.split("\\|")[2].trim().equals("0")))
      switch (this.c)
      {
      default:
      case 1:
      case 0:
      }
    while (true)
    {
      while (true)
      {
        while (true)
        {
          this.a.c(this.d);
          com.danielstudio.app.wowtu.f.e.a(w.c(this.a), str2);
        }
        w.a(this.a).add(this.b.a);
        com.danielstudio.app.wowtu.c.e locale2 = this.b;
        locale2.i = (1 + locale2.i);
      }
      w.b(this.a).add(this.b.a);
      com.danielstudio.app.wowtu.c.e locale1 = this.b;
      locale1.j = (1 + locale1.j);
    }
  }

  

上面的这种代码格式非常难看,基本看不出原来的运行逻辑,所以再给大家介绍一个反编译的工具,叫做Procyon,用法也很简单,

帮助
java -jar decompiler.jar

反编译单个class文件
java -jar procyon-decompiler-0.5.24.jar AutoCloseableExample.class  

反编译整个Jar包
java -jar procyon-decompiler.jar -jar myJar.jar -o out

  

下面是使用Procyon对相同的类进行反编译之后的代码

protected void a(final g g) {
        if (!this.isCancelled()) {
            w.g.remove(this.b.a);
            if (h.a(g)) {
                final String s = (String)g.c();
                final String s2 = s.split("\\|")[1];
                if (!s.split("\\|")[2].trim().equals("0")) {
                    switch (this.c) {
                        case 1: {
                            this.a.e.add(this.b.a);
                            final e b = this.b;
                            ++b.i;
                            break;
                        }
                        case 0: {
                            this.a.f.add(this.b.a);
                            final e b2 = this.b;
                            ++b2.j;
                            break;
                        }
                    }
                    this.a.c(this.d);
                }
                com.danielstudio.app.wowtu.f.e.a(this.a.b, s2);
            }
        }
    }

  

代码逻辑这么清晰,有没有被惊艳到呀~
所以说,不能光知道那些人人皆知的工具,有很多其他的工具也是非常的好用的。

代码框架解析

好啦,现在我们得到我们想要的源代码了,我们来简单的分析一下

如果大家下载过”煎蛋”的话,应该能看出来,UI上使用的是非常新的设计风格,也就是Material Design设计风格。但是真正的Material Design需要Android L版本的支持,所以要考虑兼容性,就要用到最新的support.v7兼容包和其他兼容组件,这点在上面的包结构中也有所体现。

com.afollestad.materialdialogs这个包,从名字上也可以看是个Material Design风格的Dialog,是为了保持风格的统一。

com.danielstudio.app.wowtu这个包,则是煎蛋App的核心包,里面是具体的逻辑代码,我们需要重点分析的东西都在这里面

loopj.android.http这个包是不是很熟悉?这是android-async-http,一个非常出名的网络请求的开源框架,这是整个项目的网络请求核心包

com.nostra13.universalimageloader这个包不必我多废话了,加载图片的框架,功能很强大

在下面的那些包就是用于分享的第三方SDK了,比如QQ和新浪的,umeng则是用来渠道统计和升级的第三方SDK

最下面的uk.co.senab.phtotview则是一个很强大的图片显示控件,可以根据手势自由放缩

到目前为止,我们已经知道了这个App的主要框架了,下面我简单的说下要高仿的整体框架。

网络请求方面,我倾向于使用Volley,因为这个库针对复杂网络情况下频繁的小数据量请求进行了优化,所以对煎蛋这种内容类的App比较合适。

在图片加载方面,UIL虽然可以胜任这个工作,但是,我准备试一试FaceBook新推出的Fresco图片加载框架,之前我翻译过一篇关于Fresco的官方介绍,详情请戳FaceBook推出的Android图片加载库-Fresco。

其他的框架,比如butter knife ,也准备试一下,虽然感觉在这个项目里面没有必要使用IOC框架,但是之前的项目使用的都是AFinal,所以准备入手一下,试试好用不啦~

其实主要的框架也就暂时想到这么多,更多的还需要一边做一边引入,更多的是View的开源项目,熟练的使用Githun哦~

TcpDump抓包

其实,上面做的这些工作都很简单,更重要的是,我们如何去获取数据接口,没有接口,我们如何高仿呢,是不?由于煎蛋App是经过混淆的,大部分核心代码难以阅读,所以呢,我给大家介绍下如何在Android设备上使用TcpDump进行抓包。

TcpDump是Linux里面很强大的网络数据采集工具,也就是我们常说的抓包工具,抓包可以干很多坏事啦,不过,我们都是乖小孩~

因为Android系统本身就是以Linux 2.6 kenal作为内核的,所以我们可以使用TcpDump进行抓包。

首先呢,我们需要把TcpDump上传到我们的测试机上去,我使用的是eng工程模式的Nexus5测试机,使用Genymotion虚拟机没有成功,可能是因为TcpDump不能运行在x86架构的虚拟机上,ADT原生的虚拟机是ARM架构,应该可以使用,但是我的打开太慢,就没有测试,如果你要使用真机,要确保是eng工程模式。

有了测试机之后,adb连接上,然后使用下面命令查看连接设备是否成功

1

kaiqiangzhaoMacBook:~ zhaokaiqiang$ adb devices List of devices attached  16e8718e    device

连接成功之后,使用下面命令将TcpDump上传到/data/local/tcpdump路径

1

kaiqiangzhaoMacBook:~ zhaokaiqiang$ adb push ~/Desktop/tcpdump /data/local/tcpdump 4189 KB/s (1801155 bytes in 0.419s) kaiqiangzhaoMacBook:~ zhaokaiqiang$

然后使用下面命令修改权限

1

kaiqiangzhaoMacBook:~ zhaokaiqiang$ adb shell chmod 777 /data/local/tcpdump

到此为止,我们的TcpDump就部署成功了。

我们简单介绍几个常用命令。

下面的命令是用来抓包的最简单的命令

1

adb shell /data/local/tcpdump -n -s 0

-n 代表不把网络地址转换成名字
-s 0 抓取数据包时默认抓取长度为68字节。加上-s 0 后可以抓到完整的数据包

因为我们网络请求很多,我们需要进行过滤,比如要获取所有10.10.10.1 的主机收到的和发出的所有的数据包

1

kaiqiangzhaoMacBook:~ zhaokaiqiang$ adb shell /data/local/tcpdump -n -s 0 host 10.10.10.1

TcpDump还有很多强大的用法,我就不一一解释了,在我的收藏文章有,大家留言就得了。Android相关问题的好文章整理

我们使用的命令是下面这样的

1

adb shell /data/local/tcpdump -n -s 0 -w /sdcard/jiandan.pcap host 10.10.10.your ip

这样我们就可以把所有和当前ip进行通讯的包抓到,然后保存到/sdcard/jiandan.pcap文件,等着我们用下面的WireShake进行分析了

WireShake分析数据包

经过上面的一步,我们已经抓到了煎蛋App和服务器之间的通讯包,抓包时,有几点需要注意:

  1. 尽量减少测试机上的App数量,避免无用数据混淆视听
  2. 抓包尽量简短有效,在App请求的时候开始抓,请求完毕马上停止

这样,我们就可以得到我们的pcap格式的数据包了,下一步就是使用WireShake进行数据分析。
WireShake也很强大,但是我们这里只是简单的使用,更多强大功能自己去摸索。

我们可以使用下面的命令把文件下载下来

1

adb pull /sdcard/jiandan.pcap ~/Desktop/jiandan.pcap

下面是一个抓包的数据,用WireShark打开后,如下


注意红方框的地方。一般来说,资讯类App获取数据都是使用Http协议的接口,而对实时性要求比较高的App,比如股票行情类的,则是使用Socket通讯,显示在这里就是使用的是TCP协议。我们可以看到,本地ip和42.120.48.125进行了Http通讯,点开下面的包数据,就可以在请求文本里面看到我们的完整的请求URL,这个就是获取段子的接口,使用page进行分页。

其实按照这种方法,我们能够把基本上所有的使用Http协议的接口抓取出来,但是还有更好的办法,一般来说,这些地址都是硬编码在代码里面的,知道了一个地址格式,我们就可以直接搜索查找出其他类似的接口,比如,我们把第一步反编译出来的类文件放在Eclipse中的Java项目里面,然后全项目查找关键词oxwlxojflwblxbsapi试试

果然出现了很多的接口地址,这样我们就可以省下很大力气,具体接口测试不多说,自己去试。

其实一开始我想做煎蛋客户端,是通过Jsoup解析Web网址实现的,而且也解析成功了,能够正常使用,但是后来突发奇想,想看看代码怎么写的,就顺便看了下,成功获取到接口之后,能够更加方便的使用,所以就直接用了。

这个项目的段子功能模块,已经基本完成,后续功能正在做,希望这个项目能成为新手的很好的学习资料
,我也很用心的在做,如果你看了代码,有所收获,那是极好的,如果你发现我写的代码性能不好,或者是有更好的解决方案,希望你能告诉我,提交issue或者是pull request,我想把这个项目做的比9GAG项目更好。

下面是完成的功能

  1. 段子显示
  2. 评论数量显示
  3. 评论详情显示
  4. 评论过多隐藏楼层
  5. 加载动画
  6. 左滑退出
  7. 投票
  8. 正在完善的其他功能…

本项目的github地址:https://github.com/ZhaoKaiQiang/JianDan

感谢煎蛋的开发者DanielWangDev

时间: 2024-11-08 05:28:53

Android 逆向工程之步骤的相关文章

Android 逆向工程 实践篇

Android逆向工程 实践篇 上篇给大家介绍的是基础+小Demo实践. 如果没有看过的同学可以进去看看.(逆向工程 初篇) 本篇主要给大家介绍如何反编译后修改源码, 并打包运行在手机上. 先介绍下本篇文章用到的工具和资源. 1: Android Killer 1.3.1.0 (工具) 2: crackme.apk 还没有破解之前会提示随意输入用户名密码会提示下面的信息. 下面我们来打开apk, 看看源码是怎么回事. 我先用工具(Android Killer) 打开creckme.apk 这个是

[原] Android 自定义View步骤

例子如下:Android 自定义View 密码框 例子 1 良好的自定义View 易用,标准,开放. 一个设计良好的自定义view和其他设计良好的类很像.封装了某个具有易用性接口的功能组合,这些功能能够有效地使用CPU和内存,并且十分开放的.但是,除了开始一个设计良好的类之外,一个自定义view应该: l 符合安卓标准 l 提供能够在Android XML布局中工作的自定义样式属性 l 发送可访问的事件 l 与多个Android平台兼容. Android框架提供了一套基本的类和XML标签来帮您创

Android逆向工程工具 - 3

<Android逆向工程工具 - 1 https://www.cnblogs.com/cuihengchaliao/p/6661871.html>提到经过修改重新打包的apk文件,需要再重新签名才能安装. 再重新签名时,如果是正规途径的修改,原来版本的签名证书可以使用:但如果是不正规途径的apk包修改,重新签名时原来开发者的证书是不可用的,这时修改者一般会用工具自己生成公钥.私钥对和证书,对修改的apk包进行重新签名,但是因为证书和原版的证书不一样,安装时是无法覆盖原版的,同时原版开发者也会自

Android逆向工程-破解 哈皮妹-萝莉

转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/18797493 前言 新的一年新的开始,除了继续我的原有课题之外,我还打算研究下Android逆向工程的一些东西,主要包括反编译.Smali.APK打包.签名.反逆向和移动安全等.这篇就是新课题的第一篇文章,不过要牺牲下哈皮妹-萝莉这款应用了.通过对哈皮妹-萝莉的破解,让我更加深刻直观地认识到,Android的安全性是一个多么大的问题,如果我们的应用没有采用特殊手段去阻止破解

Android逆向工程工具Dare的使用方法(Mac OS X中)

其实这篇日志很简单,争取用两句话说完.Dare这个工具是宾州大学计算机系发布的apk逆向工程工具.可以将Android系统中使用的apk文件反编译为Java Class文件.目前支持Linux和Mac OS X中使用,在Mac中的使用方法尤其简单,在这个页面:http://siis.cse.psu.edu/dare/downloads.html 提供可执行文件的下载,下载解压之后在终端中进入其目录,输入: bash dare -d apkoutput WeChat_462.apk 上面是以最新的

逆向Android软件的步骤

逆向Android软件的步骤: 首先使用反编译的工具对反编译,然后阅读反汇编代码,如果有必要还会对其进行动态调试,找到突破口后注入或直接修改反汇编代码,最后重新编译软件进行测试.整个过程可分为反编译.静态分析.动态调试.重编译等4个环节. 结论:反破解技术也是从这四个方面进行的. 一.对抗反编译工具(如ApkTool.BackSmali.dex2jar),使其无法进行反编译,或者反编译后无法得到软件正确的反汇编代码. 思路是:寻找反编译工具在处理apk或dex文件时的缺陷,然后在自己的软件中加以

Android逆向工程初步(一) 15.4.24

最近看了看Android的逆向工程,破解的书,像是<Android Hack‘s Book>之类的,感觉挺有意思的,看了看一些smali的语法,试着自己写了个demo玩玩: 1.工具: 最新版的apktool2.0:http://connortumbleson.com/2015/04/20/apktool-v2-0-0-released/ 安装方法在:http://ibotpeaches.github.io/Apktool/install/ apk签名工具(懒得手动了):http://www.

Unity加入Android项目Build步骤

转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 简介: 有的项目需要在Android中加入Unity功能,例如ANDROID应用中嵌入Unity3D视图(展示3D模型) 有的项目需要在Unity中加入Android功能,例如3D语音天气球(源码分享)--创建可旋转的3D球 由于Android中的功能和代码只能当作一个Unity插件,需要在Unity进行最终的Build后生成apk文件运行. 所以无论上面两种情况都涉及了在Unity中加

Mac 下 下载Android源码步骤

android源码下载及安装: 1.初始化安装环境:A.建立大小写敏感硬盘镜像:步骤如下:Disk Utility –> New Image,随便取个名字,这里用AndroidDisk,30GB足够了,然后注意选成Mac OS Extended (Case-sensitive, Journaled), –> Create记住保存路劲为 ~/AndroidDisk.dmg B.挂载镜像:使用命令:hdiutil attach ~/AndroidDisk.dmg -mountpoint /Volu