我需要一些有确保文件完整性的人的意见。 我试图用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_begin
和text_end
将包含.text
部分的开始和结束地址,以及{ {1}} crc_stored
部分的crc校验和。
我想知道这是否是一种正确的方法,或者有更好的方法?
编辑:Karoly Horvath说得对。我们假设我使用crc检查来解密一些代码。我想知道哪个是ro校验和保护可执行文件的最佳方法。 奥拉夫也有权利。我可以使用sha算法。问题是一样的。
Edit2:请停止说可以绕过任何保护措施。我知道,我只是想让它变得更难。如果可以,请回答这个问题。
答案 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
}
我希望你能看到这个"解决方案"根本不是一个解决方案(如果有人能够修补一个条件跳转,肯定他就能够修补两个这样的跳转)。
答案 1 :(得分:0)
请勿停止程序运行。 如果开始时许可证有误,则在1到5分钟后可能会出现一些奇怪的行为, 导致段错误,错误的计算等等。 但是以某种间接的方式。就像第二个线程一样,如果许可证错误,它可以修改计算或更改另一个线程堆栈中的随机位。
还可以在运行时通过/proc/self
获取自己的地图,并在运行时在.text
节中运行校验和。
这样,您还可以找到一些运行时修改。
但令人痛苦的事实是, 如果它是可运行的,那么这仅仅是攻击者需要多少努力才能运行无许可副本。使它不可运行并不重要。仅仅是破解它所付出的努力必须大于付出的努力。