簡體   English   中英

檢測Cycript / Substrate或gdb是否附加到iOS應用程序的進程?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM