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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 220|回复: 1

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

[复制链接]

1万

主题

1万

帖子

7万

积分

论坛元老

Rank: 8Rank: 8

积分
74881
发表于 2015-10-28 20:32:51 | 显示全部楼层 |阅读模式
苹果是非常看重产品的安全性的,所以给用户设计了一套复杂的安全机制。这让喜爱自由,崇尚一切开放的程序员们极度不爽,于是越狱就成了苹果和黑客们反复斗法的场所。总体来说,越狱可以让我们随意安装、共享应用,但确实也降低了设备的安全性,会给一些恶意应用提供方便之门。有时我们的应用希望知道安装的设备是否已经越狱了,显然,苹果官方不会给出解决方案来的,那么我们怎么办呢?因为越狱后会自动安装cydia,所以我们可以从这方面入手;也可以借助权限问题,去读取应用的列表;还可以去读环境变量,不越狱的机器应该是读取不到任何内容的。; M! @9 C: `: ?3 O
   587.jpg ) O6 J! T5 ?8 f6 n, D: @$ f
  下面我们一个一个方法来讲:" g" r6 H* c% {( Y+ ^2 q. p# O- U
  1. 判定常见的越狱文件& j  X) h5 f: s
  /Applications/Cydia.app# j+ T4 N- t% L5 r
  /Library/MobileSubstrate/MobileSubstrate.dylib( X* R( t! U9 R( N
  /bin/bash
. R3 s& N) Y9 Z' q+ A  /usr/sbin/sshd- }# _, \* @$ m3 V- p
  /etc/apt
0 ]1 o; H- R$ ~# e% N, g* N) o  这个表可以尽可能的列出来,然后判定是否存在,只要有存在的就可以认为机器是越狱了。#define ARRAY_SIZE(a) sizeof(a)/sizeof(a[0])
. ]0 C4 o) Q% I& m ) w# b  o* p! h& E5 O! h: P
const char* jailbreak_tool_pathes[] = {
# f2 N0 Z0 Y# y7 w. c"/Applications/Cydia.app", - Y" c: ?; N! L2 A7 l( O0 `9 r
"/Library/MobileSubstrate/MobileSubstrate.dylib",
+ `4 \8 y2 ~) c8 \# I"/bin/bash", ; |7 ~9 ?/ Q4 F2 L) S
"/usr/sbin/sshd",
- U4 {% p+ k* T+ g7 `7 h"/etc/apt"
# q. Q# n# \6 L1 D8 z1 i0 P}; # r  h  {7 F# m3 t7 {
% E! s" c; L, Z) }. [0 n/ a* l
- (BOOL)isJailBreak $ Y# s0 y% g5 S2 Z3 s
{
) f- {6 {$ b7 W) w' ^, y" g( j* X# Vfor (int i=0; i<ARRAY_SIZE(jailbreak_tool_pathes); i++) {
! U8 @  h& k9 |7 _9 M) u$ S7 s8 F( f; tif ([[NSFileManager defaultManager] fileExistsAtPath:[NSString stringWithUTF8String:jailbreak_tool_pathes]]) { 1 R( I0 x, {, s0 h# K, p! a6 w1 }
NSLog(@"The device is jail broken!"); ) M8 e+ {" T3 n' q
return YES;
. H. z' J& d2 z4 ?2 @' M, R}
# k; c4 d! |% f1 v} 4 e, d2 M$ I: L* Z% @4 r2 ^, B
NSLog(@"The device is NOT jail broken!"); % C5 J- J$ M- ]0 d: ?& Z' D; R
return NO;
* b" V7 {6 N4 z}- g3 R9 p$ D6 Q, Z5 h! E  S/ Z
  2. 判断cydia的URL scheme$ ?4 h+ V; P: b: Y
  URL scheme是可以用来在应用中呼出另一个应用,是一个资源的路径(详见《iOS中如何呼出另一个应用》),这个方法也就是在判定是否存在cydia这个应用。01.- (BOOL)isJailBreak
9 w1 u6 E/ O, j7 r+ }% i02.{
* X' }! u8 @3 C, l) X03.if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString"cydia://"]]) {
/ E$ o* }2 O9 b4 t: a3 D; Q04.NSLog(@"The device is jail broken!");
/ {! q- X0 C6 c+ e05.return YES;
; z& o5 l1 Y$ q& i: f06.}
) M- u9 G4 j: Z# N/ u1 |0 z0 O07.NSLog(@"The device is NOT jail broken!"); % U( r% I! o3 U
08.return NO;
3 f' s- O- c; ]# ?/ i09.}5 B( p$ _6 o7 i  {
  3. 读取系统所有应用的名称3 x" ?* \3 ^8 q; |- |
  这个是利用不越狱的机器没有这个权限来判定的。#define USER_APP_PATH @"/User/Applications/"
