iOS 反反調(diào)試之sysctl

前幾天在調(diào)試某被注入過dylib的WX時(shí)灼舍,由于本人剛剛接觸逆向,對(duì)該方面知識(shí)不夠拉鹃,碰到了點(diǎn)問題被困擾了兩天,現(xiàn)已解決鲫忍,特此分享給新手供參考膏燕。

先說說遇到的問題現(xiàn)象:

  • 在正常狀態(tài)下該ipa包能正常安裝正常運(yùn)行,且會(huì)一直停留在登錄界面讓輸入授權(quán)碼悟民。
  • debugserver 能正常附加坝辫,lldb也能正常連接,但是在連接成功后再c后過大約5s后app崩潰射亏。lldb輸出:Process 11155 exited with status = 10 (0x0000000a)
    如下:
(lldb) process connect connect://0000000:1234
Process 11155 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
    frame #0: 0x00000001819c8fd8 libsystem_kernel.dylib`mach_msg_trap + 8
libsystem_kernel.dylib`mach_msg_trap:
->  0x1819c8fd8 <+8>: ret    

libsystem_kernel.dylib`mach_msg_overwrite_trap:
    0x1819c8fdc <+0>: mov    x16, #-0x20
    0x1819c8fe0 <+4>: svc    #0x80
    0x1819c8fe4 <+8>: ret    
(lldb) c
Process 11155 resuming
Process 11155 exited with status = 10 (0x0000000a) 

系統(tǒng) log輸出如下:

