但是,我们在应用程序中使用的是C库。我们使用的是针对ARM体系结构编译的该库的.so文件。我们使用应用程序主Java代码中的SWIG接口与该库进行交互。我想知道是否可以将私钥存储在该库的源代码中,然后通过SWIG绑定函数访问这些密钥。我认为这是针对我的问题的最佳解决方案,因为ARM .so文件需要出色的商业反编译器和ARM体系结构的知识才能有效地对其进行反向工程。因此,使获取私钥的方法变得相当安全。
#1 楼
将密钥隐藏在apk中的任何位置(包括.so文件)绝对不足以长时间保留密钥的秘密。可以肯定地执行的代码可以进行逆向工程,并且可以提取密钥-即使没有花哨的反编译器并且也不太了解ARM架构(顺便说一句,arm32有一个非商业的反编译器)。我强烈建议您阅读有关白盒加密的知识,并在为解决此类问题而开发的特定领域中寻找解决方案。
#2 楼
如果您的应用程序可以解密文件,那么您应该假定有足够兴趣的人也可以解密。故事的结局。迷惑会使人放慢脚步,但不会阻止所有人,而且可能不会像您认为的那样有效。
#3 楼
但是,我们在应用程序中使用了C库。我们使用的是针对ARM体系结构编译的该库的.so文件。我们使用应用程序主Java代码中的SWIG接口与该库进行交互。我想知道是否可以将私钥存储在该库的源代码中,然后通过SWIG绑定函数访问这些密钥。
我完全可以,但是会阻止某人从获取该C库并将其通过
objdump
或Radare传递,并弄清楚密钥的存储位置?与binwalker
之类的东西相比,使用Java可能需要的技巧更少。如果将其存储为字符串,则/usr/bin/strings
本身可能会选择它。ARM .so文件需要精通的商业反编译器和ARM体系结构的知识
并非如此:
objdump
(-marm
)和radare
支持ARM。如果您从未玩过这些游戏,请试一试。objdump
radare2
评论
您想从Java访问密钥,对吗?在这种情况下,一种简单的解决方法是,在调用调用方法来检索它后,附加一个调试器并获取密钥。硬编码密码密钥的做法有其自己的CWE条目:cwe.mitre.org/data/definitions/321.html
如何进行C代码中的所有解密和其他工作?
对于大多数经验丰富的逆向工程师而言,您的“漂亮的东西安全性”都是微不足道的。