iOS逆向工程

逆向工程的目的

1)分析竞品的最新研究或者产品原型(包括所用的技术,所使用的框架)
2)学术/学习目的。
3)破解应用的使用权限
4)识别竞品潜在的侵权行为

逆向工程的分析工具

进行iOS逆向工程的一个关键就是工具的使用,工欲善其事,必先利其器。

工具分类 工具名称
越狱工具 盘古越狱
查看文件工具 PP助手, iExplorer, iFunbox, iTool
砸壳工具 dumpdecrypted, Clutch
查看头文件工具 class-dump
反汇编工具 Hopper, IDA Pro
调试器 Cycript, gdb
UI分析工具 Reveal
网络分析工具 Charles

第一部分 砸壳查看APP头文件

工具

一.App Store上的应用都使用了FairPlay DRM数字版权加密保护技术。我们要对文件进行反汇编,而IPA都是加密的,哪怎么办呢?所以在逆向之前我们需要先对应用进行砸壳。这里我们使用的是 dumpdecrypted。(还可以使用Clutch,这里我们就不讲Clutch了)

dumpdecrypted 代码

Dumps decrypted mach-o files from encrypted iPhone applications from memory to disk.
This tool is necessary for security researchers to be able to look under the hood of encryption.

二.class-dump是用于解析Mach-O文件中存储的OC运行时信息的。他能生成类的声明、分类、协议。和otool -ov类似,但是由于class-dump的结果是以OC代码展示的,所以有很强的可读性。

class-dump 代码

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.

三.一台越狱手机

iOS为了保证安全性,所有的应用都是在沙盒中运行。所以要想完成逆向操作,我们需要更高级的权限。没有越狱设备那就无法展开学习和研究工作。

步骤

一.安装好 dumpdecryptedclass-dump 以后,在越狱机上Cydia上安装 openSSH,通过MAC终端控制手机,openSSH密码是alpine(手机和电脑需要在同一网段,然后点开设置查看当前手机分配的ip地址)

Mac-mini-Damon:~ damon$ ssh root@192.168.2.108 
root@192.168.2.108's password: 
iPhone4:~ root# 

二.在越狱机上Cydia上安装 Cycript

Cycript是一个理解Objective-C语法的javascript解释器,这意味着我们能够在一个命令中用Objective-C或者javascript,
甚至2者兼用。它能够挂钩正在运行的进程,能够在运行时修改应用的很多东西。使用Cycript有如下好处:

1.我们能够挂钩正在运行的进程,并且找出正被使用的类信息,例如view controllers,内部和第3方库,甚至程序的delegate的名称。
2.对于一个特定的类,例如View Controller, App delegate或者任何其他的类,我们能够得到所有被使用的方法名称。
3.我们能够得到所有实例变量的名称和在程序运行的任意时刻实例变量的值。
4.我们能够在运行时修改实例变量的值。
5.我们能够执行Method Swizzling,例如替换一个特定方法的实现。
6.我们可以在运行时调用任意方法,即使这个方法目前并不在应用的实际代码当中。
Mac-mini-Damon:dumpdecrypted-master damon$ cd /Users/damon/Desktop/dumpdecrypted-master 
Mac-mini-Damon:dumpdecrypted-master damon$ make
`xcrun --sdk iphoneos --find gcc` -Os  -Wimplicit -isysroot `xcrun --sdk iphoneos --show-sdk-path` -F`xcrun --sdk iphoneos --show-sdk-path`/System/Library/Frameworks -F`xcrun --sdk iphoneos --show-sdk-path`/System/Library/PrivateFrameworks -arch armv7 -arch armv7s -arch arm64 -c -o dumpdecrypted.o dumpdecrypted.c 
Mac-mini-Damon:dumpdecrypted-master damon$ ls
Makefile        dumpdecrypted.c     dumpdecrypted.o
README          dumpdecrypted.dylib
Mac-mini-Damon:dumpdecrypted-master damon$ 

三.找出要反编译APP的执行文件目录,为了避免干扰,最好杀掉其他进程,只打开反编译APP,使用ps -e命令得到路径

iPhone4:~ root# ps -e 
  PID TTY           TIME CMD
 1556 ??         0:00.10 /usr/libexec/afc2d -S -L -d /
 1564 ??         0:03.07 /usr/libexec/deleted --idleExit
 1566 ??         0:00.15 /System/Library/PrivateFrameworks/GeoServices.framework/geod
 1568 ??         0:00.36 /usr/libexec/mobileassetd
 1570 ??         0:00.63 /System/Library/Frameworks/AssetsLibrary.framework/Support/assetsd
 1612 ??         0:00.37 sshd: root@ttys000 
 1622 ??         0:06.20 /var/mobile/Applications/B1215D4A-24B7-480F-B91D-8F5386B0211A/QQ.app/QQ
 1623 ??         0:00.10 /System/Library/Frameworks/UIKit.framework/Support/pasteboardd
 1613 ttys000    0:00.05 -sh
 1628 ttys000    0:00.01 ps -e
