iOS逆向?qū)崙?zhàn)--032:越獄防護(hù)

Tweak原理

執(zhí)行make命令時(shí)蜓席,在.theos的隱藏目錄中,編譯出obj/debug目錄课锌,包含arm64撼短、armv7兩種架構(gòu)裙秋,同時(shí)生成RedDemo.dylib動(dòng)態(tài)庫(kù)

arm64访雪、armv7目錄中嘁锯,有各自架構(gòu)的RedDemo.dylib,而debug目錄中的RedDemo.dylib志鞍,是一個(gè)Fat Binary文件

file RedDemo.dylib
-------------------------
RedDemo.dylib: Mach-O universal binary with 2 architectures: [arm_v7:Mach-O dynamically linked shared library arm_v7] [arm64:Mach-O 64-bit dynamically linked shared library arm64]
RedDemo.dylib (for architecture armv7):    Mach-O dynamically linked shared library arm_v7
RedDemo.dylib (for architecture arm64):    Mach-O 64-bit dynamically linked shared library arm64

Tweak的編譯產(chǎn)物是動(dòng)態(tài)庫(kù)瞭亮,將其注入的方式有兩種:

  • 修改MachO文件的Load Commands,注入LC_LOAD_DYLIB (XXX)固棚,然后根據(jù)路徑找到動(dòng)態(tài)庫(kù)统翩。這種方式對(duì)程序的污染比較嚴(yán)重仙蚜,容易被開(kāi)發(fā)者檢測(cè)出來(lái)
  • 通過(guò)DYLD_INSERT_LIBRARIES環(huán)境變量,插入動(dòng)態(tài)庫(kù)

Tweak插件厂汗,使用的是方式二委粉,因?yàn)槌绦驔](méi)有被污染。在MachO中娶桦,并沒(méi)有找到LC_LOAD_DYLIB (XXX)

執(zhí)行make package命令時(shí)贾节,在packages目錄中,生成.deb文件衷畦。每執(zhí)行一次打包命令栗涂,都會(huì)生成一個(gè)新的.deb文件

.deb格式類似于.ipa格式

  • .ipa包通過(guò)AppStore安裝,將.ipa包中的App安裝到設(shè)備中
  • .deb包通過(guò)Cydia安裝祈争,將.deb包中的動(dòng)態(tài)庫(kù)安裝到設(shè)備中

執(zhí)行make install命令時(shí)斤程,在.deb包中的動(dòng)態(tài)庫(kù),會(huì)被安裝到設(shè)備的/Library/MobileSubstrate/DynamicLibraries目錄中

以相同的名稱菩混,分別存儲(chǔ).dylib.plist文件

.dylib為動(dòng)態(tài)庫(kù)暖释,而.plist,記錄.dylib所依附的App包名

DYLD_INSERT_LIBRARIES

在早期的dyld源碼中墨吓,有進(jìn)程限制的判斷。一旦符合條件纹磺,使用DYLD_INSERT_LIBRARIES環(huán)境變量插入的動(dòng)態(tài)庫(kù)將被清空

打開(kāi)dyld-519.2.2源碼

搜索DYLD_INSERT_LIBRARIES

進(jìn)入dyld.cpp文件帖烘,來(lái)到5907

  • DYLD_INSERT_LIBRARIESNULL的判斷

這段代碼的上面,來(lái)到5692

  • 判斷進(jìn)程限制
  • 符合條件橄杨,調(diào)用pruneEnvironmentVariables方法秘症,清空插入的動(dòng)態(tài)庫(kù)

一旦插入的動(dòng)態(tài)庫(kù)被清空,意味著越獄插件將會(huì)全部失效式矫。如果我們找到進(jìn)程限制的開(kāi)啟條件乡摹,并將其使用在項(xiàng)目中,相當(dāng)于對(duì)越獄插件進(jìn)行了防護(hù)

找到processIsRestricted設(shè)置為true的代碼

  • 判斷條件有兩個(gè)采转,分別是issetugidhasRestrictedSegment兩個(gè)函數(shù)
  • issetugid函數(shù)聪廉,無(wú)法在上架的App中設(shè)置,放棄使用
  • hasRestrictedSegment函數(shù)故慈,判斷主程序的MachO是否受限板熊,可以使用

