反编译C++文件有多难?

逆向工程 C++ 安卓 ios
2021-06-26 05:14:00

我正在编写一个带有 AES 加密的 Android 应用程序,我要将 AES 密钥作为字符串保存到扩展名为.cpp.

我还将创建一个使用相同 AES 密钥的 iOS 应用程序。是否可以将密钥保存在 iOS 中的 C++ 文件中?反编译 C++ 文件并读取密钥会有多困难?

这是来自 Android 的 C++ 文件:

#include <jni.h>
#include <string>

extern "C"
JNIEXPORT jstring JNICALL
Java_com_android_app_aesKeyFromJNI(JNIEnv *env, jobject /* this */) {
    std::string secret = "somesecretkey";
    return env->NewStringUTF(secret.c_str());
}
2个回答

不够狠!

首先,如果您将密钥保存为未加密的字符串,一个简单的strings命令就会找到它,IDA x-ref 甚至会显示使用它的反向器。
如果您保存加密的密钥,一个简单的断点将让他们看到解密后的密码。(或了解解密算法)。

像这样的纯文本字符串将在十六进制编辑器(如查看文件是可见的hte或类似的观众xxdod)或使用Sysinternals的strings命令或strings(1)在Linux / FreeBSD的等,例如。大多数逆向工程工具都有一个单独的字符串视图,因为它们通常对逆向工程师特别有用。Amirag 已经为 IDA 指出了这一点。

就 Android 而言,C++ 文件可能最终会成为 ELF 文件格式的共享对象。这些是具有已知结构的二进制文件。只需查看导出的函数/符号,就可以轻松找到“秘密”。即使你进一步混淆它,它仍然无济于事。混淆是通过默默无闻保证安全这不是真正的安全因此,如果这是目标,即使将该字符串写入一些异或字节数组或使用凯撒密码也不会增加任何切实的保护。

此外,您永远不应该在以用户结尾的代码中包含私钥。之所以称其为秘密,是因为它应该保密仅仅用编译器“修改”这个秘密的表示根本不会有帮助。

如果这是用户不应该看到的秘密,这属于服务器端或 HSM(硬件安全模块),但任何形式存在于用户的机器上没有其他方法可以在不信任用户的同时将“秘密”置于用户手中。这也是软件保护机制的基本难题。