android - 堆损坏 - Android native 代码中的 SEGV_MAPERR

标签 android c encryption openssl java-native-interface

我正在尝试为流式 AES 加密创建一个小型库,我的工作基于 Facebook Conceal 项目 (https://github.com/facebook/conceal),只是更改了一些内容并改进了 native 的包装器以支持带填充的密码。

它正在工作,它可以毫无问题地破译文件,但是当我处理大流时,我会遇到随机的堆内存损坏,经过大量调试后,我一直无法找到错误。

这是我的代码:
https://gist.github.com/frisco82/9782725

我试图找到内存分配或释放问题,但几乎没有 malloc 或 free,jni 调用应该是安全的,openssl 也是如此(我已经编译了我自己的,但隐藏提供的也失败)

CheckJni 不会发出任何警告,虽然上下文处理有点开箱即用,但它似乎并没有损坏(实际上 Android concrypt 似乎使用了类似的东西)。

此外,如果有人可以将我指向 Android 原生 AES 多步(多次更新调用)库,我会切换到那个并忘记这个。

错误时有不同,但通常与他的相似:

03-26 10:33:02.065: A/dalvikvm(2475): @@@ ABORTING: DALVIK: HEAP MEMORY CORRUPTION IN mspace_malloc addr=0x0
03-26 10:33:02.065: A/libc(2475): Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 2494 (AsyncTask #1)
03-26 10:33:02.205: I/DEBUG(933): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
03-26 10:33:02.205: I/DEBUG(933): Build fingerprint: 'generic_x86/google_sdk_x86/generic_x86:4.4.2/KK/999428:eng/test-keys'
03-26 10:33:02.205: I/DEBUG(933): Revision: '0'
03-26 10:33:02.205: I/DEBUG(933): pid: 2475, tid: 2494, name: AsyncTask #1  >>> com.proton <<<
03-26 10:33:02.205: I/DEBUG(933): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad

完整的堆栈跟踪:
http://pastebin.com/f6mDuQEj

最佳答案

It is working and it can decipher files without problems but I get random Heap Memory Corruptions when I work with large streams.

在我看来,从上面一行来看,您的程序显然正在覆盖您的代码隐式或显式分配的内存。我试图理解您的代码,但我不清楚。但是我试着从内存损坏的场景来看,发现你的程序确实有 malloc/free 调用,这可能会导致内存溢出。

EVP_CIPHER_CTX *ctx = (EVP_CIPHER_CTX*) malloc(sizeof(EVP_CIPHER_CTX));
EVP_CIPHER_CTX_init(ctx);

EVP_CIPHER_CTX *ctx = (EVP_CIPHER_CTX*) malloc(sizeof(EVP_CIPHER_CTX));
EVP_CIPHER_CTX_init(ctx);

我试图检查 EVP_CIPHER_CTX 结构 的布局,但它在您的代码中不可用。但我看到这些指针在您的程序中的各种上下文中得到使用。现在您应该检查在哪些情况下您的缓冲区可以被覆盖,因为您在某些地方使用了不同的 keyLength 并且根据此您的程序正在执行不同的功能。我认为您可能想要查看这些代码并查看是否可能发生溢出!!!....

由于您的应用程序将在基于 android 的系统上运行,我们无法运行任何动态工具(Valgrind/WinDBG/Pageheap..)所以我想您需要通过在重要位置放置一些日志来检查您的代码并查看您在哪里正在覆盖。

希望以上信息对您了解您的问题有所帮助。

关于android - 堆损坏 - Android native 代码中的 SEGV_MAPERR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22662332/

相关文章:

android - 将 APK 复制到 KitKat 上的/system/app 时未安装库

android - Android布局绘制有什么比较高效的?安卓 :textColor ="#FFFFFF" or android:textColor ="@android:color/white"?

android - Android 中的滑动动画

c - 我应该在不同的文件中多次包含头文件吗?

c - 如何为 EVP_CIPHER 设置零填充?

security - Phonegap/ Cordova : Storing password securely?

android - 如何以编程方式在 Android 中创建和读取 WEP/EAP WiFi 配置?

c - 了解如何在 R 中处理 .Internal C 函数

在没有 Root 访问的情况下,Linux 在 CPL3(用户模式)下会崩溃或挂起吗?

python - Django 设置 ‘SECRET_KEY’ 的目的是什么?