版主提供了 anti dylib 的文章,http://bbs.chinapyg.com/thread-76158-1-1.html
原理很简单,看下面源代码即可~     

在Build Settings中找到“Other Linker Flags”
在其中加上

-Wl,-sectcreate,__RESTRICT,__restrict,/dev/null

用IDA 载入 /usr/lib/dyld 分析 -- 我的版本是ios7.1.2
结合源代码观看 http://www.opensource.apple.com/source/dyld/dyld-353.2.1/src/dyld.cpp

下面是我拎出来的相关片段:

//
// Look for a special segment in the mach header.
// Its presences means that the binary wants to have DYLD ignore
// DYLD_ environment variables.
//

// 检测目标bin中是否存在 __RESTRICT 或 __restrict 节
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;
}

static bool processRestricted(const macho_header* mainExecutableMH)
{
#if __MAC_OS_X_VERSION_MIN_REQUIRED
// ask kernel if code signature of program makes it restricted
uint32_t flags;
if ( csops(0, CS_OPS_STATUS, &flags, sizeof(flags)) != -1 ) {
if ( flags & CS_ENFORCEMENT ) {
gLinkContext.codeSigningEnforced = true;
}
}
if (flags & CS_RESTRICT) {
sRestrictedReason = restrictedByEntitlements;
return true;
}
#else
gLinkContext.codeSigningEnforced = true;
#endif

// all processes with setuid or setgid bit set are restricted
if ( issetugid() ) {
sRestrictedReason = restrictedBySetGUid;
return true;
}

// <rdar://problem/13158444&13245742> Respect __RESTRICT,__restrict section for root processes
if ( hasRestrictedSegment(mainExecutableMH) ) {
// existence of __RESTRICT/__restrict section make process restricted
sRestrictedReason = restrictedBySegment;
return true;
}
return false;
}

IDA逆向 :
dyld::_main(macho_header const*, unsigned long, int, char const**, char const**, char const**, unsigned long *)
<ignore_js_op>

Anti-Anti-dylib.png (38.25 KB, 下载次数: 0)

下载附件

昨天 18:35 上传

 

patch方案:
1.不要改变原有规则,即对__RESTRICT 区段的检测还是保留,我们可以在 macho 文件里面插入特殊标记,比如(P.Y.G),然后进行检测,如果找到 特殊标记,则进行patch,否则走原始流程,这样在开发tweak的时候,按照我们预先定义的特殊标记即可成功挂载!
2.使用KMP定位到patch点即可!
3.game over!!

最新文章

  1. [转] 利用SET STATISTICS IO和SET STATISTICS TIME 优化SQL Server查询性能
  2. Swift基础语法(三)
  3. 转载jQuery图片放大插件[twiPicZoom]
  4. OSG中的HUD
  5. 《Android 性能测试初探》
  6. 脚本语言&amp;&amp; Performance Testing
  7. Zend Guard Run-time support missing问题的解决
  8. 百度富文本编辑器ueditor使用总结
  9. 解决Windows服务1053错误方法
  10. Cocos2d-x 3.2 Lua演示样例 ClickAndMoveTest(点击移动測试)
  11. 我的 MarkDown 学习笔记
  12. .a与.framework的区别
  13. 【Tomcat】Tomcat配置之请求字符串编码
  14. 2018-2019-2 网络对抗技术 20162329 Exp4 恶意代码分析
  15. ALTER SYSTEM ARCHIVELOG CURRENT挂起案例
  16. Java方法 传值方式
  17. Windows CreateFont:创建自己的字体
  18. centos7 Minimal安装没有ifconfig
  19. 文件的基本操作(python)
  20. 番外篇 之 Win32Api

热门文章

  1. [模板]ST表浅析
  2. jmeter 目录内容分布
  3. mysql 使用inet_aton和inet_ntoa处理ip地址数据
  4. 基于sersync海量文件实时同步
  5. 关于LaaS,PaaS,SaaS一些个人的理解
  6. NodeJs通过async/await处理异步
  7. leetcode73
  8. TCP接入层的负载均衡、高可用、扩展性架构
  9. Exception in thread &quot;main&quot; java.lang.UnsatisfiedLinkError:
  10. leetcode 7 reverse integer 反转整数