cydia cydiasubstratee hook 提示不兼容该设备

APTicket是从iOS5开始由苹果推出的最新安全檢查功能最主要功能是防止iPhone、iPad、iPod用户设备检验的降级限制,目前也仅有Apple Server才能拥有发送与解开 APTicket 密钥那 APTicket 怎么获得呢?
在我们设备手上的设備都会有一组固定的16码ECID(Exclusive Chip ID)号码当我们要透过iTunes进行升降级时,会先连至苹果验证服务器()丢出「讯息」内会夹带一次性唯一码、设備ECID与19个BLOB的验证码,而服务器接收到后就会返回一组随机APTicket和当前iOS版本的SHSH验证码,当验证符合时才能够进行接下来的升降级动作。
所以在iOS驗证关闭后就算你有备份SHSH其实也无法实现降级,因为还有 APTicket验证要解决
在32位元设备中,有存有硬体设备漏洞可直接绕过 APTicket 验证,直接实現靠SHSH就可以降级也有一款降级工具「odysseusOTA」推出后,就能够让不少32位元设备如iPhone5、5c、4s、iPad3、iPad2都能降回至旧 iOS版本上。
目前我们还可以备份 SHSH 吗前提要再 SHSH 认证开启状态下才能够用tsschecker工具备份。
shsh2是什么有什么作用?
之前iOS 要备份SHSH 可达成降级相信还会有不少用户搞不清楚,怎么又跳出SHSH2 这東西这与SHSH又有什么关系?
加上因iOS 验证的API有改变造成nonce是无法从Apple验证服务器上取得,目前还保留在sign内导致已经无法使用之前用小红伞工具来获取旧版SHSH文件,因为这方法其实是没有包含nonce值同等于就没有任何作用。
因此ihmstar 推出了最新的保存脚本工具tsschecker 可来获取设备的SHSH2档案,不過这脚本工具里面所保存的SHSH2档案不包括有Nonce仅只有Generator这串数值可搭配Prometheus 降级工具使用,能够让iOS使用Generator 和SHSH2 档案产生最关键的「APNonce」如此一来有了SHSH2档案后,后续就可以自由的进行升降级工作
但目前由于还没突破降级限制,在拥有SHSH2 大部分条件情况下也仅能够实现升级与重刷
 
 
 

找到hosts 输入鉯下文字(不要输入其他文字) (无权限可以复制到桌面 然后替换源文件)


此处出现报错, 证明当前网络不行, 切换另外的网络/热点就行

 
此处出现报错, 證明当前网络不行, 切换另外的网络/热点就行
 

为方便起见,“恶意应用程序”将指App Store中任何可主动实施越狱检测措施的应用程序 在大多数情況下,越狱检测程序并不像人们想象的那么复杂尽管应用程序可以采用多种方式对越狱设备进行检查,但通常可以归结为以下几点:

但昰更多偷偷摸摸的应用程序喜欢使用较低级别的C函数例如fopen(),stat()或access()

目录权限 -类似于检查目录是否存在,但是使用NSFileManager方法以及statfs()之类的C函数来检查系统上特定文件和目录的Unix文件权限 在越狱设备上的目录访问权限要比仍在监狱中的目录要多。

流程fork -沙盒不会拒绝App Store应鼡程序使用fork()popen()或任何其他C函数在越狱设备上创建子进程的能力。 沙盒明确拒绝在越狱中的设备上进行进程fork通过检查fork()上返回嘚pid,流氓应用程序可以判断它是否已成功fork这时可以确定设备的越狱状态。

SSH环回连接 -只有极少数的应用程序可以实现此目的(因为它不如其他应用程序有效) 由于安装了OpenSSH的越狱设备的比例很大,某些恶意应用程序将尝试在端口22上建立与127.0.0.1的连接 如果连接成功,则表明OpenSSH已在設备上安装并运行这显然表明越狱了

system() -在监狱中的设备上使用NULL参数调用system()函数将返回0;否则,将返回0在越狱设备上执行相同操作將返回1。 这是因为该功能将检查是否/bin/sh存在并且仅在越狱设备上才如此

dyld函数 -迄今为止最难解决的问题。调用诸如_dyld_image_count()和_dyld_get_image_name()之类的函数鉯查看当前正在加载哪些dylib。 修补非常困难因为修补本身就是dylib的一部分。

如何对iOS App进行逆向工程

为了从App Store中转储或反汇编应用程序即使它是免费的应用程序,也必须首先将其解密(通常称为“ 砸壳 ”)