iPhone4:~ root# 

其中的 /var/mobile/Applications/B1215D4A-24B7-480F-B91D-8F5386B0211A/QQ.app/QQ 就是我们要找的

四.使用Cycript找出反编译APP的Documents目录路径

iPhone4:~ root# cycript -p QQ
cy# [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]
#"file:///var/mobile/Applications/B1215D4A-24B7-480F-B91D-8F5386B0211A/Documents/"
cy# 

其中的 /var/mobile/Applications/B1215D4A-24B7-480F-B91D-8F5386B0211A/Documents/ 就是我们要找的Documents目录路径

五.将dumpdecrypted_7.dylib拷贝到Documents目录下,此处是使用scp方式,也可以使用iFunBox或者PP助手进行文件操作(这里的dumpdecrypted_7.dylib是别人已经生成好的)地址

Mac-mini-Damon:~ damon$ scp /Users/damon/Desktop/dumpde/dumpdecrypted_7.dylib root@192.168.2.108:/var/mobile/Applications/B1215D4A-24B7-480F-B91D-8F5386B0211A/Documents/
root@192.168.2.108's password: 
dumpdecrypted_7.dylib                         100%   81KB  81.0KB/s   00:00    
Mac-mini-Damon:~ damon$ 

六.然后就是使用dumpdecrypted砸壳

iPhone4:~ root# cd /var/mobile/Applications/B1215D4A-24B7-480F-B91D-8F5386B0211A/Documents/
iPhone4:/var/mobile/Applications/B1215D4A-24B7-480F-B91D-8F5386B0211A/Documents root# DYLD_INSERT_LIBRARIES=dumpdecrypted_7.dylib /var/mobile/Applications/B1215D4A-24B7-480F-B91D-8F5386B0211A/QQ.app/QQ
mach-o decryption dumper

DISCLAIMER: This tool is only meant for security research purposes, not for application crackers.

[+] detected 32bit ARM binary in memory.
[+] offset to cryptid found: @0x4a4c(from 0x4000) = a4c
[+] Found encrypted data at address 00004000 of length 46284800 bytes - type 1.
[+] Opening /private/var/mobile/Applications/B1215D4A-24B7-480F-B91D-8F5386B0211A/QQ.app/QQ for reading.
[+] Reading header
[+] Detecting header type
[+] Executable is a FAT image - searching for right architecture
[+] Correct arch is at offset 16384 in the file
[+] Opening QQ.decrypted for writing.
[+] Copying the not encrypted start of the file
[+] Dumping the decrypted data into the file
[+] Copying the not encrypted remainder of the file
[+] Setting the LC_ENCRYPTION_INFO->cryptid to 0 at offset 4a4c
[+] Closing original file
[+] Closing dump file

iPhone4:~ root# ls

(null)/         CustomFace/        Image/         Other/        QQAppSetting.plist  TRctBundle/  app.m                dumpdecrypted_7.dylib  wallet/
AVEngine.log    Doc/               LuaPluginDir/  QMusicSdk/    QQFlow.ini          Theme/       client_wording.json  giftInfo/              webappCache2/
Audio/          FileRecv/          MQZONEv1/      QQ.decrypted  QQHeadThumb/        ThemeInfo/   content/             patchScripts/          wupseq.dat
ConfigStorage/  FileTransferTemp/  MyFolder/      QQ.ini        QZoneImageThumb/    Video/       contents/            tbmg.data
root# 

其中的 QQ.decrypted 就是我们要的破解文件

七.使用class-dump将文件解析

QQ.decrypted拷贝到Mac桌面文件夹,使用class-dump进行解析

Mac-mini-Damon:~ damon$ cd /Users/damon/Desktop/test 
Mac-mini-Damon:test damon$ class-dump --arch armv7 QQ.decrypted > QQ.m
Mac-mini-Damon:test damon$ 

得到的QQ.m文件就是我们需要的头文件,class-dump --arch armv7 QQ.decrypted > QQ.m,因为我是用的手机是iPhone4做的(没办法,只能用公司不用的4进行越狱),所以使用 armv7,其他型号使用相对应的 4(armv7),4s(armv7),5(armv7),5s(arm64),6(arm64),6s(arm64)

1)分析从AppStore下载的IPA包

