我的逆向工程之路 - 0SX工具篇

主要学习资料:《iOS应用逆向工程(第二版)》

  1. class-dump

    下载地址:http://stevenygard.com/projects/class-dump

    下载class-dump-3.5.dmg后,将dmg文件里面的class- dump复制到“/usr/bin” ,然后再Terminal 中执行“sudo chmod 777/usr/bin/class-dump”赋予其执行权限。然后问题来了。

    复制的时候 提示我没有权限,于是想chmod一下,悲剧的是还是不行。网上查了一下发现原来是Rootless 搞得鬼。

    OS X 10.11 加入了Rootless,默认创建的用户还是属于admin用户组    
    也能切换到root用户,但是加以了限制.使得某些操作只有苹果的应用可以      
    被许可(通过代码签名来判断).所以第三方应用即使是运行在root权限中,      
    有一些操作也无法完成。
    

    关闭Rootless 的方法就是 重启电脑,听到嘟一声后(赶紧哦)按住cmd+r进入安全模式(这里还有一个坑,用的是mac mini 美式键盘,试了好几次没成功。之后进键盘设置 -> 更改键盘类型,重新识别了一次键盘,搞定。)

    找到实用工具,也就是命令窗口 ternimal,输入
    csrutil disable 关闭
    csrutil enable 打开
    csrutil status 查看状态
    最后重启即可

    class-dump的对象是 framework的库文件 或者 app的可执行文件。这里我:

    MAC:~ LJ$ cd /Users/renjinkui/Desktop/classDump-Test/LJTrack.app   
    MAC:LJTrack.app LJ$ class-dump -S -s -H LJTrack -o /Users/renjinkui/Desktop/classDump-Test/
    
    

    -S 是将方法排序,-s 是将类名,分类名排序,
    -H 则是生成头文件,-o 后面接生成头文件的位置,没有则头文件放到当前目录。
    好了class-dump 基本就搞定了。