4 C! v, M7 H- e3 D, g1 q) l+ \- (BOOL)isJailBreak ! |; Q( ]( x" }' o) l9 C
{
- Y. E( P2 x5 u2 u5 Pif ([[NSFileManager defaultManager] fileExistsAtPath:USER_APP_PATH]) {
) w& y" \$ K+ {3 ^4 uNSLog(@"The device is jail broken!"); ( X1 t6 P1 l5 s1 ^. y$ x
NSArray *applist = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:USER_APP_PATH error:nil]; " `3 G, T3 Y7 L/ a5 m
NSLog(@"applist = %@", applist); # \' E& H- i1 b
return YES;
$ d8 y# t2 r: ~( U9 ]* Y5 e' U" o0 j8 R, d} 8 L1 k* b2 |2 N" @; z/ y5 S
NSLog(@"The device is NOT jail broken!");
6 H0 w0 e+ H( w5 G+ q* D7 z  Lreturn NO; 7 r, E: f2 S) |' z8 S; f. V
}
9 `3 p) l: k4 n: l7 R" C/ l6 Y+ J  4. 使用stat方法来判定cydia是否存在
) ?4 ]6 k1 L  [- t/ J, _  这个方法本身思路还是通过判定cydia应用,但方法是用的stat函数,同时会判定是否有注入动态库。#define CYDIA_APP_PATH "/Applications/Cydia.app"
1 |! l: n" s- V5 L/ y* _int checkInject() ! R8 f7 G9 s5 g: F
{ % m0 E0 S7 O* K0 u! b7 c- n
int ret;
+ Y& H4 m& x% e2 A* EDl_info dylib_info;
1 u5 F2 `+ ?* z1 Yint (*func_stat)(const char*, struct stat*) = stat; 9 u; G" X# D+ x0 O/ q: j) `8 |

0 ~# V! n4 [* T5 s. M1 Eif ((ret = dladdr(func_stat, &dylib_info)) && strncmp(dylib_info.dli_fname, dylib_name, strlen(dylib_name))) { ' g* X  b" }! q# i; ?# @+ x3 U. i
return 0;
; m3 l. q* \7 U/ B0 T} 6 ~* }: t2 x( D9 s
return 1; ' x2 s6 @  S5 L9 C% e
} 7 @) {4 |( S6 F; ~* J2 j9 x
9 P$ _: {' I; {6 W( G7 `! H% |
int checkCydia() ! T+ e5 f# z" e- B  V* U4 y
{ " Y* B* N; P4 x( s
// first ,check whether library is inject
, _) ?: S" J4 B( a8 I" Q5 }' a  estruct stat stat_info; . t' p  s2 ~8 i! J) d& X& {
* m2 [+ V9 Y$ `* c" Q' B. Z! m
if (!checkInject()) {
  y. i( t) G- ]6 N9 [- {if (0 == stat(CYDIA_APP_PATH, &stat_info)) { 3 h) J  z. w7 o4 V! F
return 1;
! U0 r/ o. N; u! i& L}
  x- E" @3 e7 {) k% q9 \} else {
5 a8 h* ?& S/ rreturn 1;
* d6 O! m6 t$ N( u" W  q0 H} ; u0 [" D5 M! M
return 0; + z) F! O8 H, u( m8 C2 @
} 2 X+ s% \8 ?4 x: m
! y8 w5 d- F' p
- (BOOL)isJailBreak + r- ]' U) B* g# _6 a
{ / C$ X4 k1 y  n. ]4 B" S" y2 @
if (checkCydia()) { & h3 I# [+ l: h3 C% {- Q& Y
NSLog(@"The device is jail broken!"); , _" {& ]" _9 t7 p
return YES; 5 _7 Q& e! T: z9 z
} ( N" z4 v6 d) E( U" G2 n
NSLog(@"The device is NOT jail broken!"); 4 L$ B+ f2 K9 Z# T7 U6 q
return NO;
4 I2 l1 F; _9 w' U- E}
1 x% @" h( F  v+ W  5. 读取环境变量这个DYLD_INSERT_LIBRARIES环境变量,在非越狱的机器上应该是空,越狱的机器上基本都会有Library/MobileSubstrate/MobileSubstrate.dylib % O, [6 V6 M# A& u
char* printEnv(void) 3 s  L0 j; ]% W; y* U
{
8 {! j0 [' M+ \" G/ x" xchar *env = getenv("DYLD_INSERT_LIBRARIES");
( |, r" D+ o9 `) `- R  ?NSLog(@"%s", env);
4 Q8 G4 b- q, d) n( Jreturn env; ' ~1 H' K7 p& g, q- r
} $ z7 `7 ^) m& q! p; F) U% M) A
7 _: u# S& U7 {4 }; z
- (BOOL)isJailBreak
" \2 g$ {% p- ~0 r) R6 @# s{ 5 k. i" ~9 C  L7 b7 a- b
if (printEnv()) {
% H/ E0 h- @- b5 y* Y: ]NSLog(@"The device is jail broken!");
, A3 R' g( v# ^5 o4 }1 |" xreturn YES; , z; m, {- J; o+ T
}
, h& x8 Z& G" ^4 eNSLog(@"The device is NOT jail broken!"); . ^% |9 l0 b* @: H/ i& Y
return NO;
' n1 x( G- K, i' y5 K}& h! R. Z2 ?% }! J
  当然,判定一个设备是否越狱时,可以多种方法并用以确保准确。这里我还想说的是越狱有完美越狱还有非完美越狱,这本身就不是官方有保证的行为,所以情况也是复杂多变。iOS7针对沙盒机制也有了改进升级,有些情况对新的版本或许是不合适的,这点还需要实际情况实际处理。另外,还有fork一个子线程,看返回值等一些方法,这里也不再一一列举。, z, a: x# `7 j4 K
  最后,越狱毕竟会带来不安全因素的增加,尤其是金融工具装的比较多的情况下,强烈不推荐越狱。
哈...今天心情不错,来游戏咖啡区签到了...
回复

使用道具 举报

0

主题

10

帖子

84

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2018-1-21 22:58 , Processed in 0.281250 second(s), 28 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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