我正在尝试编写一个可以运行有限时间的代码(就像在试用版中一样)说5次或10次..之后代码将无法运行。 我有一个方法,但它修改了源代码。我不想要那个。此外,禁止使用外部文件。 这是我的源代码修改方法的代码 - 如果在int x = 5中5,则必须将fseek值(此处为38)计算到位置。 (我不确定是否清楚)
#include<stdio.h>
int main(){
int x=5;
char c;
FILE *f;
if(x>0){
f=fopen("FT.c","r+");
fseek(f,38,SEEK_SET);
fprintf(f,"%d",--x);
fclose(f);
printf("%d time left",x);
}else{
printf("you cannot run more than 5 time");
}
return 0;
}
N.B。我不想再次编译源代码。我想要生成可执行文件,然后.exe文件可以运行有限的时间
答案 0 :(得分:3)
你可以做到这一点,但这不是一个好主意。
您要求的是Digital Rights Management or DRM并且它不起作用。即使是最大的软件公司也无法使其可靠运行,其根本原因是,如果我可以运行您的代码,我可以修改您的代码。所有DRM都是减速带。你改变二进制数字的想法很容易找到和失败。友情提示:不要浪费你的时间。相反,拥有许可证并执行它,或者不分发您的软件(即将其作为服务器提供)。
但是,让我们这样做。
在已编译的可执行文件的末尾附加一个数字。可执行文件读取它以确定它剩余的次数,并用新的次数重写它。
有多种方法可以将数字放在最后。您可以使用十六进制编辑器在那里编写它。我使用一个小的Perl程序来写4个字节。
# It's backwards because x86 machines are little-endian.
# And you're probably on an x86 machine.
$ perl -we 'open my $fh, ">>", shift; print $fh "\x03\x00\x00\x00";' executable
这意味着该计划必须......
argv[0]
打开自己。我们需要读取/写入特定数量的字节,因此我将使用uint32_t来获得固定大小的4字节整数。
// Open our own executable for reading.
FILE *fp = fopen(argv[0], "rb");
if( fp == NULL ) {
fprintf( stderr, "Can't open %s for %s: %s", argv[0], mode, strerror(errno) );
exit(-1);
}
// Seek 4 bytes from the end.
if( fseek( fp, -4, SEEK_END ) != 0 ) {
fprintf( stderr, "Can't seek: %s", strerror(errno) );
exit(-1);
}
// Read 4 bytes
uint32_t times = 0;
fread( ×, 4, 1, fp );
if( times == 0 ) {
printf("Program expired. Please give me $money$.\n");
exit(-1);
}
else {
printf("You have %d tries remaining.\n", times);
}
写作非常相似。
argv[0]
打开自己。// Open our own executable for reading & writing.
// Can't use "a", that will always write to the end of the file.
// Can't use "w", that will erase the file.
FILE *fp = fopen(argv[0], "r+b");
if( fp == NULL ) {
fprintf( stderr, "Can't open %s for %s: %s", argv[0], mode, strerror(errno) );
exit(-1);
}
// Seek 4 bytes from the end.
if( fseek( fp, -4, SEEK_END ) != 0 ) {
fprintf( stderr, "Can't seek: %s", strerror(errno) );
exit(-1);
}
fwrite( ×, 4, 1, fp );
同样,这种形式的复制保护几乎不是速度提升。任何知道十六进制编辑器的人都可以轻松识别它并打破它。任何人都无法通过谷歌获得由其他人撰写的指示。这个答案仅适用于练习。