class-dump --arch armv7s Victim.decrypted
指定哪个架构 需要被解析
  1. Theos

    https://github.com/theos/theos 下载地址
    直接下载theos,放到/opt/theos 文件夹下


    theosLocation.png

    终端安装法:

     MAC:~ LJ$ export THEOS=/opt/theos
     MAC:~ LJ$ sudo git clone git://github.com/DHowett/theos.git $THEOS
     
    

    改变theos 文件夹的所属关系:

     sudo chown $(id -u):$(id -g) /opt/theos
    

    设置环境变量:

     设置              ~/.bash_profile 文件  
     在文件最后面加上:  export PATH=/opt/theos/bin/:$PATH  
    


    配置ldid (下载地址:http://joedj.net/ldid)
    github 源码地址:https://github.com/rpetrich/ldid
    原理文章: http://www.saurik.com/id/8
    把它放到 /opt/theos/bin/下
    sudo chmod 777 /opt/theos/bin/ldid 赋予权限


    配置CydiaSubstrate,
    运行自动化脚本: sudo /opt/theos/bin/bootstrap.sh substrate

    (最新版的 theos 里面已经没有这个脚本了,可以跳过执行脚本这一步)

    巨坑啊!!!

    接下来要做的就是从 iOS 上已经安装的 Cydia Substrate 上复制 cydiaSubstrate 文件到 theos 上

    (首先在Cydia中搜索安装:CydiaSubstrate)

    文件位于 iOS 上的
    “/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate”,
    将其拷贝到 OSX 上,然后重命名为 libsubstrate.dylib 后
    放到 “/opt/theos/libsubstrate.dylib” 中


    配置dpkg-deb:
    deb 是越狱开发安装包的标准格式,而 dpkg-deb 是操作 deb 文件的工具,
    有了这个工具,Theos 才能将工程正确地打包成 deb 包

    https://raw.githubusercontent.com/DHowett/dm.pl/master/dm.pl下载dm.pl,将其重命名为 dpkg-deb 后,
    放到 “/opt/theos/bin/“ 目录下,然后设置它的可执行权限

     sudo chmod 777 /opt/theos/bin/dpkg-deb
    
    (发现 最新的theos 里面已经有dm.pl 文件了...)为了保持一致,也copy一个出来,改个名字,再放进去。

    另外一种 安装dpkg:
    https://www.macports.org/install.php 下载OSX 对应版本的pkg安装包
    安装完成后, 运行: sudo port selfupdate
    确保MacPorts 升级到最新版 再运行: sudo port install dpkg(有点慢哦)


    配置Theos NIC templates:(Theos 工程模板)
    下载地址: <https://github.com/DHowett/theos-nic- templates/archive/master.zip>
    发现 最近的Theos 里面已经包含了其中的四种了,只有一个sbsettingstoggle.nic.tar 没有,直接copy 进去。

    使用Theos 创建工程
MAC:Code-Test LJ$ nic.pl   =========>启动NIC
NIC 2.0 - New Instance Creator

[1.] iphone/activator_event
[2.] iphone/application_modern
[3.] iphone/cydget
[4.] iphone/flipswitch_switch
[5.] iphone/framework
[6.] iphone/ios7_notification_center_widget
[7.] iphone/library
[8.] iphone/notification_center_widget
[9.] iphone/preference_bundle_modern
[10.] iphone/sbsettingstoggle
[11.] iphone/tool
[12.] iphone/tweak
[13.] iphone/xpc_service
Choose a Template (required): 12  =========>选择一个模板来创建,tweak模板
Project Name (required): iOSRE    =========>工程名字
Package Name [com.yourcompany.iosre]: com.iosre.iosreproject ===>deb包名
Author/Maintainer Name [LiJie]: lijie =========> tweak作者名字
[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]: com.apple.springboard  =========>tweak作用对象的bundle identifier
[iphone/tweak] List of applications to terminate upon installation (space-separated, '-' for none) [SpringBoard]: SpringBoard =========>tweak 安装后需要重启的应用,进程名
Instantiating iphone/tweak in iosre/...
Done.   
 

生成的工程iosre,里面包含四个文件:

 1. Makefile: 指定工程用到的文件,框架,库等    
    (Application,Tweak, Tool 三种类型的程序 分别对应的.mk文件:  
     application.mk, tweak.mk, tool.mk)

    如果提示找不到文件common.mk,则include改成:include /opt/theos/makefiles/common.mk

 2. Tweak.xm: 默认生成的原文件  
    (%hook, %log, %orig   三个基本的预处理命令)
    %hook: 指定需要hook的class, 以%end结尾  
    %orig: 执行被hook的函数
    %orig(x,x): 执行被hook的函数的,同时修改函数的参数 
    %log : 在%hook里面使用,将函数类名,参数,等信息写入syslog  
    %group  将%hook分组,以%end结尾, 一个group可以包含多个hook  
    %init   group必须配合init使用,用于初始化group,再hook 或者 ctor内调用  
    %ctor: (构造函数,后没有显式调用)系统会自动生成ctor,并在其中调用init  
    %new : hook内部使用,给class添加函数(类似class_addMethod),%end结尾    
    %c   :  动态获取一个类的定义(objc_getClass, NSClassFromString)  
    详细资料:  <http://iphonedevwiki.net/index.php/Logos>
 3. control: 记录了deb包管理系统所需要的基本信息,会被打包到deb包里  
 4. iOSRE.plist: 记录了一些配置信息  
    (Filter有不同的array时,需要添加 Mode:(String)Any 键值对)  

生成好工程之后,就是编译 -> 打包 -> 安装了。

1.  编译命令: make
   (这个时候,项目就会多出一个obj文件夹,里面有一个.dylib文件,就是tweak的核心部分)

2.  编译 + 打包命令: mark package (也就是想make 再 dpkg-deb)
    这个时候就会生成一个 .deb的文件,就是最终的发布安装包。

3.  编译 + 打包 + 安装:  make package install
    图像安装:  通过iFunBox 吧deb拖到iOS ,然后用iFile安装。最后再重启。
    或者: SSH命令,iOS 必须安装OpenSSH。首先,在MakeFile文件最后 加上"THEOS_DEVICE_IP = 本机IP",告诉Theos 测试设备的IP地址。然后命令行输入:"make package install" 命令来完成编译,打包,安装。

不需要多次输入密码的方法:

ssh_Location.png
autorized_keys.png
1. 找到上面路径 里面的known_hosts文件里面的 iOS的 IP那一行。(完整删掉哦)
2. 生成 authorized_keys 
    先: ssh-keygen -t rsa  
    再: cp /Users/****/.ssh/id_rsa.pub ~/authorized_keys
3. 配置iOS:
    以root身份登录iOS中,输入:"ssh-keygen", 生成"/var/root/.ssh"目录;
    然后exit 退出登录,
    再输入: "scp ~/authorized_keys root@192.168.1.**:/var/root/.ssh"。即可
4. 清理:
     make clean, 清除工程命令(删除了,Theos编译 打包留下的文件 obj,_,)
  1. Reveal

    Reveal是可以查看我们自己的appUI布局。但是也是可以看其他App的哦。

  2. 安装Reveal Loader:
    在Cydia 中,搜索并安装Reveal Loader。下载时会自动,下载一个libReveal.dylib的文件(最新版本 只剩下一个RevealServer.framework 文件了)。

    下载完,在iOS上/Library/ 目录下有没有 RHReavealLoader文件夹,没有就手动新建一个,并把libReveal.dylib(RevealServer.framework)文件(在,"Show Reveal Library in Finder")拷贝进去。

  3. 配置Reveal Loader, 直接进设置 -> Reveal->Enabled Applications 打开需要查看的App。

  4. 在未越狱机上的使用:(真机可以通过USB 或者 局域网联调)

在文件:/Users/renjinkui/.lldbinit   里面加上: 
command alias reveal_load_sim expr (void*)dlopen("/Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries/RevealServer.framework/RevealServer", 0x2);

command alias reveal_load_dev expr (void*)dlopen([(NSString*)[(NSBundle*)[NSBundle mainBundle]               pathForResource:@"RevealServer.framework/RevealServer" ofType:@""] cStringUsingEncoding:0x4], 0x2);

command alias reveal_start expr (void)[(NSNotificationCenter*)[NSNotificationCenter defaultCenter]           postNotificationName:@"IBARevealRequestStart" object:nil];

command alias reveal_stop expr (void)[(NSNotificationCenter*)[NSNotificationCenter defaultCenter]            postNotificationName:@"IBARevealRequestStop" object:nil];

这四个语句分别代表了: 
在模拟器,和在真机上加载Reveal动态库。(最新版,已经可以自动加载动态库 和 开始Reveal了。)
开始Reveal 和 结束Reveal。
reveal_framework_location.png
command alias  第一个跟别名,后面跟命令。
dlopen 是打开动态库,在framework里面则要定位到"***.framework/***"。
dlsym  是获取函数地址
dlclose 关闭

RevealServer.framework 拷贝到工程里面的时候,会有崩溃提示说,(not found image)找不到图片的,就要在这里 加上RevealServer.framework。


reveal_error.png
  1. IDA

    下载安装: https://www.hex-rays.com/products/ida/support/download_demo.shtml

IDA 的界面通过 空格进行切换(Graph 或者 Text):

   满足条件的分支:  绿色线、
   不满足条件的:    红色线、
   没有分支的:      蓝色线。 
IDA_GraphView.png
IDA_TextView.png
  1. iFunBox

越狱的iPhone ,需要先安装 App File Conduit2.
iFunBox 才能浏览全系统的文件。

  1. dyld_decache

下载地址: https://cloud.github.com/downloads/kennytm/Miscellaneous/dyld_decache%5Bv0.1c%5D.bz2
iOS 3.1 后,库文件的位置:

/System/Library/Caches/com.apple.dyld/dyld_shared_
dyld_shared_cache_armv7、 
dyld_shared_cache_armv7s或 
dyld_shared_cache_arm64   

dyld_decache 用于提取库里面的二进制文件。

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

推荐阅读更多精彩内容