一、class-dump

简介:顾名思义,就是用来导出目标对象的class信息的工具,私有方法声明也能导出来。

原理:利用 Objective-C语言的 runtime 特性,将存 在Mach-O 文件中的头文件信息提 出来,并生成对应的 .h 文件。

使用方法:
1,下载然后将class-dump 复制到“ /usr/bin”目录下。
2,执行sudo chmod 777 /usr/bin/class-dump”命令赋予其执行权限。
3,class-dump执行:

 
 
 
 
 

Objective-C

 
1
2
class-dump -S -s -H /Applications/Calculator.app -o
/Users/zhangdasen/Desktop/test

4,上面一段代码就是导出Mac下计算器app的头文件,到桌面test文件夹,并且排序,class-dump的一些参数,大家可以自己在命令行输入class-dump然后回车就有相关说明。

使用注意
从 AppStore 下 的 App 都是经过加密的,可执行文件被加上了一层”壳”。
class-dump 应付不了这样的文件,此时使用 class-dump 看上去会“失效”。还得先用别的工具把壳砸开才行,这个后面会说到。

class-dump下载地址:http://stevenygard.com/projects/class-dump


二、Theos越狱开发工具包

简介
Theos:是一个越狱开发工具包,由iOS越狱界知名人士Dustin Howett(@DHowett)开发并分享到 GitHub 上。

iOSOpenDev:是整合在 Xcode里的越狱开发工具, 熟悉Xcode 的朋友可能会对它更感兴趣。但逆向工程接触底层知识较多,很多东西无法自动化,因此推荐使用整合度并不算高的 Theos,当你手动完成一个又一个练习时,对逆向工程的理解一定会更深。

(1) Theos的安装:
1,设置xcode
假设安装了3 个 Xcode,并将它们分别命名为 Xcode1.app、Xcode2.app 和 Xcode3.app, 要指定 Xcode3 为活动 Xcode,则运行如下命令 :

 
 
 
 
 

Objective-C

 
1
sudo xcode-select -s /Applications/Xcode3.app/Contents/Developer

2, Theos下载
从 GitHub 上下 Theos, 操作如下:(在终端中执行)

 
 
 
 
 

Objective-C

 
1
2
export THEOS=/opt/theos
sudo git clone git://github.com/DHowett/theos.git$THEOS

export THEOS=/opt/theos
这句话是设置环境变量,上面两句话指的就是git克隆theos到系统的/opt/theos目录下.

小问题:git 克隆下来的theos由于缺少文件,在后面make packget install 会提示缺少 _Prefix/NullabilityCompat.h 等文件,需要我们去https://github.com/theos/headers 把这个头文件放到/opt/theos/include目录中就行了。(可直接克隆到目录中去)

 
 
 
 
 
 

Objective-C

 
1
sudo git clone <span class="hljs-symbol">https:</span>/<span class="hljs-regexp">/github.com/theos</span><span class="hljs-regexp">/headers /opt</span><span class="hljs-regexp">/theos/includ</span>

不过我这边已经有一个封好的theos,下面会提到。

3,配置ldid
ldid 是专门用来 名 iOS 可执行文件的工具,用以在越狱 iOS 中 代 Xcode 自带的codesign。从 http://joedj.net/ldid 下 ldid,把它放在“ /opt/theos/bin/ ”下,然后用以下命令赋予它可执行权限:

 
 
 
 
 

Objective-C

 
1
sudo chmod 777 /opt/theos/bin/ldid

4,配置CydiaSubstrate
因为Theos 的一个 bug,它无法自动生成一个有效的 libsubstrate.dylib 文件,需要手动操作。
在 Cydia 中搜索安装“CydiaSubstrate”,然后用 iFunBox 或 scp 等方式将 iOS 上的“/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate” 到 OSX 中,将其重命名为 libsubstrate.dylib 后放到
“ /opt/theos/vendor/lib/libsubstrate.dylib”中, 替换掉无效的文件即可。

5,dpkg-deb
deb 是越狱开发安装包的标准格式,dpkg-deb 是一个用于操作 deb 文件的工具,有了这个工具,Theos 才能正确地把工程打包成为 deb 文件。
从 https://raw.githubusercontent.com/DHowett/dm.pl/master/dm.pl 下 dm.pl,将其重命名为 dpkg-deb 后,放到“/opt/theos/bin/”目录下,然后用以下命令赋予其可执行权限:

 
 
 
 
 

