iOS安全—阻止tweak注入hook api【转】

作者: Detailscool | 来源:发表于2016-09-22 11:07 被阅读636次

    在网上看到一种方法可以通过在Other Linker Flags中添加:

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

    的方法来阻止dylib注入。

    便动手试了一下,编写一个测试Demo不添加任何linker flags,然后使用theos对其进行hook。

    Snip20151110_8

    启动后使用image list –o –f 来查看加载的动态库:
    [145] 0x0025f000 /Library/MobileSubstrate/MobileSubstrate.dylib(0x000000000025f000)
    [152] 0x003c0000 /Library/MobileSubstrate/DynamicLibraries/TestLog.dylib(0x00000000003c0000)
    发现我们用来hook编写的dylib已经被加载,自然能看到hook成功的log。
    2015-11-10 15:21:50.824 myTest[21906:273137] viewDidLoad — 你已经被我Hook了。。。。。。

    然后使用linker flags:

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

    重新编译生成。

    运行后在所有加载的动态库中已找不到hook的dylib,hook失败了,说明这是有效的。

    再来看看生成的macho文件多了一个__RESTRICT/__restrict section。

    Snip20151110_9
    为什么加了这样的一个section就能阻止dylib注入了呢?

    在这里找到了答案:http://www.opensource.apple.com/source/dyld/dyld-210.2.3/src/dyld.cpp

    if ( removedCount != 0 ) {        
          dyld::[log](http://www.opengroup.org/onlinepubs/009695399/functions/log.html)("dyld: DYLD_ environment variables being ignored because ");        
          switch (sRestrictedReason) {            
                case restrictedNot:               
                 break;            
                case restrictedBySetGUid:                
                 dyld::[log](http://www.opengroup.org/onlinepubs/009695399/functions/log.html)("main executable (%s) is setuid or setgid\n", sExecPath);                
                break;            
              case restrictedBySegment:                
                dyld::[log](http://www.opengroup.org/onlinepubs/009695399/functions/log.html)("main executable (%s) has __RESTRICT/__restrict section\n", sExecPath);                
                 break;            
              case restrictedByEntitlements:                
                dyld::[log](http://www.opengroup.org/onlinepubs/009695399/functions/log.html)("main executable (%s) is code signed with entitlements\n", sExecPath);                
                break;       
           }    
    }
    

    也就是说下面三种情况,可以让环境变量:DYLD_INSERT_LIBRARIES被无视
    1.Set restricted status by entitlements
    This option is only available to applications on OS X with special entitlements.

    2.setuid and setgid
    Any application that makes these two calls are going to be marked as restricted by the linker as a security measure.

    3.Restricted Segment of Header
    The final way to mark a binary as restricted is by telling the linker to add new section to the binary header that is named “__RESTRICT” and has a section named “__restrict” when you compile it.

    所以编译生成的含有__RESTRICT/__restrict section的app会忽略DYLD_INSERT_LIBRARIES。

    当然解决办法也是有的,把section的名字修改一下即可。
    用010 editor打开可执行文件,找到section的名字:

    Snip20151110_10
    手动修改其为另外的一个字符串,结果如下:
    Snip20151110_12
    再用MachOView打开,确认没有改错:
    Snip20151110_13
    然后重新签名,安装app.

    又可以成功注入了!

    参考链接:
    http://bbs.iosre.com/t/tweak-app-app-tweak/438
    http://www.opensource.apple.com/source/dyld/dyld-210.2.3/src/dyld.cpp
    http://www.samdmarshall.com/blog/blocking_code_injection_on_ios_and_os_x.html

    转自 iOS安全—阻止tweak注入hook api

    后记

    关于注入linker flags之后通常会出现看不到Hierachy的现象。所以本尊一般会把其放在Release位置。

    相关文章

      网友评论

      • 不会骑名字:请问你是怎么重新签名的?我使用ldid签名后还是闪退

      本文标题: iOS安全—阻止tweak注入hook api【转】

      本文链接:https://www.haomeiwen.com/subject/fshzettx.html