目录

  • 免责声明
  • 非越狱下的代码注入步骤
  • 使用 ViewDebug 和导出的 Objective-C 类的头文件分析目标 App
  • Objective-C 方法常见的 Hook 方式

免责声明

  • 本文为一篇严肃的学术研究型文章,文中所提及的注入手段仅供 iOS 底层技术的学习与交流,不针对任何公司与 App。

  • 为防止读者将本文用于商业或者非法用途,本文不提供任何注入工具与重签名脚本。

  • 读者如果将本文用于商业或者非法用途,则所产生的后果由读者自行承担。

非越狱下的代码注入步骤

  • 材料与工具

    1. WeChat.ipa 包(已脱壳)
    2. class-dumpSublime Text
    3. yololibMachOView
    4. XCodeiPhone
    5. 重签名脚本
  • 解压 WeChat.ipa 包,获取 WeChatMachO 文件,使用 class-dumpMachO 文件中导出 Objective-C 类的头文件

    将导出的 Objective-C 类的头文件拖入 Sublime Text 中,以备后面分析 App 时查找和使用

  • 新建 iOS - App 工程 InjectCodeDemo

    在工程 InjectCodeDemo 的根目录下新建 IPA 目录,并将已脱壳的 WeChat.ipa 拖入 IPA 目录中

  • 在工程 InjectCodeDemo 中新建动态库 HzpService.frameworkHcgService.dylib

    关于 HzpService.framework

    1. 新建注入工具类 HzpInjectTool

    关于 HcgService.dylib

    1. 新建注入工具类 HcgInjectTool
    2. Target(HcgService) - Build Settings - Architectures - Base SDK 修改为 iOS
    3. Target(HcgService) - Build Settings - Signing - Code Signing Identity 修改为 iOS Developer
  • 在工程 InjectCodeDemo 中导入新建的动态库 HzpService.frameworkHcgService.dylib
    并修改 Target(InjectCodeDemo) - Build Phases

  • 将重签名脚本拷贝到工程 InjectCodeDemo 的根目录下
    并在 Target(InjectCodeDemo) - Build Phases 中添加 New Run Script Phase

    注意:
    Run Script 的顺序需要在 Embed Frameworks 之前
    即需要先使用 WeChat.app 覆盖 InjectCodeDemo.app,然后再将动态库拷贝到 WeChat.app/Frameworks 目录下

  • 连入 iPhone 真机,并将 Target(InjectCodeDemo) 改为真机调试

  • 注意:

    1. App 安装期间需要保持 iPhone 处于开启状态
      否则会提示 Unlock iPhone to Continue
    2. 因为 XCode 编译阶段动态库拷贝机制的问题
      所以每次在运行 App 之前,都需要使用 Command + Shift + K 清空 XCode 缓存
      以保证(执行脚本)和(拷贝动态库)之间相对顺序的正确性
      否则会提示 The file "InjectCodeDemo" couldn’t be opened because you don’t have permission to view it.

