【iOS逆向与安全】iOS远程大师:通过H5后台远程查看和协助iPhone设备

ios,h5,iphone · 浏览次数 : 6

小编点评

**iOS远程大师技术实现** **核心技术:** - H5前端界面 - WebSocket通信 -服务器转发 - iPhone设备处理 **技术步骤:** **1. H5前端界面** - 使用 Vue框架构建用户界面。 - 用户可以通过 H5 页面实时查看 iPhone 的屏幕。 - 实现横屏坐标转换,确保点击事件能够在正确的位置被执行。 **2. WebSocket通信** - 建立 WebSocket 连接,确保双向通信。 - 发送指令并接收设备回应。 **3. iPhone设备处理命令** - 支持键盘输入、触屏操作等常见交互方式。 - 针对越狱设备,提供 XCUITest 接口的封装。 **主要功能:** - 实时屏幕显示 - 键盘输入 - 触屏操作 - 多设备管理 **遇到的问题及解决方案:** - 模拟滑动: - 尝试使用 `ios13-SimulateTouch` 项目。 - 如果无法解决,考虑使用其他库或框架。 - 越狱设备连接断开: - 尝试重新建立连接。 - 考虑使用网络连接监控机制。 - 尝试使用其他框架或工具。 **设备兼容性:** - 越狱机 12, 13, 14 系统正常运行。 - 非越狱机 15 和 16 部分机型能正常运行。 **总结:** iOS远程大师是一个功能丰富的技术,可以实现实时屏幕显示、键盘输入和触屏操作等功能。通过解决遇到的问题,该项目积累了丰富的经验和技术储备,可以为有类似需求的开发者提供一些参考。

正文

前言

在移动设备测试和远程协助的过程中,能够远程查看和协助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进行实时通信,以确保低延迟的指令传输。

image-20240515180325536

  • 建立连接:前端与后端建立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远程大师主要实现了以下几个功能:

  1. 实时屏幕显示:用户可以在H5界面实时查看iPhone的屏幕。
  2. 远程协助:支持键盘输入、触屏操作等常见交互方式,以便对远程iPhone进行协助。
  3. 多设备管理:支持同时连接和管理多个iPhone设备。

三、遇到的问题及解决方案

在开发过程中,我也遇到了几个主要问题:

模拟滑动:在越狱机上的模块滑动效果始终不理想,竖滑正常,横滑始终反应,折腾了好久,最终放弃,直接引用了IOS13-SimulateTouch项目代码。
越狱设备socket连接偶尔断开 :在socket失去连接时,有重新建立连接,但还是有偶现的设备掉线线情况,后边有时间再处理。
设备兼容性:在越狱机上的12,13,14系统能正常运行,非越狱机15和16部分机型能正常运行。

总结

通过开发iOS远程大师,我们不仅实现了H5后台远程查看和协助iPhone的功能,还积累了丰富的经验和技术储备。希望这篇文章能对有类似需求和兴趣的开发者提供一些参考和启发,如你需要体验该项目,请联系我。

提示:阅读此文档的过程中遇到任何问题,请关住工众好【移动端Android和iOS开发技术分享】或+99 君羊【812546729

image-20230225231548837

与【iOS逆向与安全】iOS远程大师:通过H5后台远程查看和协助iPhone设备相似的内容:

【iOS逆向与安全】iOS远程大师:通过H5后台远程查看和协助iPhone设备

在移动设备测试和远程协助的过程中,能够远程查看和协助iPhone设备是一项非常实用的功能。为了解决这一需求,我开发了一款名为**iOS远程大师**的产品,允许用户通过H5后台界面查看和协助越狱或非越狱的iPhone设备。本文将详细介绍iOS远程大师的开发过程和技术实现。

iOS开发基础136-防暴力点击

要在Objective-C中创建一个高度可复用的工具类,以防止按钮的暴力点击,并且使用切面编程(AOP)的方式,我们可以考虑使用Aspects这个库来实现方法的拦截。以下是具体的实现步骤: 第一步:引入Aspects库 首先,需要将Aspects集成到项目中。Aspects是一个轻量级的AOP框架,

iOS开发基础133-崩溃预防

现代移动应用的用户体验依赖于其稳定性和可靠性。然而,在开发过程中,我们时常会遇到各种崩溃问题。崩溃不仅会影响用户的使用体验,还可能损害应用的声誉。因此,本文将详细介绍一个名为CrashPrevention的工具类,它能够为iOS开发者提供多方面的崩溃预防措施,借助该工具类,开发者能够有效减少崩溃的发

iOS开发基础109-网络安全

在iOS开发中,保障应用的网络安全是一个非常重要的环节。以下是一些常见的网络安全措施及对应的示例代码: Swift版 1. 使用HTTPS 确保所有的网络请求使用HTTPS协议,以加密数据传输,防止中间人攻击。 示例代码: 在Info.plist中配置App Transport Security (

iOS开发基础102-后台保活方案

iOS系统在后台执行程序时,有严格的限制,为了更好地管理资源和电池寿命,iOS会限制应用程序在后台的运行时间。然而,iOS提供了一些特定的策略和技术,使得应用程序可以在特定场景下保持后台运行(即“后台保活”)。以下是iOS中几种常见的后台保活方案,并附上示例代码: 一、后台任务 利用beginBac

iOS开发之弹窗管理

前言 “千淘万漉虽辛苦,吹尽狂沙始到金。”在这快速变化的互联网行业,身边的朋友有的选择了勇敢创业,有的则在技术的海洋中默默耕耘。时常在深夜反思,作为一个开发者,我们的价值何在?答案或许就在那行代码中,润物细无声。以下是我在日常开发中封装的一个弹窗管理工具——CLPopoverManager,希望能为

iOS开发基础135-Core Data

Objective-C (OC) 中使用 Core Data 是iOS应用开发中管理模型层对象的一种有效工具。Core Data 使用 ORM (对象关系映射) 技术来抽象化和管理数据。这不仅可以节省时间,还能减少编程错误。以下是使用 Core Data 的详细介绍,包括示例代码,以及深入底层的一些

iOS 单元测试之常用框架 OCMock 详解

测试驱动开发并不是一个很新鲜的概念了。在日常开发中,很多时候需要测试,但是这种输出是必须在点击一系列按钮之后才能在屏幕上显示出来的东西。测试的时候,往往是用模拟器一次一次的从头开始启动 app,然后定位到自己所在模块的程序,做一系列的点击操作,然后查看结果是否符合自己预期。

从 iOS App 启动速度看如何为基础性能保驾护航

启动是App给用户的第一印象,一款App的启动速度,不单单是用户体验的事情,往往还决定了它能否获取更多的用户。所以到了一定阶段App的启动优化是必须要做的事情。

iOS转场之present与dismiss的使用

present的使用方式 present只能是A present B , B present C , C present D这样的链式弹出。 不能A present B , A present C , A present D这样的叠加弹出,会报错。 dismiss的使用方法 dismiss是底部父V