Tweak原理分析、DYLD源码分析找到防护突破口、修改RESTRICT段防护Tweak、参考dyld源码防护

一、Tweak原理分析

1、获取APPID,com.tencent.xin


2、theos创建


3、cd进来,make编译一下,生成隐藏文件.theos,最后是把theosDemo.dylib注入到手机

4、make package一下,生成packages文件。make package打包,打包成deb的包。安装的时候其实就是安装的这个.deb的包

5、make install注入。微信重启了,Cydia中出现theosDemo


6、打开iFunBox,在Device/Library/MobileSubstrate/DynamicLibraries中会出现theosDemo.dylibtheosDemo.plist
注意点:正常情况下这里是会出现的theosDemo.dylibtheosDemo.plist,但是我这里用theos它没有出现,用Monkey写Tweak,他就出现了。这是为什么了? 待解决中

7、打开Xcode,可以看到打印

8、把手机上的MachO拷贝出来,用MachOView打开,Load Commands中并没有theosDemo。所以咋们的越狱插件是通过DYLD_INSERT_LIBRARIES环境变量插入的。

两种方式
1、Framework注入、修改了MachO
2、DYLD_INSERT_LIBRARIES环境变量插入,MachO没有改变

二、DYLD源码分析找到防护突破口


搜索DYLD_INSERT_LIBRARIES

command+shift+j

来到5693行;pruneEnvironmentVariables(envp, &apple);移除环境变量; gLinkContext.processIsRestricted 保证这个为真,就可以移除环境变量

processIsRestricted搜索一下,看这个属性是在那里赋值的。processIsRestricted = true

搜索一下hasRestrictedSegment。所以如果MachO中segname__RESTRICTsectname__restrict,则hasRestrictedSegment(mainExecutableMH)为ture,则gLinkContext.processIsRestricted为true,则环境变量移除,则不会插入动态库

三、修改RESTRICT段防护Tweak

1、创建一个普通的工程


2、theos创建一个Tweak

3、把Tweak拖入Sublime Text。编写logos,然后保存一下

4、theos执行makemake package;make install。应用重新启动了

5、command+shift+2Open Console
注意:正常情况下这里是会打印不好意思我把你干掉了,但是我这里用theos它没有出现,用Monkey写Tweak,它就打印了。这是为什么了? 待解决中(同上面的问题)

下面的是用Monkey写的Tweak。成功了。

6、Other Linker Flags 添加-Wl,-sectcreate,__RESTRICT,__restrict,/dev/null。然后编译一下

查看MachO,如图所示,生成了Section64(__RESTRICT,__restrict)

7、command+R运行项目。打印点击了屏幕,防住了。

8、把App拷贝下来,查看MachO。


9、修改二进制,破坏防护

保存,退出MachOView,在此打开MachOView
Snip20191223_24.png

10、再把MachO拷贝回手机,scp -P 12345 -r ~/Desktop/antiTweak.app root@localhost:/var/mobile/Containers/Bundle/Application/07DDF178-A970-4227-A3B4-644944E25E9F/
注意:此时的app启动不了,因为破坏了签名

11、重签名。创建一个MonkeyApp项目,项目名随便取,Bundle Identifier也随便取,我这里取了一个和原工程一样的。然后重新运行MonkeyApp项目。



打印不好意思我把你干掉了,说明成功了。

四、参考dyld源码防护

1、dyld源码



2、原项目按如下方式修改。并且Other Linker Flags中也添加了-Wl,-sectcreate,__RESTRICT,__restrict,/dev/null

#import "ViewController.h"
#import <mach-o/loader.h>
#import <mach-o/dyld.h>

#if __LP64__
    #define LC_SEGMENT_COMMAND        LC_SEGMENT_64
    #define LC_SEGMENT_COMMAND_WRONG LC_SEGMENT
    #define LC_ENCRYPT_COMMAND        LC_ENCRYPTION_INFO
    #define macho_segment_command    segment_command_64
    #define macho_section            section_64
    #define macho_header             mach_header_64
#else
    #define LC_SEGMENT_COMMAND        LC_SEGMENT
    #define LC_SEGMENT_COMMAND_WRONG LC_SEGMENT_64
    #define LC_ENCRYPT_COMMAND        LC_ENCRYPTION_INFO_64
    #define macho_segment_command    segment_command
    #define macho_section            section
    #define macho_header             mach_header
#endif

@interface ViewController ()

@end

@implementation ViewController

+ (void)load {
    //根据imagelist可以看出,imagelist 里面第0个是我们自己的可执行文件
    const struct mach_header * header = _dyld_get_image_header(0);
    if (hasRestrictedSegment(header)) {
        NSLog(@"没毛病");
    } else {
        NSLog(@"请删除插件!!!");
    }
    
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    UIAlertController *ac = [UIAlertController alertControllerWithTitle:@"提示" message:@"点击了屏幕" preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction *action = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
    [ac addAction:action];
    [self presentViewController:ac animated:true completion:nil];
    NSLog(@"点击了屏幕");
    
}

static bool hasRestrictedSegment(const struct macho_header* mh)
{
    const uint32_t cmd_count = mh->ncmds;
    const struct load_command* const cmds = (struct load_command*)(((char*)mh)+sizeof(struct 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;
}


@end

3、修改二进制,用MachOView修改,方法如上。

4、重签名。使用MonkeyApp重签名。方法如上。打印请删除插件!!!,说明又防住了,✌️。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容