当前位置: 首页 > news >正文

iOS逆向工程理论篇续

编写自己的tweak

我们要编写tweak的目标往往是引起我们兴趣的软件, 而这个引起我们兴趣的软件元素一般是: 功能和数据.

  1. 从UI入手, 找出UI函数

    对于App, 我们感兴趣的现象往往体现在UI上, UI展示了函数的执行过程和结果. 如果能拿到UI对象, 那么取到它对应的函数也很简单. 我们称这个函数是UI函数. 这个过程我们一开始可以利用cycript工具. 后面会介绍一个很强大的工具. 这里只是熟悉下cycript的简单使用.

    下面我以微信这个界面为例:

  • 用Cycript注入到目标的进程, 这里以微信的注册界面为例.

  • 查看当前的UI层次结构, 定位到我们要寻找的控件, 这里我们以寻找 下一步 按钮为例.

  • 然后输入如下命令:

      [[UIApp keyWindow] recursiveDescription].toString()
    复制代码

    UIApp 是[UIApplication sharedApplication] 的简写

    调用这个方法即可打印keyWindow的视图结构:

  • 可以看到每个视图的信息都被展示在 <>里, 其中缩进的多少体现了视图间的关系.缩进少的视图是缩进多视图的父视图 .然后通过#操作符号 + 控件地址, 就可以拿到任意的控件:

  • 通过UI表现上看我们要找的控件有可能是按钮, 所以我们搜索UIButton这个类, 然后利用控件的hidden属性查找目标对象.

由于过程简单所以这里不展示寻找过程, 最后找到目标是 FixTitleColorButton 这个类.

可以看到baseClass是UIButton, 证明我们猜测对了.

  • 下面就开始获取这个按钮的点击方法:

UIControl类提供了actionsForTarget:forControlEvent: 方法获取UIControl的响应方法. 所以只要目标控件是UIControl子类就可以通过这个方法获取响应函数.

可以看到我们的目标控件点击的时候调用这个方法:

[FixTitleColorButton实例 onNext]
复制代码

由于在查找目标控件的过程过于麻烦, 所以介绍一个很好用的工具FLEXLoader. 通过Cydia搜索并下载. 然后在设置界面打开它, 并配置可以操作的App.

然后打开目标App就可以看到FLEXLoader工具栏.

可以看到FLEXLoader工作界面很简洁, 具体使用也很简单.

首先点击select, 然后就可以选择我们的控件了.对应的也会显示控件类. 如果我们要找的控件被覆盖, 那么可以通过views查看图层.

可以看到我们要找的FixTitleColorButton被UIImageView覆盖了. 当我们点击FixTitleColorButton后就会看到我们选中的控件.

如果感觉选中的不是目标控件, 那么可以通过move这个功能移动所选控件来查看是不是目标控件. 然后继续循环这个操作来查找到目标控件.

找到了目标控件类, 然后在去通过cycript做具体操作即可.

转载于:https://juejin.im/post/5b30b7baf265da5989593f3b

相关文章:

  • [区块链] 拜占庭将军问题 [BFT]
  • 记一次通过c#运用GraphQL调用Github api
  • vue中嵌套页面(iframe)
  • nodejs+mongoose+blog
  • mysql查询两个日期之间相差多少天?
  • 数字货币交易界面数字格式化
  • mybitis懒加载Could not write JSON:No serializer...
  • srand rand
  • 简析gRPC client 连接管理
  • Java应用性能调优
  • BOM和DOM
  • Linux top命令的用法详细详解
  • StringUtils中常用方法leftPad(),rightPad(),center()
  • docker的持久化存储和共享存储和网络架构
  • 项目经理需了解的技术
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 2017届校招提前批面试回顾
  • 3.7、@ResponseBody 和 @RestController
  • 77. Combinations
  • Cumulo 的 ClojureScript 模块已经成型
  • Fastjson的基本使用方法大全
  • JavaScript的使用你知道几种?(上)
  • js面向对象
  • js正则,这点儿就够用了
  • Vue.js 移动端适配之 vw 解决方案
  • 飞驰在Mesos的涡轮引擎上
  • 机器学习中为什么要做归一化normalization
  • 基于webpack 的 vue 多页架构
  • 坑!为什么View.startAnimation不起作用?
  • 设计模式 开闭原则
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 微信小程序:实现悬浮返回和分享按钮
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 用简单代码看卷积组块发展
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (ros//EnvironmentVariables)ros环境变量
  • (阿里云万网)-域名注册购买实名流程
  • (层次遍历)104. 二叉树的最大深度
  • (二)linux使用docker容器运行mysql
  • (二)springcloud实战之config配置中心
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (一)Dubbo快速入门、介绍、使用
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)一些感悟
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • ./configure、make、make install 命令
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析