iOS逆向基础

准备
  • 一台越狱iOS设备
    可通过爱思助手,内部集成了unc0ver越狱工具,目前支持iOS11.0~iOS14.3的非完美越狱,需要使用6.1.2版本,6.2.0版本会提示越狱失败。
  • mac 安装程序
    爱思助手:越狱
    iFunBox:可访问或管理iOS设备文件系统(需要iOS越狱设备安装Apple File Conduit和AppSync)
  • iOS越狱设备安装程序
    Apple File Conduit:激活所有路径访问权限
    AppSync:关闭签名,可向iOS设备文件系统传输文件
    Filza File:可访问或管理iOS设备文件系统
    OpenSSH:远程传输协议工具
    usbmuxd:usbmuxd 是苹果的一个服务,这个服务主要用于在USB协议上实现多路TCP连接,将USB通信抽象为TCP通信。苹果的iTunes、Xcode,都直接或间接地用到了这个服务。(https://cgit.sukimashita.com/usbmuxd.git/
    Cycript:Cycript是由Cydia创始人Saurik推出的一款脚本语言,Cycript混合了Objective-C++、ES6(JavaScript)、Java等语法的混合物,可以用来探索、修改、调试正在运行的Mac\iOS APP。cycript的原理是动态库注入,它能够Hook正在运行的进程。
Cycript 逆向微信实战
  1. 找到下载的usbmuxd内部的python脚本tcprelay.py,并执行。
python tcprelay.py -t 22(openSSH端口号):目的端口号

Terminal输出:

sanweiguoye@sanweiguoyedeMacBook-Pro python-client % python tcprelay.py -t 22:2345
Forwarding local port 2345 to remote port 22 (正在转发本地2345端口到22端口)
  1. 通过openSSH登录iOS设备
ssh root@192.168.6.67 (通过局域网ip地址连接,延迟高)
ssh root@localhost -p 2345 (usbmuxd转发端口)

执行ps -A可查看当前设备正在执行的所有进程,通过grep参数筛选出微信进程。

iPad:~ root# ps -A|grep WeChat
10251 ??         0:25.67 /var/containers/Bundle/Application/D3A7DE37-EF05-4552-8E9C-0876C387B670/WeChat.app/WeChat
11242 ttys000    0:00.03 grep WeChat
  1. cycript注入微信
cycript -p WeChat
或
cycript -p 10251

李明杰老师提供了一系列cycript语言封装的函数,方便用于动态调试正在运行的App。
https://github.com/CoderMJLee/mjcript

通过scp执行或者iFunBox将mjcript.cy文件放到usr/lib/cycript0.9目录。
导入mjcript文件:

@import mjcript

cycript常见指令:

cy# MJFrontVc()
#"<WCAccountMainLoginViewController: 0x1450d9400>"
cy# UIApp
#"<UIApplication: 0x143e20650>"
cy# UIApp.delegate
#"<MicroMessengerAppDelegate: 0x2819e4dc0>"
cy# #0x2819e4dc0.window
#"<iConsoleWindow: 0x143f100f0; baseClass = UIWindow; frame = (0 0; 1024 768); gestureRecognizers = <NSArray: 0x2826a70c0>; layer = <UIWindowLayer: 0x282cdc800>>"
cy# MJInstanceMethodNames(#0x1450d9400)
[&"WCBaseInfoItemBeginEdit:",&"WCBaseInfoItemEndEdit:",&"WCBaseInfoItemPressReturnKey:",&"WCBaseInfoItemEditChanged:",&"setupWithData:",&"signMethod",&"onSignMethodSwitch:",&"setSignMethod:",&"onNext",&"vcResignFirstResponder",&"findCountryCode",&"showCountryCodePickerView",&"showCountryCode",&"checkNextBtnEnable",&"CountryCodePickerDidPickCountryCode:",&"useGrayBackgroundColor",&"userDidClickBack",&"userDidClickMore",&"showFooterViewWithSwitchBtnTitle:loginBtnTitle:",&"onSwitch",&"initMoreView",&"onBothDeviceClicked",&"getSignMethod",&"showPhoneLoginFooter",&"showUserLoginFooter",&"switchToUserLogin",&"showOtherMethodPageSheet",&"switchToPhoneLogin",&"bShowPhoneLoginViewFirst",&"setBShowPhoneLoginViewFirst:",&"init",&"didReceiveMemoryWarning",&"setDelegate:",&"viewDidLoad",&".cxx_destruct",&"dealloc",&"initTableView"]
cy# var app = UIApp.keyWindow
#"<iConsoleWindow: 0x143e79390; baseClass = UIWindow; frame = (0 0; 1024 768); gestureRecognizers = <NSArray: 0x2826222e0>; layer = <UIWindowLayer: 0x282c918a0>>"
cy# app.rootViewController
#"<MMUINavigationController: 0x1450c6a00> ChildViewControllers:(\n    \"<WCAccountMainLoginViewController: 0x1450d9400>\"\n)"
cy# choose(UILabel)  // 获取当前进程所有UILabel类型的实例对象(cycript自带函数)
[#"<MMUILabel: 0x143f4dca0; baseClass = UILabel; frame = (0 0; 0 36); userInteractionEnabled = NO; layer = <_UILabelLayer: 0x2808ee670>>",#"<CTRichTextView: 0x143fa1b40; baseClass = UILabel; frame = (20 116; 464 33); opaque = NO; layer = <_UILabelLayer: 0x2808f2260>>",#"<CTRichTextView: 0x143fbcf80; baseClass = UILabel; frame = (20 116; 464 33); opaque = NO; layer = <_UILabelLayer: 0x2808f19f0>>",#"<MMUILabel: 0x143e57cc0; baseClass = UILabel; frame = (0 0; 0 36); userInteractionEnabled = NO; layer = <_UILabelLayer: 0x2808b2ee0>>",#"<MMUILabel: 0x143e8ded0; baseClass = UILabel; frame = (0 0; 122 52); text = '\xe5\xb8\x90\xe5\x8f\xb7'; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x2808d73e0>>",#"<MMUILabel: 0x143e9b120; baseClass = UILabel; frame = (0 0; 122 52); text = '\xe5\xaf\x86\xe7\xa0\x81'; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x2808d6800>>",#"<MMUILabel: 0x143eea2f0; baseClass = UILabel; frame = (0 0; 122 52); text = '\xe5\x9b\xbd\xe5\xae\xb6/\xe5\x9c\xb0\xe5\x8c\xba'; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x2808f3ac0>>",#"<MMUILabel: 0x146204720; baseClass = UILabel; frame = (0 0; 0 0); userInteractionEnabled = NO; layer = <_UILabelLayer: 0x2808c3700>>"]

cycript 还可动态向方法添加代码,实时添加视图或修改属性,比如常见的去广告功能。

Reveal

准备:
Reveal免费版:https://mac.orsoon.com/Mac/150671.html
Reveal2Loader:安装完成后在设置中打开允许调试的App。
将Mac中Reveal库同步到/Library/Frameworks/RHRevealLoader,保持两端Reveal库版本一致。

顺利连接会出现以下图标,点击即可查看或修改视图结构。



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.需要一台越狱的iPhone手机 最好是完美越狱的,越狱比较简单,直接下载爱思助手或者是PP助手都可以一键越狱,...
    九龙阅读 4,948评论 0 0
  • 越狱环境 首先肯定是得拥有一台越狱手机,我的是iPhone 5s 10.3.3 ,非完美越狱(即重启手机会变为非越...
    水煮杰尼龟阅读 4,507评论 0 0
  • ios 逆向工程 刚进一个新公司,公司的大牛直接分给一个课题研究任务,直接懵逼了,/(ㄒoㄒ)/~~ 想哭,世界就...
    天下林子阅读 29,886评论 39 120
  • 前言 工欲善其事,必先利其器。在开始iOS逆向工程前,我们需要准备一些工具让我们事半功倍。 1、iOS篇(cydi...
    Tidus阅读 8,396评论 3 50
  • 步骤简化工具 MJAppTools 编译放在手机目录,usr —> bin中 MJAppTools 如果没有权限...
    南城同學阅读 3,987评论 0 2

友情链接更多精彩内容