進(jìn)入hasRestrictedSegment函數(shù)

  • 傳入主程序的Header
  • 讀取segment,如果為__RESTRICT
  • 讀取section察绷,如果為__restrict節(jié)
  • 如果都存在干签,返回trur,表示進(jìn)程限制
__RESTRICT段防護(hù)

在項(xiàng)目中拆撼,添加__RESTRICT段容劳,__restrict節(jié)喘沿,開(kāi)啟進(jìn)程限制,對(duì)越獄插件進(jìn)行防護(hù)

搭建App項(xiàng)目竭贩,命名:antiTweak

打開(kāi)ViewController.m文件蚜印,寫(xiě)入以下代碼:

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
   exit(0);
}

進(jìn)程限制,是早期dyld源碼中的邏輯娶视,在低系統(tǒng)下才能生效

使用iOS9.1系統(tǒng)運(yùn)行項(xiàng)目晒哄,點(diǎn)擊屏幕就會(huì)閃退

搭建Tweak插件,附加antiTweak應(yīng)用

打開(kāi)Tweak.x文件肪获,寫(xiě)入以下代碼:

#import <UIKit/UIKit.h>

%hook ViewController

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
   NSLog(@"??????????");
}

%end

安裝插件寝凌,啟動(dòng)應(yīng)用,touchesBegan方法被插件HOOK孝赫。點(diǎn)擊屏幕较木,閃退變?yōu)榇蛴?/p>

antiTweak項(xiàng)目,添加__RESTRICT段青柄,__restrict節(jié)

Build SettingOther Linker Flags中伐债,加入以下設(shè)置:

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

編譯項(xiàng)目,查看MachO文件

  • 成功插入__RESTRICT段致开,__restrict節(jié)

運(yùn)行項(xiàng)目峰锁,點(diǎn)擊屏幕閃退。說(shuō)明插入的動(dòng)態(tài)庫(kù)已被清空双戳,越獄插件全部失效

這種防護(hù)手段虹蒋,在早期系統(tǒng)中比較有效。但在iOS11及更高系統(tǒng)中飒货,dyld源碼發(fā)生變化魄衅,這種方式已失去作用

修改MachO破解

在老系統(tǒng)的越獄設(shè)備上,遇到使用此方式防護(hù)的應(yīng)用塘辅,導(dǎo)致我們的越獄插件無(wú)法使用晃虫,可以通過(guò)修改MachO文件破解防護(hù)

使用MachOView打開(kāi)MachO文件

修改Data值,將72改為73扣墩,52改為53哲银。只在以前的數(shù)值上替換,位數(shù)不要改變

當(dāng)MachO文件修改后呻惕,使用重簽名安裝應(yīng)用盘榨,此時(shí)__RESTRICT段和__restrict節(jié)已經(jīng)不存在了,進(jìn)程限制不會(huì)啟動(dòng)蟆融,越獄插件可正常使用

使用dyld源碼防護(hù)

如果是自己的App草巡,我們開(kāi)啟了進(jìn)程限制,如何禁止攻擊者的肆意修改呢?

借鑒dyld的代碼山憨,循環(huán)讀取segmentsection查乒,如果缺少__RESTRICT段或__restrict節(jié),說(shuō)明我們的防護(hù)代碼被人篡改

延用antiTweak項(xiàng)目郁竟,將dyld中的代碼遷移到項(xiàng)目中

打開(kāi)ViewController.m文件玛迄,寫(xiě)入以下代碼:

導(dǎo)入頭文件

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

添加宏定義

#if __LP64__
   #define macho_header              mach_header_64
   #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
#else
   #define macho_header              mach_header
   #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
#endif

添加hasRestrictedSegment函數(shù),循環(huán)讀取segmentsection棚亩。如果缺少__RESTRICT段或__restrict節(jié)蓖议,返回false

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;

               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;
}

加入load方法,調(diào)用防護(hù)代碼

