iOS逆向之分析工具的安装和使用
【摘要】
一、逆向 App 总体思路
UI 分析:Cycript 、Reveal;代码分析:
代码在 Mach-O 文件,所以要对 Mach-O 文件进行静态分析;
MachOView、class-...
一、逆向 App 总体思路
- UI 分析:Cycript 、Reveal;
- 代码分析:
-
- 代码在 Mach-O 文件,所以要对 Mach-O 文件进行静态分析;
-
- MachOView、class-dump、Hopper Disassember、ida;
- 动态调试:
-
- 对运行中 App 进行代码调试;
-
- debugserver、LLDB;
- 代码编写:
-
- 注入代码到 App 中;
-
- 必要时还可能需要重新签名、打包 ipa。
二、MonkeyDev 安装与使用
① 安装
- MonkeyDev 是 iOSOpenDev 的升级,是非越狱插件开发集成神器:
-
- 可以使用 Xcode 开发 CaptainHook Tweak、Logos Tweak 和 Command-line Tool,在越狱机器开发插件,是原来 iOSOpenDev 功能的迁移和改进;
-
- 只需拖入一个砸壳应用,自动集成 class-dump、restore-symbol、Reveal、Cycript 和注入的动态库并重签名安装到非越狱机器;
-
- 支持调试自己编写的动态库和第三方 App;
-
- 支持通过 CocoaPods 第三方应用集成 SDK 以及非越狱插件,简单来说就是通过 CocoaPods 搭建一个非越狱插件商店。
- MonkeyDev 下载地址:MonkeyDev。
- 官方说明文档地址:MonkeyDev 官方文档。
② 使用
- 点击 File - New - Project,创建 iOS 项目,选择 iOS 滑动到最下方可以看到 MonkeyDev 提供的模块,选择相应的项目类型,就可以创建对应的项目:
- 创建完成后,工程如下;
-
- MonkeyTestAppDylib 是将被注入目标 App 的动态库,我们自己要 hook 的代码可以在 MonkeyTestAppDylib.m 文件里面编写,它支持 OC runtime 的 HOOK,C 函数的 fishhook,AntiAntiDebug 里面是反反调试的代码;
-
- fishhook这个是自动集成的 fishhook 模块,MonkeyDev 的 Framewroks 已经自动集成 RevealServer.framework 和 libcycript.dylib,如果选择 Release 编译的话是不会集成的。
- 准备脱壳后的 ipa 文件,然后右键项目里面的 TargetApp 文件夹 Show in Finder,把 ipa 文件拖入下面的位置,TargetApp 文件夹下的 put ipa or app here 这个文件不要删除。
③ Xcode 12 运行错误解决
- 动态库证书错误:
- 在 TARGETS 的 Build Settings 下添加 CODE_SIGNING_ALLOWED 为 NO:
- ld: file not found: /usr/lib/libstdc++.dylib 错误:
- 在 MonkeyTestAppDylib 的 Build Settings 的 Other Linker Flags 中移除掉 /usr/lib/libstdc++.dylib 和 -weak_library:
三、Reveal 安装与使用
① 安装
- Reveal 是一个很强大的 UI 分析工具,UI 分析非常直观,用来查看 App 的 UI 布局相当方便。
- 关联 MonkeyDev,打开 Reveal 页面,Help-Show Reveal Library in Finder -iOS Library 拷贝RevealServer.framework,然后前往 /opt/MonkeyDev/Frameworks 替换掉 RevealServer.framework:
② 使用
- 在真机上运行 monkeyDev 工程,程序启动后,打开 Reveal,选择 USB 方式,点击 App 的 icon,进入 UI 分析页。
四、class-dump 的安装和使用
① 安装
- class-dump 主要用于提取 Mach-O 文件中的头文件信息并生成 .h 文件,通过对生成的 .h 文件可分析对应 App 实现的基本思路和一些重要的类对应的功能,以便进一步进行逆向工作。
- class-dump下载地址:Class-dump。下载 class-dump 的 dmg 格式:class-dump-3.5.dmg:
- 安装操作:
-
- 打开终端输入:open /usr/local/bin;
-
- 把 dmg 文件中的 class-dump 文件复制到 /usr/local/bin;
-
- 改权限,终端输入:
sudo chmod 777 /usr/local/bin/class-dump
- 1
② 使用
- 在终端通过命令可以导出文本格式头文件,可以导出 text 文件格式:
class-dump -H iQiYiPhoneVideo -o IQIY
- 1
- 如需帮助则在终端输入:
class-dump --help
- 1
五、Hopper Disassembler
- Hopper Disassembler Mac 版是一个强大的 Mac 反编译神器,可以反汇编,反编译和调试应用程序,而且支持 iOS 逆向,可以把 Mach-O 文件的机器语言代码反编译成汇编代码、OC 或 Swift 的伪代码。
- Hopper Disassembler 支持分解 Mach-O、ARM 和 Windows 二进制文件,是程序员进行拆开代码进行调试或学习的神器。
- Hopper Disassembler 官方下载地址:Hopper。
六、Cycript 安装和环境配置
① 安装
- Cycript 是 Objective-C++、ES6(JavaScript)、Java 等语法的混合物,使用 Cycript 可以动态调试 App。
- Cycript 官方下载地址:Cycript。
- Cycript 官方学习文档:Cycript 官方文档。
- 从 Cycript 下载 SDK,下载完成后解压文件夹放到 /opt 目录下。
② 配置环境变量
- 打开终端输入:
open -e .bash_profile
- 1
- 在打开的 .bash_profile 文件内添加 Cycript 环境变量地址:
export PATH=/opt/cycript_0.9.594/:$PATH
- 1
- Cycript 需要依赖低版本的 ruby2.0:
dyld: Library not loaded: /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/libruby.2.0.0.dylib
Referenced from: /opt/cycript_0.9.594/./Cycript.lib/cycript-apl
Reason: image not found
zsh: abort ./cycript -r 10.19.80.176:6666
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 查找到 ruby 安装所在目录:拷贝出 libruby.2.4.10.dylib ,并将动态库改成 libruby.2.0.0.dylib,粘贴到 /opt/cycript_0.9.594/Cycript.lib/ 目录下:
③ 使用
- 打开终端进入 cycript_0.9.594 目录:cd /opt/cycript_0.9.594;
- 在终端输入电脑与真机必须同一局域网内的IP地址:./cycript -r 10.19.80.176:6666
- 按 enter 键出现 cy# 表示成功连接。
- 日志内也可以查到可运行的 IP 地址:
Download cycript(https://cydia.saurik.com/api/latest/3) then run: ./cycript -r 10.19.80.176:6666
- 1
- control +D 退出查看,在 cy# 后面输入:
[[UIApp keyWindow]recursiveDescription].toString()
- 1
- 可以查看 UI 整体布局结构。
- 查找根视图:
cy# UIApp.keyWindow.rootViewController
#"<RootViewController: 0x141150400>"
- 1
- 2
- 获取对象的所有成员变量,使用(*对象):
cy# *UIApp.keyWindow.rootViewController
- 1
- 筛选出某种类型对象:
choose(UIViewController) choose(UITableViewCell)
- 1
- 使用遇到的问题:
*** _syscall(connect(socket_, info->ai_addr, info->ai_addrlen)):../Console.cpp(306):CYSocketRemote [errno=61]
- 1
- MDCycriptManager.h 中的端口值换一下,#define PORT 6666 换成端口为 6688。
七、代码注入
@interface MyViewController
@end
%hook MyViewController
\- (void)showLoginPopup{
NSLog(@"hook viewDidLoad method");
UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"温馨提示" message:@"我的第一个tweak工程创建成功" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:@"取消",nil];
[alertView show];
UITableView *p = MSHookIvar<UITableView*>(self,"_tableView");
p.backgroundColor=[UIColor purpleColor];
}
\- (void)toLogin{
%orig;
UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"温馨提示" message:@"你过来呀!" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:@"取消",nil];
[alertView show];
}
%end
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- iOS 逆向之路有坑有惊喜,需要了解并使用逆向中的各种工具,要求对汇编语言了解,熟悉各种脚本语言,对系统的底层知识的了解要求更高,越狱环境下的逆向自由度更高,非越狱环境下逆向依然充满挑战。在逆向别人 App 时候,也在提醒我们,开发项目中涉及的核心代码安全性很重要,避免被泄漏出去。
文章来源: blog.csdn.net,作者:Serendipity·y,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/Forever_wj/article/details/122776367
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)