运行程序固定的时间

时间:2017-03-06 02:45:35

标签: c

我正在尝试编写一个可以运行有限时间的代码(就像在试用版中一样)说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文件可以运行有限的时间

1 个答案:

答案 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

这意味着该计划必须......

  1. 使用argv[0]打开自己。
  2. 从最后搜索4个字节。
  3. 将最后4个字节读入4字节整数。
  4. 检查它不是0。
  5. 我们需要读取/写入特定数量的字节,因此我将使用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( &times, 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);
    }
    

    写作非常相似。

    1. 使用argv[0]打开自己。
    2. 从最后搜索4个字节。
    3. 写下新的剩余次数。
    4. // 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( &times, 4, 1, fp );
      

      同样,这种形式的复制保护几乎不是速度提升。任何知道十六进制编辑器的人都可以轻松识别它并打破它。任何人都无法通过谷歌获得由其他人撰写的指示。这个答案仅适用于练习。