我发现可以从二进制文件中提取硬编码字符串。
例如属性视图流程浏览器 http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx显示所有超过 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;
}
The strings can clearly be extracted from the corresponding executable:
我认为找到琴弦有点太容易了。
我的问题是:
- How to simply hide 隐藏字符串1 or 隐藏字符串2在里面
可执行的?
- 有没有更安全的
使用“作弊代码”的方式比
一些晦涩的隐藏输入?
欢迎来到更广阔的防御性编程世界。
有几种选择,但我相信所有这些都依赖于某种形式的混淆;尽管并不完美,但至少是一些东西。
您可以以其他二进制形式(十六进制?)存储文本,而不是直接字符串值。
您可以加密存储在应用程序中的字符串,然后在运行时解密它们。
您可以将它们拆分到代码中的各个点,然后再重新构建。
或者它们的某种组合。
请记住,某些攻击比查看实际的二进制文件更进一步。有时他们会在程序运行时调查程序的内存地址空间。 MS 想出了一个叫做.Net 2.0 中的安全字符串 http://msdn.microsoft.com/en-us/library/system.security.securestring.aspx。目的是在应用程序运行时保持字符串加密。
第四个想法是不要将字符串存储在应用程序本身中,而是依赖验证代码提交到您控制的服务器。在服务器上您可以验证它是否是合法的“作弊代码”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)