Objective-C

 
1
sudo chmod 777 /opt/theos/bin/dpkg-deb

Theos操作这些移动文件设置权限这些步骤很啰嗦。
鉴于这些,我自己这边已经封装了一个集成好的Theos,附带一个自动下载的小脚本TheosScript.sh,不需要手动添加ldid、libsubstrate、dpkg-deb等。
脚本下载地址:https://github.com/DaSens/Theos-Script

 
进行简单演示:
 

进行简单演示

(2) Theos的用法介绍:
1,更改工作目录
更改工作目录至常用的 iOS 工程目录(如 “ /Users/zhangdasen/Code/”)
注:为何要做这一步呢,因为使用Theos创建的工程,是你在哪个目录执行的nic.pl启动的,就会在创建完成后在这个目录生成创建的Theos项目。

2,创建工程
终端输入“/opt/theos/bin/nic.pl”,启动 NIC(New Instance Creator),下面进行简单演示:

3,简单说明
上面创建工程输入了一大堆东西,下面用一张图来说明:

4,工程文件说明
创建好工程就会生成四个文件:
Makefile、Tweak.xm、control、iOSREProject.plist 下面进行简单说明。

(1) Makefile
Makefile 文件指定工程用到的文件、框架、库等信息,将整个过程自动化,下图为里面内容说明。
下图是我自己修改过后的Makefile文件。

补充:
1,导入 private framework

 
 
 
 
 

Objective-C

 
1
iOSREProject_PRIVATE_FRAMEWORKS = private framework name

2,链接 Mach-O 对象(Mach-O object)

 
 
 
 
 

Objective-C

 
1
iOSREProject_LDFLAGS = -lz –lsqlite3.0 –dylib1.o

(2) Tweak.xm
用 Theos 创建 tweak 工程, 认生成的源文件是 Tweak.xm。
如果后缀名是单独一个“ x”,说明源文件支持 Logos 和 C 语法;
如果后缀名是“ xm ”,说明源文件支持 Logos 和 C/C++ 语法,与“ m ”和“ mm ”的区别类似。
Tweak.xm 语法众多,在这里简单介绍一些,详细语法大家可以去看书籍。

● %hook
指定需要 hook 的 class, 必须以 %end 结尾

 
 
 
 
 

Objective-C

 
1
2
3
4
5
6
7
%hook SpringBoard
 
- (void)_menuButtonDown:(id)down {
     NSLog(@"You've pressed home button.");
     %orig; // call the original _menuButtonDown:
}
%end

● %orig该指 在 %hook 内部使用,执行被 (hook)的 数的原始代码,如下:

 
 
 
 
 

Objective-C

 
1
2
3
4
5
6
%hook SpringBoard
 
- (void)_menuButtonDown:(id)down {
       NSLog(@"You've pressed home button.");
       %orig; // call the original _menuButtonDown: }
%end
还可以利用 %orig 更改原始 数的参数,例如:
 
 
 
 
 

Objective-C

 
1
2
3
4
5
%hook SBLockScreenDateViewController
 
- (void)setCustomSubtitleText:(id)arg1 withColor:(id)arg2 {
         %orig(@"iOS 8 App Reverse Engineering", arg2); }
%end
 
这样一来, 锁屏界面原本显示日期的地方就变成了如图的样子。

● %group
该指 用于将 %hook 分组,便于代码管理及按条件初始化分组(含义 后有 细解 ),必须以 %end 结 ;一个 %group可以包含多个 %hook,所有不 于某个自定义 group 的 %hook会被隐式归类到 %group _ungrouped 中。
用法:

 
 
 
 
 

Objective-C

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
%group iOS7Hook
 
%hook iOS7Class
 
- (id)iOS7Method {
     id result = %orig;
     NSLog(@"This class & method only exist in iOS 7.");
     return result;
} %end
%end // iOS7Hook
 
 
%group iOS8Hook
 
%hook iOS8Class
 
- (id)iOS8Method {
   id result = %orig;
   NSLog(@"This class & method only exist in iOS 8."); return result;
}
%end
 
%end // iOS8Hook

● %init
该指令用于初始化某个 %group,必须在 %hook 或 %ctor 内调用;如果带参数,则初始化指定的 group,如果不带参数,则初始化 _ungrouped,如下:

 
 
 
 
 
 

Objective-C

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef kCFCoreFoundationVersionNumber_iOS_8_0
#define kCFCoreFoundationVersionNumber_iOS_8_0 1140.10 #endif
%hook SpringBoard
 
- (void)applicationDidFinishLaunching:(id)application {
%orig;
%init; // Equals to %init(_ungrouped)
 
if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_7_0 && kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iOS_8_0)
      %init(iOS7Hook);
if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_8_0)
      %init(iOS8Hook);
}%end
只有调用了 %init,对应的 %group 才能起作用,切 切 !