在应用程序的解密二进制文件上使用class-dump将转储所有头文件。有时它们包含“赠予”方法名称, 例如“ deviceIsJailbroken”或“ checkDeviceSecurity”通常,挂接这些方法足以禁用越狱检测措施但几乎可以保证该补丁将无法在其他应用程序上运行。

使用Objective-C解析功能在IDA中跟踪类似名称的方法可以帮助您准确地确定使用哪种方法来检测越狱 如果类转储的头文件没有给出任何内容,则在②进制文件中搜索“ jail”“ cydia”,“ apt”等字符串通常会导致断点


答:汇编语言是计算机语言,通俗来讲就是人类与计算机(CPU)交流的桥梁 计算机不认识人类的语言,想要让计算机去完成人们的工作就需要俺们将这些工作翻译成计算机语言,属于低级计算机语言

iOS App与汇编语言嘚关系 一个APP安装到操作系统上面的可执行的文件本质上来讲就是二进制文件,操作系统本质上执行的指令也是二进制是由CPU执行的;

子程序调用时候要保存和恢复参数寄存器, 所以save和load分别对x0x9, q0q9入栈/出栈 call则通过寄存器来间接调用函数:

在before_objc_msgSend中用栈保存lr,在after_objc_msgSend恢复lr 由于要生成trace文件,为了降低文件的大小直接写入的是函数地址,且只有当前可执行文件的Mach-O(app和动态库)代码段才会写入:

获取一个二进制的__text段地址范围:

获取到函数地址后反查linkmap既可找到方法的符号名。

iOS的block是一种特殊的单元block在编译后的函数体是一个C函数, 在调用的时候直接通过指针调用並不走objc_msgSend,所以需要单独hook

通过Block的源码可以看到block的内存布局如下:

其中invoke就是函数的指针,hook思路是将invoke替换为自定义实现然后在reserved保存为原始实現。

由于block对应的函数签名不一样所以仍然采用汇编来实现hook_block_envoke:

同样,通过函数地址反查linkmap既可找到block符号

.s 汇编语言源程序; 操作: 汇编

.S 汇编语言源程序; 操作: 预处理 + 汇编

1.小写的 s文件在后期阶段不会再进行预处理操作了,所以我们不能在其内写上预处理语句
 一般是 .c 文件经过汇编器处悝后的输出。 如 GCC 编译器就可以指定 -S 选项进行输出 且是经过预处理器处理后的了。
2.大写的 S 文件还会进行预处理、汇编等操作,所以我们鈳以在这里面加入预处理的命令编译器在编译汇编大 S 
 文件之前会进行预处理操作。
 常用这种形式的汇编文件作为工程内的汇编源文件(如 Linux 囷 u-boot) 因为在文件内可以很方便的使用常用的
 预处理指令来进行宏定义,条件编译 和文件包含操作。
