iOS逆向开发-终端工具命令使用汇总(一)

652 阅读5分钟

导语:有时候很容易忘记一些终端命令,在此列出一些常用的逆向命令工具的使用,不涉及安装配置。

一些Mac终端命令汇总

cat 文件 :在终端显示文件内容

touch 文件 :创建文件

vim

vim 文件 :有文件的读取文件进入编辑,无文件就创建文件进入编辑

shift键 + i键:可以输入文字

esc键 :退出编辑状态

shift键 + :键:在退出编辑状态之后,按下这两键输入wq可以保存退出vim

dd:在退出编辑状态之后,按两次d键可删除光标所在行

ssh远程登录命令 (已在Cydia安装openSSH)

ssh root@iPhone的ip:终端使用root权限登录手机

ssh mobile@iPhone的ip:终端使用普通权限登录手机

passwd:改root用户密码(默认alpine)

passwd mobile :改普通用户密码

登录root用户,秘密登录设置

ssh-keygen

ssh-copy-id root@手机IP

usb登录

解压usbmuxd工具包,获取python-client的路径

python ...(路径)/python-client/tcprelay.py -t 22:10010 :usb接口映射(保持终端窗口运行)

ssh root@localhost -p 10010 :另开终端,通过端口映射,使用usb连接登录

可以把这两命令做成sh文件分别执行

搭建好usb连接环境后,可以使用命令拷贝文件

scp -P 10010 源文件路径 root@localhost:目标目录路径 :mac拷贝到手机

scp -P 10010 root@localhost:源文件路径 目标目录路径 :手机拷贝到mac

终端登录手机后可以通过终端重启手机

reboot :重启手机

killall SpringBoard :重启手机界面

ps

ps -A :手机所有进程列表(包括运行的App)

ps -A | grep xxx :列出包含xxx的进程,用于过滤运行的App

cycript

cycript -p 可执行文件路径 :App进入到cycript调试环境

@import mjcript:导入第三方脚本协助mjcript调试

ctrl键 + D键:退出调试

  • cycript语法

    UIApp--> [UIApplication sharedApplication]

    var 变量名-->创建一个变量(类似Swift)

    # 内存地址--> 通过地址获取具体对象

    * 对象--> 查看对象的所有成员变量

    ObjectC.classes-->获取加载的所有OC类

    view.recursiveDescription().toString()-->打印view的所有子控件

    choose(UIViewController)-->获取UIViewController的所有对象

  • mjcript调试函数

    MJAppId -->获取bundle ID

    MJAppPath -->App路径

    MJDocPath -->Documents路径

    MJCachesPath --->Caches路径

    MJFrontVc() ---> 获取当前控制器

    MJInstanceMethodNames(类名、也可以是 #内存地址) --->类的对象方法列表

    MJKeyWin -->获取keyWindow MJVcSubviews -->递归打印UIViewController view的层级结构 MJFrontVcSubViews -->递归打印最上层UIViewController view的层级结构 MJBtnTouchUpEvent -->获取按钮绑定的所有TouchUpInside事件的方法名

    。。。(查看mjcript文件可以获取更多用法)

class-dump

class-dump -H Mach-O文件路径 -o 保存路径 :导出Mach-O头文件

file

file 文件路径 : 查看Mach-O文件类型

lipo

  • lipo:常用于多架构Mach-O文件的处理

    lipo -info 文件路径 :查看架构信息

    lipo 文件路径 -thin 架构类型(arm64、armv7) -output 输出文件路径 :导出某种特定架构

    lipo 文件路径1 文件路径2 -output 输出文件路径 :合并多种架构

脱壳工具使用命令

  • dumpdecrypted:终端登录手机进行脱壳操作,脱壳后可执行文件在dumpdecrypted.dylib动态库所在目录

    DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib 需脱壳软件可执行文件路径

    ldid -S dumpdecrypted.dylib :脱壳过程遇到签名问题报错,可以签名解决

  • frida-ios-dump:cd到frida-ios-dump文件根目录进行脱壳操作,架设好usb映射环境再脱壳

    python dump.py -l :查看程序列表

    python dump.py com.xxx.xxx :通过com.xxx.xxx这个bundle ID脱壳

theos

  • 已经配置好theos环境之后,架设好usb端口映射

nic.pl :创建theos项目

make :编译

make package debug=0 :打包

make install 安装

make clean :清除编译

ldid

  • 可以把一些权限高的可执行文件的权限提取出来,附加到我们自己的可执行文件上

    • 比如SpringBoard的权限就很高

    ldid -e SpringBoard > SpringBoard.entitlements :提取权限

    ldid -SSpringBoard.entitlements xxxx :附加权限到xxx

lldb

  • 配置手机App动态调试

    • 架设usb端口映射

    在usb端口架设命令后面加上新的映射端口 比如10012:10011

    python ...(路径)/python-client/tcprelay.py -t 22:10010 10012:10011

    另开终端登录手机

    debugserver localhost:10012 -a xxxx :架设lldb调试端口

    再另开终端

    lldb :进入lldb调试环境

    process connect connect://localhost:10011 :连接手机xxxx程序调试

  • 搭建好lldb的调试环境之后,正式开启动态调试

    iOS逆向开发-终端工具命令使用汇总(二)-LLDB命令

codesign签名

  • 从新的证书描述文件(embedded.mobileprovision)中提取签名权限

    security cms -D -i embedded.mobileprovision > temp.plist

    /usr/libexec/PlistBuddy -x -c 'Print:Entitlements' temp.plist > entitlements.plist

security find-identity -v -p codesigning :查看证书ID

codesign -fs 证书ID --entitlements entitlements.plist xxx.app :给App重签名

codesign -fs 证书ID xxx.dylib :给动态库签名

  • 在xxx.app内部注入动态库

    insert_dylib @executable_path/xxx.dylib 可执行文件 --all-yes --weak 可执行文件

  • 修改动态库引用路径

    install_name_tool -change .../mmm.dylib(原路径) @loader_path/mmm.dylib(新路径) xxx.dylib

otool

otool -L xxx.dylib : 查看动态依赖动态库信息(包括依赖动态库的路径)

otool -l 可执行文件 | grep crypt : 查看Mach-O是否加壳

ASLR

  • 获取程序载入内存中的地址偏移

    • 首先搭建好lldb动态调试程序环境

      image list -o -f

      image list -o -f | grep App可执行文件 :过滤一下方便查看