【iOS逆向与安全】iOS远程大师:通过H5后台远程查看和协助iPhone设备
前言
在移动设备测试和远程协助的过程中,能够远程查看和协助iPhone设备是一项非常实用的功能。为了解决这一需求,我开发了一款名为iOS远程大师的产品,允许用户通过H5后台界面查看和协助越狱或非越狱的iPhone设备。本文将详细介绍iOS远程大师的开发过程和技术实现。
一、技术实现
整个项目的核心技术包括H5前端界面、WebSocket通信、服务器转发和iPhone设备处理。下面将分步骤介绍每个部分的实现。
1. H5前端界面
在H5前端,我使用了vue框架来构建用户界面。用户通过这个界面可以实时查看iPhone的屏幕,并通过鼠标发送交互指令。
- 实时屏幕显示:通过WebSocket连接,接收服务器转发的iPhone屏幕图像,并在H5页面上进行渲染。
- 用户指令捕获:在div中监听用户的鼠标事件,并将这些事件转换为特定的指令格式。
横屏坐标转换
在前端实现中,处理横屏模式下的坐标转换至关重要。在 H5 后台将设备切换为横屏时,尽管你看到的界面已经是横屏了,但 iPhone 端实际仍然是竖屏,因此必须进行坐标转换,以确保点击事件能够在正确的位置被执行,并且保持显示的一致性。
const convertCoordinates = (width, height, clickX, clickY) => {
const angle = rotateAngle.value % 360
if (angle === -90) {
const rotatedX = height - clickX * Math.cos(angle * Math.PI / 180) + clickY * Math.sin(angle * Math.PI / 180)
const rotatedY = -clickX * Math.sin(angle * Math.PI / 180) + clickY * Math.cos(angle * Math.PI / 180)
clickX = rotatedX
clickY = rotatedY
} else if (angle === -180) {
const rotatedX = width - clickX
const rotatedY = height - clickY
clickX = rotatedX
clickY = rotatedY
} else if (angle === -270) {
const rotatedX = clickY
const rotatedY = width - clickX
clickX = rotatedX
clickY = rotatedY
}
return { clickX, clickY }
}
2. WebSocket通信
前端和设备之间采用WebSocket进行实时通信,以确保低延迟的指令传输。
- 建立连接:前端与后端建立WebSocket连接,确保双向通信的实现。
- 指令发送:用户在前端页面上进行交互操作,前端将这些指令发送给后端,通过WebSocket进行传输。
- 指令转发:后端接收到前端发送的指令后,根据指令内容识别目标设备,并将指令下发到对应的设备。
- 执行指令:目标设备接收到后端发送的指令,并执行相应的操作。
- 结果回传:设备执行完指令后,将执行结果发送给后端,后端再通过WebSocket将结果回传给前端,以供用户查看或处理。
3. iPhone设备处理命令
在iPhone设备端,我们区分越狱和不越狱设备的支持情况。
越狱设备:支持iOS 12到14版本,通过私有API实现更深层次的操作。主要包括硬件触发和屏幕点击。
- 按键操作:通过私有API直接触发iPhone的硬件功能,例如电源、Home键、音量+-等操作。
- 屏幕点击:利用越狱权限,直接在屏幕坐标上模拟触摸事件。
按键操作的部分代码如下:
+ (void)sendHIDEventWithUsagePage:(uint16_t)usagePage usage:(uint16_t)usage down:(Boolean)down {
uint64_t abTime = mach_absolute_time();
IOHIDEventRef event = IOHIDEventCreateKeyboardEvent(kCFAllocatorDefault, abTime, usagePage, usage, down, 0);
IOHIDEventSetIntegerValue(event,4, 1);
IOHIDEventSetSenderID(event, senderID);
postIOHIDEvent(event);
} static void postIOHIDEvent(IOHIDEventRef event)
{
static IOHIDEventSystemClientRef ioSystemClient = NULL;
if (!ioSystemClient){
ioSystemClient = IOHIDEventSystemClientCreate(kCFAllocatorDefault);
}
if (senderID != 0) {
IOHIDEventSetSenderID(event, senderID);
} else {
return;
}
IOHIDEventSystemClientDispatchEvent(ioSystemClient, event);
}
具体的按键代码可参考:https://iphonedev.wiki/IOHIDFamily
屏幕点击的部分代码如下:
// 示例代码:使用私有API触发屏幕点击
void simulateTouch(CGFloat x, CGFloat y) {
// 在实现模拟滑动过程中,滑动效果始终不理想,最终放弃。引用IOS13-SimulateTouch 项目来实现了屏幕的点击和滑动
// 具体实现参考 IOS13-SimulateTouch 项目
// https://github.com/xuan32546/IOS13-SimulateTouch
}
在这也要感谢微信群里的 @福州-啊嘴 在模拟滑动中提供的帮助
非越狱设备:支持iOS 15及以上版本,利用XCUITest实现硬件的触发和屏幕的点击。
- 硬件触发:通过XCUITest框架模拟按键操作。
- 屏幕点击:使用XCUITest框架在指定坐标模拟点击。
按键操作的部分代码如下:
+ (void)sendHIDEventWithUsagePage:(uint16_t)usagePage usage:(uint16_t)usage down:(Boolean)down {
if (usage == 0xe9) {
[[XCUIDevice sharedDevice] pressButton:XCUIDeviceButtonVolumeUp];
} else if (usage == 0xea) {
[[XCUIDevice sharedDevice] pressButton:XCUIDeviceButtonVolumeDown];
} else if (usage == 0x30 && down) {
if ([XCUIDevice sharedDevice].fb_isScreenLocked) {
[[XCUIDevice sharedDevice] fb_unlockScreen:nil];
} else {
[[XCUIDevice sharedDevice] fb_lockScreen:nil];
}
}
} + (void)simulateHome {
[[XCUIDevice sharedDevice] pressButton:XCUIDeviceButtonHome];
}
屏幕点击的部分代码如下:
@interface XCUICoordinate () // 滑动事件
- (void)pressForDuration:(double)arg1 thenDragToCoordinate:(id)arg2; // 点击事件
- (void)pressForDuration:(double)arg1; @end + (void)simulateClick:(CGPoint)tapPoint {
// 在 https://github.com/appium/WebDriverAgent 项目已经有现成封装好的代码,在这就直接拿来用了
CGFloat x = tapPoint.x;
CGFloat y = tapPoint.y;
CGSize screenSize = [self getScreenSize];
double multiple = screenSize.width / remote_device_screen_width;
x = x * multiple;
y = y * multiple; FBRouteRequest *request = [[FBRouteRequest alloc] init];
request.arguments = @{@"x": @(x), @"y": @(y), @"duration": @0.001};
NSLog(@"witwit simulateClick =%@=", request.arguments);
[FBElementCommands handleTouchAndHold:request];
}
二、具体功能
iOS远程大师主要实现了以下几个功能:
- 实时屏幕显示:用户可以在H5界面实时查看iPhone的屏幕。
- 远程协助:支持键盘输入、触屏操作等常见交互方式,以便对远程iPhone进行协助。
- 多设备管理:支持同时连接和管理多个iPhone设备。
三、遇到的问题及解决方案
在开发过程中,我也遇到了几个主要问题:
模拟滑动:在越狱机上的模块滑动效果始终不理想,竖滑正常,横滑始终反应,折腾了好久,最终放弃,直接引用了IOS13-SimulateTouch项目代码。
越狱设备socket连接偶尔断开 :在socket失去连接时,有重新建立连接,但还是有偶现的设备掉线线情况,后边有时间再处理。
设备兼容性:在越狱机上的12,13,14系统能正常运行,非越狱机15和16部分机型能正常运行。
总结
通过开发iOS远程大师,我们不仅实现了H5后台远程查看和协助iPhone的功能,还积累了丰富的经验和技术储备。希望这篇文章能对有类似需求和兴趣的开发者提供一些参考和启发,如你需要体验该项目,请联系我。
提示:阅读此文档的过程中遇到任何问题,请关住工众好【
移动端Android和iOS开发技术分享】或+99 君羊【812546729】
【iOS逆向与安全】iOS远程大师:通过H5后台远程查看和协助iPhone设备的更多相关文章
- iOS逆向分析app
适合有一定的逆向编程基础的人看. 背景:自动抢红包的脚本工具:cyscript,reveal,class-dump,越狱的pod等. 这里先上一张reveal的分析图: 小结:获取到了真个软件的整体结 ...
- iOS逆向开发(1):基础工具 | ssh | scp | socat
小白:小程,我一直想问,什么是逆向来着?是逆向行驶吗? 小程:理解为逆向行驶也没错.一般的项目是从无到有,而逆向是从已有的状态入手,分析出已有的流程与结构的手段. iOS上的逆向开发,是一件有趣的事情 ...
- iOS逆向实战与工具使用(微信添加好友自动确认)
iOS逆向实战与工具使用(微信添加好友自动确认) 原文链接 源码地址 WeChatPlugin-iOS Mac OS 版微信小助手(远程控制.消息防撤回.自动回复.微信多开) 一.前言 本篇主要实现在 ...
- iOS逆向之一 工具的安装和使用
iOS逆向之一-工具的安装和使用 最近在学习iOS安全方面的技术,有些东西就记录下来了,所有有了这篇文章.顺便也上传了DEMO,可以再这里找到这些DEMO的源码:dhar/iOSReProject 越 ...
- iOS 逆向之ARM汇编
最近对iOS逆向工程很感兴趣. 目前iOS逆向的书籍有: <Hacking and Securing IOS Applications>, <iOS Hacker's Handboo ...
- ios开发——实用技术OC-Swift篇&本地通知与远程通知详解
本地通知与远程通知详解 一:本地通知 Local Notification的作用 Local Notification(本地通知) :是根据本机状态做出的通知行为,因此,凡是仅需依赖本机状态即可判 ...
- ios逆向过程中lldb调试技巧
在ios逆向过程中,善于运用lldb,会给逆向带来很大的方便 一般的命令: 1.image list -o -f 看看各个模块在内存中的基址 2.register read r0 读取寄存器r0的 ...
- iOS逆向+越狱
感觉本文涉及内容有点多的,但是自己不愿意写太多,就简单的谢谢关于ios上手的东西吧 初级入手不免要用到,pp助手,i4 tools等 iOS逆向-ipa包重签名及非越狱手机安装多个应用 1.常识 我们 ...
- 偏执的iOS逆向研究员:收集全版本的macOS iOS+越狱+内核调试
Intro 虽然“只有偏执狂才能够生存”这句话已经被假药停给毁了,但是作为一只有逼格的高大上的iOS逆向分析研究员,难道如果有现成的macOS/iOS全版本镜像可以下载并且无限“漫游”,难道你就不想来 ...
- iOS逆向(五)-ipa包重签名
为什么要重签名? 1.在没有源代码的情况下,你已经对某个应用进行了资源修改(比如修改了启动图或图标等).修改完成以后,如果想要让APP可以正常使用,该APP一定要重新签名然后压缩成IPA文件. 2.如 ...
随机推荐
- 响应式系统reactive system初探
目录 初识响应式系统 什么是响应式系统 响应式系统的四大特点 及时响应性(Responsive) 恢复性(Resilient) 有弹性(Elastic) 消息驱动(Message Driven) 总结 ...
- C# 面向对象编程解析:优势、类和对象、类成员详解
C# - 什么是面向对象编程? OOP代表面向对象编程. 过程式编程涉及编写执行数据操作的过程或方法,而面向对象编程涉及创建包含数据和方法的对象. 面向对象编程相对于过程式编程具有几个优势: OOP执 ...
- Python 数组和列表:创建、访问、添加和删除数组元素
Python 没有内置支持数组,但可以使用 Python 列表来代替. 数组 本页将向您展示如何使用列表作为数组,但要在 Python 中使用数组,您需要导入一个库,比如 NumPy 库.数组用于在一 ...
- NL2SQL基础系列(1):业界顶尖排行榜、权威测评数据集及LLM大模型(Spider vs BIRD)全面对比优劣分析[Text2SQL、Text2DSL]
NL2SQL基础系列(1):业界顶尖排行榜.权威测评数据集及LLM大模型(Spider vs BIRD)全面对比优劣分析[Text2SQL.Text2DSL] Text-to-SQL(或者Text2S ...
- go语言结构体使用小结
转载请注明出处: 在Go语言中,结构体(struct)是一种复合数据类型,它允许你将多个不同类型的字段组合成一个单一的类型.结构体为数据的封装和抽象提供了便利,使得数据组织更加清晰和易于管理. 结构体 ...
- Spring Cloud Alibaba 官方实践指南【文章有点长自备咖啡茶点】
注:本文内容均转自官方文档,方便胖友们学习,不代表博主观点. 链接地址:SpringCloudAlibaba | Spring Cloud Alibaba 基于网关实现 SpringCloud 服务发 ...
- seo FAQ 科普
前言 seo 常规问题整理,后续不断补充,只做科普. 正文 1.什么是seo: seo 也就是搜索排名. 2.百度,360等知名品牌如何排名: 抓取,过滤,建立索引,输出结果 3.是否网站越好看排名就 ...
- c# 优化代码的一些规则——什么情况下应该使用new[七]
前言 new 在重构这本书中写道new就是坏代码的味道,说明使用new的情况并不多. 在这里我指的new 是方法修饰符,而不是指实例. 正文 看下new的作用: new 修饰符可以重新定义从基类继承下 ...
- 力扣69(java&python)-x的平方根(简单)
题目: 给你一个非负整数 x ,计算并返回 x 的 算术平方根 . 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 . 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0. ...
- 力扣670(java)-最大交换(中等)
题目: 给定一个非负整数,你至多可以交换一次数字中的任意两位.返回你能得到的最大值. 示例 1 : 输入: 2736输出: 7236解释: 交换数字2和数字7.示例 2 : 输入: 9973输出: 9 ...