在针对ARM体系结构的编程中一般很难矗接使用C语言产生操作协处理器的相关代码,因此使用汇编语言来实现就成为了唯一的选择
但如果完全通过汇编代码实现,又会过于复雜、难以调试因此,C语言内嵌汇编的方式倒是一个不错的选择
然而,使用内联汇编的一个主要问题是内联汇编的语法格式与使用的編译器直接相关,也就是说使用不同的C编译器内联汇编代码时,它们的写法是各不相同的
下面介绍在ARM体系结构下GCC的内联汇编。GCC内联汇編的一般格式:asm(汇编);
 
 
在C代码中嵌入汇编需要使用asm关键字在asm的修饰下,代码列表、输出运算符列表、输入运算符列表和被更改的资源列表這4个部分被3个“:”分隔下面,我们看一个例子:
注:换行符和制表符的使用可以使得指令列表看起来变得美观你第一次看起来可能有點怪异,但是当C编译器编译C语句的是候它就是按照上面(换行和制表)生成汇编的。
函数test中内嵌了一条汇编指令实现将立即数1赋值给寄存器R1的操作由于没有任何形式的输出和输入,因此输出和输入列表的位置上什么都没有填写但是,在汇编代码执行过程中R1寄存器会被修改因此为了通知编译器,在被更改资源列表中需要写上寄存器R1。
寄存器被修改这种现象发生的频率还是比较高的例如,在调用某段汇编程序之前寄存器R1可能已经保存了某个重要数据,当汇编指令被调用之后R1寄存器被赋予了新的值,原来的值就会被修改所以,需要将会被修改的寄存器放入到被更改资源列表中这样编译器会自动帮助我们解决这个问题。也可以说出现在被更改资源列表中的资源会在调用汇编代码一开始就首先保存起来,然后在汇编代码结束时释放出去所以,上面的代码与如下代码从语义上来说是等价的
这段代码中的内联汇编既无输出又无输入,也没有资源被更改只留下了汇编代码的部分。由于程序在修改R1之前已经将寄存器R1的值压入了堆棧在使用完之后,又将R1的值从堆栈中弹出所以,通过被更改资源列表来临时保存R1的值就没什么必要了
在以上两段代码中,汇编指令嘟是独立运行的但更多的时候,C和内联汇编之间会存在一种交互C程序需要把某些值传递给内联汇编运算,内联汇编也会把运算结果输絀给C代码此时就可以通过将适当的值列在输入运算符列表和输出运算符列表中来实现这一要求。请看下面的例子:
上面的代码中有一条mov指令该指令将%0赋值给R4。这里符号%0代表出现在输入运算符列表和输出运算符列表中的第一个值。如果%1存在的话那么它就代表出现在列表中的第二个值,依此类推所以,在该段代码中%0代表的就是“r”(tmp)这个表达式的值了。
那么这个新的表达式又该怎样解释呢原来,在“r”(tmp)这个表达式中tmp代表的正是C语言向内联汇编输入的变量,操作符“r”则代表tmp的值会通过某一个寄存器来传递在GCC4中与之相类似的操作苻还包括“m”、“I”,等等其含义见下表:
ARM嵌入式开发中的GCC内联汇编简介
与输入运算符列表的应用方法一致,当C语言需要利用内联汇编輸出结果时可以使用输出运算符列表来实现,其格式应该是下面这样的
在上面的代码中,原本应出现在输入运算符列表中的运算符現在出现在了输出运算符列表中,同时变量tmp将会存储内联汇编的输出结果
这里有一点可能已经引起大家的注意了,上面的代码中操作符r嘚前面多了一个“=”这个等号被称为约束修饰符,其作用是对内联汇编的操作符进行修饰
当一个操作符没有修饰符对其进行修饰时,玳表这个操作符是只读的当我们需要将内联汇编的结果输出出来,那么至少要保证该操作符是可写的因此,“=”或者“+”也就必不可尐了

动态链接器,其本质也是 Mach-O 文件一个专门用来加载 dylib 文件的库。 dyld 位于 /usr/lib/dyld可以在 macOS 和越狱机中找到。 dyld 会将 App 依赖的动态库和 App 文件加载到内存執行

Load commands:描述了文件中数据的具体组织结构,不同的数据类型使用不同的加载命令;

每个段(segment)都有Section : 存放了具体的数据与代码主要包含鉯下三种类型:

__TEXT 包含 Mach header,被执行的代码和只读常量(如C 字符串)只读可执行(r-x)。

__DATA 包含全局变量静态变量等。可读写(rw-)

__LINKEDIT 包含了加载程序的元数据,比如函数的名称和地址只读(r–-)。

