【发布时间】:2009-05-29 14:10:17
【问题描述】:
我发现可以从二进制文件中提取硬编码字符串。
例如Process Explorer的属性视图显示所有超过3个字符的字符串。
这是我编写的一个简单可执行文件的代码,用于简单地对其进行测试:
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0501
#endif
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
_TCHAR* hiddenString1 =_T("4537774B-CC80-4eda-B3E4-7A9EE77991F5");
_TCHAR* hiddenString2 =_T("hidden_password_or_whatever");
for (int i= 0; i<argc; i++) {
if (0 == _tcscmp(argv[i],hiddenString1)) {
_tprintf (_T("The guid argument is correct.\n")); }
else if (0 == _tcscmp(argv[i],hiddenString2)) {
_tprintf (_T("Do something here.\n")); }
}
_tprintf (_T("This is a visible string.\n"));
//Keep Running
Sleep(60000);
return 0;
}
可以清楚地从对应的可执行文件中提取字符串:
我认为找到字符串有点太容易了。
我的问题是:
- 如何简单地隐藏 hiddenString1 或 hiddenString2 可执行吗?
- 有没有更安全的 使用“作弊码”的方法比使用 一些晦涩的隐藏输入?
【问题讨论】:
-
这个问题是关于 GUID 还是关于一般字符串?
-
GUID 只是一个例子:我也想隐藏一些 http 请求的 URL。
-
隐藏 http 请求的 URL 是行不通的。任何拥有嗅探器的人都可以准确地看到您的应用在做什么,而且这样做比检查您的进程的内存要容易得多。
-
你可以参考this - 它解释了什么是函数加密和全同态加密。
标签: c++ security obfuscation reverse-engineering defensive-programming