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閱讀 228,443評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,530評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,407評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,981評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,759評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,204評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,263評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,415評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,955評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,650評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,892評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,675評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,967評論 2 374

推薦閱讀更多精彩內容