iOS安全攻防 防 防 防 防不住 . . . . . .

移动端的攻防问题一直存在,一直有问题。
网上有很多前辈总结的经验,我现在站在巨人的肩膀上写个笔记。

先引入头文件

#import <sys/stat.h>
#import <dlfcn.h>
#import <mach-o/dyld.h>
#import <SystemConfiguration/CaptiveNetwork.h>
#import <dlfcn.h>

检测设备越狱

#define ARRAY_SIZE(a) sizeof(a)/sizeof(a[0])
const char* jailbreak_tool_pathes[] = {"/Applications/Cydia.app","/Library/MobileSubstrate/MobileSubstrate.dylib","/bin/bash","/usr/sbin/sshd","/etc/apt","/User/Applications/"
};
+ (BOOL)isJailbroken {//尝试使用NSFileManager判断设备是否安装了如下越狱常用工具for (int i=0; i<ARRAY_SIZE(jailbreak_tool_pathes); i++) {if ([[NSFileManager defaultManager] fileExistsAtPath:[NSString stringWithUTF8String:jailbreak_tool_pathes[i]]]) {return YES;}}//判断cydia的URL schemeif ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://"]]) {return YES;}//使用stat方法来判定cydia是否存在if (checkCydia()) {return YES;}if (printEnv()) {return YES;}return NO;
}#define CYDIA_APP_PATH                "/Applications/Cydia.app"//stat是不是出自系统库
int checkInject()
{int ret;Dl_info dylib_info;char *dylib_name = "/usr/lib/system/libsystem_kernel.dylib";int (*func_stat)(const char*, struct stat*) = stat;if ((ret = dladdr(func_stat, &dylib_info)) && strncmp(dylib_info.dli_fname, dylib_name, strlen(dylib_name))) {return 0;}return 1;
}int checkCydia()
{// first ,check whether library is injectstruct stat stat_info;if (checkInject()) {if (0 == stat(CYDIA_APP_PATH, &stat_info)) {return 1;}} else {return 1;}return 0;
}
//读取环境变量
//这个DYLD_INSERT_LIBRARIES环境变量,在非越狱的机器上应该是空,越狱的机器上基本都会有Library/MobileSubstrate/MobileSubstrate.dylib
char* printEnv(void)
{char *env = getenv("DYLD_INSERT_LIBRARIES");return env;
}

检测网络代理

+ (BOOL)getProxyStatus {NSDictionary *proxySettings = (__bridge NSDictionary *)(CFNetworkCopySystemProxySettings());NSArray *proxies = (__bridge NSArray *)(CFNetworkCopyProxiesForURL((__bridge CFURLRef _Nonnull)([NSURL URLWithString:@"http://www.baidu.com"]), (__bridge CFDictionaryRef _Nonnull)(proxySettings)));NSLog(@"\n%@",proxies);NSDictionary *settings = proxies[0];NSLog(@"%@",[settings objectForKey:(NSString *)kCFProxyHostNameKey]);NSLog(@"%@",[settings objectForKey:(NSString *)kCFProxyPortNumberKey]);NSLog(@"%@",[settings objectForKey:(NSString *)kCFProxyTypeKey]);if ([[settings objectForKey:(NSString *)kCFProxyTypeKey] isEqualToString:@"kCFProxyTypeNone"]){NSLog(@"没设置代理");return NO;}else{NSLog(@"设置了代理");return YES;}
}

禁止动态调试

typedef int (*ptrace_ptr_t)(int _request, pid_t _pid, caddr_t _addr, int _data);
#if !defined(PT_DENY_ATTACH)
#define PT_DENY_ATTACH 31
#endifvoid disable_gdb() {void *handle = dlopen(0, RTLD_GLOBAL | RTLD_NOW);ptrace_ptr_t ptrace_ptr = dlsym(handle, "ptrace");ptrace_ptr(PT_DENY_ATTACH, 0, 0, 0);dlclose(handle);
}+ (void)dynamicDebuggingDisable {
#ifdef RELEASEdisable_gdb(); // 只在release(archive)时调用这个代码
#endif
}

防止重签名、二次打包

