日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS应用代码注入防护

發(fā)布時(shí)間:2025/3/21 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS应用代码注入防护 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在應(yīng)用開發(fā)過程中,我們不僅僅需要完成正常的業(yè)務(wù)邏輯,考慮應(yīng)用性能、代碼健壯相關(guān)的問題,我們有時(shí)還需要考慮到應(yīng)用安全的問題。
那么應(yīng)用安全的問題涉及到很多方面。比如防止靜態(tài)分析的,代碼混淆、邏輯混淆;防止重簽名的,應(yīng)用ID檢測、甚至是代碼的HASH檢測等等。那么這篇文章我想聊聊關(guān)于代碼的注入檢測,因?yàn)榘l(fā)現(xiàn)隨著iOS系統(tǒng)的更新,我們防護(hù)的手段發(fā)生了一些變化。

代碼注入的方式

代碼注入的方式大致分為兩種

  • 越獄注入:通過修改DYLD_INSERT_LIBRARIES 環(huán)境變量的值,來插入動(dòng)態(tài)庫并執(zhí)行
  • 非越獄注入:
    • 直接將自定義的Framwork或者dylib庫打包進(jìn)入APP并重簽名。
    • 利用yololib修改MachO文件,添加庫路徑.在應(yīng)用啟動(dòng)時(shí),dyld會(huì)加載并執(zhí)行.

早期防護(hù)方式

在工程的Build Settings中找到Other Linker Flages 并添加字段
-Wl,-sectcreate,__RESTRICT,__raestrict,/dev/null
此操作的作用是在可執(zhí)行文件中添加一個(gè)Section.我們使用MachOView分析如下:

當(dāng)MachO文件中擁有這個(gè)字段,那么我們通過越獄環(huán)境插入動(dòng)態(tài)庫的方式就會(huì)失效.起到防護(hù)的作用.其原理在DYLD源碼中可以分析到.

dyld源碼分析

首先這里分析的DYLD源碼版本是519.2.2版本.
我們可以通過檢索DYLD_INSERT_LIBRARIES定位到_main函數(shù)加載插入動(dòng)態(tài)庫的代碼如下.

// load any inserted librariesif ( sEnv.DYLD_INSERT_LIBRARIES != NULL ) {for (const char* const* lib = sEnv.DYLD_INSERT_LIBRARIES; *lib != NULL; ++lib) loadInsertedDylib(*lib);}

但是早在這個(gè)環(huán)境變量判斷之前,dyld已經(jīng)做了一個(gè)判斷

if ( gLinkContext.processIsRestricted ) {pruneEnvironmentVariables(envp, &apple);// set again because envp and apple may have changed or movedsetContext(mainExecutableMH, argc, argv, envp, apple);}

如果判斷出進(jìn)程是restricted!也就是當(dāng)前進(jìn)程是限制插入動(dòng)態(tài)庫的!就會(huì)調(diào)用pruneEnvironmentVariables函數(shù)移除相關(guān)的環(huán)境變量.
那么我們的processIsRestricted值什么時(shí)候?yàn)閠rue呢?
繼續(xù)分析源碼可以發(fā)現(xiàn)兩個(gè)關(guān)鍵函數(shù)影響其值.其中 hasRestrictedSegment 函數(shù)專門檢測RESTRICT段

// any processes with setuid or setgid bit set or with __RESTRICT segment is restrictedif ( issetugid() || hasRestrictedSegment(mainExecutableMH) ) {gLinkContext.processIsRestricted = true;}

通過注釋也能發(fā)現(xiàn).任意進(jìn)程的__RESTRICT段設(shè)置為restricted動(dòng)態(tài)庫插入將被限制.
我們進(jìn)入到processIsRestricted函數(shù)內(nèi),實(shí)現(xiàn)如下.

#if __MAC_OS_X_VERSION_MIN_REQUIRED static bool hasRestrictedSegment(const macho_header* mh) {const uint32_t cmd_count = mh->ncmds;const struct load_command* const cmds = (struct load_command*)(((char*)mh)+sizeof(macho_header));const struct load_command* cmd = cmds;for (uint32_t i = 0; i < cmd_count; ++i) {switch (cmd->cmd) {case LC_SEGMENT_COMMAND:{const struct macho_segment_command* seg = (struct macho_segment_command*)cmd;//dyld::log("seg name: %s\n", seg->segname);if (strcmp(seg->segname, "__RESTRICT") == 0) {const struct macho_section* const sectionsStart = (struct macho_section*)((char*)seg + sizeof(struct macho_segment_command));const struct macho_section* const sectionsEnd = &sectionsStart[seg->nsects];for (const struct macho_section* sect=sectionsStart; sect < sectionsEnd; ++sect) {if (strcmp(sect->sectname, "__restrict") == 0) return true;}}}break;}cmd = (const struct load_command*)(((char*)cmd)+cmd->cmdsize);}return false; }

所以通過添加Other Linker Flags 在MachO中設(shè)置RESTRICT段賦值為restricted可以用來防護(hù)越獄的代碼注入.
但是新版的dyld源碼中去掉了__RESTRICT檢測.從iOS10開始,這種防護(hù)手段已失效

