如何防止NDK将堆栈跟踪转储到android logcat?
问题描述:
我们正在努力添加一个NDK组件,为我们的Android应用程序提供额外的安全性。我们希望这个组件的逻辑是私有的,因此不希望堆栈跟踪在android studio logcat中转储。我已经尝试了几个标志到CMake构建配置,但似乎没有帮助。如何防止NDK将堆栈跟踪转储到android logcat?
externalNativeBuild {
cmake {
cppFlags "-lz -std=c++11 -s"
arguments "-DAPP_OPTIM=release", "-DCMAKE_BUILD_TYPE=Release"
}
}
此外,有喜欢的工具的任何Proguard的可供NDK,这样的代码可以混淆?
答
你在问一些奇怪的事情。如果你只想做逆向工程难度 - 那么最好是只混淆代码,也不要试图隐瞒你崩溃,至少是因为它:
- 发展
- 使得期间就更难调试应用程序不可能获得通过谷歌从最终用户的崩溃报告播放控制台
- 全系统的故障报告机制和应用程序框架,在不可预知的方式
干扰如果你仍然想用它做实验 - 尝试这个片段:
#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环境中使用您的代码所需的所有导出。