簡體   English   中英

如何防止NDK將堆棧跟蹤信息轉儲到android logcat?

[英]How to prevent NDK from dumping stack trace to android logcat?

我們正在努力添加NDK組件,以為我們的Android應用程序提供額外的安全性。 我們希望此組件的邏輯是私有的,因此不希望android studio logcat中的堆棧跟蹤轉儲。 我已經嘗試了幾個標志到CMake構建配置,但似乎沒有幫助。

    externalNativeBuild {
        cmake {
            cppFlags "-lz -std=c++11 -s"
            arguments "-DAPP_OPTIM=release", "-DCMAKE_BUILD_TYPE=Release"
        }
    }

另外,是否有適用於NDK的類似於Proguard的工具可以混淆代碼?

您在問一些奇怪的事情。 如果您只是想增加反向工程的難度,那么最好只混淆代碼,並且至少不要因為以下原因而試圖隱藏崩潰:

  • 使得在開發過程中調試應用程序更加困難
  • 使得無法通過Google Play控制台從最終用戶那里獲取崩潰報告
  • 以無法預測的方式干擾系統范圍的故障報告機制和應用程序框架

如果您仍然想嘗試一下,請嘗試以下代碼段:

#include <signal.h>
#include <stddef.h>
#include <unistd.h>
#include <sys/syscall.h>

void makeCrashesSilent() {
    struct sigaction sa;
    sa.sa_flags = SA_SIGINFO;
    sa.sa_sigaction = [] (int signo, siginfo_t*, void*) {
        _exit(1);
    };
    int signals[] = {
            SIGSEGV,
            SIGBUS,
            SIGFPE,
            SIGABRT,
            SIGILL,
            SIGINT,
    };
    for (size_t i = 0; i < sizeof signals / sizeof signals[0]; i++) {
        syscall(__NR_sigaction, signals[i], &sa, nullptr);
    }
}

此函數將自定義處理程序安裝到所有UNIX信號,這些信號在通常情況下會以本機崩潰和logcat中的相關轉儲結尾。 一次調用此函數可取消logcat中的調試輸出。 但是,盡管如此,每次崩潰仍然可以通過logcat中的簡短消息檢測到:

10-06 21:24:01.214 945-2236/? I/ActivityManager: Process com.example.sergik.test2 (pid 7682) has died: fore TOP 
10-06 21:24:01.214 632-632/? I/Zygote: Process 7682 exited cleanly (1)

就這樣。 沒有崩潰轉儲,沒有額外的信息。 請注意,系統可能會立即重新啟動您的應用程序,因為它看不到崩潰,最好將重新啟動推遲到用戶明確請求后再進行。 就像我之前所說的那樣-這很可能會混淆android運行時,尤其是在現代系統中,ART為某些信號安裝了自己的處理程序鏈。

因此最好將注意力集中在混淆上。 AFAIK中有一些基於LLVM的混淆器可能會滿足您的需求。 但是您甚至可以開始時不使用任何其他工具-第一步,您可以僅隱藏二進制文件中所有不必要的符號信息,而僅保留JNI必需的導出,例如,通過每個.so文件的版本腳本:

{
  global:
    JNI_OnLoad; Java_*;

  local:
    *;
};

這種腳本將隱藏所有導出,除了使用Java Land中的代碼所必需的導出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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