2017年最后一更... ...
其实,道高一尺,魔高一丈,关于iOS App安全是个攻防不断(恶心🤢)的过程。
一、先说判断设备是否越狱的几种情况
A.设备越狱普遍都会有以下文件
"/Applications/Cydia.app",
"/Library/MobileSubstrate/MobileSubstrate.dylib",
"/bin/bash",
"/usr/sbin/sshd",
"/etc/apt"
B.判断是否存在cydia应用
至于cydia应用是干什么的,这里就不做说明,可以点击去了解下。
C.能够读取系统所有的应用名称
非越狱手机是无法获取系统应用参数的。
D.读取环境变量 DYLD_INSERT_LIBRARIES
非越狱手机DYLD_INSERT_LIBRARIES获取到的环境变量为NULL。
结合以上条件,就可以判断设备是否越狱,文章最下面会贴上github地址。
// 常见越狱文件
const char *Jailbreak_Tool_pathes[] = {
"/Applications/Cydia.app",
"/Library/MobileSubstrate/MobileSubstrate.dylib",
"/bin/bash",
"/usr/sbin/sshd",
"/etc/apt"
};
char *printEnv(void){
char *env = getenv("DYLD_INSERT_LIBRARIES");
return env;
}
/** 当前设备是否越狱 */
+ (BOOL)isDeviceJailbreak
{
// 判断是否存在越狱文件
for (int i = 0; i < 5; i++) {
if ([[NSFileManager defaultManager] fileExistsAtPath:[NSString stringWithUTF8String:Jailbreak_Tool_pathes[i]]]) {
NSLog(@"此设备越狱!");
return YES;
}
}
// 判断是否存在cydia应用
if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://package/com.example.package"]]){
NSLog(@"此设备越狱!");
return YES;
}
// 读取系统所有的应用名称
if ([[NSFileManager defaultManager] fileExistsAtPath:@"/User/Applications/"]){
NSLog(@"此设备越狱!");
return YES;
}
// 读取环境变量
if(printEnv()){
NSLog(@"此设备越狱!");
return YES;
}
NSLog(@"此设备没有越狱");
return NO;
}
二、ipa文件被篡改
可以从反编译过来的程序安装包获取二进制文件或者图片等文件,进行修改之后替换回到安装包中。对于设备已经越狱的用户,大多数更倾向于从网上下载ipa安装包进行安装。攻击者修改文件内容并诱骗给用户安装,会造成用户敏感信息被窃取的风险。
检测ipa文件是否被篡改可以通过以下方法:
- 通过对CodeResources读取资源文件原始hash,和当前hash进行对比,判断是否经过篡改,被篡改过的文件应从服务器重新请求资源文件进行替换;
- 可以通过检测SignerIdentity判断是Mach-O文件否被篡改;
- 可以通过检测cryptid的值来检测Mach-O文件是否被篡改,篡改过cryptid的值为1。
这里主要介绍方法2.通过检测SignerIdentity判断是Mach-O文件否被篡改
原理是:SignerIdentity的值在info.plist中是不存在的,开发者不会加上去,苹果也不会,只是当ipa包被反编译后篡改文件再次打包,需要伪造SignerIdentity。
NSBundle *bundle = [NSBundle mainBundle];
NSDictionary *info = [bundle infoDictionary];
if ([info objectForKey:@"SignerIdentity"] != nil)
{
return YES;
}
return NO;
如果不是很明白可以参考文章:
iOS平台游戏安全之IPA破解原理及防御