DYLD_INSERT_LIBRARIES 檢測

那么既然dyld加載過程不再檢測__RESTRICT段了我們就手動(dòng)的檢測DYLD_INSERT_LIBRARIES環(huán)境變量.通過函數(shù)可查看當(dāng)前進(jìn)程環(huán)境變量的值.

char *env = getenv("DYLD_INSERT_LIBRARIES");NSLog(@"%s",env);

在沒有插入動(dòng)態(tài)庫時(shí),env為null.
那么一旦為自己的應(yīng)用寫入插件時(shí),我們就可以看到控制臺的輸出

2019-01-03 19:20:37.285 antiInject[7482:630392] /Library/MobileSubstrate/MobileSubstrate.dylib

白名單檢測

那么上面的檢測只可以檢測越獄環(huán)境中的代碼注入,在非越獄環(huán)境中,逆向工程師可以利用yololib工具注入動(dòng)態(tài)庫.所以我們可以檢索一下自己的應(yīng)用程序所加載的動(dòng)態(tài)庫是否是我們源程序所有

bool HKCheckWhitelist(){int count = _dyld_image_count();for (int i = 0; i < count; i++) {//遍歷拿到庫名稱!const char * imageName = _dyld_get_image_name(i);//判斷是否在白名單內(nèi),應(yīng)用本身的路徑是不確定的,所以要除外.if (!strstr(libraries, imageName)&&!strstr(imageName, "/var/mobile/Containers/Bundle/Application")) {printf("該庫非白名單之內(nèi)!!\n%s",imageName);return NO;}}return YES; }

其中l(wèi)ibraries變量是<q style="box-sizing: border-box;">白名單</q>.

轉(zhuǎn)載于:https://blog.51cto.com/14039500/2343380

總結(jié)

以上是生活随笔為你收集整理的iOS应用代码注入防护的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美日韩另类在线 | 国产精品免费一区二区三区四区 | 青青草国内自拍 | 中文字幕一区三区 | 婷婷综合精品 | 公交顶臀绿裙妇女配视频 | 汗汗视频 | 日韩爱爱片 | 亚洲va久久久噜噜噜久久天堂 | h片在线免费看 | 强行侵犯视频在线观看 | 一二三不卡视频 | 女人又爽又黄免费女仆 | 懂色tv | 成人交配视频 | 夜夜摸视频网 | 久久久高清免费视频 | 色偷偷888欧美精品久久久 | 好爽又高潮了毛片 | 在线观看的黄网 | 欧日韩av| 中文字幕你懂的 | 波多野结衣在线免费观看视频 | 黄色一级视频免费看 | 97成人在线视频 | 国产精品情侣呻吟对白视频 | www.av色| 麻豆婷婷| 天堂色综合| 91精品在线观看入口 | 真实乱视频国产免费观看 | 亚洲精品乱码久久久久久9色 | 亚洲午夜久久 | 日韩欧美在线不卡 | 色播日韩 | 五月视频 | 少女国产免费观看 | 久久综合伊人77777麻豆最新章节 | 久久亚洲网站 | www在线看片| 欧美激情一区二区三区蜜桃视频 | 国产美女永久无遮挡 | 97精品| 欧美第一页在线观看 | 国产在线一区二 | 成人黄色激情网 | 亚洲三级在线免费观看 | 欧美福利在线视频 | 欧美11p| 黄色片网站视频 | 亚洲成人中文字幕在线 | 国产a免费观看 | 青青青青青青青青草 | 特级西西人体444www高清 | 中文字幕一区二区三区四区 | 18国产免费视频 | 精品一区二区免费 | 日本成人一区二区三区 | 日韩黄网站 | xxxxx18日本| 中文字字幕在线中文乱码 | 91天堂在线观看 | 欧洲色区| 日韩欧美国产精品综合嫩v 国产小毛片 | 欧美 日韩 国产 精品 | 麻豆影视在线免费观看 | 99热精品国产 | 成人激情免费 | 奇米影视第四色777 波多野结衣一区二区三区免费视频 | 亚洲制服丝袜在线播放 | 欧美人妖69xxxxxhd3d | 日韩av在线一区 | 免费在线成人网 | 国产丰满大乳奶水在线视频 | 国产一区二区三区 | 97爱视频| 天堂av在线免费观看 | 国产成人精品一区二区三区四区 | 精品黄色一级片 | 九九九精品视频 | 精品久久久网站 | 肉肉av福利一精品导航 | 91麻豆映画传媒 | 国产激情对白 | 欧美xxxx性xxxxx高清 | 手机在线永久免费观看av片 | 黑人粗进入欧美aaaaa | 日韩精品国产一区二区 | 欧美日韩色图 | 日本一级黄色 | 在线观看黄色av网站 | 99久久久无码国产精品性 | 人人妻人人澡人人爽久久av | 国产精品伦理 | 色www亚洲国产张柏芝 | 欧美xxxx胸大 | 黄色的网站免费观看 | 精品成在人线av无码免费看 | 黄网在线观看免费 |