以 SingPass 應用為例分析 iOS RASP 應用自保護的實現以及繞過方法(上)-天天日報
NuDetectSDK 二進制文件也使用相同的混淆器,但它似乎沒有參與上圖所示的早期越獄檢測。另一方面,SingPass 是應用程序的主要二進制文件,我們可以觀察到與威脅檢測相關的字符串:
(相關資料圖)
不幸的是,二進制文件沒有泄漏其他字符串,這些字符串可以幫助識別應用程序檢測越獄設備的位置和方式,但幸運的是,應用程序沒有崩潰。
如果我們假設混淆器在運行時解密字符串,則可以嘗試在顯示錯誤消息時轉儲 __data 部分的內容。在執行時,用于檢測越獄設備的字符串可能已被解碼并清楚地存在于內存中。
1. 我們運行應用程序并等待越獄消息;
2. 我們使用 Frida 附加到 SingPass,并注入一個庫:
2.1 在內存中解析 SingPass 二進制文件;
2.2 轉儲 __data 部分的內容;
2.3 將轉儲寫入 iPhone 的 /tmp 目錄;
一旦數據區被轉儲,__data 部分會發生以下變化:
轉儲前后的 __data 部分此外,我們可以觀察到以下字符串,它們似乎與混淆器的 RASP 功能有關:
與 RASP 功能相關的字符串所有的 EVT_* 字符串都由一個且只有一個我命名為 on_rasp_detection 的函數引用。這個函數是應用程序開發者在觸發 RASP 事件時用來執行操作的威脅檢測回調函數。
為了更好地理解這些字符串背后的檢查邏輯,讓我們從用于檢測掛鉤函數的 EVT_CODE_PROLOGUE 開始。
EVT_CODE_PROLOGUE:掛鉤檢測
當通過匯編代碼接近 on_rasp_detection 的交叉引用時,我們可以多次發現這種模式:
為了檢測給定函數是否被鉤住,混淆器加載函數的第一個字節,并將該字節與值 0xFF 進行比較。乍一看,0xFF 似乎是任意的,但事實并非如此。實際上,常規函數以一個序言開始,該序言在堆棧上分配空間,以保存由調用約定定義的寄存器和函數所需的堆棧變量。在 AArch64 中,這個分配可以通過兩種方式執行:這些指令是不相等的,如果偏移量存在,它們可能會導致相同的結果。在第二種情況下,指令 sub SP、SP、#CST 用以下字節編碼:
正如我們所看到的,該指令的編碼從 0xFF 開始。如果不是這樣,那么該函數要么以不同的堆棧分配序言開始,要么可能以一個掛鉤的蹦床開始。由于應用程序的代碼是通過混淆器的編譯器編譯的,因此編譯器能夠區分這兩種情況,并為正確的函數的序言插入正確的檢查。
如果函數指令的第一個字節沒有通過檢查,則跳轉到紅色基本塊。這個基本塊的目的是觸發一個用戶定義的回調,它將根據應用程序的設計和開發人員的選擇來處理檢測:
打印錯誤
應用程序崩潰
破壞內部數據
……
從上圖中,我們可以觀察到檢測回調是從位于 #hook_detect_cbk_ptr 的靜態變量加載的。調用此檢測回調時,混淆器會向回調提供以下信息:
1. 檢測碼:EVT_CODE_PROLOGUE 為 0x400;
2. 可能導致應用程序崩潰的受攻擊指針;
現在讓我們仔細看看檢測回調的整體設計。
檢測回調
如上一節所述,當混淆器檢測到篡改時,它會通過調用存儲在地址的靜態變量中的檢測回調來做出反應:0x10109D760
通過靜態分析 hook_detect_cbk,實現似乎破壞了回調參數中提供的指針。另一方面,在運行應用程序時,我們觀察到越獄檢測消息,而不是應用程序崩潰。如果我們查看在該地址讀取或寫入的交叉引用,我們會得到以下指令列表:
所以實際上只有一條指令,init_and_check_rasp+01BC,用另一個函數覆蓋默認的檢測回調:與默認回調相比:hook_detect_cbk(被覆蓋的函數)相比,hook_detect_cbk_user_def 不會損壞一個會導致應用程序崩潰的指針。相反,它調用 on_rasp_detection 函數,該函數引用上圖中列出的所有字符串 EVT_CODE_TRACING、EVT_CODE_SYSTEM_LIB 等。通過整體查看 init_and_check_rasp 函數,我們可以注意到 X23 寄存器也用于初始化其他靜態變量:
X23 寫入指令這些內存寫入意味著回調 hook_detect_cbk_user_def 用于初始化其他靜態變量。特別是,這些其他靜態變量很可能用于其他 RASP 檢查。通過查看這些靜態變量 #EVT_CODE_TRACING_cbk_ptr、#EVT_ENV_JAILBREAK_cbk_ptr 等的交叉引用,我們可以找到執行其他 RASP 檢查的位置以及觸發它們的條件。
EVT_CODE_SYSTEM_LIB
EVT_ENV_DEBUGGEREVT_ENV_JAILBREAK多虧了 #EVT_* 交叉引用,我們可以靜態地通過使用這些 #EVT_* 變量的所有基本塊,并突出顯示可能觸發 RASP 回調的底層檢查。在詳細檢查之前,需要注意以下幾點:1. 雖然應用程序使用了一個商業混淆器,除了 RASP 之外,還提供了本地代碼混淆,但代碼是輕度混淆的,這使得靜態匯編代碼分析非常容易。
2. 應用程序為所有 RASP 事件設置相同的回調。因此,它簡化了 RASP 繞過和應用程序的動態分析。
反調試
SingPass 使用的混淆器版本實現了兩種調試檢查。首先,它檢查父進程 id ( ppid ) 是否與 /sbin/launchd 相同,后者應該為 1。
getppid 通過函數或系統調用調用。如果不是這種情況,它會觸發 EVT_ENV_DEBUGGER 事件。第二個檢查基于用于訪問 extern_proc.p_flag 值的 sysctl。如果此標志包含 P_TRACED 值,則 RASP 例程會觸發 EVT_ENV_DEBUGGER 事件。
在 SingPass 二進制中,我們可以在以下地址范圍內找到這兩個檢查的實例:越獄檢測
對于大多數越獄檢測,混淆器會通過檢查設備上是否存在(或不存在)某些文件來嘗試檢測設備是否已越獄。
借助以下幫助程序,可以使用系統調用或常規函數檢查文件或目錄:
如上所述,我提到 __data 部分的轉儲顯示與越獄檢測相關的字符串,但轉儲并未顯示混淆器使用的所有字符串。通過仔細研究字符串編碼機制,可以發現有些字符串是在臨時變量中即時解碼的。我將在本文的第二部分解釋字符串編碼機制,這樣,我們可以通過在 fopen、utimes 等函數上設置鉤子,并在這些調用之后立即轉儲 __data 部分來揭示字符串。然后,我們可以遍歷不同的轉儲,查看是否出現了新的字符串。
最后,該方法無法對所有字符串進行解碼,但可以實現良好的覆蓋。用于檢測越獄的文件列表在附件中給出。還有一個檢測 unc0ver 越獄的特殊檢查,包括嘗試卸載 /.installed_unc0ver:
0x100E4D814: _unmount ( "/.installedunc0ver" )
環境
混淆器還會檢查觸發 EVT_ENV_JAILBREAK 事件的環境變量。其中一些檢查似乎與代碼提升檢測有關,但仍會觸發 EVT_ENV_JAILBREAK 事件。
startswith ( )從逆向工程的角度來看,startswith ( ) 實際上是作為一個 "or-ed" 的 xor 序列來實現的,以得到一個布爾值。這可能是編譯器優化的結果。你可以在位于地址 0x100015684 的基本塊中觀察這個模式。
高級檢測
除了常規檢查之外,混淆器還執行高級檢查,比如驗證 SIP ( 系統完整性保護 ) 的當前狀態,更準確地說,是 KEXTS 代碼簽名狀態。
根據我在 iOS 越獄方面的經驗,我認為沒有越獄會禁用 CSR_ALLOW_UNTRUSTED_KEXTS 標志。相反,我猜它是用來檢測應用程序是否在允許這種停用的 Apple M1 上運行。
Assembly range: 0x100004640 – 0x1000046B8混淆器還使用 Sandbox API 來驗證是否存在某些路徑:
通過這個 API 檢查的路徑是 OSX 相關的目錄,所以我猜它也被用來驗證當前代碼沒有在 Apple Silicon 上被解除。例如,下面是使用 Sandbox API 檢查的目錄列表:
Assembly range: 0x100ED7684 ( function )
此外,它使用沙盒屬性 file-read-metadata 作為 stat ( ) 函數的替代方案。
Assembly range: 0x1000ECA5C – 0x1000ECE54
該應用程序通過私有系統調用使用沙盒 API 來確定是否存在一些越獄工件。這是非常明智的做法,但我想這并不符合蘋果的安全政策。
代碼符號表
此檢查的目的是驗證已解析導入的地址是否指向正確的庫。換句話說,此檢查驗證導入表沒有被可用于掛鉤導入函數的指針篡改。
Initialization: part of sub_100E544E8
Assembly range: 0x100016FC4 – 0x100017024
在 RASP 檢查初始化 ( sub_100E544E8 ) 期間,混淆器會手動解析導入的函數。此手動解析是通過迭代 SingPass 二進制文件中的符號、檢查導入符號的庫、訪問(在內存中)此庫的 __LINKEDIT 段、解析導出 trie 等來執行的。此手動解析填充一個包含已解析符號的絕對地址的表。
此外,初始化例程設置遵循以下布局的元數據結構:
symbols_index 是一種轉換表,它將混淆器已知的索引轉換為 __got 或 __la_symbol_ptr 部分中的索引。索引的來源(即 __got 或 __la_symbol_ptr)由包含類枚舉整數的 origins 表確定:symbols_index 和 origins 這兩個表的長度都是由靜態變量 nb_symbols 定義的,它被設置為 0x399。元數據結構后面跟著兩個指針:resolved_la_syms 和 resolved_got_syms,它們指向混淆器手動填充的導入地址表。每個部分都有一個專用表:__got 和 __la_symbol_ptr。
然后,macho_la_syms 指向 __la_symbol_ptr 部分的開頭,而 macho_got_syms 指向 __got 部分。
最后,stub_helper_start / stub_helper_end 保存了 __stub_helper 部分的內存范圍。稍后我將介紹這些值的用途。
這個元數據結構的所有值都是在函數 sub_100E544E8 中進行初始化時設置的。
在 SingPass 二進制文件的不同位置,混淆器使用此元數據信息來驗證已解析導入的完整性。它首先訪問 symbols_index 和具有固定值的起源:
由于 symbols_index 表包含 uint32_t 值,#0xCA8 匹配 #0x32A ( 起源表的索引 ) 當除以 sizeof ( uint32_t ) : 0xCA8 = 0x32A * sizeof ( uint32_t ) 。換句話說,我們有以下操作:
然后,給定 sym_idx 值并根據符號的來源,該函數訪問已解析的 __got 表或已解析的 __la_symbol_ptr 表。此訪問是通過位于 sub_100ED6CC0 的輔助函數完成的。可以用下面的偽代碼來概括:
比較 section_ptr 和 manual_resolved 的索引 sym_idx 處的條目,如果它們不匹配,則觸發事件 #EVT_CODE_SYMBOL_TABLE。實際上,比較涵蓋了不同的情況。首先,混淆器處理 sym_idx 處的符號尚未解析的情況。在這種情況下,section_ptr [ sym_idx ] 指向位于 __stub_helper 部分中的符號解析存根。這就是元數據結構包含本節的內存范圍的原因:
另外,如果兩個指針不匹配,函數會使用 dladdr 來驗證它們的位置:
例如,如果導入的函數與 Frida 掛鉤,則兩個指針可能不匹配。在 origin [ sym_idx ] 被設置為 SYM_ORIGINS::NONE 的情況下,函數跳過檢查。因此,我們可以通過用 0 填充原始表來禁用這個 RASP 檢查。符號的數量接近元數據結構,元數據結構的地址是由 ___atomic_load 和 ___atomic_store 函數泄露的。
代碼跟蹤檢查代碼跟蹤檢查旨在驗證當前沒有被跟蹤。通過查看 #EVT_CODE_TRACING_cbk_ptr 的交叉引用,我們可以識別出兩種驗證。
GumExecCtx
EVT_CODE_TRACING 似乎能夠檢測 Frida 的跟蹤檢查是否正在運行。這是我第一次觀察到這種檢查,非常聰明。對于那些想用原始匯編代碼進行分析的人,我將使用 SingPass 二進制文件中的這個地址范圍:0x10019B6FC – 0x10019B82C。
這是執行 Frida Stalker 檢查的函數圖:
與 Frida Stalker 檢測相關的代碼是的,此代碼能夠檢測到 Stalker。讓我們從第一個基本塊開始。 _pthread_mach_thread_np ( _pthread_self ( ) ) 旨在獲取調用此檢查的函數的線程 ID。
然后更巧妙的是,MRS ( TPIDRRO_EL0 ) & #-8 用于手動訪問線程本地存儲區。在 ARM64 上,蘋果使用 TPIDRRO_EL0 的最低有效字節來存儲 CPU 的數量,而 MSB 包含 TLS 基地址。
然后,第二個基本塊(循環的入口)使用鍵 tlv_idx 訪問線程本地變量,在循環中取值范圍為 0x100 到 0x200:
以下調用 _vm_region_64 ( ... ) 的基本塊用于驗證 tlv_addr 變量是否包含具有正確大小(即大于 0x30)的有效地址。在這些情況下,它會通過這些奇怪的內存訪問跳轉到以下基本塊:
觸發 EVT_CODE_TRACING 的條件為了弄清楚這些內存訪問的含義,我們有必要知道這個函數與 EVT_CODE_TRACING 事件相關聯。哪些知名的公共工具可以與代碼跟蹤相關聯?沒有太大的風險,我們可以假設存在 Frida Stalker。
如果我們查看 Stalker 的實現,我們會注意到在 gumstalker-arm64.c 中的這種初始化:
所以跟蹤者創建了一個線程局部變量,用于存儲 GumExecCtx 結構的指針,該結構具有以下布局:如果我們添加這個布局的偏移量并且如果我們實際上內聯 GumArm64Writer 結構,我們可以得到這個表示:由于編譯器強制對齊,destroy_pending_since 位于偏移量 0x08 而不是 0x04 處。這樣一來,我們可以觀察到:
* ( tlv_table + 0x18 ) 有效匹配 GumThreadId thread_id 屬性;
* ( tlv_table + 0x24 ) 匹配 GumOS target_os;
* ( tlv_table + 0x28 ) 匹配 GumPtrauthSupport ptrauth_support;
GumOS 和 GumPtrauthSupport 是在 gumdefs.h 和 gummemory.h 中定義的枚舉,其值如下:
GumOS 包含 6 個條目,從 GUM_OS_WINDOWS = 0 到 GUM_OS_QNX = 5,這類似于 GUM_PTRAUTH_INVALID = 0,而最后一個條目與 GUM_PTRAUTH_SUPPORTED = 2 相關聯。因此,前面的奇怪條件被用來對 GumExecCtx 結構進行指紋識別:
防止這種 Stalker 檢測的一種方法是使用 _GumExecCtx 結構中的交換字段重新編譯 Frida。責任編輯:hnmd003
相關閱讀
-
以 SingPass 應用為例分析 iOS RASP 應用自保護的實現以及繞過方法(上)-天天日報
通過在應用程序的安裝目錄中搜索一些關鍵字,我們實際上得到了兩個結果,它們含有混淆器名稱的信息:NuD...
2023-04-08 -
專訪蔚來與杜比團隊:音樂人可以有足夠的信心,作品被原汁原味地傳遞到車廂 全球聚焦
《無間道》被喻為香港警匪電影的巔峰之作,影片當中劉建明(劉德華飾)與陳永仁(梁朝偉飾)在深水埗鴨...
2023-04-07 -
焦點報道:IDMIX 推出氮化鎵潮酷小魔盒,2C1A 接口支持 65W 快充
快充插線板是一種新形態充電設備,它同時兼顧了AC插座與USB充電器功能,深受用戶喜愛,但市面上快充插線...
2023-04-07 -
谷歌 Pixel 平板通過相關認證,更多產品信息曝光-全球要聞
繼此前谷歌方面已經確認,后續將推出旗下首款平板電腦產品PixelTablet后,陸續被曝光的產品端相關信息也...
2023-04-07
相關閱讀
-
以 SingPass 應用為例分析 iOS RASP 應用自保護的實現以及繞過方法(上)-天天日報
通過在應用程序的安裝目錄中搜索一些關鍵字,我們實際上得到了兩個結果,它們含有混淆器名稱的信息:NuD...
-
【世界新要聞】商業運營收入首破百億 新城控股輕裝上陣
村上春樹在《海邊的卡夫卡》中曾言:“當你穿越了暴風雨,你就不再是原來的那個人。”企業發展亦如是。...
-
每日觀察!今年最火的,肯定是民宿:五一假期部分價格翻5倍,有老板稱3月就訂滿
旅游業將期盼押注在五一假期。今年初,西安、長沙、洛陽的“人山人海”在朋友圈里刷屏,近段時間,泰山...
-
蘇科大回應凌晨4點發考研錄取通知:會逐一打電話確保通知到學生
4月7日,有網友稱:凌晨4點半收到蘇州科技大學材料科學與工程學院的
-
最資訊丨編程貓客服回應網傳取消節假日3倍工資:這個情況不存在
今日,據博主王落北粉絲投稿:編程貓銷售總監開500人大會,宣布取消
-
騰訊視頻與抖音上演“世紀大和解”,但頭騰大戰不會結束:天天短訊
騰訊視頻將向抖音授權長視頻,并明確了二創發布方式和規則。自此,騰訊視頻與抖音多年的版權大戰落下帷...
-
環球快報:“因加班懟領導”系編造,借謠言發泄情緒終將反噬
面對真假難辨的網絡爆料,輿論也要多一些警惕,不要動輒就被別有用心者牽著走,以為自己是在為正義發聲...
-
造謠“加班怒懟領導”,煽動公眾情緒當休矣
網絡不是“法外之地”,如果僭越了守法敬畏心、缺失了言論責任感、淡薄了正確價值觀,就必然會被自己制...
-
當前快訊:虎頭局大敗局:成本失控、資金鏈斷裂,創始人胡亭夢碎上海灘
胡亭后悔了。3月31日上午,虎頭局上海綠谷總部沉悶壓抑,虎頭局創始人胡亭在一眾前來討薪討款的員工、供...
-
世界播報:2023年世界大健康博覽會開幕,愛康攜醫療“黑科技”酷炫登場
充滿科技感的未來空間里腦海中剛一浮現“握拳”的想法機械手臂就迅速做出對應動作注意!這可不是科幻電...
-
常青科技完成發行工作,正式上市!為打破國際化工巨頭壟斷持續發力
4月10日,全面注冊制下,第一批主板注冊制企業將上市交易。早在3月26日晚間,常青科技便(603125 SH)發...
-
新消息丨直播帶崗“職”等你來
使用直播招聘這種新方式,求職者通過主播現場展示的視頻,能更直觀的了解企業情況,為求職帶來了便利。
-
推動優質醫療資源擴容下沉,讓人人享有健康-精選
近年來,各地組織優質醫療資源到基層開展義診、健康宣教、帶教查房等活動,帶動更多醫務人員走進基層,...
-
旅游市場持續回暖背后的創新與信心
中國旅游研究院院長戴斌認為,在多重效應疊加之下,我國旅游業的復蘇發展將對消費增長與升級發揮重要作...
-
緊抓關鍵期 加力促匹配——多地多渠道拓崗位穩就業
今年以來,各地堅持拓寬市場化渠道和穩定公共崗位規模結合,支持新就業形態靈活就業,不斷擴大崗位供給。
-
從綠色機遇透視中國經濟活力 簡訊
今天,加快全面轉型的中國經濟,正涌動著綠色機遇。
-
人民熱評:陳某龍造謠被行拘,但加班痛點需直視
據人民網評發文,4月7日晚,四川德陽警方發布稱,針對網傳涉中國電
-
每日頭條!新能源車險保費大增背后:賠付率超油車,行業如何提升利潤?
中新經緯4月7日電(李自曼)近日,財險老三家中國人民財產保險股份有限公司(下稱人保財險)、中國平安財產...
-
周鴻祎:360 全網數字安全大腦將結合 GPT 能力抵御網絡攻擊:當前資訊
北京商報訊(記者魏蔚)4月7日,360創始人周鴻祎表示,360很快會將全網數字安全大腦和GPT結合,以更好實...
-
全球熱推薦:“百萬豪車”三折賣,“餡餅”還是“陷阱”?
中新網4月8日電(中新財經葛成)如果說我想用不到三十萬的價格,買臺百萬級別的全新奔馳旗艦SUV,你一定懷...
-
全國各地區最低工資標準出爐,你的工資不能低于這個數
中新網北京4月8日電(記者李金磊)最新最低工資表公布。人社部網站近日發布了全國各地區最低工資標準情況(...
-
西藏工業經濟、數字經濟保持良好發展勢頭
總體來看,西藏工業經濟、數字經濟保持良好發展勢頭,今年一季度快速增長,為完成全年目標任務打下了堅...
-
搶抓農時 春耕備耕 快看點
陽春四月,西藏各地陸續進入春耕備耕時節,廣袤田野生機勃發。同時,各相關部門根據各自實際情況,早謀...
-
西藏第三次全國土壤普查工作全面啟動
近日,西藏自治區第三次全國土壤普查全面鋪開推進會暨專項培訓班在拉薩舉行,標志著西藏第三次全國土壤...
-
天天視點!西藏自治區游泳館將于4月10日開放
近日,記者從西藏自治區游泳館了解到,該館將于4月10日向社會開放服務。
-
歷史性突破,IPv6流量首超IPv4,2025年用戶及流量規模劍指世界第一!概念股狂飆,通信龍頭被兩路資金盯上|全球滾動
相比IPv4,IPv6的數據轉發路徑更短,極大地提高了轉發效率。據國家IPv6發展監測平臺統計,今年2月,我國...
-
清華大學與螞蟻集團攜手攻堅下一代安全科技_世界今熱點
鞭牛士報道 2023年4月7日,清華大學與螞蟻集團簽署合作協議,雙方
-
草莓品鑒 比“美” 賽“甜”:今熱點
這次參評的品種特別多,除了主栽品種紅顏、圣誕紅、妙香七號、夢之瑩、寶豐、甘露等,還有由新城區科學...
-
優質醫療資源下沉基層
為提升基層衛生服務健康管理能力,更好地為轄區居民提供全面、優質的診療服務,該衛生服務中心聯合醫聯...
-
今日訊!嚴厲打擊超量開藥、重復開藥等行為 27家定點醫療機構存在違規問題被查
專項檢查行動以大數據篩查、現場檢查為重點,采取結算數據疑點分析、投訴舉報線索征集、走訪調查等方式...
精彩推薦
閱讀排行
精彩推送
- 看熱訊:產業旺 村民富 鄉村興...
- 一個人的“通信班”_環球熱消息
- 天天觀點:傳承“墨脫精神” 筑...
- 【世界新視野】西藏公漳浦“半牧...
- 世界新資訊:探訪全國海拔最高的...
- 預訂機票一分鐘內三次變價,春秋...
- 世界即時看!交通部有關部門約談...
- 天天報道:民族團結進步創建“進...
- 石拐區 民生項目繪就幸福畫卷
- 全球球精選!評論:只有爭“分”...
- 一季度高新區新增經營主體827戶
- 我市首屆廣電家博會開幕 全球播資訊
- 當前關注:認房不認貸?呼和浩特...
- 專訪蔚來與杜比團隊:音樂人可以...
- MCN機構游良文化被申請破產,曾...
- 蘇炳添不用小米手機被噴?這誤會...
- 焦點報道:IDMIX 推出氮化鎵潮酷...
- 面向現實世界場景,多語言大數據...
- 今日快看!低至 15 萬元,最便...
- 部分用戶余額寶頁面顯示亂碼 支...
- 觀天下!警方通報網傳中電科加班...
- 谷歌 Pixel 平板通過相關認證...
- 王文濤、陳敏爾、張工會見空客 ...
- 32 位應用已死,對安卓手機意味...
- 小熊電器:營收創新高,靚麗業績...
- 微信官宣:發視頻號,可以賺錢了...
- 當前資訊!年薪百萬元!這四大專...
- 高壓之下如何破題?華僑城A選擇...
- 綠動資本張國津:ESG成中國企業...
- 天天簡訊:9年“卷”成特斯拉四大...





