我的代码中包含以下内容:
system("a system call");
但是,作为printf
,system()
中的文本在二进制代码中是可读的。
我正在使用
编译.c
gcc -std=gnu99 code.c -o code
如何编译以抑制二进制代码中的可读字符串?
答案 0 :(得分:4)
我们不知道您编写的操作系统。但我猜它是Linux(或者至少是一些POSIX)。
然后我的建议是避免system(3) 并使用其他内容,例如fork(2),execve(2),waitpid(2);花时间阅读Advanced Linux Programming了解详细信息(对您来说可能很棘手)。
顺便说一句,你天真地认为通过从你的二进制文件中删除字符串,人们将无法理解正在发生的事情。他们可以使用strace(1)并立即猜测程序运行的程序和参数(即使你加密了命令字符串等等) 顺便说一下,通过默默无闻的安全是错误的。最后,一些术语:system(3)是一个standard C library函数(命名很差,它应该被称为command
),它不是system call ,在syscalls(2)中列出(在Linux上)。
答案 1 :(得分:1)
你可以"加密"字符串并存储加密版本。然后当程序需要ASCII字符串时,解密它。
最简单的加密器是使用随机比特模式执行按位xor。要解密,只需执行相同的按位xor,即可获得相同的随机位模式。
您需要将字符串长度与加密的字节序列一起保存。
以下是简单的加密和解密功能。这些不是加密安全的,但足以达到目标。 您可以使用全局常量作为键。
void encrypt(char* str, unsigned long key)
{
unsigned char* p = (unsigned char*)str, c;
do
{
key = key * 214013L + 2531011L;
c = *p;
*p ^= (unsigned char)(key>>24);
++p;
}
while(c);
}
void decrypt(char* str, unsigned long key)
{
unsigned char* p = (unsigned char*)str;
do
{
key = key * 214013L + 2531011L;
*p ^= (unsigned char)(key>>24);
}
while(*p++);
}