小谷秃头合集服务器
有些
app
也会作反越狱操做
和防越狱插件
markdown
不太小谷以为没有必要这么绝。毕竟人家是越狱手机的话,直接掐死就不太好了~app
防盗版
吧BundleID
也称APPID
,每一个应用独一份(其实他的本名是文件ID
)post
兄弟们知道用MonkeyDev重签名
的话,会更改BundleID
。ui
直接上代码了加密
- (void)checkBundleId{
NSDictionary *infoDic = [[NSBundle mainBundle] infoDictionary];
NSString *bundleID = [infoDic objectForKey:@"CFBundleIdentifier"];
if (![bundleID isEqualToString:@"服务器请求的bundleID"]) {
//防御措施
NSLog(@"防御措施");
}
}
复制代码
钉钉
好像是用到这个了。spa
检查重签名
的原理:是检查权力配置文件embedded.mobileprovision
的 UUID
和帐户的前缀
插件
若是应用被重签名,帐户的前缀
和 UUID
会不同。因此咱们能够经过这种方法检查重签名code
我估计兄弟们都玩过这个orm
embedded.mobileprovision
不是标准的plist
文件。因此咱们要经过处理把他变成plist
文件,而后在检测上代码了
//检测重签名
- (BOOL)isResign{
NSString * embedProPath = [[NSBundle mainBundle] pathForResource:@"embedded" ofType:@"mobileprovision"];
NSError *error;
NSString *embedProStr = [NSString stringWithContentsOfFile:embedProPath encoding:NSISOLatin2StringEncoding error:&error];
if (embedProStr) {
NSScanner *scanner = [NSScanner scannerWithString:embedProStr];
NSString * contentStr;
BOOL result = [scanner scanUpToString:@"<plist" intoString:&contentStr];
if (result) {
result = [scanner scanUpToString:@"</plist>" intoString:&contentStr];
if (result) {
//格式化字符串
NSString *strPlist = [NSString stringWithFormat:@"%@</plist>",contentStr];
// NSLog(@"plist --> %@",strPlist);
//plist --> dic
NSData * data = [strPlist dataUsingEncoding:NSUTF8StringEncoding];
NSError *errordic;
NSDictionary *dicPlist = [NSPropertyListSerialization propertyListWithData:data options:0 format:0 error:&errordic];
//若是没有错误
if (!error) {
//能够查看UDID和签名前缀
NSLog(@"dicPlist --> %@",dicPlist);
//UUID
NSString *UUIDStr = [dicPlist objectForKey:@"UUID"];
//签名前缀
NSArray *prefixArr = [dicPlist objectForKey:@"ApplicationIdentifierPrefix"];
NSString *appPrefix = [prefixArr firstObject];
//判断 这里能够作一个服务器请求,具体判断根据本身的项目来!!
if ([UUIDStr isEqualToString:@"7a016e01-31c1-4f6e-bfee-998245a9063a"] && [appPrefix isEqualToString:@"9536852PXS"]) {
//说明没有重签名
NSLog(@"没有重签名");
return false;
}else{
NSLog(@"重签名应用");
return true;
}
}
}
}
return true;
}
return false;
}
复制代码
dicPlist
的打印这个就能够防止重签名应用了
还有一种更帅气的检测
。(偷偷的告诉兄弟们,这个小谷曾经在用,感受不错~,不过咱们公司的iOS包
很差过审(什么版号的问题),而后小谷只能把这个去掉了~)
App Store
下载的应用,在 loadCommand
中的 LC_ENCRYPTION_INFO_64
段会有加密状况
若是没有加密,必定不是从App Store下载
的,或者逆向大佬操做过了
给兄弟们对比下加密
和未加密
的
咱们的
砸壳
,也会把这个值改掉
dyld源码
或者fishhook的源码
就比较好理解查找了~)#include <execinfo.h>
#import <mach-o/ldsyms.h>
//是不是从App Store下载的(这里小谷只判断LC_ENCRYPTION_INFO_64,毕竟如今大多数都不主持32位了)
- (BOOL)isAppStore{
const uint8_t *command = (const uint8_t *) (&_mh_execute_header + 1);
for (uint32_t idx = 0; idx < _mh_execute_header.ncmds; ++idx)
{
if (((const struct load_command *) command)->cmd == LC_ENCRYPTION_INFO_64)
{
struct encryption_info_command *crypt_cmd = (struct encryption_info_command *) command;
printf("crypt_cmd--cryptid,%d\n",(uint32_t)crypt_cmd->cryptid);
if (crypt_cmd->cryptid == 0) return false;
if (crypt_cmd->cryptid == 1) return true;
}
else
{
command += ((const struct load_command *) command)->cmdsize;
}
}
return false;
}
复制代码
兄弟们能够试一下
这个就是和我原先博客写的代码签名原理
差很少,就是把一块重要代码块,进行MD5比较
若是有更改 --> MD5就会改变,作到防御的目的
这几种方法仍是比较流行的。兄得们能够在项目中用起来试试
但愿能够和兄弟们共同探讨技术!😆,而后,小谷去加班了~