From 464de2715e4189216a757906dbb843c8c6b759e9 Mon Sep 17 00:00:00 2001 From: Mohamed Marbouh Date: Fri, 14 Nov 2014 15:36:05 +0100 Subject: [PATCH 1/2] Added iOS 8 compatibility --- IPC.m | 51 +++++++++++++++++- interface.h | 1 + layout/.DS_Store | Bin 0 -> 10244 bytes layout/DEBIAN/.DS_Store | Bin 0 -> 6148 bytes layout/DEBIAN/control | 4 +- layout/DEBIAN/preinst | 2 +- layout/Library/.DS_Store | Bin 0 -> 8196 bytes layout/Library/MobileSubstrate/.DS_Store | Bin 0 -> 8196 bytes .../DynamicLibraries/libobjcipc.plist | 13 ++++- 9 files changed, 65 insertions(+), 6 deletions(-) mode change 100644 => 100755 IPC.m mode change 100644 => 100755 interface.h create mode 100644 layout/.DS_Store create mode 100644 layout/DEBIAN/.DS_Store mode change 100644 => 100755 layout/DEBIAN/control create mode 100644 layout/Library/.DS_Store create mode 100644 layout/Library/MobileSubstrate/.DS_Store mode change 100644 => 100755 layout/Library/MobileSubstrate/DynamicLibraries/libobjcipc.plist diff --git a/IPC.m b/IPC.m old mode 100644 new mode 100755 index 6358ede..3ca5b2a --- a/IPC.m +++ b/IPC.m @@ -7,6 +7,7 @@ // #import +#import #import #import #import @@ -47,13 +48,41 @@ static inline void socketServerCallback(CFSocketRef s, CFSocketCallBackType type } } +@interface BSAuditToken : NSObject + +- (int)pid; + +@end + +// I don't think the first arugment even is a BSAuditToken, leaving it as a +//TODO: find actual function parameters to check if SpringBoard is requesting or some other proc +static BOOL (*original_BSAuditTokenTaskHasEntitlement)(BSAuditToken *token, NSString *entitlement); +static inline BOOL replaced_BSAuditTokenTaskHasEntitlement(BSAuditToken *token, NSString *entitlement) +{ + + if ([entitlement isEqualToString:@"com.apple.multitasking.unlimitedassertions"]) { + + // override the original result + // as mentioned, trying to access the first parameter crashes the device, and since it's happening on assertiond, it'll look like a bootloop. we could've used [token pid] == pidForProcess... or [token bundleIdentifier] + + return YES; + } + + return original_BSAuditTokenTaskHasEntitlement(token, entitlement); +} + static OBJCIPC *sharedInstance = nil; @implementation OBJCIPC + (void)load { - if ([self isBackBoard]) { + if( [self isassertiond]) { + // replace the function. testing if is iOS 8 by checking if it responds to iOS 8-only method + if([[NSProcessInfo processInfo] respondsToSelector:@selector(operatingSystemVersion)]) { + MSHookFunction(((int *)MSFindSymbol(NULL, "_BSAuditTokenTaskHasEntitlement")), (int*)replaced_BSAuditTokenTaskHasEntitlement, (void**)&original_BSAuditTokenTaskHasEntitlement); + } + } else if ([self isBackBoard]) { // load the library dlopen(XPCObjects, RTLD_LAZY); @@ -79,6 +108,19 @@ + (void)load { } } ++ (BOOL)isassertiond { + + static BOOL queried = NO; + static BOOL result = NO; + + if(!queried) { + queried = YES; + result = [[NSProcessInfo processInfo].processName isEqualToString:@"assertiond"]; + } + + return result; +} + + (BOOL)isSpringBoard { static BOOL queried = NO; @@ -230,7 +272,12 @@ + (BOOL)launchAppWithIdentifier:(NSString *)identifier stayInBackground:(BOOL)st SpringBoard *app = (SpringBoard *)[UIApplication sharedApplication]; SBApplicationController *controller = [objc_getClass("SBApplicationController") sharedInstance]; - SBApplication *application = [controller applicationWithDisplayIdentifier:identifier]; + SBApplication *application = nil; + if([[NSProcessInfo processInfo] respondsToSelector:@selector(operatingSystemVersion)]) { + application = [controller applicationWithBundleIdentifier:identifier]; + } else { + application = [controller applicationWithDisplayIdentifier:identifier]; + } if (application == nil) { IPCLOG(@"App with identifier <%@> cannot be found", identifier); diff --git a/interface.h b/interface.h old mode 100644 new mode 100755 index 9a6306d..3f4571d --- a/interface.h +++ b/interface.h @@ -39,6 +39,7 @@ typedef enum + (instancetype)sharedInstance; - (SBApplication *)applicationWithDisplayIdentifier:(NSString *)identifier; +- (SBApplication *)applicationWithBundleIdentifier:(NSString *)identifier; @end diff --git a/layout/.DS_Store b/layout/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..a59d260044493c5fed6ad2d7e236d6ce027ce7fe GIT binary patch literal 10244 zcmeHMO>Epm6n<}$CZ4)!XPc%?o6>F-2&s~mBvqAADC};Mme7=j=4bO$SiEbK7#usS zo!y2gQUn4)`4b>691v=O@^gU$C%7O)LBN4S4iv$O8z&^-&>L?&PRLJ#xRjqVW6ivo zH}mZAH{bf{y#)YFPn)d(2>{Tj3duK7bCn|IMO{;3k*1O)l085Q?#Y$>shs2G)~r?v zg@8gpA)pXY2q*;p4G56W7DdygRINflA)pXgLO^^U5>$muMsi-t@Y6v}7y^(iCv{k; zPjNtKlZa$8lJioArgTpkJz!*tQHX)koaPf^Imu)s=cSb9fYKZ=dNM{43WiT7yF|Dg zFe#;K6#@!@wFrpVy#l(R8`99TDt^C`n{sSFXlc2Ov9j_F6_py>sEdooH{RDj;g$LW zBbfHnMqw-**`}3?`h7+)vDhE*JZGtIiO)72B`_Q<%ms?8cKggc%&g zF*I=!U7W&4a2}t=bNCFtg0JC4xu4h~*}CL-vBh_&x8fH_WQ#IrvCLJ;c5L(U?tg}C zm#YNDwpMSe*&cB&y>w&RzO$wr4#G4-&bovmsk} z<$_qv_Obeq%^bq9-k>*XL}eb6(@pvTK~!EQXF~#-jBk*$L_I-TUM^>kFrwTE#w+CT zPCX?U$ThjRLGNZ7$F*ep6RMpjqP-6v!zVxqKZ^lM! z!e*jZJ5lQh-iAl<7#_zSyc>IQkSI2cBO%2s9LEWK2z?B&h$WoC$MA7{0-waE@I`zH zUlycWMY+2c$tGn;$rY3<_7_~obH{03(6kbI!G;_Zz@R#_ET#Lub_uIsQBFZQg=^^) z*3wP61?3j5v0GT_Dbz?Ipb)rT5h#-{mJs>>?)Crwzg}Noy_Z5jAwURVc~^f|T6ETd zL*&{MR3D%!idZ)H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0= 7.0), mobilesubstrate -Version: 1.0.1 +Depends: firmware (>= 7.0), mobilesubstrate (>= 0.9.5101) +Version: 1.0.2 Architecture: iphoneos-arm Description: Maintainer: Alan Yip diff --git a/layout/DEBIAN/preinst b/layout/DEBIAN/preinst index 5e3a025..8a62e5a 100755 --- a/layout/DEBIAN/preinst +++ b/layout/DEBIAN/preinst @@ -5,7 +5,7 @@ cydia=($CYDIA) if [[ $1 == install || $1 == upgrade || $1 == reinstall || $1 == remove ]]; then if [[ ${CYDIA+@} ]]; then - eval "echo 'finish:restart' >&${cydia[0]}" + eval "echo 'finish:reboot' >&${cydia[0]}" fi fi diff --git a/layout/Library/.DS_Store b/layout/Library/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..9a0defeddc124ee239557b855af68fe7b699aca4 GIT binary patch literal 8196 zcmeHMO>h)N6n<|LV44x=B?OiqVW}vF%7O_Lm58Fdn*>Bi5!oc0gy=fE(~{B2%(^qX z3sR}t($Z4!r_}P|!LmTbpNk$m>BX`{OFekVK`cFa^JJBJ;O6V;*$4^9%|E8My1(w% z@6Ggl^Ud_WT>!vr)$9RC0DwkSBG;+8N|E!jE-JCm(n5$74`73U98{qQ-XibF5HS!j z5HS!j5HS!j@NZy%_H0?SYwY`KHfkdVA_i_q2ITu8NmXJx#D>D))j>^=0uZ*6IVjYp zJRpckhL{eqp)d%gW2)={!%z%U3{>GXpOo%|=@1(VRXCsu2Mo`QVTOXi*(oj=xC5pY zMs37E#K2+(WbVEShQOtq-MS)w_n`s?_#ldPuUxd)1NNz_Th@CQRuMYh%w8vik5BpCp9KN1)ex{s;9R%mF(Ly zn@XPQ>F(Q|O7`BdYj&2up=lep@5u~JlxI($J@@8YZ=ZkXv(FVX7`|PgZ2?mku1}Ng z)rJ*KvHP1eeK$`N({IYOXZs7BS3Pl5*oJS_#DL)oufSJ%#N5G>>x36n;PH}Sm#X9> zGPa$w9v5D|313Ulzq!}yfIPn2pQAfTd{WI zmRq*(+}*ctZsjT-XKk!KUz3#CVze&VoG`qSa7@cNK1m!qzV)yrDl8t0vk}Lb5h^O7 zZ(#f*ZOWu|4Y{WDF@qUBp>Ni-W76JV5!5O(+p2dkZfGMOtxX+b8|!4;Vpp1K1uNKD?8!x#tGqgfanfK~ua(byqvm-KxXouCpFea5o%b$AY*hZo>Qcn!|M`|u%r z3>V-F_zJ#;Z{Z?*4?n<<@H6}hzrpW_xEys{fh(~MH{s2=1(SFy?!?=%2X|o~W-yBb zIEX_yhIyRCV`$b5oQYeN-g=kH=5ugjGah()O(P)Sn-3-0ihB3zePzd_%`HeXBB zqa-(RBG3dn?o?xx9Oc4iJQmNbeFzEN|(2&*+7ye<4e>miBZa!x2oB_ zj6`^d@ug~bkDig5s`+Z^KUP!W0Rvm&CRg@5Ft$9}nO`ybllKD2Z+yCj!w4JdV@&2zuya4eNLkpTH;a zDSR5A!I$u5d_~G|fe7zy%1>caq*q#_(SMf#x%X2^$ozls+Q0t?PEivv5HaxoWB^+S zasyeqw&vH5g_kLF?IhKQsLCS!8VZ9DYJzl}Fi6J<=l?LIev({eOghAdLb6c#+kXg% O_Wx-A50rOfH-7+jpwS}$ literal 0 HcmV?d00001 diff --git a/layout/Library/MobileSubstrate/.DS_Store b/layout/Library/MobileSubstrate/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..4e2f7356eee705f8b51ee151830a17304cb8b522 GIT binary patch literal 8196 zcmeHMT}&KR6h3F6WiBJ_-2&~l)OHPuRG3x<)>{ZDJeh8pRThz(=u_G!JS#4 z5)w4gsIeL~#>5Aspw?)7@IfE+!5CvT_C=G%h*4jB^T|Yg=$q%xoh1c|`lL;mySeAP z_uPAC?tJsjT+RRhn9S=<05Jeis0!pNnVS?bF6xF72|PuFNbvwuU_utokj-qE9Xdh= zLIy$xLIy$xLI!RH258R~McHKEm!qK#83-BJk_?FVL!7F>M1YGD{Z|JWKLsExCbwUx zO?iMH6Av&E;G#r7l#VI02Mj_nNHI``(|BA=CrkvmC{cz3%5cEo%ot=S=%1b9;{J5N zgv8K>41^49WI*KZ9J=5l*r2V+-*eQ@Q6_JIo0)Z|GnSK~xz{t(mg#zpjVl-_D&Dre zL}8_>`0;4z0|S%J?0~0vc{i!$#{HhD8=0WpuX&S&_Mqcft8FbaY#Os^UeW2;o@Uxc z?uO8blxgeEY|_cwx;rr-kC!raZ!*m*`*X$&h4yQJbK#F67sUU+6{`OUZ9zWmPTUr25+c)vjTIe3zi)?6hY(wmWR(Ttdc_ zcguEH9lZ0<;UjJLU)!;hM_DMHv_V&YVG3y4f9SHRGBx=+fHcA!=AH<1QO~ zm~N~Ltz!)e*V&MzWeiKY8dxN#PsFnA-I?*T_Tq0 z@4~})FE(K_wqXY*u?xGg4~H>@V>pgFPN9v{_y{iI)A$0uf^XmwF5~<75q>IH6)DK` zr0f?genzc-e2z(;!E+o*-Bg}E6(_s@A9=2n2~qAUuc+J|s5H5Hm)G6c8#U(3O6tbf zQ$a7jV%LgvPi*f#bw4|>nH+{lj>ep?FJ5xZpH12o!s3eT)~K}#X`e^@E~`@;gtB>& z9Q75eGrmoZl2(Pvd9fUAXQa_y#<$DS6Rg93vN*_ojoQr=jvHn8HzHgj34Tlhyb9mK zckna(0>8m^l3fW#aSz6@iez^H@5WlZ2kWo_@55F+itTueMAw6-@HF<~AP$lEMo4~H zlHYl}fF|b9#XQd796pAR;}iHKK1E`D5nsZW@wIg_JXH{&M7+GVANFo#2E^V^B_{I! zZhC!$-vN9+LK8Bur5M2Cu7R#3U2@@%i}hD8a_u Date: Fri, 14 Nov 2014 16:26:41 +0100 Subject: [PATCH 2/2] Improved code --- IPC.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/IPC.m b/IPC.m index 3ca5b2a..5e131b5 100755 --- a/IPC.m +++ b/IPC.m @@ -77,7 +77,7 @@ @implementation OBJCIPC + (void)load { - if( [self isassertiond]) { + if( [self isAssertiond]) { // replace the function. testing if is iOS 8 by checking if it responds to iOS 8-only method if([[NSProcessInfo processInfo] respondsToSelector:@selector(operatingSystemVersion)]) { MSHookFunction(((int *)MSFindSymbol(NULL, "_BSAuditTokenTaskHasEntitlement")), (int*)replaced_BSAuditTokenTaskHasEntitlement, (void**)&original_BSAuditTokenTaskHasEntitlement); @@ -108,7 +108,7 @@ + (void)load { } } -+ (BOOL)isassertiond { ++ (BOOL)isAssertiond { static BOOL queried = NO; static BOOL result = NO; @@ -273,7 +273,7 @@ + (BOOL)launchAppWithIdentifier:(NSString *)identifier stayInBackground:(BOOL)st SBApplicationController *controller = [objc_getClass("SBApplicationController") sharedInstance]; SBApplication *application = nil; - if([[NSProcessInfo processInfo] respondsToSelector:@selector(operatingSystemVersion)]) { + if([controller respondsToSelector:@selector(applicationWithBundleIdentifier:)]) { application = [controller applicationWithBundleIdentifier:identifier]; } else { application = [controller applicationWithDisplayIdentifier:identifier];