C: 抑制来自二进制的系统调用
C: Suppress system calls from binary
我的代码中有这样的东西:
system("a system call");
但是,作为 printf
,system()
中的文本在二进制代码中是可读的。
我正在用
编译 .c
gcc -std=gnu99 code.c -o code
如何编译以抑制二进制代码中的可读字符串?
您可以 "encrypt" 字符串并存储加密版本。然后当程序需要这个ASCII字符串的时候,解密。
最简单的加密器是使用随机位模式进行按位异或。要解密,只需使用完全相同的随机位模式执行相同的按位异或。
您需要将字符串长度与加密的字节序列一起保存。
这里是简单的加解密函数。这些不是加密安全的,但足以实现目标。
您可以使用全局常量作为键。
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++);
}
我们不知道您在哪个操作系统上编写代码。但我猜它是 Linux(或至少一些 POSIX)。
那么我的建议是 避免 system(3) and use something else, such as fork(2), execve(2), waitpid(2); take time to read Advanced Linux Programming 了解详细信息(它们对您来说可能很棘手)。
顺便说一句,您天真地认为通过从二进制文件中删除字符串,人们将无法理解正在发生的事情。他们可以使用 strace(1) 并立即猜测您的程序是什么程序和参数 运行(即使您加密了命令字符串等...)
顺便说一句,通过模糊来实现安全是错误的。
最后,一些术语:system(3) is a standard C library function (very poorly named, it should have been called command
), it is not a system call, which are listed (on Linux) in syscalls(2)。
我的代码中有这样的东西:
system("a system call");
但是,作为 printf
,system()
中的文本在二进制代码中是可读的。
我正在用
编译.c
gcc -std=gnu99 code.c -o code
如何编译以抑制二进制代码中的可读字符串?
您可以 "encrypt" 字符串并存储加密版本。然后当程序需要这个ASCII字符串的时候,解密。
最简单的加密器是使用随机位模式进行按位异或。要解密,只需使用完全相同的随机位模式执行相同的按位异或。
您需要将字符串长度与加密的字节序列一起保存。
这里是简单的加解密函数。这些不是加密安全的,但足以实现目标。 您可以使用全局常量作为键。
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++);
}
我们不知道您在哪个操作系统上编写代码。但我猜它是 Linux(或至少一些 POSIX)。
那么我的建议是 避免 system(3) and use something else, such as fork(2), execve(2), waitpid(2); take time to read Advanced Linux Programming 了解详细信息(它们对您来说可能很棘手)。
顺便说一句,您天真地认为通过从二进制文件中删除字符串,人们将无法理解正在发生的事情。他们可以使用 strace(1) 并立即猜测您的程序是什么程序和参数 运行(即使您加密了命令字符串等...)
顺便说一句,通过模糊来实现安全是错误的。
最后,一些术语:system(3) is a standard C library function (very poorly named, it should have been called command
), it is not a system call, which are listed (on Linux) in syscalls(2)。