小谷禿頭合集服務器
有些
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就會改變,作到防禦的目的
這幾種方法仍是比較流行的。兄得們能夠在項目中用起來試試
但願能夠和兄弟們共同探討技術!😆,而後,小谷去加班了~