[英]How to prevent Android SQLite from dumping stack trace to 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的工具可以混淆代碼?
您在問一些奇怪的事情。 如果您只是想增加反向工程的難度,那么最好只混淆代碼,並且至少不要因為以下原因而試圖隱藏崩潰:
如果您仍然想嘗試一下,請嘗試以下代碼段:
#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.