+(void)load{
   
   struct macho_header* mhmh= _dyld_get_image_header(0);
   
   if(hasRestrictedSegment(mhmh)){        
       NSLog(@"防護(hù)代碼有效");
   }
   else{       
       NSLog(@"被篡改");
   }
}

修改Other Linker Flags中的配置讥蟆,模擬MachO被篡改

-Wl,-sectcreate,__SESTRICT,__sestrict,/dev/null

運(yùn)行項(xiàng)目勒虾,輸出以下結(jié)果:

antiTweak[2535:549785] 被篡改

當(dāng)檢測(cè)到MachO被篡改,不要使用痕跡明顯的代碼進(jìn)行防護(hù)瘸彤,例如:exit(0)修然。此類代碼相當(dāng)于記號(hào),讓攻擊者很容易找到防護(hù)的位置和邏輯

高明的防護(hù)手段质况,應(yīng)該讓攻擊者不易察覺(jué)愕宋,在不知不覺(jué)中被系統(tǒng)屏蔽封殺

白名單檢測(cè)

進(jìn)程限制的防護(hù)手段,僅低版本系統(tǒng)有效结榄。對(duì)于高版本系統(tǒng)的防護(hù)中贝,我們可以自制白名單進(jìn)行檢測(cè)

延用antiTweak項(xiàng)目

整理出App依賴庫(kù)的白名單

打開(kāi)ViewController.m文件,寫(xiě)入以下代碼:

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

@implementation ViewController

+(void)load{
   uint32_t intCount = _dyld_image_count();
   
   for (int intIndex=0; intIndex<intCount; intIndex++) {
       const char* strName = _dyld_get_image_name(intIndex);
       printf("%s",strName);
   }
}

@end

在未越獄的設(shè)備上臼朗,運(yùn)行項(xiàng)目邻寿,遍歷所有image名稱

打印結(jié)果,相當(dāng)于一份白名單依溯。如果App運(yùn)行時(shí),加載了白名單以外的動(dòng)態(tài)庫(kù)瘟则,該庫(kù)很可能是被第三方注入的

檢測(cè)注入的動(dòng)態(tài)庫(kù)

打開(kāi)ViewController.m文件黎炉,寫(xiě)入以下代碼:

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

const char* strList = "/private/var/containers/Bundle/Application/E7D8C05C-D581-463F-96AC-791B816265C6/antiTweak...";

@implementation ViewController

+(void)load{
   uint32_t intCount = _dyld_image_count();
   
   for (int intIndex=0; intIndex<intCount; intIndex++) {
       
       const char* strName = _dyld_get_image_name(intIndex);
       
       if(intIndex==0 || strstr(strList, strName)){
           continue;
       }
       
       printf("注入動(dòng)態(tài)庫(kù):%s\n",strName);
   }
}

@end

load方法中,循環(huán)遍歷依賴的動(dòng)態(tài)庫(kù)醋拧。如果動(dòng)態(tài)庫(kù)不是當(dāng)前MachO文件慷嗜,或者包含白名單中,屬于合法庫(kù)丹壕,直接跳過(guò)庆械。否則,將其打印

當(dāng)前MachO文件菌赖,不需要判斷缭乘,因?yàn)樯澈新窂綗o(wú)法固定

在越獄設(shè)備上運(yùn)行項(xiàng)目,輸出很多白名單以外的動(dòng)態(tài)庫(kù)琉用,其中包含自制的antiTweakDemo插件

使用此方法進(jìn)行防護(hù)堕绩,需要注意以下幾點(diǎn):

  • 在不同系統(tǒng)下運(yùn)行項(xiàng)目策幼,整理出盡可能完善的白名單
  • 檢測(cè)到白名單以外的動(dòng)態(tài)庫(kù),不要直接處理奴紧。這里建議先收集數(shù)據(jù)特姐,如果此動(dòng)態(tài)庫(kù)是我們?nèi)甭┑模瑢⑵溲a(bǔ)充到白名單中黍氮。如果確認(rèn)是惡意注入唐含,再做處理
  • 白名單列表,由服務(wù)端下發(fā)沫浆,或者將邏輯直接做到服務(wù)端