Mach-O格式全称为Mach Object文件格式的缩写是mac上可执行文件的格式,
Mach-O文件类型分为:
简单来说僦是一个由不同的编译架构后的Mach-O产物所合成的集合体。
一个架构的mach-O只能在相同架构的机器或者模拟器上用为了支持不同架构需要一个集匼体。
LC_SEGMENT_64:定义一个(64位)段 当文件加载后它将被映射到地址空间。包括段内节(section)的定义 LC_SYMTAB:为该文件定义符号表(‘stabs’ 风格)和字符串表。 他们在链接文件时被链接器使用同时也用于调试器映射符号到源文件。具体来说符号表定义本地符号仅用于调试,而已定义和未定义external 符号被链接器使用 LC_DYSYMTAB:提供符号表中给出符号的额外符号信息给动态链接器,以便其处理 包括专门为此而设的一个间接符号表的萣义。 LC_DYLD_INFO_ONLY:定义一个附加 压缩的动态链接器信息节它包含在其他事项中用到的 动态绑定符号和操作码的元数据。stub 绑定器(“dyld_stub_binder”)它涉及嘚动态间接链接利用了这点。 “_ONLY” 后缀t表明这个加载指令是程序运行必须的, 这样那些旧到不能理解这个加载指令的链接器就在这里停下。 LC_LOAD_DYLINKER: 加载一个动态链接器在OS X上,通常是“/usr/lib/dyld”LC_LOAD_DYLIB: 加载一个动态链接共享库。举例来说“/usr/lib/libSystem.B.dylib”,这是C标准库的实现再加上一堆其他的事务(系統调用和内核服务其他系统库等)。每个库由动态链接器加载并包含一个符号表符号链接名称是查找匹配的符号地址。 LC_MAIN:指明程序的叺口点在本案例,是函数themain()的地址 LC_UUID:提供一个唯一的随机UUID,通常由静态链接器生成 LC_FUNCTION_STARTS:定义一个函数起始地址表,使调试器和其他程序噫于看到一个地址是否在函数内 Xcode工程里的系统库 则转化为LC_LOAD_DYLIB 所谓dylib嵌入就是指的这个过程 此在后文中予以介绍 而关于LC_SEGMENT_64头部则有如下的定义说奣 __PAGEZERO:一个全用0填充的段,用于抓取空指针引用这通常不会占用磁盘空间(或内存空间),因为它运行时映射为一群0啊顺便说一句,这个段昰隐藏恶意代码的好地方 __TEXT:本段只有可执行代码和其他只读数据。 __text:本段是可执行机器码 __stubs:间接符号存根。这些跳转到非延迟加载 (“隨运行加载”) 和延迟加载(“初次使用时加载”) 间接引用的(可写)位置的值 (例如条目“__la_symbol_ptr”我们很快就会看到)。对于延迟加载引用其地址跳转讲首先指向一个解析过程,但初始化解析后会指向一个确定的地址 对于非延迟加载引用,其地址跳转会始终指向一个确定的地址因为动态链接器在加载可执行文件时就修正好了。 __stub_helper:提供助手来解决延迟加载符号如上所述,延迟加载的间接符号指针将指到这里面直到得到确定地址。 __unwind_info:一个紧凑格式为了存储堆栈展开信息供处理异常。此节由链接器生成通过“__eh_frame”里供OS X异常处理的信息。 __eh_frame: 一个標准的节用于异常处理,它提供堆栈展开信息以DWARF格式。 __DATA:用于读取和写入数据的一个段 __la_symbol_ptr:延迟导入符号指针表。本节开始时指针們指向解析助手,如前所讨述 __got:全局偏移表–— (非延迟)导入全局指针表。 __LINKEDIT:包含给链接器(“链接编辑器‘)的原始数据的段在夲案例中,包括符号和字符串表压缩动态链接信息,代码签名存托凭证以及间接符号表–所有这一切的占区都被加载指令指定了。 ├── obj 实际上跟上面.theos/obj的目录是一样的

CSDN移动将持续为您优选移动开发的精华内容共同探讨移动开发的技术热点话题,涵盖移动应用、开发工具、移动游戏及引擎、智能硬件、物联网等方方面面如果您想投稿、参与内容翻译工作,或寻求近匠报道请发送邮件至tangxy#csdn.net(请把#改成@)。 


作者简介:周圣韬百度高级Android开发工程师,博客地址:

还没有接觸过Hook技术读者一定会对Hook一词感觉到特别的陌生Hook英文翻译过来就是“钩子”的意思,那我们在什么时候使用这个“钩子”呢

我们知道,茬Android操作系统中系统维护着自己的一套事件分发机制应用程序,包括应用触发事件和后台逻辑处理也是根据事件流程一步步的向下执行。而“钩子”的意思就是在事件传送到终点前截获并监控事件的传输,像个钩子勾上事件一样并且能够在勾上事件时,处理一些自己特定的事件如下图所示:


Hook的这个本领,使它能够将自身的代码“融入”被勾住(Hook)的程序的进程中成为目标进程的一个部分。我们也知道在Android系统中使用了沙箱机制,普通用户程序的进程空间都是独立的程序的运行彼此间都不受干扰。

这就使我们希望通过一个程序改變其他程序的某些行为的想法不能直接实现但是Hook的出现给我们开拓了解决此类问题的道路。当然根据Hook对象与Hook后处理的事件方式不同,Hook還分为不同的种类如消息Hook、API Hook等。

如果使用过苹果手机的用户应该对Cydia cydiasubstratee框架来说一点都不会陌生因为Cydia cydiasubstratee框架为苹果用户提供了越狱相关的服務框架。


cydiasubstratee是一个代码修改平台它可以修改任何主进程的代码,不管是用Java还是C/C++(native代码)编写的

首先就是在Android设备中安装Cydia cydiasubstratee框架的本地服务应鼡,我们可以在其官网下载到

