东方头条领取金币分析

导言

东方头条APP推出看新闻换金币的奖励措施,1000金币=1RMB,带着这个创造财富的动力,想分析一下IOS版的东方头条APP。但是,我还没开始着手分析,就发现IOS版并没有阅读文章送金币的活动,阿西吧,那就温故而知新嘛。

如果你也想薅羊毛,那我就当仁不让的推荐给你,邀请码:089238394。就这样吧,我们开始任性的逆向之旅吧,走到哪算哪儿,别认真你是否能能获得额外的金币。

准备

注意:该步骤相关软件或命令暂时不用管是怎么操作的,后续操作用到时会详细讲解。
此处,只需要明白这些工具的用途即可。

脱壳的东方头条APP

重要的事情说三遍。首先需要一台越狱的手机。首先需要一台越狱的手机。首先需要一台越狱的手机。

下载PP助手,下载并安装东方头条App_Store。有三种方式:

  • 第一种,如果是手机端PP助手安装的该APP,你可以在/var/mobile/Containers/Bundle/Application/71E0A419-7781-4869-B0BA-F298982D8473/东方头条App_Store.app/中找到可二进制文件东方头条App_Store,并通过scp命令下载到本地留作分析。
  • 第二种,在Mac上安装PP助手,通过Mac安装东方头条App_Store到手机设备。本地直接解压东方头条App_Store.ipa,打开里面的东方头条App_Store.app,查看包内容,里面根据大小排序,最大的一个文件就是东方头条App_Store二进制文件,复制在工作目录,留作分析。
  • 第三种,就是第一种和第二种的组合,不用上传文件到手机,也不用下载文件到本地Mac,本地的与第二种做法相同复制一份,留作分析即可。

usbmuxd

在OSX上,苹果有一个服务,叫usbmuxd,这个服务主要用于在USB协议上实现多路TCP连接,将USB通信抽象为TCP通信。苹果的iTunes, XCode,都直接或者间接地用到了这个服务。

安装命令如下:

    wget https://cgit.sukimashita.com/usbmuxd.git/snapshot/usbmuxd-1.0.8.tar.gz
    mkdir usbmuxd-1.0.8
    tar -zxvf usbmuxd-1.0.8.tar.gz -C usbmuxd-1.0.8

那么问题来了,如何让iDevice通过苹果的数据线和Mac/PC通信?答案是,只要有usbmuxd服务,就可以和iDevice通信,通过TCP.

libimobiledevice已经将苹果的usbmuxd服务和其他iTunes相关的服务实现跨平台并且开源了。

另外,peerTalk,一个基于usbmuxd服务的开源代码,作为iDevice和OS X通信的一个很好的例子,可以迅速拿来参考,用到自己的app里。既然用到苹果私有(没公开)的协议,那么app能否上架呢?答案是肯定的。并没有用到私有API。某些知名软件比如duet,利用这个usbmuxd上的peerTalk和VNC技术,实现了将iPad作为Mac的显示器的功能,并且在AppStore上架。

另外,树莓派也已经实现了peerTalk。

lldb

LLDB是个开源的内置于XCode的具有REPL(read-eval-print-loop)特征的Debugger,其可以安装C++或者Python插件。在日常的开发和调试过程中给开发人员带来了非常多的帮助。

brew install lldb

如果自己不安装,则可以直接使用Xcode自带的lldb,/Applications/Xcode.app/Contents/Developer/usr/bin/lldb

ldid

ldid是一款二进制授权管理软件,可以对越狱应用进行SHA1运算生成授权,让软件包可以在iPhone上执行。我们使用Homebrew来安装它们。Homebrew是一款Mac上基于Ruby的包管理器。使用如下命令:

brew install dpkg ldid

dpkg可以安装deb插件到iDevices。
如果没有安装Homebrew,那么需要先安装Homebrew,使用如下命令即可:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

debugserver