+ (void)isSecondIPA:(NSString *)teamId {//teamId:你自己证书的公司IDif(![bundleIDPrefix() isEqualToString:teamId]){exit(0);}
}
//获取组织ID
NSString* bundleIDPrefix() {static NSString*buPreStr=nil;if (buPreStr.length==0) {@try{NSDictionary *query = [NSDictionary dictionaryWithObjectsAndKeys: (id)kSecClassGenericPassword, kSecClass, @"bundleIDPrefix", kSecAttrAccount, @"", kSecAttrService, (id)kCFBooleanTrue, kSecReturnAttributes, nil];CFDictionaryRef result = nil;OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, (CFTypeRef *)&result);if (status == errSecItemNotFound)//iOS Example-iOS 应用安全报告//30 / 33status = SecItemAdd((__bridge CFDictionaryRef)query, (CFTypeRef *)&result);if (status != errSecSuccess)return nil;NSString *accessGroup = [(__bridge NSDictionary *)result objectForKey:(id)kSecAttrAccessGroup];NSLog(@"accessGroup:%@",accessGroup);NSArray *components = [accessGroup componentsSeparatedByString:@"."];buPreStr = [[components objectEnumerator] nextObject];CFRelease(result);}@catch(NSException *ex){}}return buPreStr;
}

检测代码注入

+ (void)checkCodeInjection {if (checkMach_O() || isInjected0() || isInjected1()) {exit(0);}
}bool isInjected0() {int count = _dyld_image_count();//获取加载image的数量if (count > 0) {for (int i = 0; i < count; i++) {//遍历所有的image_name。判断是否有DynamicLibrariesconst char * dyld = _dyld_get_image_name(i);if (strstr(dyld, "DynamicLibraries")) {return YES;}}}return NO;
}bool isInjected1() {//检测环境变量是否有DYLD_INSERT_LIBRARIESchar* env = getenv("DYLD_INSERT_LIBRARIES");if(env){return YES;}return NO;
}bool checkMach_O() {NSBundle *bundle = [NSBundle mainBundle];NSDictionary *info = [bundle infoDictionary];if ([info objectForKey: @"SignerIdentity"] != nil){//存在这个key,则说明被二次打包了return YES;}return NO;
}

END:使用案列

main文件 禁止动态调试

int main(int argc, char * argv[]) {@autoreleasepool {[FQSecurityDefense dynamicDebuggingDisable];return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));}
}

