游戏咖啡屋-最好的游戏编程源码技术网站!

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区






查看: 304|回复: 1

[程序] iOS越狱的判定方法

[复制链接]

1万

主题

1万

帖子

7万

积分

论坛元老

Rank: 8Rank: 8

积分
75683
发表于 2015-10-28 20:32:51 | 显示全部楼层 |阅读模式
苹果是非常看重产品的安全性的,所以给用户设计了一套复杂的安全机制。这让喜爱自由,崇尚一切开放的程序员们极度不爽,于是越狱就成了苹果和黑客们反复斗法的场所。总体来说,越狱可以让我们随意安装、共享应用,但确实也降低了设备的安全性,会给一些恶意应用提供方便之门。有时我们的应用希望知道安装的设备是否已经越狱了,显然,苹果官方不会给出解决方案来的,那么我们怎么办呢?因为越狱后会自动安装cydia,所以我们可以从这方面入手;也可以借助权限问题,去读取应用的列表;还可以去读环境变量,不越狱的机器应该是读取不到任何内容的。. m3 O/ Y7 K# [3 b0 @4 k
   587.jpg $ J1 q6 L& O/ O: h; w# I1 a! V" A  }5 ?
  下面我们一个一个方法来讲:# Y- c. Q, g" Z' p& [4 ~* o
  1. 判定常见的越狱文件% T7 I2 ]: o1 x" [7 @  A! c8 p4 Z
  /Applications/Cydia.app
5 R7 ~$ K3 ^& S2 B$ P  A& q  /Library/MobileSubstrate/MobileSubstrate.dylib
4 n" q& `# ?. b, Y  /bin/bash& @, d& s! Y5 a
  /usr/sbin/sshd
8 M& B7 ~& I9 C, [& x  /etc/apt* r3 _# o/ c4 m3 X, q  e
  这个表可以尽可能的列出来,然后判定是否存在,只要有存在的就可以认为机器是越狱了。#define ARRAY_SIZE(a) sizeof(a)/sizeof(a[0])
5 l6 {/ E; {/ c6 K+ Q: `
- |' f8 U4 v! Oconst char* jailbreak_tool_pathes[] = {
. f+ _- }# M$ G1 ?) Z"/Applications/Cydia.app", : S( i% ~# L- u/ o7 f6 r% A+ X
"/Library/MobileSubstrate/MobileSubstrate.dylib",
  X- U5 x" ~1 D1 a"/bin/bash",
* F3 h% p3 \: k* h0 a* S"/usr/sbin/sshd", # h/ E. ]0 G1 n( v4 A: i) x
"/etc/apt"
2 ]6 p. m6 j& a$ \5 {0 q8 H};
; \7 ~1 x  N: M, d- |7 T9 U6 P
; \. t: J" x$ Y; E- (BOOL)isJailBreak
$ @6 B0 t& H3 D1 O' H{
5 w4 I$ r* Z7 n) |9 Nfor (int i=0; i<ARRAY_SIZE(jailbreak_tool_pathes); i++) { & d( G# [6 t" W6 f0 e0 z4 ?, o
if ([[NSFileManager defaultManager] fileExistsAtPath:[NSString stringWithUTF8String:jailbreak_tool_pathes]]) { ! j: h# o8 M4 l! E% ~: i& o
NSLog(@"The device is jail broken!"); ; Z+ V! a% d. r9 ]6 J3 i9 ?
return YES; $ J0 X" M- a' K5 N7 G" m+ B) t7 v
} ) O' R& j, A/ J
} 8 {0 o. D* u* P, R$ a
NSLog(@"The device is NOT jail broken!"); * Y; h* g2 f5 |$ k/ D' v
return NO;
3 s6 S, G; m# ?/ r+ @" Z}
3 t; ]( ^3 d3 Y  2. 判断cydia的URL scheme
2 u% @( e3 {3 K  URL scheme是可以用来在应用中呼出另一个应用,是一个资源的路径(详见《iOS中如何呼出另一个应用》),这个方法也就是在判定是否存在cydia这个应用。01.- (BOOL)isJailBreak
4 N6 R8 E; P( }. C  W2 y02.{
/ o7 Q) p( S; A% C03.if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString"cydia://"]]) { 0 ~3 M, C6 k% r7 a2 ?; ~
04.NSLog(@"The device is jail broken!");
9 ~  ^$ n% i: s1 K# A05.return YES; 2 [$ n% a; J6 z; O
06.} % J! Z" \( O8 S! l" i) @
07.NSLog(@"The device is NOT jail broken!"); ) l9 o. u3 n1 ?6 j$ H& C
08.return NO;
8 J& @- t5 `9 L- y6 D3 H! ]09.}; x0 L( R, K7 V: B
  3. 读取系统所有应用的名称
( K& g) Y- _1 ]# o9 u. X3 \0 R0 G  这个是利用不越狱的机器没有这个权限来判定的。#define USER_APP_PATH @"/User/Applications/" $ J; |$ f2 P1 x- l- E6 F" C6 }2 L
- (BOOL)isJailBreak 8 w$ X6 R! @" x) y! c
{ ( U. o6 U( p) p9 k4 u  p
if ([[NSFileManager defaultManager] fileExistsAtPath:USER_APP_PATH]) {
% j% m) g0 H% U. C, O% p: XNSLog(@"The device is jail broken!");
& {3 [# x, d; d: r" p% G4 ONSArray *applist = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:USER_APP_PATH error:nil];
* i" c) U2 ]* h( A0 RNSLog(@"applist = %@", applist); , x+ \* d9 S5 j/ K/ m7 Q  |0 l4 y5 W$ f
return YES;
' Z; L, L; t" Q  d) w* x. L}
1 }' g% I* V! T1 G* GNSLog(@"The device is NOT jail broken!");
# ~0 @4 K: C4 ?; `5 y. @: vreturn NO; 7 A1 l# `* L1 u5 m- ?0 s* b! k3 X
}. a' u, G. x5 P& K' m1 G
  4. 使用stat方法来判定cydia是否存在2 p) b3 R! X5 ^" q. |3 u  D# {
  这个方法本身思路还是通过判定cydia应用,但方法是用的stat函数,同时会判定是否有注入动态库。#define CYDIA_APP_PATH "/Applications/Cydia.app" 8 s+ y% w  J# @6 z* w. _& u0 c
int checkInject() 6 P! m3 s3 N, }8 V
{
6 m$ L5 L) ^- e& S7 Z% \0 R7 v) ^" @int ret; ) r8 |5 t6 G4 \
Dl_info dylib_info; / ^4 W* m! o9 h; V, @. a
int (*func_stat)(const char*, struct stat*) = stat; 4 ^/ e$ [# B9 A) d" v
: e0 r" h4 d  A7 g' S
if ((ret = dladdr(func_stat, &dylib_info)) && strncmp(dylib_info.dli_fname, dylib_name, strlen(dylib_name))) { " Z/ q& o8 c2 P6 k9 H1 Z( D. Q8 t
return 0; 2 j% O5 i$ M, K* i. C# y
}
, b0 z  B! W- J* c# ~return 1; - x: Y$ t' j. t2 \. ^; P1 s9 J0 ~
}
  W* i/ P# ?" R" G( k