● %new
在 %hook 内部使用,给一个现有 class 加新函数,功能与 class_addMethod 相同。它的用法如下:

 
 
 
 
 

Objective-C

 
1
2
3
4
5
6
%hook SpringBoard %new
 
- (void)namespaceNewMethod {
     NSLog(@"We've added a new method to SpringBoard.");
}
%end

● %ctor
tweak的constructor,完成初始化工作;如果不显式定义,Theos会自动生成一个%ctor,并在其中调用 %init(_ungrouped)。因此,
%hook SpringBoard – (void)reboot {
NSLog(@”If rebooting doesn’t work then I’m screwed.”);
%orig;
}
%end
可以成功生效,因为 Theos 隐式定义了如下内容:%ctor

 
 
 
 
 

Objective-C

 
1
2
3
{
    %init(_ungrouped);
}

 
 
 
 
 

Objective-C

 
1
2
3
4
5
6
7
%hook SpringBoard
 
- (void)reboot{
     NSLog(@"If rebooting doesn't work then I'm screwed.");
    %orig;
}
%end

里的 %hook无法生效,因为这里显式定义了%ctor,却没有显式调用 %init,
%group(_ungrouped) 不起作用。
%ctor 一般可以用来初始化 %group,以及进行 MSHookFunction 等操作,如下:

 
 
 
 
 
 

Objective-C

 
1
2
3
4
5
6
7
8
9
10
11
12
#ifndef kCFCoreFoundationVersionNumber_iOS_8_0
#define kCFCoreFoundationVersionNumber_iOS_8_0 1140.10 #endif
%ctor{
 
%init;
 
if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_7_0 && kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iOS_8_0)
    %init(iOS7Hook);
if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_8_0)
    %init(iOS8Hook);
MSHookFunction((void *)&AudioServicesPlaySystemSound, (void *)&replaced_AudioServicesPlaySystemSound, (void **)&original_AudioServicesPlaySystemSound);
}

注意,%ctor 不需要以 %end 结 。

● %c
该指 的作用等同于 objc_getClass 或 NSClassFromString,即动态获 一个类的定义,在 %hook 或 %ctor 内使用。

(3) control文件
control文件 录了deb包管理系统所需的基本信息,会被打包进deb包里。
iOSREProject 里 control 文件的内容如下:

