导语:有时候很容易忘记一些终端命令,在此列出一些常用的逆向命令工具的使用,不涉及安装配置。
一些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 IDMJAppPath
-->App路径MJDocPath
-->Documents路径MJCachesPath
--->Caches路径MJFrontVc()
---> 获取当前控制器MJInstanceMethodNames(类名、也可以是 #内存地址)
--->类的对象方法列表MJKeyWin
-->获取keyWindowMJVcSubviews
-->递归打印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的调试环境之后,正式开启动态调试
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可执行文件
:过滤一下方便查看
-