导语:有时候很容易忘记一些终端命令,在此列出一些常用的逆向命令工具的使用,不涉及安装配置。
一些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:10011python ...(路径)/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 -fimage list -o -f | grep App可执行文件:过滤一下方便查看
-