使用 ViewDebug 和导出的 Objective-C 类的头文件分析目标 App

  • ① 分析登录按钮点击事件

    登录按钮的类型为 FixTitleColorButton,继承自 UIButton
    点击登录按钮将会触发 WCAccountMainLoginViewController 类的 onNext 方法

    通过 class-dump 导出的头文件进行验证,确实在 WCAccountMainLoginViewController.h 中找到了 -onNext 方法

  • 分析账号输入框和密码输入框

    账号输入框和密码输入框的类型均为 WCUITextField,均继承自 UITextField


    WCAccountMainLoginViewController.h 中找到了疑似存储账号和密码的成员变量:
    存储账号的成员变量:WCAccountTextFieldItem* _textFieldUserNameItem
    存储密码的成员变量:WCAccountTextFieldItem* _textFieldUserPwdItem

    那么,WCAccountMainLoginViewController 类中存储账号和密码的成员变量(WCAccountTextFieldItem 类型)和 ViewDebug 中的账号密码输入框(WCUITextField 类型)之间有什么联系呢?我们尝试在继承链中查找一下:
    WCAccountTextFieldItem 继承自 WCBaseTextFieldItem

    WCBaseTextFieldItem 中有 WCUITextField 类型的 m_textField 成员变量

    WCUITextField 又继承自 UITextFieldUITextField 可以通过 text 属性拿到输入框中的内容

  • 理一下登录按钮与账号密码输入框之间的联系

    1. 点击登录按钮将会触发 WCAccountMainLoginViewController 类的 -onNext 方法
    2. 账号密码输入框是 WCAccountMainLoginViewController 类中两个 WCAccountTextFieldItem 类型的成员变量(_textFieldUserNameItem_textFieldUserPwdItem
    3. -onNext 方法中可以拿到成员变量 _textFieldUserNameItem_textFieldUserPwdItem
    4. WCAccountTextFieldItem 继承自 WCBaseTextFieldItem
      WCBaseTextFieldItem 中有 WCUITextField 类型的成员变量 m_textField
      WCUITextField 又继承自 UITextField
      UITextField 可以通过 text 属性拿到输入框中的内容

Objective-C 方法常见的 Hook 方式

  • ① 使用 method_exchangeImplementations

    备注:onceToken 应该定义为静态局部变量 static dispatch_once_t onceToken;

  • ② 使用 class_replaceMethod

    备注:onceToken 应该定义为静态局部变量 static dispatch_once_t onceToken;

  • ③ 使用 method_getImplementation 和 method_setImplementation

    备注:onceToken 应该定义为静态局部变量 static dispatch_once_t onceToken;

  • 注意

    Objective-C 方法中,self 代表当前实例对象或者当前类对象,这种说法不准确
    Objective-C 方法中,self 代表的是当前方法调用者

iOS 非越狱下的代码注入相关推荐

  1. iOS开发技术之应用代码注入防护

    1.介绍 在应用开发过程中,我们需要考虑到应用安全的问题.而应用安全的问题涉及到很多方面的内容,随着iOS系统的不断更新,我们需要在防护的手段上发生一些改变. 如下所示: [1]防止静态分析:代码混淆 ...

  2. iOS非越狱渠道运营必知的10条

    做运营到底是做点啥?入口,转化,留存,掏用户钱,悠忽用户传,靠着用户改. 入口:不断问自己一个问题,用户在哪里?转化,根据入口的用户特性来制定宣传语和着陆页:留存是关键,用户留不下来,推广越快,死得越 ...

  3. 【干货分享】IOS非越狱渠道运营必知的10条

    做运营到底是做点啥?入口,转化,留存,掏用户钱,悠忽用户传,靠着用户改.入口:不断问自己一个问题,用户在哪里?转化,根据入口的用户特性来制定宣传语和着陆页:留存是关键,用户留不下来,推广越快,死得越早 ...

  4. 专注于非越狱环境下iOS应用逆向研究,从dylib注入,应用重签名到App Hook

    专注于非越狱环境下iOS应用逆向研究,从dylib注入,应用重签名到App Hook. 注意!本文所有操作均在以下环境下成功进行,不同平台或环境可能存在某些问题,欢迎大家在issue中提出问题以及相互 ...

  5. iOS逆向(4)-代码注入,非越狱窃取微信密码

    利用LLDB对微信进行分析,然后利用分析的结果,再逐步讲解如何Hook微信的登录过程,截获微信密码. 在上一篇文章(APP重签名)中,已经介绍了如何对APP重签名,并且利用XCode将微信跑起来,既然 ...

  6. iOS逆向工程——非越狱调试

    其实iOS的逆向分析业界已经十分成熟了,网上也有许多有趣的尝试(一步一步实现iOS微信自动抢红包(非越狱).本文着重于如何在非越狱机器上进行调试,出于学习及总结的目的,记录于此. 本文以破解游戏梦幻西 ...

  7. IOS逆向笔记之HOOK实现(非越狱)

    HOOK是越狱的最终目标,目的是给应用添加功能如插件或者是更改应用的某个功能来满足我们的需求,如微信中添加抢红包插件.本文将以最近比较火的"快看"漫画为例子去除付费漫画中的收费弹窗 ...

  8. iOS安全–在非越狱平台进行越狱开发(附分析流程)

    目的:在不越狱的前提下,使用动态库库注入的方式来hook应用的某些函数以篡改应用行为. 需要的工具: 砸壳: dumpdecrypted class-dump: class-dump Cycript: ...

  9. iOS冰与火之歌番外篇 - 在非越狱手机上进行App Hook(转载)

    作者简介:郑旻(花名蒸米),阿里巴巴移动安全部门资深安全工程师,香港中文大学移动安全(Android & iOS)方向博士,曾在腾讯.百度以及硅谷的FireEye实习.在博士期间发表了多篇移动 ...

最新文章

  1. javascript运动系列第二篇——变速运动
  2. 二叉树的层序遍历和二叉树的线索化
  3. python包安装_Python及图像处理相关包安装
  4. autossh配置socks代理
  5. python动态心形代码_Python实现酷炫的动态交互式数据可视化,附代码!
  6. ZOJ 3761 Easy billiards 月赛E DFS
  7. 固件是通用的吗_冷镦和冷挤压是一回事吗,两者有什么区别?
  8. 获取当前时间---年月日时分秒------iOS
  9. Java学习笔记(完结)
  10. docker-compose中解决depends_on无效问题
  11. iphone震动反馈怎么设置_苹果魅族都在用的震动反馈 到底是怎样实现的?
  12. 面向物联网的可重构流式深度卷积神经网络加速器
  13. 知识树软件的IPO图
  14. C++入门(六)之String
  15. 微信服务器保留几年记录_MongoDB日志记录
  16. 【Ubuntu】SMBus Host controller not enabled(虚拟机进入不了图形界面)
  17. 微信小程序布局-图片+文字
  18. 多肉商店html网页代码,[转载]国外多肉植物及种子购买网站(转载)
  19. Embedding Label Structures:细粒度特征表示的标签结构嵌入
  20. 微信小程序--页面劫持

热门文章

  1. 蒙特卡洛方法的使用:计算pi值与积分计算
  2. 中国现在开源系统cms 论坛排行榜
  3. UG 二次开发中文帮助文档,UFun在线帮助文档, NX API 中文帮助文档
  4. java如何进行内存自动释放、垃圾回收?
  5. 文本无关说话人确认的深度神经网络嵌入
  6. 【提问的智慧】-[How To Ask Questions The Smart Way]
  7. 分布式文件系统FastDFS详解
  8. matlab fread 详细讲解
  9. Android保存图片和视频到本地并更新相册
  10. uboot readme