debugserver是运行在ios上,作为服务端,实际上执行LLDB(作为客户端)传过来的没命令,再把执行结果反馈给LLDB,显示给用户,即所谓的”远程调试”。在默认情况下,ios上并没有安装debugserver。需要设备连接Xcode,在Window–>Devices菜单中增加此设备后,debugserver才会被Xcode安装到IOS设备的/Developer/usr/bin/目录下。注意:由于缺少task_for_pid权限,通过Xcode安装的debugserver只能调试自己的APP。为了逆向,我们需要对debugserver进行相关配置,使我们可以调试别人的APP

表1 设备对应的ARM的类型

Name ARM
iPhone 4s armv7
iPhone 5 armv7s
iPhone 5c armv7s
iPhone 5s arm64
iPhone 6 plus arm64
iPhone 6 arm64
iPad 2 armv7
iPad mini armv7
The New iPad armv7
iPad with Retina display armv7s
iPad Air arm64
iPad Air 2 arm64
iPad mini with Retina display arm64
iPad mini 3 arm64
iPad touch 5 armv7

theos

TheOS 被设计为一个在基于Unix平台 (Mac OS X、IOS…) 和大多数的Linux平台下开发iOS程序的集成开发环境。说是集成开发环境,其实就是给我们准备好了一些代码模板、预置一些基本的Makefil 脚本,我们还是要在终端命令行中完成一些关键操作,比如make cleanmake packagemake install

sudo Git clone --recursive https://github.com/theos/theos.git /Users/${yourName}/Documents/sofrware/theos

然后把/Users/${yourName}/Documents/sofrware/theos的权限改成你自己:

sudo chown $(id -u):$(id -g) /Users/${yourName}/Documents/sofrware/theos

最后把theos的执行路径加入到环境变量中,在~/.bash_profile中加上:

export THEOS="/Users/${yourName}/Documents/sofrware/theos"

注意:${yourName}替换为你自己的用户名,甚至说/Users/${yourName}/Documents/sofrware/theos路径完全替换成你喜欢的路径。

hopper disassembler

Hopper Disassembler是一款非常优秀的反汇编软件,完全媲美IDA。具体怎么使用后续会用到,但我们必须知道Hopper中的地址都是虚拟机偏移后的地址,lldb中真是。

reveal

Reveal一款APP UI层分析工具,三维模式可以说非常清晰定位到APP的UI层Controller以及其他View。

class-dump

class-dump是用来dump目标文件的类信息的工具。它利用Objective-C语言的runtime的特性,将存储在mach-O文件中的@interface和@protocol信息提取出来,并生成对应的.h文件。官方介绍如下:

This is a command-line utility for examining the Objective-C runtime information stored in Mach-O files. It generates declarations for the classes, categories and protocols. This is the same information provided by using ‘otool -ov’, but presented as normal Objective-C declarations, so it is much more compact and readable.

我们可以使用class-dump通过命令直接导出脱壳的APP的头文件,从这些头文件里面我们可以看到方法的出参和入参,也能猜出一定概率的用途。
class-dump可执行二进制文件的下载地址: http://stevenygard.com/projects/class-dump

到此我们的前前期准备工作做完了。

实战

dump头文件

执行下面指令,dump东方头条APP的头文件:

./class-dump -H ~/Documents/东方头条-个性化新闻阅读平台-2.2.6\(越狱应用\)/Payload/东方头条App_Store.app/东方头条App_Store -o ~/Documents/workspace/re/东方头条/

dump的头文件如下图

端口映射

通过usbmuxd做设备和本地的端口映射,其冒号前为设备端口,冒号后为本地端口。上面设备1234映射为本地1234,设备的22端口映射为本地的2222端口。为什么要这么做?因为我们需要使用lldb“远程调试”,需要本地lldb监听一个端口,那么这个端口定位1234。22端口映射为2222,因为Mac自身的的端口是22,如果将手机设备的22端口映射22会冲突。设备的22端口为我们通过ssh登录设备提供便利。

$ python ~/Documents/software/usbmuxd-1.0.8/python-client/tcprelay.py -t 1234:1234 22:2222
Forwarding local port 1234 to remote port 1234 # 输出日志
Forwarding local port 2222 to remote port 22 # 输出日志