class-dump --arch armv7 QQ.decrypted > QQ.m

2)分析从越狱平台下载的越狱IPA包

class-dump -H MYXJ.app -o /Users/damon/Desktop/test/headMYXJ 

第二部分 分析APP UI

Reveal简介

Reveal能够在运行时调试和修改iOS应用程序。它能连接到应用程序,并允许开发者编辑各种用户界面参数,
这反过来会立即反应在程序的UI上。就像用FireBug调试HTML页面一样,在不需要重写代码、
重新构建和重新部署应用程序的情况下就能够调试和修改iOS用户界面。

Reveal查看任意app的高级技巧介绍了如何在越狱设备上查看任意app的技巧:

1)iOS设备需要越狱,iOS6以上
2)安装Reveal,越狱设备与安装Reveal的Mac在同一wifi内。
3)点击菜单Help / Show Reveal Library in Finder,获取libReveal.dylib
4)将libReveal.dylib上传到设备的/Library/MobileSubstrate/DynamicLibraries
5)编辑并上传一个libReveal.plist,格式和/Library/MobileSubstrate/DynamicLibraries下面的其他plist类似,其中的filter的bundle写要查看的iOS App的bundle Id。 
格式如下:
{ Filter = { Bundles = ( "你要查看的app的bundle Id" ); }; }
6)重启iOS设备

第三部分 反编译

一:Hopper简介

Hopper是一款运行在Mac、Windows和Linux下的调试(os x only)、反汇编和反编译的交互式工具。
可以对32、64位的MAC程序、Windows程序和IOS程序(arm)进行调试、反编译等。

功能

1)能够分析出函数的代码块、变量等
2)可以生成代码块的控制流图CFG
3)可以通过Python脚本来调用Hopper的其他一些功能,使用更加灵活
4)在MAC上还可以通过GDP动态调试分析
5)对Objective C的极佳的支持——能够解析出Selector、字符串和发送的消息
6)反编译,生成伪代码
7)分析快速,且占用资源少

二:IDA Pro简介

IDA Pro是一个非常强大的反汇编和调试工具,支持Windows,Linux, Mac OS X平台

IDA Pro权威指南(第2版)

第四部分 网络接口分析

Charles简介

Charles是Mac下常用的对网络流量进行分析的工具,类似于Windows下的Fiddler。
在开发iOS程序的时候,往往需要调试客户端和服务器的API接口,这个时候就可以用Charles,Charles能够拦截SSL请求、模拟慢速网络、
支持修改网络请求包并多次发送、能够篡改Request和Response等强大的功能。下面介绍安装和使用方法。

功能

1)拦截SSL请求
2)模拟慢速网络 
菜单Proxy中的Throttle Setting可以对此进行设置
3)支持修改网络请求包并多次发送
4)断点功能 
Charles能够断到发送请求前(篡改Request)和请求后(篡改Response)
5)捕获记录控制 可以过滤出关注的请求。菜单Proxy中的Record Setting可以对此进行设置

第五部分 使用调试器hook

gdb调试命令

已经集成在Xcode中去了用于调试App程序
但是直接在硬件设备上执行时,可以获得更多的功能

可以调试设备上所有的进程
快速分离和重新附着到某个进程上
没有桌面形式的操作系统上进行开发程序时的调试
攻击者可以修改gdb命令的脚本文件,来达到操作设备上任何程序的

运行、修改、监控设备上的所有的程序

iOS应用程序安全(22)-使用GDB进行运行时分析和操作

iOS安全攻防(二十)动态调试利器---gdb基础篇

iOS逆向工程读书笔记

第六部分 如何防止被反编译

代码混淆的必要性以及方法:

1) 使用c语言实现关键的代码逻辑

2)使用宏替换

逆向工程参考文章

iOS逆向 - dumpdecrypted工具砸壳

iOS安全–使用Cycript进行运行时分析

dumpdecrypted砸壳

用dumpdecrypted给App砸壳

用dumpdecrypted给App砸壳

IOS 逆向工程之砸壳

iOS逆向工程-dumpdecrypted砸壳

手把手教你反编译别人的app

iOS 使用Class-dump分析App内部实现

Objective-C Class-dump 安装和使用方法

使用class-dump-z分析支付宝app

IOS安全–使用class-dump-z导出IOS应用类信息

iOS APP安全杂谈

iOS APP安全杂谈之二

iOS APP安全杂谈之三

iOS URL Scheme 劫持-在未越狱的 iPhone 6上盗取支付宝和微信支付的帐号密码

Reveal真机查看任意APP

使用Reveal调试自己和他人的应用

分析微信来优化自己的应用

#微信抢红包# 源码直接分享

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容