逆向工程应用-竞品分析



使用技术: 逆向工程,是一种产品设计技术再现的过程,即对一项目标产品进行逆向分析及研究,从而演绎并得出该产品的处理流程、组织结构、功能特性及技术规格等设计要素,其主要目的是在不能轻易获得必要的生产信息的情况下,直接从成品分析,推导出产品的设计原理。

分析对象: 某程、某龙

分析方法: 静态分析法,在不执行iOS应用的情形下,对应用进行静态分析的一种方法。比如获取应用的文件系统结构,本地文件的分析、使用反汇编工具(Disassembler,比如IDA)查看内部代码,分析代码结构也是静态分析。

  • app bundle 分析

  • 提取.h文件分析

  • 提取可执行文件包含字符串分析

  • 沙盒文件分析

  • 页面结构分析

前期准备:
    1. ituens上下载相关软件先, 打开ipa资源包,ipa文件其实就是个zip文件。


iTunesArtwork 用浏览器打开,是1024的app icon。

META-INF目录:存放签名信息

Payload(资源存放文件 )

  • 资源包中包含众多资源文件(图片、plist文件、Assets.car、本地化文件、签名相关文件(CodeResources、SC_Info)及其他资源文件)

iOS7后可使用Images.cxassets,打包后会生成Assets.car文件。可使用工具打开这个文件

car文件解压工具

也可以直接下载 百度云下载地址

常见的导入图片的几种方式

加入到Assets.xcassets中

  • 只支持png格式的图片
  • 图片只支持[UIImage imageNamed]的方式实例化,但是不能从Bundle中加载
  • 在编译时,Images.xcassets中的所有文件会被打包为Assets.car的文件

CreateGroup

  • 黄色文件夹图标;Xcode中分文件夹,Bundle中所有所在都在同一个文件夹下,因此,不能出现文件重名的情况
  • 可以直接使用[NSBundle mainBundle]作为资源路径,效率高!
  • 可以使用[UIImage imageNamed:]加载图像

CreateFolderRefences

  • 蓝色文件夹;Xcode中分文件夹,Bundle中同样分文件夹,因此,可以出现文件重名的情况
  • 需要在[NSBundle mainBundle]的基础上拼接实际的路径,效率较差
  • 不能使用[UIImage imageNamed:]加载图

PDFs矢量图(Xcode6+)

Bundle(包)中的图片素材

在给ipa包瘦身的时候,可以使用图片压缩工具,通过无损或有损压缩的方式减小图片大小,还可以通过改变图片导入的方式给ipa包瘦身。携程、艺龙均有使用Images.xcassets。

CreateGroup、CreateFolderRefences两种方式打出来的包,图片都会直接放在.app文件中,所以打包前后,图片的大小不会改变,而加入到Assets.xcassets中的方法则不同,打包后,在.app中会生成Assets.car文件来存储Assets.xcassets中的图片,并且文件大小也大大降低。也可使用工具给图片压缩,比如 imageoptim

其他可以给ipa包瘦身的也有通过设置Bitcode、设置编译器优化级别、去除符号信息甚至修改方法名长度等。

  1. 通过逆向工程相关技术(class-dump-z),拿到沙盒文件、.h文件集合等。

app bundle 分析
  • 某龙:

    有大量图片资源使用中文命名

    部分图片包含了1倍图片,部分图片只有@2x图片,使用了Images.assets

    文件中包含momd文件,使用了CoreData

    Frameworks文件夹中没有包含Swift需要的库,没有使用Swift

    JSPatch文件

    Plist文件中统计页面及事件

    全局搜索配置(CoreSpotlight.plist)

    webp引导页(减小大小)

    配置url跳转(xxxRoute.plist)

  • 某程:

    部分图片包含了1倍图片,部分图片只有@2x图片,使用了Images.assets

    图片命名均以_分隔,形如call\_ico\_conceal\_click@2x

    项目中没有使用Swift

    JSPatch文件

    相关Plist文件中存储SQL语句

    内置H5页面(webapp)

    Plist文件配置相关电话

    开发员工配置(BundleVersion.json)

    配置工程依赖(crip.json)

.h文件分析

CNPPopupController

简单和通用的弹出控件

FXBlurView

实现背景模糊效果

  • 初始化UIView在UIImageView或者其他控件的上方,FXBlurView可以根据底层显示的状态生成模糊效果,并且可以动态,静态生成模糊效果。


FXLabel

  • FXLabel 改进了标准的 UILabel 组件,提供了文字的各种阴影效果和梯度填充。

BlocksKit

  • BlocksKit 是一个开源的框架,对 Cocoa 进行了扩展,将许多需要通过 delegate 调用的方法转换成了 block。在很多情况下,blocks 比 delegate 要方便简单,因为 block 是紧凑的,可以使代码更简洁,提高代码可读性,另外 block 还可以进行异步处理。使用 block 要注意避免循环引用。

    BlocksKit 的所有方法都以bk_开头,这样可以方便地列出所有 BlocksKit 的所有方法。最常用的是 UIKit Category,它为 UIAlertView,UIActionSheet,UIButton,UITapGestureRecognizer 等提供了 blocks。BlocksKit 主要目录结构

    • Core:存放 Foundation 相关的 Block category,如 NSObject、NSTimer、NSarray、NSDictionary、NSSet、NSIndexSet、NSMutableArray等

    • DynamicDelegate:动态代理(消息转发机制)

    • UIKit:扩展了 UIAlertView,UIActionView,UIButton 等

主要功能有下面三个方面:

  • 通过block传入事件处理函数

  • 创建动态代理,传入block给想要实现的方法。

  • 在很多基础的类上增加额外的方法。

常见用法

原理分析: 消息转发机制
  • 当一个对象收到它没实现的消息的时候,通常会发生如下的情况。

    1. 调用+(BOOL)resolveInstanceMethod:(SEL)aSEL,如果对象在这里动态添加了selector 的实现方法,则消息转发结束,否则执行步骤2
    2. 调用 - (id)forwardingTargetForSelector:(SEL)aSelector,在这里你可以将消息转发给其他对象,如果实现则消息转发结束,否则执行步骤3
    3. 执行完整的消息转发机制,调用-(void)forwardInvocation:(NSInvocation *)invocation 在这一步,你可以修改消息的任何内容,包括目标(target),selector,参数。如果没有实现在这里还未实现转发则程序将抛出异常。

BlocksKit 动态代理实现方式是最后一步,即-(void)forwardInvocation:(NSInvocation *)invocation,使得动态代理能够接受任意消息。

网上有两篇对BlocksKit源码的解析,看了觉得很受益匪浅。

BlocksKit源码解析一

BlocksKit源码解析二

NJKWebViewProgress

Webview进度条控件

SDCycleScrollView

KissXML

解析xml数据

MGSwipeTableCell

侧滑UITableViewCell展示多个可操作按钮

MPFoldTransition

一个实现多种视图切换效果的库。

页面结构分析

越狱设备可使用Reveal查看任意App的UI页面。

官网下载地址: http://revealapp.com


如有任何疑问或问题请联系我:fishnewsdream@gmail.com,欢迎交流,共同提高!

Objective-C/Swift技术开发交流群201556264,讨论何种技术并不受限,欢迎各位大牛百家争鸣!

微信公众号OldDriverWeekly,欢迎关注并提出宝贵意见

老司机iOS周报,欢迎关注或订阅

刚刚在线工作室,欢迎关注或提出建设性意见!

刚刚在线论坛, 欢迎踊跃提问或解答!

如有转载,请注明出处,谢谢!

本站总访问量 本文总阅读量