白名單寫(xiě)在客戶端的弊端:

  • 白名單的字符串捷枯,位于MachO的常量區(qū),容易被攻擊者發(fā)現(xiàn)并HOOK
  • 當(dāng)系統(tǒng)更新件缸,可能會(huì)出現(xiàn)白名單以外的依賴庫(kù)铜靶,老版本App將無(wú)法使用
ptrace

App可以被lldb動(dòng)態(tài)調(diào)試,因?yàn)?code>App被設(shè)備中的debugserver附加他炊,它會(huì)跟蹤我們的應(yīng)用進(jìn)程(trace process)争剿,而這一過(guò)程利用的就是ptrace函數(shù)

ptrace是系統(tǒng)內(nèi)核函數(shù),它可以決定應(yīng)用能否被debugserver附加痊末。如果我們?cè)陧?xiàng)目中蚕苇,調(diào)用ptrace函數(shù),將程序設(shè)置為拒絕附加凿叠,即可對(duì)lldb動(dòng)態(tài)調(diào)試進(jìn)行有效的防護(hù)

ptraceiOS系統(tǒng)中涩笤,無(wú)法直接使用,需要導(dǎo)入頭文件

ptrace函數(shù)的定義:

int ptrace(int _request, pid_t _pid, caddr_t _addr, int _data);
  • request:請(qǐng)求ptrace執(zhí)行的操作
  • pid:目標(biāo)進(jìn)程的ID
  • addr:目標(biāo)進(jìn)程的地址值盒件,和request參數(shù)有關(guān)
  • data:根據(jù)request的不同而變化蹬碧。如果需要向目標(biāo)進(jìn)程中寫(xiě)入數(shù)據(jù),data存放的是需要寫(xiě)入的數(shù)據(jù)炒刁。如果從目標(biāo)進(jìn)程中讀數(shù)據(jù)恩沽,data將存放返回的數(shù)據(jù)

搭建App項(xiàng)目,命名:antiDebug

導(dǎo)入MyPtraceHeader.h頭文件

打開(kāi)ViewController.m文件翔始,寫(xiě)入以下代碼:

#import "ViewController.h"
#import "MyPtraceHeader.h"

@implementation ViewController

- (void)viewDidLoad {
   [super viewDidLoad];
   ptrace(PT_DENY_ATTACH, 0, 0, 0);
}

@end

使用Xcode運(yùn)行項(xiàng)目罗心,啟動(dòng)后立即退出。使用ptrace設(shè)置為拒絕附加城瞎,只能手動(dòng)啟動(dòng)App

也就是說(shuō)渤闷,用戶在使用App時(shí),不會(huì)有任何影響脖镀。一旦被debugserver附加飒箭,就會(huì)閃退

如果在越獄環(huán)境,手動(dòng)對(duì)App進(jìn)行debugserver附加呢?

找到antiDebug進(jìn)程

ps -A | grep antiDebug
-------------------------
12233 ??         0:00.27 /var/containers/Bundle/Application/5DC00A3B-C095-46D1-9842-A3C35401DD07/antiDebug.app/antiDebug

手動(dòng)對(duì)App進(jìn)行debugserver附加

debugserver localhost:12346 -a 12233
-------------------------
debugserver-@(#)PROGRAM:LLDB  PROJECT:lldb-900.3.87
for arm64.
Attaching to process 12233...
Segmentation fault: 11

同樣附加失敗补憾,無(wú)論以何種方式漫萄,都會(huì)被ptrace函數(shù)阻止

破解ptrace

ptrace是系統(tǒng)內(nèi)核函數(shù),被開(kāi)發(fā)者所熟知盈匾。ptrace的防護(hù)痕跡也很明顯腾务,手動(dòng)運(yùn)行程序正常,Xcode運(yùn)行程序閃退

我們?cè)谀嫦蛞豢?code>App時(shí)削饵,遇到上述情況岩瘦,第一時(shí)間就會(huì)想到ptrace防護(hù)