! |+ K: P: w5 i# S) y- H# B, j6 Zint checkCydia() 5 p0 e( Z% v: T- s6 t- n
{ - t) k7 e; Z* t! X4 H7 C
// first ,check whether library is inject
5 e: y, W; ]( M+ b7 n+ R; a% pstruct stat stat_info;
' v& S2 |+ q( U  s# Q , G  h4 |, P5 U1 d# e
if (!checkInject()) {
( L+ t' T0 g7 X$ n+ v0 Wif (0 == stat(CYDIA_APP_PATH, &stat_info)) {
4 I: M+ o  o. h1 t$ |* |$ Greturn 1;
( T" A1 c- b( j# h}
# S# Q/ q/ F# k8 ~} else { 1 ^& ?+ L3 F) O  @/ f
return 1; ; K( m& I% u/ d- A; Y3 ]
} / S$ x/ C, Q' h0 w9 \) S) J7 \
return 0;
! T/ b* ]( J$ y# `+ ~1 E, K}
. N+ [5 Q* u8 G5 s: ^3 q0 R% { , J' V3 ~6 ~+ m8 g+ m' W
- (BOOL)isJailBreak # k% ]# R3 m2 J; @) B) h0 ~
{
* o% g& w& P/ v4 M/ gif (checkCydia()) { / s4 L; h1 M) `$ B2 t) W+ x
NSLog(@"The device is jail broken!"); 8 ~3 Q1 s3 E) ]9 ?% Z5 M5 N% D( ~
return YES;
- C# h6 G! l: ?: z} + X, [3 }9 t4 u9 x8 N: G
NSLog(@"The device is NOT jail broken!");
. O, q* ?* l" _return NO; ; f$ {) {3 w1 V- H* I
}
5 F) a( E5 m; r  5. 读取环境变量这个DYLD_INSERT_LIBRARIES环境变量,在非越狱的机器上应该是空,越狱的机器上基本都会有Library/MobileSubstrate/MobileSubstrate.dylib   I% q$ ]9 {0 g; B7 }
char* printEnv(void)
, j' o, `& ~! C: V2 W+ D+ X  c* O{
6 M5 a* d* W- b2 nchar *env = getenv("DYLD_INSERT_LIBRARIES");
& C+ E6 Q, t1 [, l% |0 v: n8 GNSLog(@"%s", env); ( ~5 R$ [1 ]9 f8 i) y5 a
return env;
7 L* l  R7 e4 S# A; i}
2 `& X) ^6 h( ]+ W % a# B) d' x! @& W: p% x: Z
- (BOOL)isJailBreak
$ ?, J4 W6 O( }1 _/ j& ~0 ]{ " _5 ^1 t: G  r* Q+ |1 U" r
if (printEnv()) { ( Z4 y* Z) l& m( d& T
NSLog(@"The device is jail broken!"); 4 \6 |  R  J9 Y- ~7 T4 }
return YES; $ }: R: U! _; U' U$ A3 d# ^
} : U7 F" w- Y) x
NSLog(@"The device is NOT jail broken!");
4 y9 A$ ~2 Q  M& e2 `return NO;
0 v  F' u0 N5 @; g) a. o4 e# l}# O. f, Y8 o& {  I# d( f
  当然,判定一个设备是否越狱时,可以多种方法并用以确保准确。这里我还想说的是越狱有完美越狱还有非完美越狱,这本身就不是官方有保证的行为,所以情况也是复杂多变。iOS7针对沙盒机制也有了改进升级,有些情况对新的版本或许是不合适的,这点还需要实际情况实际处理。另外,还有fork一个子线程,看返回值等一些方法,这里也不再一一列举。
; }2 y& W3 t0 ~  最后,越狱毕竟会带来不安全因素的增加,尤其是金融工具装的比较多的情况下,强烈不推荐越狱。
哈...今天心情不错,来游戏咖啡区签到了...
回复

使用道具 举报

0

主题

10

帖子

84

积分

注册会员

Rank: 2

积分
84
发表于 2017-12-13 19:53:55 | 显示全部楼层
哈...今天心情不错,来游戏咖啡区签到了...
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|游戏咖啡屋 ( 蜀ICP备14021481号-1

GMT+8, 2018-4-27 14:56 , Processed in 0.312500 second(s), 28 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表