[英]Detect if Cycript/Substrate or gdb is attached to an iOS app's process?
我正在構建一個將敏感數據傳輸到我的服務器的iOS應用程序,我正在簽署我的API請求作為一項額外措施。 我想盡可能地進行逆向工程,並且使用Cycript查找某些真實應用程序的簽名密鑰,我知道通過附加到流程來找到這些密鑰並不困難。 我完全清楚,如果有人真的很熟練並且努力嘗試,他們最終會利用,但我想盡可能地努力,同時仍然方便自己和用戶。
我可以檢查越獄狀態並采取其他措施,或者我可以執行SSL固定,但通過附加到進程並修改內存,兩者仍然很容易繞過。
有沒有辦法檢測是否有某些東西 (無論是Cycript,gdb,還是任何可用於破解流程的類似工具)附加到流程中,而不是被App Store拒絕?
編輯:這不是檢測iOS應用程序是否在調試器中運行的重復。 該問題與輸出更相關,它檢查輸出流以確定是否有輸出流附加到記錄器,而我的問題與此無關(並且該檢查不包括我的條件)。
gdb檢測可以通過鏈接的stackoverflow問題來實現 - 它使用kstat來確定進程是否正在被調試。 這將檢測調試器當前是否附加到進程。
還有一段代碼 - 在iOS應用程序中使用宏SEC_IS_BEING_DEBUGGED_RETURN_NIL - 它允許您在代碼中的各個位置(它是C / Objective-C)引入一個執行調試器附加檢查的宏。
至於檢測Cycript,當它針對一個進程運行時,它會在進程中注入一個dylib來處理cycript命令行和進程之間的通信 - 該庫的部分名稱看起來像cynject
。 該名稱與典型iOS應用程序中存在的任何庫類似。 這應該可以通過像( C
)這樣的小循環來檢測:
BOOL hasCynject() {
int max = _dyld_image_count();
for (int i = 0; i < max; i++) {
const char *name = _dyld_get_image_name(i);
if (name != NULL) {
if (strstr(name, "cynject") == 0) return YES;
}
}
}
同樣,給它一個比這更好的名稱是可取的,以及混淆你正在測試的字符串。
這些只是可以采取的方法 - 不幸的是,這些只會在運行時以某種方式保護您,如果有人選擇指向IDA或其他一些反匯編程序,那么您就不會受到保護。
將調試器檢查作為宏實現的原因是您將代碼放在代碼中的各個位置,因此有人試圖修復它必須在各種地方修補應用程序。
基於@ petesh的回答,我發現下面的代碼在帶有Cycript的越獄手機上達到了我想要的效果。 printf字符串的存在是反向工程師的黃金,所以這段代碼只適用於demo / crack-me應用程序。
#include <stdio.h>
#include <string.h>
#include <mach-o/dyld.h>
int main ()
{
int max = _dyld_image_count();
for (int i = 0; i < max; i++) {
const char *name = _dyld_get_image_name(i);
const char needle[11] = "libcycript";
char *ret;
if ((ret = strstr(name, needle)) != NULL){
printf("%s\nThe substring is: %s\n", name, ret);
}
}
return 0;
}
據我所知,Cycript過程注入可以通過調試符號實現。 因此,如果您刪除App Store版本的調試符號(Release配置的默認構建設置),那將有所幫助。
您可以采取的另一個操作,即對App的可用性沒有影響,將使用混淆器。 但是,這會導致任何崩潰報告無效,因為即使崩潰報告符號化,您也無法理解符號。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.