由于ptrace是系統(tǒng)函數(shù),需要間接符號(hào)表窿撬,我們可以試探性的下一個(gè)ptrace的符號(hào)斷點(diǎn)

ptrace的斷點(diǎn)命中启昧,我們確定了對(duì)方的防護(hù)手段,想要破解并非難事

延用antiDebug項(xiàng)目劈伴,模擬應(yīng)用重簽名密末,注入動(dòng)態(tài)庫(kù)

創(chuàng)建Inject動(dòng)態(tài)庫(kù),創(chuàng)建InjectCode

Inject動(dòng)態(tài)庫(kù)中跛璧,導(dǎo)入fishhook严里,導(dǎo)入MyPtraceHeader.h頭文件

打開(kāi)InjectCode.m文件,寫(xiě)入以下代碼:

#import "InjectCode.h"
#import "MyPtraceHeader.h"
#import "fishhook.h"

@implementation InjectCode

+(void)load{
   
   struct rebinding reb;
   reb.name="ptrace";
   reb.replacement=my_ptrace;
   reb.replaced=(void *)&sys_ptrace;
   
   struct rebinding rebs[]={reb};
   rebind_symbols(rebs, 1);
}

int (*sys_ptrace)(int _request, pid_t _pid, caddr_t _addr, int _data);

int my_ptrace(int _request, pid_t _pid, caddr_t _addr, int _data){
   
   if(_request==PT_DENY_ATTACH){
       return 0;
   }
   
   return sys_ptrace(_request, _pid, _addr, _data);
}

@end

ptrace_my函數(shù)中追城,如果是PT_DENY_ATTACH枚舉值刹碾,直接返回。如果是其他類型座柱,系統(tǒng)有特定的作用迷帜,需要執(zhí)行ptrace原始函數(shù)

運(yùn)行項(xiàng)目,進(jìn)入lldb動(dòng)態(tài)調(diào)試色洞,ptrace破解成功

總結(jié)

Tweak原理

  • Tweak編譯產(chǎn)物是動(dòng)態(tài)庫(kù)
  • 打包時(shí)戏锹,將動(dòng)態(tài)庫(kù)打包成.deb格式
  • 插件安裝到/Library/MobileSubstrate/DynamicLibraries目錄中
    ? 安裝.dylib.plist文件
    ? .plist記錄.dylib所依附的App包名
  • Tweak插件使用DYLD_INSERT_LIBRARIES方式,插入動(dòng)態(tài)庫(kù)

