ELF文件的CRC校验和

时间:2015-11-16 11:20:12

标签: c linux security elf crc32

我需要一些有确保文件完整性的人的意见。 我试图用crc校验和保护我的文件的完整性。我的主要目标是更难绕过许可证文件检查(包括拆卸可执行文件和删除条件跳转)。

我提出了以下想法:

unsigned long crc_stored = 4294967295;
char* text_begin = (char*)0xffffffffffffffff;
char* text_end = (char*)0xffffffffffffffff;

int main(){
    unsigned long crc = calc_checksum(text_begin, text_end);
    if (crc == crc_stored)
        //file is ok
}

我按以下方式编辑elf二进制文件的.data部分:text_begintext_end将包含.text部分的开始和结束地址,以及{ {1}} crc_stored部分的crc校验和。

我想知道这是否是一种正确的方法,或者有更好的方法?

编辑:Karoly Horvath说得对。我们假设我使用crc检查来解密一些代码。我想知道哪个是ro校验和保护可执行文件的最佳方法。 奥拉夫也有权利。我可以使用sha算法。问题是一样的。

Edit2:请停止说可以绕过任何保护措施。我知道,我只是想让它变得更难。如果可以,请回答这个问题。

2 个答案:

答案 0 :(得分:1)

让我看看。你有代码执行此操作:

int main() {
  if (!license_ok()) { exit(1); }
  // do something useful
}

您担心有人会反汇编您的代码,并修补条件跳转,因此您建议改为使用这种代码:

int main() {
  if (calc_checksum() != stored_crc) { exit(1); }
  if (!license_ok()) { exit(1); }
  // do something useful
}

我希望你能看到这个"解决方案"根本不是一个解决方案(如果有人能够修补一个条件跳转,肯定他就能够修补两个这样的跳转)。

您可以在one manybooks上找到关于该主题的更合理/更强大的解决方案的想法。

答案 1 :(得分:0)

请勿停止程序运行。 如果开始时许可证有误,则在1到5分钟后可能会出现一些奇怪的行为, 导致段错误,错误的计算等等。 但是以某种间接的方式。就像第二个线程一样,如果许可证错误,它可以修改计算或更改另一个线程堆栈中的随机位。

还可以在运行时通过/proc/self获取自己的地图,并在运行时在.text节中运行校验和。 这样,您还可以找到一些运行时修改。

但令人痛苦的事实是, 如果它是可运行的,那么这仅仅是攻击者需要多少努力才能运行无许可副本。使它不可运行并不重要。仅仅是破解它所付出的努力必须大于付出的努力。