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. Pandas 使用入门
  2. Vagrant 管理部署 VirtualBox (推荐使用)
  3. python opencv-4.1.0 cv2.getTextSize()函数 (计算文本字符串的宽度和高度)
  4. python备份发包脚本_Python备份脚本,python
  5. phpredis中文手册——《redis中文手册》 php版
  6. 英特尔核芯显卡控制面板怎么找不到_【全球首发】英特尔第十代Cometlake台式机处理器详解与评测...
  7. jquery插件之thickbox
  8. 3秒搞定!~~ 一亿数据获取前100个最大值
  9. ML/DL常用评估方法
  10. 三个数据集与deploy.prototxt
  11. 景色宜人的openeim001
  12. uva 1329(加权并查集)
  13. 解决IIS7.5及以后中URL文件名有加号或空格导致显示404错误的问题
  14. 开源OA协同办公平台使用教程:O2OA集成WPS
  15. Unknown column 'hghefsdhjd' in 'where clause'
  16. 如何拯救k8s镜像分发的阿喀琉斯之踵
  17. oracle全量拷贝,oracle数据库expdp异机全量备份
  18. KeyStore(示例,出错代码)
  19. html导航栏点击显示该栏内容,点击导航栏,实现下方内容改变
  20. 【操作系统】存储模型(二):虚拟存储技术和置换算法

热门文章

  1. 转载:130 个相见恨晚的超实用网站,一次性分享出来,十倍提高工作效率
  2. 客户端与服务器端交互原理
  3. kernal源码下载地址
  4. 西门子828D系统PLC轴控制伺服刀塔应用
  5. 新形势下,互联网公益应该怎么做?
  6. 最近在读的技术类书籍
  7. vue3项目使用自定义字体font-family
  8. 10月份Github上最热门的开源项目
  9. 计算机技能标准包括哪些,(对口单招计算机技能考试标准.doc
  10. 车流量与人流量AI检测算法在智慧城市中的应用