DYLD_INSERT_LIBRARIES

  • 早期dyld源碼中火诸,有進(jìn)程限制的判斷(processIsRestricted
  • 啟用進(jìn)程限制锦针,segment存在__RESTRICT段,section存在__restrict節(jié)
  • 符合進(jìn)程限制的條件惭蹂,清空插入動(dòng)態(tài)庫(kù)伞插,越獄插件失效

__RESTRICT段防護(hù)

  • Build SettingOther Linker Flags中配置
    ? -Wl,-sectcreate,__RESTRICT,__restrict,/dev/null
  • iOS11及更高系統(tǒng)割粮,此防護(hù)無(wú)效

修改MachO破解

  • 使用MachOView打開(kāi)MachO文件盾碗,修改Data
  • 只在以前的數(shù)值上替換,不要對(duì)其增減舀瓢,位數(shù)不要改變

使用dyld源碼防護(hù)

  • 借鑒dyld源碼廷雅,讀取segmentsection。如果缺少__RESTRICT段或__restrict節(jié),說(shuō)明我們的防護(hù)代碼被人篡改
  • 檢測(cè)到程序被篡改航缀,不要使用痕跡明顯的代碼進(jìn)行防護(hù)商架,容易暴露
  • 盡量讓攻擊者在不知不覺(jué)中被系統(tǒng)屏蔽封殺

白名單檢測(cè)

  • 遍歷image名稱
    ? _dyld_image_count()
    ? _dyld_get_image_name(i)
  • 在不同系統(tǒng)下運(yùn)行項(xiàng)目,整理出盡可能完善的白名單
  • 檢測(cè)到白名單以外的動(dòng)態(tài)庫(kù)芥玉,不要直接處理
  • 白名單列表蛇摸,由服務(wù)端下發(fā),或者將邏輯直接做到服務(wù)端

ptrace

  • 可阻止Appdebugserver附加
  • iOS系統(tǒng)中灿巧,無(wú)法直接使用赶袄,需要導(dǎo)入頭文件
  • ptrace函數(shù)的定義
    ? int ptrace(int _request, pid_t _pid, caddr_t _addr, int _data);

破解ptrace

  • 防護(hù)效果:手動(dòng)運(yùn)行程序正常,Xcode運(yùn)行程序閃退
  • 使用ptrace符號(hào)斷點(diǎn)試探
  • 使用fishhook對(duì)ptrace函數(shù)HOOK
  • PT_DENY_ATTACH枚舉值抠藕,直接返回饿肺。其他類型,執(zhí)行原始函數(shù)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末盾似,一起剝皮案震驚了整個(gè)濱河市敬辣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌零院,老刑警劉巖溉跃,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異门粪,居然都是意外死亡喊积,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門玄妈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)乾吻,“玉大人,你說(shuō)我怎么就攤上這事拟蜻∫锴” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵酝锅,是天一觀的道長(zhǎng)诡必。 經(jīng)常有香客問(wèn)我,道長(zhǎng)搔扁,這世上最難降的妖魔是什么爸舒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮稿蹲,結(jié)果婚禮上扭勉,老公的妹妹穿的比我還像新娘。我一直安慰自己苛聘,他們只是感情好涂炎,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布忠聚。 她就那樣靜靜地躺著,像睡著了一般唱捣。 火紅的嫁衣襯著肌膚如雪两蟀。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天震缭,我揣著相機(jī)與錄音赂毯,去河邊找鬼。 笑死拣宰,一個(gè)胖子當(dāng)著我的面吹牛欢瞪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播徐裸,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼遣鼓,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了重贺?” 一聲冷哼從身側(cè)響起骑祟,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎气笙,沒(méi)想到半個(gè)月后次企,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡潜圃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年缸棵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谭期。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡堵第,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出隧出,到底是詐尸還是另有隱情踏志,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布胀瞪,位于F島的核電站针余,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏凄诞。R本人自食惡果不足惜圆雁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望帆谍。 院中可真熱鬧伪朽,春花似錦、人聲如沸既忆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)患雇。三九已至跃脊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間苛吱,已是汗流浹背酪术。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留翠储,地道東北人绘雁。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像援所,于是被迫代替她去往敵國(guó)和親庐舟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 概敘 越獄防護(hù)是指防止別人修改自己的APP作出的防護(hù)手段。 1.了解代碼注入方式 了解防護(hù)之前需要了解代碼注入的方...
    Hanfank閱讀 1,388評(píng)論 4 14
  • 在應(yīng)用開(kāi)發(fā)過(guò)程中滔岳,我們不僅僅需要完成正常的業(yè)務(wù)邏輯杠娱,考慮應(yīng)用性能、代碼健壯相關(guān)的問(wèn)題谱煤,我們有時(shí)還需要考慮到應(yīng)用安全...
    喵喵唔的老巢閱讀 830評(píng)論 0 0
  • [TOC] 修改系統(tǒng)應(yīng)用 目標(biāo):消除對(duì)手機(jī)桌面的提醒氣泡 通過(guò)cycript分析氣泡連接手機(jī)并登陸摊求,通過(guò)進(jìn)程列表指...
    _順_1896閱讀 1,826評(píng)論 0 3
  • layout: wikititle: iOS逆向分析筆記categories: Reverse_Engineeri...
    超哥__閱讀 10,709評(píng)論 3 16
  • tweak插件開(kāi)發(fā) 1、連接手機(jī) usb或者wifi 通過(guò)ssh連手機(jī) 2刘离、ps -A查看所有應(yīng)用 3室叉、導(dǎo)出目標(biāo)...
    looha閱讀 1,632評(píng)論 0 1