简单的保护字符串,增加反汇编难度


Creative Commons LicenseCreative Commons LicenseCreative Commons License

本文主要记录下如何在C语言里保护你的字符串不被看见,增加反汇编的难度,目前应该没有有效的保护反汇编的
机制,关于如何防止反汇编给程序加壳等不在本文讨论范围

通常字符串的保存方式

1
2
char  mystr[] = "hello world";
char mystr[] = {'!', 'h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd', '!'};

代码了如果按照如上的方式定义字符串,只要用二进制工具打开可执行程序就能看见,类似如下的字段

1
2
00001040: 6865 6c6c 6f20 776f 726c 6400 0000 0000  hello world.....
00001050: 2168 656c 6c6f 776f 726c 6421 0000 0000 !helloworld!....

改进后的保存方式

改进后,字符串通过一定的数学变化的形式来存储,也可以把代码里用到的路径也隐藏起来,比如如下的实例代码
通过简单的异或的方式隐藏了字符串,二进制工具打开可执行程序只能看到如下类似的字符,如果要得到实际的字符串还需要研究汇编代码,把解析程序分析出来,增加了破解的难度

1
2
00000540: 0948 8345 f801 8345 f401 488b 45f8 0fb6  .H.E...E..H.E...
00000550: 108b 45f4 31c2 488b 45f8 8810 488b 45f8 ..E.1.H.E...H.E.

C测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/* mixstring.c */
#include <stdio.h>

char MIICrjCCA[] = {
'H'^0x27, 'e'^0x28, 'l'^0x29 ,'l'^0x2a, 'o'^0x2b, 'w'^0x2c,
'o'^0x2d, 'r'^0x2e, 'l'^0x2f, 'd'^0x30, '!'^0x31, '!'^0x32,
'\0'^0x33
};

char PXdAPN[] = {
'/'^0X12, 'p'^0X12, 'a'^0X12, 't'^0X12, 'h'^0X12, '/'^0X12,
't'^0X12, 'o'^0X12, '/'^0X12, 'f'^0X12, 'i'^0X12, 'l'^0X12,
'e'^0X12, '\0'^0x12
};

char *IXrtDF(char *str, int key)
{
int key_start = key;
char *p = str;
while( ((*p) ^= key_start) != '\0') {
p++;
key_start++;
}
return str;
}

char *IXrtBF(char *str, int key)
{
int key_start = key;
char *p = str;
while( ((*p) ^= key_start) != '\0') {
p++;
}
return str;
}

int main(void)
{
printf("dec strings %s\n", IXrtDF(MIICrjCCA, 0x27));
printf("dec path %s\n", IXrtBF(PXdAPN, 0x12));
}
1
2
3
$ ./mixstring
dec strings Helloworld!!
dec path /path/to/file
-------------本文结束感谢您的阅读-------------
如果文章对您有帮助,也可以打赏支持喔!