美文网首页逆向工程
4.汇编逆向工具集(二)

4.汇编逆向工具集(二)

作者: 木子心语 | 来源:发表于2018-04-29 00:12 被阅读122次

    1.debugserver和LLDB

    倚天剑 屠龙刀
    • 如果说IDA是倚天剑,那么LLDB就是屠龙刀,两者在iOS逆向工程中的地位不相上下,难分伯仲.
    • LLDB全程为 Low Level Debugger ,是由苹果出品,内置于Xcode中的动态调试工具
    • 不但通吃C,C++,OC,还支持OSX,iOS以及iOS模拟器
    干将莫邪
    • LLDB是运行在OSX中的,要想调试iOS,还需要另一个伙伴配合,他就是debugserver.可以说它们两个是宝剑界的干将莫邪.

    1.1 debugserver

    • debugserver运行在iOS上,作为服务端,实际执行LLDB传过来的命令
    • 执行结果反馈给LLDB,显示给用户,即所谓的远程调试.
    • 在默认情况下,iOS上并没有安装debugserver
    • 只有设备连接过一次Xcode后,debugserver才会被Xcode安装到iOS的/Developer/usr/bin目录下.
    iOS-debugserver

    1.2 帮debugserver减肥

    设备-ARM-信息.png
    • 我的手机是iphone5s--对应的ARM是arm64
    • 我们从手机/Developer/usr/bin/debugserver 把debugserver 下载到mac上
    scp root@iOSIP:/Developer/usr/bin/debugserver /Users/mac-name/Desktop/debugserver
    
    • 然后进行减肥操作(路径自己选择)
    lipo -thin arm64 /Users/mac-name/Desktop/debugserver -output /Users/popo/Desktop/debugserver1/debugserver
    
    瘦身后的debugserver 终端处理操作
    • 再接着,我们给debugserver添加task_for_pid权限
      1.因为通过Xcode安装的debugserver只能调试我们自己的App
      2.我们自己有App的源代码,就用不着debug了.
      3.所以我们要添加task_for_pid权限
    用到的文件
    • xml文件下载地址: http://iosre.com/ent.xml
    • 这个是在debugserver1目录下执行的终端命令(上图就是该目录下的文件)
    ldid -Sent.xml debugserver  
    

    注意:如果没有安装ldid,要进行安装后,才可以使用用上面的命令执行.安装ldid的命令是:

    brew install ldid
    
    • 接着,我们在执行
    codesign -s - --entitlements ent.plist -f debugserver
    

    以上就完成了对debugserver的处理

    • 经过处理的debugserver拷贝到iOS
    scp /Users/popo/Desktop/debugserver1/debugserver root@192.168.3.15:/usr/bin/debugserver
    
    • 我们进入手机终端,对debugserver进行授权
    chmod +x /usr/bin/debugserver
    
    debugserver授权
    • 我们执行一下debugserver,测试一下是否配置成功,我们监听1234端口,开启SpringBoard--debugserver,看到下图结果,说明我们的配置是没问题了.
    C8657EFF-5FA8-4711-8DA2-74041B7E6F7D.png
    • 接着我们就要使用LLDB,对1234端口进行调试.

    1.3 LLDB

    • 在mac终端敲lldb,会进入lldb环境,我们输入help,就可以查看lldb调试命令.我们就可以开启调试模式.
    lldb-调试参数-1 lldb-调试参数-2 lldb-调试参数-3 lldb-调试参数-4
    • 首先启动debugserver
    • 在lldb环境输入:
    process connect connect://手机ip:1234
    
    debugserver + lldb
    • 调试命令--1.image list
    image list -o -f

    --用于列举当前进程中的所有模块
    --每次进程启动时,同一进程的所有模块在虚拟内存中的起始地址都会产生随机偏移.

    • 调试命令--2.breakpoint
      --2.1用于设置断点
      --2.2用法:
      -- (1) b function
      -- (2) br s -a address
      -- (3) br s -a 'ASLROffset + address'
      --2.3使用:
      --第1种:在函数的起始位置设置断点
      --(lldb) b NSLog
      --第2/3种是在地址处设置断点
      --(lldb) br s -a 0xCCCCC
      --2.4注意:
      --当进程停在断点上时,断点所在的哪一行代码并没有执行.这里和我们在xcode打断点是一样的.
    • 调试命令--3.print
      --LLDB的主要功能之一是"在程序停止的时候检查程序内部发生的事"
      --通过print命令,我们可以打印某处的值

    • 调试命令--4.nexti与stepi
      --它们的作用都是执行下一条机器指令
      --区别:nexti不进入函数体,stepi会进入函数体
      --简写: ni 与si

    • 调试命令--5.register write
      --用于给制定的寄存器赋值,从而对程序进行改动,观察程序执行过程变化

    2.dumpdecrypted--砸壳工具

    2.1 dumpdecrypted的产生

    • 由于AppStore下载的App是被苹果加密过的,可执行文件被套上一层保护壳
    • class-dump无法作用于加密过的App
    • 想要获取头文件,需要先解密App的可执行文件,也叫砸壳
    • dumpdecrypted就是由越狱社区的知名人士 Stefan Esser 出品的一款砸壳工具,被越狱社区广泛运用在iOS逆向工程研究中.

    2.2 dumpdecrypted的使用

    第二种:
    先确定下载的目录(desktop/dump目录下):


    下载dumpdecrypted

    下载执行命令:

    git clone git://github.com/stefanesser/dumpdecrypted
    
    • 接着对下载好的文件进行编译dumpdecrypted.dylib
    cd dumpdecrypted/
    
    make
    
    编译dumpdecrypted.dylib
    • 找到要砸壳的APP的Documents目录路径(微信为例)


    估计你看到这些,就会很头疼了,到底哪个是呢?

    • 我们借助强大的Cycript,让App告诉我们它在哪里,直接找到它的的根目录


      cycript -p WeChat
    • 锁定该目录 065B70ED-FCD1-4874-B4A3-86F1B765945F

    065B70ED-FCD1-4874-B4A3-86F1B765945F
    • 将dumpdecrypted.dylib拷贝到Documents目录下.
      有两种方式拷贝:
      第一种:
    scp /Users/popo/Desktop/dump/dumpdecrypted/dumpdecrypted.dyli root@192.168.3.15:var/mobile/Containers/Data/Application/065B70ED-FCD1-4874-B4A3-86F1B765945F/Documents/dumpdecrypted.dylib
    
    DA818A0B-0550-43F4-A236-123AD663F1FF.png

    第二种:


    拷贝dumpdecrypted.dylib

    以上两种方式,只需要拷贝成功就行,选择那种,根据个人喜好.

    • 开始砸壳
    DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/containers/Bundle/Application/9AF4167F-D4AA-4DBB-A67D-A956CCDBDEF9/WeChat.app/WeChat mach-o decryption dumper
    
    砸壳失败-error

    砸壳失败了,分析一下原因:
    required code signature missing for 'dumpdecrypted.dylib'
    由于没有对dumpdecrypted.dylib签名,
    我们没有砸壳成功.
    其实出现问题的时候就是涨经验的时候,
    遇到问题就解决问题.
    我们把问题解决后接着砸壳

    • 解决问题是对dumpdecrypted.dylib文件签名,首先获取可签名的证书
    security find-identity -v -p codesigning 
    
    获取可签名的证书

    然后为dumpecrypted.dylib签名

    codesign --force --verify --verbose --sign "iPhone Developer: `(开发这信息)`" dumpdecrypted.dylib 
    

    然后在上传到手机

    • 进行第二次砸壳
    DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/containers/Bundle/Application/9AF4167F-D4AA-4DBB-A67D-A956CCDBDEF9/WeChat.app/WeChat mach-o decryption dumper
    

    在当前目录下会生成WeChat.decrypted文件

    • 砸壳完成,然后你就可以拿着砸壳文件就行class-dump,静态分析汇编代码了.

    • 问题:dumpdecrypted为什么拷贝到Documents目录下操作?

      • StoreApp对沙盒以外的绝大数目录没有写权限.
      • Documents目录下使用dumpdecrypted.dylib时,保证它能在当前目录下写一个decrypted文件.

    4.OpenSSH

    汇编逆向工具集地址 https://www.jianshu.com/p/beea9f2b9f7d
    提到了远程连接手机终端.
    这里重点讲解一下.

    OpenSSH
    • 我们会经常用到两个命令ssh 和scp
    • ssh用于远程登录
    • scp远程拷贝文件
    • ssh使用:
    ssh user@手机ip
    

    我们上面连接手机时,使用到了这个命令

    ssh root@192.168.3.15
    
    • scp使用:
    scp user@手机ip:/path/to/remoteFile /path/to/localFile
    

    我们拷贝dumpdecrypted.dylib 到手机:

    scp /Users/popo/Desktop/dump/dumpdecrypted/dumpdecrypted.dyli root@192.168.3.15:var/mobile/Containers/Data/Application/065B70ED-FCD1-4874-B4A3-86F1B765945F/Documents/dumpdecrypted.dylib
    
    • 安装OpenSSH后需要注意修改默认登录密码:alpine.
    • iOS上的用户有2个
      • root
      • mobile
    • 修改密码,执行命令
    passwd root
    
    passwd mobile
    

    5.usbmuxd

    汇编逆向工具集地址 https://www.jianshu.com/p/beea9f2b9f7d
    提到了有线无线连接远程终端.
    这里也介绍一下.

    用到的python脚本
    python tcprelay.py -t   远程iOS上的端口 :  本地OSX/Windows上的端口   
    
    开启端口转发
    • ssh到iOS中
    ssh root@192.168.31.5 -p 54322
    

    就可以使用usb连线终端了.

    6.iFile--iOS版的Finder

    • iFile是iOS上一款非常强大的文件管理App,可以看做是iOS版的Finder.


      iFile
    iFile目录

    7.clutch--砸壳

    源码地址:https://github.com/KJCracks/Clutch

    7.1 源码下载

    源码下载 源码资源

    7.2 编译工具

    用Xcode打开源码
    编译命令 command + B


    源码
    生成砸壳工具

    7.3 拷贝到手机使用

    • 拷贝方法一:


      clutch文件拷贝到手机
    • 拷贝方法二:
    scp Clutch/clutch root@设备ip:/usr/bin/
    

    7.4 ssh到越狱机,准备砸壳

    • 砸壳钱先认识这些命令+参数的作用


      命令 + 参数

      1.clutch -b 砸壳后的文件是二进制文件
      2.clutch -d 砸壳后的文件是ipa文件
      3.clutch -i 查看安装的应用
      4.clutch --clean /var/tmp/clutch 目录清理
      5.clutch --version 显示版本并退出
      6.clutch --? 显示帮助并退出

    • 没有执行权限,需要授权


      授权
    • 执行clutch -i (查看手机安装的App)


      clutch -i
    • 砸壳


      砸壳两种方式

    砸壳第一种执行命令(clutch -d app序列号)

    clutch -d 1
    

    砸壳第二种执行命令(clutch -d app包名)

    clutch -d hk.itools.appe
    
    # Zipping WeChat.app
    # Swapping architectures..
    # DONE: /private/var/mobile/Documents/Dumped/hk.itools.appe-iOS7.0-(Clutch-2.0.4).ipa
    
    • 砸壳后的ipa所在目录


      砸壳后的ipa

      砸壳到这里,就完成了...

    8.fruda-ios-dump 一条命令完成iOS应用砸壳

    8.1 Frida

    Frida
    • Frida的使用场景:
      1.hook特定函数并更改返回值
      2.分析定制协议,同事其动态嗅探,解密
      3.应用调试
      4.在iOS应用上dump类和方法信息

    8.2 手机设备安装Frida

    • 首先打开手机设备,在Cydia中添加源


      添加源
    https://build.frida.re
    
    • 然后在Cydia中搜索Frida,进行安装.
    安装Frida

    8.3 在mac安装Frida

    • 终端执行:
    sudo pip install frida
    
    • 如果报下面错误:
    Uninstalling a distutils installed project (six) has been deprecated and will be
    removed in a future version. This is due to the fact that uninstalling a distutils 
    project will only partially uninstall the project.
    
    • 我们执行下面命令:
      原因:Apple预安装的这个six库出于安全原因被设置为sudo也不可以执行操作,所以需要依赖于高版本的库就需要更新six.
    sudo pip install frida –upgrade –ignore-installed six
    

    到这一步,环境配置完成了.

    8.4 配置frida-ios-dump环境

    github地址: https://github.com/AloneMonkey/frida-ios-dump

    • 下载源码
    • 安装依赖
    sudo pip install -r requirements.txt --upgrade (Python 2.7)
    
    • 修改dump.py参数
    vim /opt/dump/frida-ios-dump/dump.py
    
    修改参数

    8.5 打开终端,端口转发

    Run usbmuxd/iproxy SSH forwarding over USB (Default 2222 -> 22). e.g.
    执行下面的命令:
    iproxy 2222 22
    

    8.6 进行砸壳

    比如 一键砸壳(WeChat)

    ./dump.py WeChat
    

    这里就完成了砸壳.

    待续中...

    9.Reveal--一款Mac下调试iOS应用的软件

    下载地址:https://github.com/LK26/Reverse-tool-one/blob/master/Reveal.dmg

    9.1 Reveal

    Reveal
    • Reveal能够在运行时调试和修改iOS应用程序,而且它能连接到应用程序,并允许开发者编辑各种用户界面参数,而且会立即反应在程序的UI上.
    • Reveal会扫描其网路中关联的应用程序,并让开发者选择连接其中之一,当连接到一个应用程序后,Reveal将显示其UI,其中包括大量的参数和设置.
    • 除了解析出UI参数外,开发者可以轻松的检查UI组件的分层,并在其层次结构中选择特定元素.
    Reveal界面

    9.2 安装和使用

    • 在越狱机中,打开cydia,搜索Reveal Loader


      7333E87E-67ED-4E7F-9AC6-6800FE1C1236.png
    • 点击安装(我这里已经安装)


      安装完成
    • 打开应用设置,找到Reveal


      设置中--找到Reveal
    • 点击进入Reveal


      Enabled Applications
    • 开启你要Reveal的app


      启用app
    • 这里在手机的设置完成了,我们在Mac上打开Reveal,找到Help--->>Show Reveal Library in Finder--->>iOS Library


      iOS Library
    • 找到RevealServer.framework


      RevealServer.framework
    • Reveal新版本,iOS-Libraries文件中不再是libReveal.dylib了,
      而是RevelServer.framework,
      这里不用担心.
      我们只需要把文件名改掉就OK了.

    我们执行下面的命令:

    scp /Users/用户名/Desktop/RevealServer.framework 
      root@192.168.3.15:/Library/RHRevealLoader/libReveal.dylib
    

    拷贝到手机.

    • 如果这些完成了,你就可以对已经勾选的app页面结构进行分析了.
      注意:让手机 和 电脑处在同一局域网下,手机打开需要查看的 App, Mac上的 Reveal 选择需要查看的App,就开始你的分析之旅吧,哈哈~~

    待续中...

    相关文章

      网友评论

        本文标题:4.汇编逆向工具集(二)

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