美文网首页
我的逆向工程之路 - 0SX工具篇

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

作者: 夜间寻路人 | 来源:发表于2017-05-04 09:49 被阅读127次

    主要学习资料:《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/里面
    

    相关文章

      网友评论

          本文标题:我的逆向工程之路 - 0SX工具篇

          本文链接:https://www.haomeiwen.com/subject/zejrtxtx.html