control 文件中可以自定义的字段还有很多,但上面这些信息就已经足够了。更全面的
说明可以参阅 debian 的官方网站(http://www.debian.org/doc/debian-policy/ch-controlfields.html)

(3)iOSREProject.plist文件
简单来说就是里面描述了tweak 的作用范围,也就是需要作用的APP的bundle identifier。
也就是在创建项目的时候填写的这个地方:


待续。。。。。。

iOS 逆向工程(工具介绍)- 学习整理(转)的更多相关文章

  1. PHP之APC缓存详细介绍(学习整理)

    APC的介绍 The Alternative PHP Cache (APC) is a free and open opcode cache for PHP. Its goal is to provi ...

  2. [转]PHP之APC缓存详细介绍(学习整理)

    From : http://www.2cto.com/kf/201210/160140.html 1.APC缓存简介APC,全称是Alternative PHP Cache,官方翻译叫”可选PHP缓存 ...

  3. java工具类学习整理——集合

    好久没有总结一些东西了,同时集合部分的知识点也学习的比较早了,但是从来没有抽时间去研究和学习,今天正好有时间就总结一下map常用的遍历方法: package runningwhile; import ...

  4. ios 逆向工程文档汇总

    iOS逆向工程工具集 http://www.jianshu.com/p/7f9511d48e05 移动App入侵与逆向破解技术-iOS篇 http://blog.csdn.net/heiby/arti ...

  5. iOS逆向工程,(狗神)沙梓社大咖免费技术分享。

    序言 简介:本文针对于广大iOS开发者,作为一名开发者,仅仅专注于一门语言可能已经不适用现在的市场需求,曾经因高薪和需求量巨大,而火爆一时的移动端开发者(Android,ios),如今的路却是不再那么 ...

  6. 【整理】Xcode中的iOS模拟器(iOS Simulator)的介绍和使用心得

    [整理]Xcode中的iOS模拟器(iOS Simulator)的介绍和使用心得 iOS模拟器简介 iOS功能简介 iOS模拟器,是在Mac下面开发程序时,开发iOS平台的程序时候,可以使用的辅助工具 ...

  7. !!对python列表学习整理列表及数组详细介绍

    1.Python的数组分三种类型:(详细见 http://blog.sina.com.cn/s/blog_6b783cbd0100q2ba.html) (1) list 普通的链表,初始化后可以通过特 ...

  8. IOS开发-OC学习-常用功能代码片段整理

    IOS开发-OC学习-常用功能代码片段整理 IOS开发中会频繁用到一些代码段,用来实现一些固定的功能.比如在文本框中输入完后要让键盘收回,这个需要用一个简单的让文本框失去第一响应者的身份来完成.或者是 ...

  9. python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍

    python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍 IDLE默认不能显示行号,使用ALT+G 跳到对应行号,在右下角有显示光标所在行.列.pycharm免费社区版.Su ...

  10. 32款iOS开发插件和工具介绍[效率]

    插件和工具介绍内容均收集于网络,太多了就不一一注明了,在此谢过!   1.Charles 为了调试与server端的网络通讯协议.经常须要截取网络封包来分析. Charles通过将自己设置成系统的网络 ...

随机推荐

  1. .netcore docker noe4j

    1.借用docker搭建noe4j环境 docker pull neo4j docker run -d --restart=always -p7474: -p7687: -v /root/docker ...

  2. CSP2019: Lost and Found

    再不更就成鸽子了= = Day -INF to Day 0 不记得发生了什么 Day 1 今年HN用网上提交的方式收题?再也不怕因为交代码太晚增加省队名额了 开考看了一眼T1好像是模拟题,特地注意了\ ...

  3. subjective--主观

    existing in the mind; belonging to the thinking subject rather than to the object of thought (oppose ...

  4. jsMind思维导图模式展示数据

    效果图: jsmind组件下载地址:https://files.cnblogs.com/files/fengyeqingxiang/jsmind.zip 后端代码,此处以C#编写的后台,Java或其他 ...

  5. python中用分别用selenium、requests库实现Windows认证登录

    最近在搞单位的项目,实现python自动化,结果在第一步就把我给拒之门外,查资料问大佬,问我们开发人员,从周一折腾到周五才搞定了 接下给大家分享一下 项目背景:我们系统是基于Windows平台实现的, ...

  6. 解决TensorFlow在terminal中正常但在jupyter notebook中报错的方案

    报错情况: # 本地运行正常,jupyter中无法 import tensorflow ImportError: libcublas.so.10.0: cannot open shared objec ...

  7. [摘抄] 3.AMD规范与CommonJS规范的兼容性

    3. AMD规范与CommonJS规范的兼容性 CommonJS规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操作. AMD规范则是非同步加载模块,允许指定回调函数. 由于Node.js ...

  8. JavaScript 数组(二)数组练习

    1.求一组数中的最大值和最小值,以及所在位置(最大值和最小值在这组数中的位置) var numbers = [120, 13, 101, 88, 10, 25]; var max = numbers[ ...

  9. CSS 标签显示模式

    标签的类型(显示模式) HTML标签一般分为块标签和行内标签两种类型,它们也称块元素和行内元素. 一.块级元素(block-level) 每个块元素通常都会独自占据一整行或多整行,可以对其设置宽度.高 ...

  10. centos逻辑卷使用

    要求:  1.硬盘格式成物理卷pvpvcreate/dev/sdb/dev/sda 2.创建卷组vgcreatevg1000/dev/sdb1/dev/sdb2#创建卷组”vg1000” 3.增加卷组 ...