May  7 19:55:27 iPhone WeChat[11484] <Error>: +[MicroMessengerAppDelegate application:didRegisterForRemoteNotificationsWithDeciceToken:]: unrecognized selector sent to class 0x103b37ce0
May  7 19:55:28 iPhone mediaserverd[5349] <Notice>: '' com.cjwj.xin(pid = 11484) setting DiscoveryMode = DiscoveryMode_None, currentDiscoveryMode = DiscoveryMode_None
May  7 19:55:28 iPhone SpringBoard[11461] <Warning>: UNNotificationSchedulerConnectionListener connection invalidated
May  7 19:55:28 iPhone SpringBoard[11461] <Warning>: UNNotificationRegistrarConnectionListener connection invalidated
May  7 19:55:28 iPhone SpringBoard[11461] <Warning>: HW kbd: Failed to set (null) as keyboard focus
May  7 19:55:28 iPhone com.apple.xpc.launchd[1] (UIKitApplication:com.cjwj.xin[0x77fd][11484]) <Warning>: Service exited with abnormal code: 10
May  7 19:55:28 iPhone com.apple.debugserver-@(#)PROGRAM:debugserver  PROJECT:debugserver-340.3.124
    [11487] <Warning>: 1 +0.000000 sec [2cdf/3b03]: error: ::read ( 6, 0x16e35ea38, 1024 ) => -1 err = Bad file descriptor (0x00000009)
May  7 19:55:28 iPhone SpringBoard[11461] <Warning>: Application 'UIKitApplication:com.cjwj.xin[0x77fd]' exited voluntarily.
May  7 19:55:28 iPhone UserEventAgent[456] <Warning>: 14334655851519: id=com.cjwj.xin pid=11484, state=0
May  7 19:55:37 iPhone kernel[0] <Notice>: AppleHDQGasGauge:stats num_clients=1,num_entries=617313,dl_skip=0,dl_cali=0,dl_over=0,dl_drain=27 ops=3615206,collated=0,bfailures=2,collate_error=0,ioerr=0,timeouts=97 retry16=210,chf16=29
May  7 19:55:37 iPhone kernel[0] <Notice>: AppleHDQGasGauge:clientLog ld=593121808/d28 le=593122346/e30
May  7 19:55:37 iPhone kernel[0] <Notice>: AppleHDQGasGauge:clientLog 495657400/T20 495657400/C20 495657667/S27 566137324/T26 566137324/d26 566137324/C26 566137857/S28 566137857/e28 566661472/T27
May  7 19:55:37 iPhone kernel[0] <Notice>: AppleHDQGasGauge:clientLog 566661472/C27 566661717/S29 593121808/T28 593121808/d28 593121808/C28 593122346/S30 593122346/e30

分析

正常運(yùn)行的時(shí)候沒問題近忙,一連接lldb就崩潰竭业,這種情況一般都是加了反調(diào)試。但是作為逆向菜鳥的我來說之前只聽說過ptrace反調(diào)試及舍,但是加了ptrace斷點(diǎn)后并沒有發(fā)現(xiàn)未辆,所以可以排除ptrace了。然后通過各種google 百度后發(fā)現(xiàn)了另一種反調(diào)試方法:sysctl锯玛。下斷點(diǎn)咐柜,運(yùn)行,斷在了sysctl攘残,再看下調(diào)用棧拙友,的確是注入的dylib調(diào)用的:

(lldb) process connect connect://20.20.20.20:1234
Process 11611 stopped
* thread #1, stop reason = signal SIGSTOP
    frame #0: 0x00000001819c8fd8 libsystem_kernel.dylib`mach_msg_trap + 8
libsystem_kernel.dylib`mach_msg_trap:
->  0x1819c8fd8 <+8>: ret    

libsystem_kernel.dylib`mach_msg_overwrite_trap:
    0x1819c8fdc <+0>: mov    x16, #-0x20
    0x1819c8fe0 <+4>: svc    #0x80
    0x1819c8fe4 <+8>: ret    
(lldb) b sysctl
Breakpoint 1: where = libsystem_c.dylib`sysctl, address = 0x00000001818f6a3c
(lldb) c
Process 11611 resuming
Process 11611 stopped
* thread #4, stop reason = breakpoint 1.1
    frame #0: 0x00000001818f6a3c libsystem_c.dylib`sysctl
libsystem_c.dylib`sysctl:
->  0x1818f6a3c <+0>:  stp    x29, x30, [sp, #-0x10]!
    0x1818f6a40 <+4>:  mov    x29, sp
    0x1818f6a44 <+8>:  ldr    w8, [x0]
    0x1818f6a48 <+12>: cmp    w8, #0x8                  ; =0x8 
(lldb) bt
* thread #4, stop reason = breakpoint 1.1
  * frame #0: 0x00000001818f6a3c libsystem_c.dylib`sysctl
    frame #1: 0x0000000106387f1c libwsp.dylib`_bookIn + 146376
    frame #2: 0x0000000106394698 libwsp.dylib`_bookIn + 197444
    frame #3: 0x00000001818954bc libdispatch.dylib`_dispatch_call_block_and_release + 24
    frame #4: 0x000000018189547c libdispatch.dylib`_dispatch_client_callout + 16
    frame #5: 0x00000001818a14c0 libdispatch.dylib`_dispatch_queue_drain + 864
    frame #6: 0x0000000181898f80 libdispatch.dylib`_dispatch_queue_invoke + 464
    frame #7: 0x000000018189547c libdispatch.dylib`_dispatch_client_callout + 16
    frame #8: 0x00000001818a3914 libdispatch.dylib`_dispatch_root_queue_drain + 2140
    frame #9: 0x00000001818a30b0 libdispatch.dylib`_dispatch_worker_thread3 + 112
    frame #10: 0x0000000181aad470 libsystem_pthread.dylib`_pthread_wqthread + 1092
    frame #11: 0x0000000181aad020 libsystem_pthread.dylib`start_wqthread + 4
(lldb) 

接下來就是編寫tweak干掉反調(diào)試,如下:

#import <sys/sysctl.h>
#import <sys/proc.h>
#import <substrate.h>

 int (*old__sysctl)(int *name, u_int num, void* buffer, size_t *bufferSize, void *set0, size_t set1);

 int new_sysctl(int *name, u_int num, void* buffer, size_t *bufferSize, void *set0, size_t set1) {
    NSLog(@"========================new_sysctl");
    int result =  old__sysctl(name, num, buffer, bufferSize, set0, set1);
    size_t info_size = sizeof(struct kinfo_proc);
    if(info_size == *bufferSize){
        NSLog(@"info_size == buffer_size");
        int * flag = (int*)buffer+(0x20/sizeof(int));
        *flag = ~P_TRACED;
    }
    return result;
}


%ctor {
        MSHookFunction((void *)sysctl, (void *)&new_sysctl, (void **)&old__sysctl);
}

編譯打包安裝歼郭,再連接lldb献宫,一切正常運(yùn)行。完工实撒!

下面再補(bǔ)充下上面tweak中0x20的來源:

sysctl反調(diào)試是利用sysctl函數(shù)查看內(nèi)核進(jìn)程狀態(tài)標(biāo)志,判斷是否是被調(diào)試狀態(tài)涉瘾,當(dāng)進(jìn)程被調(diào)試的時(shí)候info.kp_proc.p_flag會(huì)變成P_TRACED知态,所以就可以通過sysctl查詢進(jìn)程相應(yīng)的kinfo_proc信息就可以判斷是否是在被調(diào)試狀態(tài),我們只需要在函數(shù)返回時(shí)修改p_flag = ~P_TRACED就可以讓sysctl返回未在調(diào)試狀態(tài)立叛。

0x20是內(nèi)核進(jìn)程狀態(tài)標(biāo)志(p_flag)相對(duì)于內(nèi)核進(jìn)程狀態(tài)模型(struct kinfo_proc) 的偏移负敏。可以通過下面方法獲让厣摺:

  • 首先在Xcode中輸入下面一行其做,然后打個(gè)斷點(diǎn)


    1.png
  • 當(dāng)斷點(diǎn)住下后用lldb打印:


    2.png
  • $1 - $0 = 0x20

如有錯(cuò)誤歡迎評(píng)論指正赁还。

參考:

http://bbs.iosre.com/t/sysctl-lldb-gdb/1953
https://coredump.gr/articles/ios-anti-debugging-protections-part-2/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末妖泄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子艘策,更是在濱河造成了極大的恐慌蹈胡,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件朋蔫,死亡現(xiàn)場(chǎng)離奇詭異罚渐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)驯妄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門荷并,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人青扔,你說我怎么就攤上這事源织◆嫖保” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵雀鹃,是天一觀的道長(zhǎng)幻工。 經(jīng)常有香客問我,道長(zhǎng)黎茎,這世上最難降的妖魔是什么囊颅? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮傅瞻,結(jié)果婚禮上踢代,老公的妹妹穿的比我還像新娘。我一直安慰自己嗅骄,他們只是感情好胳挎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著溺森,像睡著了一般慕爬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屏积,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天医窿,我揣著相機(jī)與錄音,去河邊找鬼炊林。 笑死姥卢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的渣聚。 我是一名探鬼主播独榴,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼奕枝!你這毒婦竟也來了棺榔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤隘道,失蹤者是張志新(化名)和其女友劉穎掷豺,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體薄声,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡当船,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了默辨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片德频。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖缩幸,靈堂內(nèi)的尸體忽然破棺而出壹置,到底是詐尸還是另有隱情竞思,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布钞护,位于F島的核電站盖喷,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏难咕。R本人自食惡果不足惜课梳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望余佃。 院中可真熱鬧暮刃,春花似錦、人聲如沸爆土。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽步势。三九已至氧猬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間坏瘩,已是汗流浹背盅抚。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留桑腮,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓蛉幸,卻偏偏與公主長(zhǎng)得像破讨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子奕纫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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

  • 調(diào)試器究竟是怎么工作的提陶?如何阻止一個(gè)進(jìn)程attach(掛載)到app上以及又如何破解這些保護(hù)(所謂反調(diào)試和反反調(diào)試...
    blueshadow閱讀 7,042評(píng)論 8 10
  • 前言 今天花了一天的時(shí)間終于把iOS的幾種常見的調(diào)試方法給學(xué)習(xí)了一下,在這里給大家分享一下LLDB的使用匹层,同時(shí)也是...
    Peak_One閱讀 11,027評(píng)論 5 33
  • 你是否曾經(jīng)苦惱于理解你的代碼隙笆,而去嘗試打印一個(gè)變量的值? NSLog(@"%@", whatIsInsideThi...
    木易林1閱讀 955評(píng)論 0 4
  • 你是否曾經(jīng)苦惱于理解你的代碼升筏,而去嘗試打印一個(gè)變量的值撑柔? NSLog(@"%@", whatIsInsideThi...
    paraneaeee閱讀 1,194評(píng)論 0 7
  • 夢(mèng)想有多遠(yuǎn),你就能走多遠(yuǎn)您访。 我們每個(gè)人都在想象著自己要過的生活铅忿,有的人為之努力,有的人卻只是在想灵汪,結(jié)果就可想...
    越越媽Miss暢閱讀 264評(píng)論 0 0