AppDelegate.h文件

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary<UIApplicationLaunchOptionsKey,id> *)launchOptions {dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{if ([FQSecurityDefense isJailbroken]) {NSLog(@"该设备已越狱,请谨慎操作");}if ([FQSecurityDefense getProxyStatus]) {NSLog(@"当前网络已设置代理,请谨慎操作");}//检测代码注入[FQSecurityDefense checkCodeInjection];//防止重签名[FQSecurityDefense isSecondIPA:@"3737DY09YX"];});return true;
}

iOS安全攻防 防 防 防 防不住 . . . . . .相关推荐

  1. 一文看懂设备指纹如何防篡改、防劫持

    一定程度上,设备指纹之于人的重要意义不亚于身分证. 为什么这么说? 大多数人可能都有过这样的经历: 刷短视频时,只要我们点赞了某个视频,那么下一次再刷视频时,系统就会推荐更多类似的视频:当你在某个购物 ...

  2. 某程序员揭秘“开水团”大厂真实福利:工位拥挤,没有食堂!公司防员工跟防贼一样,特别是纸巾和插排都粘到桌子上!...

    坊间都说美团福利差,差到只提供白开水,还因此喜提了"开水团"美称.但美团好歹也是个互联网大厂,它的福利待遇真有传说中那么不靠谱吗?不少人对此存疑,觉得可能有所夸张. 百闻不如一见, ...

  3. 简单的 php 防注入、防跨站 函数

    /*** 简单的 php 防注入.防跨站 函数* @return String*/function fn_safe($str_string) {//直接剔除$_arr_dangerChars = ar ...

  4. 防外挂和防木马的通用解决方案

    [转]防外挂和防木马的通用解决方案 Posted on 2012-01-19 11:30 单鱼游弋 阅读(110) 评论(0) 编辑 收藏 外挂.木马和私服一直网络游戏的三大死敌.一个不小心被任意一个 ...

  5. 技术要求→物理安全→防盗窃和防破坏

    一.要求内容 a)应将主要设备放置在机房内: b)应将设备或主要部件进行固定,并设置明显的不易除去的标记: c)应将通信线缆铺设在隐蔽处,可铺设在地下或管道中: d)应对介质分类标识,存储在介质库或档 ...

  6. 计算机监控防误,计算机监控防误操作系统专利_专利申请于2007-10-25_专利查询 - 天眼查...

    1.计算机监控防误操作系统,其特征是若干组电磁锁,每组电磁锁的信号输出/输入端与一个测控装置的第一信号输入/输出端对应相接:若干个测控装置的第二信号输出/输入端分别与监控五防主机的第一信号输入/输出端 ...

  7. 创宇滤镜|API防刷|短信邮件接口防刷|验证码防刷|搜索防刷 - 知道创宇云安全

    创宇滤镜|API防刷|短信邮件接口防刷|验证码防刷|搜索防刷 - 知道创宇云安全 创宇滤镜|API防刷|短信邮件接口防刷|验证码防刷|搜索防刷 - 知道创宇云安全 posted on 2017-02- ...

  8. 服务器硬防和软防是什么意思?服务器软件防火墙

    硬防:即硬件防火墙,是指把防火墙程序做到芯片里面,由硬件执行这些功能,能减少CPU的负担,使路由更稳定.它是保障内部网络安全的一道重要屏障.它的安全和稳定,直接关系到整个内部网络的安全.因此,日常例行 ...

  9. nRF24L01+组网方式及防撞(防冲突)机制的实战分享

    nRF24L01+组网方式及防撞(防冲突)机制的实战分享 利用多个nRF24L01+模块组网通信的实现方式 防撞(防冲突)机制的实现原理 轮询方式一主多从 时分方式一主多从或多主多从 自主避让方式一主 ...

最新文章

  1. Nature综述:如何获得理想的微生物组
  2. 关于SQLServer2000的全文检索使用心得
  3. 记录遇到的Altium designer显示布线未完成坑
  4. phpstorm 使用技巧
  5. java和python的比较-如何对比Python和Java,只需三分钟告诉你!
  6. 平方剩余(二次剩余)
  7. python常见的数据转化函数
  8. sqlite常见使用总结
  9. 操作系统——文件的逻辑结构
  10. 北京航空航天大学计算机科学与工程系,北航郑征主页 北京航空航天大学教师个人主页系统...
  11. Tomcat 8.5 配置 SSL 证书
  12. 你真的了解分层架构吗?——写给被PetShop毒害的朋友们 (转)
  13. 国家邮政局:前10月邮政行业业务收入同比增长17.8%
  14. python接口自动化参数化_python接口自动化-参数化
  15. it专员职责_【IT专员工作内容|工作职责|IT专员做什么】-看准网
  16. Whl自助搜索下载器
  17. 面试题(Qt + 函数指针)
  18. 厉害了!3分钟搞定开发部署,这个霸榜的AI开源项目大公司都在用
  19. Atitit 研发体系 codelib 代码库的建设 目录 1. 概念与组成 2 1.1. Java代码 2 1.2. Js代码 2 1.3. H5 代码 js+css+htm+txt 2 1.4.
  20. Weblogic的下载、安装、使用

热门文章

  1. CSS自适应实现图标右上角消息数字提示
  2. 我的收藏精品[把它共享出来,相信对大家有点用,毕竟是长时间收藏的](2)
  3. 开源库存管理php,GitHub - wofengliming/stock: ThinkPHP库存管理
  4. Express Invoice Plus for Mac是什么软件?Mac发票管理软件推荐!
  5. 图片隐写术/图片文件隐写/Exif工具
  6. 质量基础设施一站式服务平台建设,NQI线上系统开发方案
  7. CATIA V5焊接夹具2D出图到3D实战设计视频教程
  8. 录像:在VS Orcas和ASP.NET中使用LINQ (第一部分)
  9. html常见的错误,常见的6种HTML5错误用法
  10. 2015年国际奥数平面几何题欣赏