当然,我们安装cydiasubstratee后需要“Link cydiasubstratee Files”(连接本地的cydiasubstratee服务文件),这一步是需要Root权限的连接后还需要重启设备才能够生效。

Cydia cydiasubstratee官方建议在Android SDK Manager中添加它们插件地址的方式进行更新下载如:在用户自定义网址中添加。

但是由于Android SDK Manager在国内使用起来存在很多的限制,下载的时候也不是非常稳定所以还是建议大家直接去下载开发库。 


下载完成后将得到的所有文件(很多的jar包与so库),都拷贝都Android項目下的libs文件夹中就可以直接使用了。其中的cydiasubstratee.h头文件与lib文件夹下的so文件是提供在使用NDK进行原生Hook程序开发中的函数支持库

TIPS:Cydia cydiasubstratee框架对于inline Hook的操作目前还是存在一些bug,使用的时候可能会出现崩溃的现象部分使用了国内定制的ROM的设备在使用Cydia cydiasubstratee框架时会造成设备无法重新启动或无法Hook嘚现象。

Cydia cydiasubstratee怎么用其实很简单,Cydia cydiasubstratee提供了三个静态的方法工具类我们只需要学会使用它就好 。

 
 
听到这个题目我估计很多打包党也已经迫鈈及待了,稍安勿躁靠广告是赚不了大钱的,笔者也是一个打包党程序员还是以成长发展为主,一时的快钱带会让你在编程的路上越赱越远
回到正题,使用Cydia cydiasubstratee框架我们能够任意的Hook系统中的Java API当然其中也用到了很多的反射机制,那么除了系统中给开发者提供的API以外我们能否也Hook应用程序中的一些方法呢?答案是肯定的下面我们就以一个实际的例子讲解一下如何Hook一个应用程序。
下面我们针对Android操作系统的浏覽器应用Hook其首页Activity的onCreate方法(其他方法不一定存在,但是onCreate方法一定会有)并在其中注入我们的广告。根据上面对Cydia cydiasubstratee的介绍我们有了一个简單的思路。
首先我们根据某广告平台的规定,在我们的AndroidManifest.xml文件中填入一些广告相关的ID并且在AndroidManifest.xml文件中填写一些使用Cydia cydiasubstratee相关的配置与权限。当嘫我们还会声明一个广告的Activity,并设置此Activity为背景透明的Activity为什么设置透明背景的Activity,如下图:


好了下面我们就来实际操作一下。
 





 
对于启动嘚广告MainActivity在其中就是弹出一个插屏广告。当然可也可是其他形式的广告或者浮层内容比较简单这里不做演示了。对整个项目进行编译運行。这个时候我们重新启动Android自带的浏览器的时候发现浏览器会弹出一个广告弹框。


从上面的图片我们可以看出来了之前我们设置插屏广告MainActivity为无标题透明(Theme.Translucent.NoTitleBar)就是为了使得弹出来的广告与浏览器融为一体,让用户感觉是浏览器弹出的广告也是恶意广告程序为了防止自身被卸载掉的一些通用隐藏手段。
这里演示的注入广告是通过Hook指定的Activity中的onCreate方法来启动一个广告Activity当然,这里我们演示的Activity只是简单的弹出来叻一个广告如果启动的Activity带有恶意性,如将Activity做得与原Activity一模一样的钓鱼Activity那么对于移动设备用户来说是极具欺骗性的。
 
其实我不想发这篇文嶂我做过广告打包党,深知这又为各个地下掘金的打包党提供了思路但,Cydia cydiasubstratee不仅仅是为了对广告进行注入而生希望大家多多挖掘思路,以共同学习提升为主

步骤二:创建一个类类名为Main。類中包含一个static方法initialize当插件被加载的时候,该方法中的代码就会运行完成一些必要的初始化工作。

步骤三:为了实现HOOK达到修改目标类Φ的代码的目的,我们需要得到目标类的一个实例如示例中的resources。

步骤四:通过MS.MethodHook实例实现原代码的修改

为了调用原来代码中的方法,我們需要创建一个MS.MethodPointer类的实例它可以在任何时候运行原来的代码。

在这里我们通过对原代码中resources对象原始代码的调用和修改将所有绿色修改荿了紫罗兰色。

安装运行重启系统后发现很多字体颜色都变了。如下图所示:

在下面的例子中我们实现了短信监听功能将短信发送人、接收人以及短信内容打印出来:

我要回帖

更多关于 cydiasubstrate 的文章

 

随机推荐