上面命令执行完后窗口占用着不关闭。接下来,我们需要登录手机设备,开启一个debugsever,因为做了端口映射,所以可以直接使用localhost:2222代替设备ip:22。我们新开一个shell窗口,执行下面命令:

ssh root@localhost -p 2222

输入密码alpine,然后成功登录到设备,之后,我们使用debugserver开启一个端口为1234的服务,也就是上面做1234映射的目的:

debugserver *1234 -a  东方头条App_Store

如果设备命令窗口不支持输入中文,可以使用通配符*,然后按Tab键自动补全:

debugserver *:1234 -a /var/mobile/Containers/Bundle/Application/71E0A419-7781-4869-B0BA-F298982D8473/*App_Store.app/*App_Store

补全后:

debugserver *:1234 -a /var/mobile/Containers/Bundle/Application/71E0A419-7781-4869-B0BA-F298982D8473/东方头条App_Store.app/东方头条App_Store

到此我们的必备工具基本已就绪了。

lldb连接

启动本机的lldb,进行调试,连接本机的1234(会被转发到iOS设备的1234,而设备上的debugserver已经在前面附加了东方头条App_Store并且开启1234端口监听了)

localhost:taobaoplugin zhoujunwen$ lldb
(lldb) process connect connect://localhost:1234
Process 2572 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
    frame #0: 0x0000000181d254bc libsystem_kernel.dylib`mach_msg_trap + 8
libsystem_kernel.dylib`mach_msg_trap:
->  0x181d254bc <+8>: ret

libsystem_kernel.dylib`mach_msg_overwrite_trap:
    0x181d254c0 <+0>: mov    x16, #-0x20
    0x181d254c4 <+4>: svc    #0x80
    0x181d254c8 <+8>: ret
Target 0: (东方头条App_Store) stopped.

看到上面的内容,说明lldb已经链接成功。使用image list -o -f或者image list 东方头条App_Store获取东方头条App_Store进程在虚拟内存相对于模块基地址的偏移量。

(lldb) image list -o -f 东方头条App_Store
[  0] 0x0000000000004000 /var/mobile/Containers/Bundle/Application/71E0A419-7781-4869-B0BA-F298982D8473/东方头条App_Store.app/东方头条App_Store(0x0000000100004000)

其中第一列[X]是image的序号,不用管;第二列是ASLR的offset,也就是对应image的虚拟内存slide;第三列是image的全路径和slide之后的基地址。ASLR偏移量 = 0x0000000000004000, 模块偏移后基地址 = 0x0000000100004000。

使用Hopper打开的解密后的东方头条App_Store的安装包,其起始地址从下图中我们可以看出是0x0000000100000000, 这个地址就是模块偏移前的地址,也就是模块在虚拟内存中的起始地址。从Hopper中我们可以知道:模块偏移前的基地址=0x0000000100000000。

从上面两组数据我们可以得出:

  模块偏移后的基地址(0x5f000)= ASLR偏移量(0x5b000)+ 模块偏移前基地址(0x4000)

上面这个公式是尤为重要的,因为Hopper中显示的都是“模块偏移前基地址”,而LLDB要操作的都是“模块偏移后的基地址”。所以从Hopper到LLDB,我们要做一个地址偏移量的转换。这个在下方会多次用到。当然,有一点需要注意的是Hopper与LLDB所选择的AMR架构的位数得一致,要么是32位,要么都是64位,如果位数不匹配的话,那么计算出来的内存地址肯定是不对的。

知识点:
– 模块在内存中的起始地址—-模块基地址
– ASLR偏移 —- 虚拟内存起始地址与模块基地址的偏移量
– LLDB要操作的都是“模块偏移后的基地址”,Hopper中显示的都是“模块偏移前基地址”。

lldb断点调试

(1)断点前分析

(2)定位断点位置

(3)添加断点

(4)断点的单步执行(ni, si)

(5)放开执行该断点(c)

(6)断点的禁用和开启
(7)断点的删除

输出寄存器的值(p, po)

tweak编写

点击量:7

发表评论