学习
实践
活动
专区
工具
TVP
写文章
  • 广告
    关闭

    上云精选

    2核2G云服务器 每月9.33元起,个人开发者专属3年机 低至2.3折

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    CC++ 通过CRC32实现反破解

    我们可以通过使用CRC32算法计算出程序的CRC字节,并将其写入到PE文件的空缺位置,这样当程序再次运行时,来检测这个标志,是否与计算出来的标志一致,来决定是否运行程序,一旦程序被打补丁,其crc32值就会发生变化 ,一旦发生变化,程序就废了,绕过的方式则是,1.动态打补丁,2.找到crc32算法位置将跳转nop掉,3.直接手动计算出crc32并覆盖到原始程序的crc算法位置。 对文件的CRC32检测 PE头,前面有非常多的无效空间,可以供我们使用,crc32地址应该反写。 对磁盘的CRC32检测 对磁盘完整性检测只能防止文件被修改,但无法防止内存补丁,下面的代码将可以检测内存变化,如果内存被打补丁,则会退出执行。 原理是,定位到.text节首地址,然后计算该节的CRC32值,并存入全局变量,然后开一个线程进行循环检测,一旦发生变化,则立即让程序报废。部分代码片段。

    17420

    CRC32算法冲突概率测试和分析

    最近因为某个业务需要用到CRC32算法,但业务又不能容忍重复的数值出现,于是自然就想了解一下CRC32算法的冲突概率(或者叫碰撞概率)。 虽然我没有看懂crc32算法的原理,但隐约觉得这个冲突率不符合实际,于是继续寻找,终于功夫不负有心人,找到一个详细和完整的测试报告(http://www.backplane.com/matt/crc64 由于CRC32算法是通用的,因此也就不存在不同语言实现机制不同的问题,于是我把目光转向了测试模型,问题果然在这里。 我的测试模型:crc32(i++),这个计算模型输入进去的原值只是某个范围内连续的数据,并不是完全随机的. 于是我稍微修改一下:crc32(md5(i++)),这样就保证输入的原值是完全随机的。 归纳总结一下: 1)CRC32在完全随机的输入情况下,冲突概率还是比较高的,特别是到了1亿的数据量后,冲突概率会更高 2)CRC32在输入某个连续段的数据情况下,冲突概率反而很低,这是因为两个冲突的原值理论上应该是相隔很远

    3.7K90

    CC++ 使用CRC检测磁盘文件完整性

    实现磁盘文件检测,我们可以使用CRC32算法或者RC4算法来计算程序的散列值,以CRC32为例,其默认会生成一串4字节CRC32散列,我们只需要计算后将该值保存在文件或程序自身PE结构中的空缺位置即可。 具体实现:通过使用CRC32算法计算出程序的CRC字节,并将其写入到PE文件的空缺位置,这样当程序再次运行时,来检测这个标志,是否与计算出来的标志一致,来决定是否运行程序,一旦程序被打补丁,其crc32 实现CRC32完整性检查: 生成CRC32的代码如下,其中的CRC32就是计算过程,这个过程是一个定式,我们只需要使用CreateFile打开文件,并将文件字节数全部读入到BYTE *pFile = ( 会发现,当我们尝试修改程序中的数据时,crc32散列值也会随之变化,也就是说我们动了程序crc32也就重新就算了,这好像是一个死结无法被解开,那么该如何解决这个问题呢? 如何破解: 如果目标磁盘文件进行了CRC32磁盘校验,我们该如何破解呢?思路差不多就是找到CRC32算号位置,然后观察其结果到底时与谁进行的比较,将指令取反,也可实现破解。

    16930

    在MySQL中建立自己的哈希索引(书摘备查)

    列上的索引并给表添加一个被索引的url_crc列,就可以按照下面的方式进行查询: select id from url where url='http://www.mysql.com' and url_crc=crc32 create trigger pseudohash_crc_ins before insert on pseudohash for each row begin set new.url_crc=crc32 如果表有很多行并且crc32()产生了很多冲突,就要实现自己的64位哈希函数。要确保自己的函数返回整数,而不是字符串。 crc32()返回一个32位的整数值,因此至少需要93000个值才会出现碰撞(k*(k-1)/2n=1,其中n=2^32,则k=92682)。 如果碰撞不是问题,不如进行统计并且不需要精确的结果,就可以通过在where子句中使用crc32()值简化查询,并得到效率提升。

    84430

    CC++ 使用CRC检测内存映像完整性

    校验思路如下 1.首先从内存得到PE的代码节的RVA和节大小 2.根据得到的RVA和节大小计算出crc32或是RC4值 3.读取自身保存的原始CRC32值,与校验结果进行比较 1.先来实现第一步 .text): %x --> 镜像大小: %x \n", va_base, sec_len); system("pause"); return 0; } 2.第二部就是计算校验和,然后计算该节的CRC32 值,并存入全局变量,也就是程序打开后自动初始化计算一次内存crc32值并放入全局变量中,然后开一个线程,每三秒检测一次内存变化,如果变化则终止执行或弹窗提示,你也可以提前计算处校验和并写入PE空缺位置。 crcTmp1 = (crcTmp1 >> 1) ^ 0xEDB88320L; else crcTmp1 >>= 1; } crcTable[i] = crcTmp1; } // 计算CRC32 ((BYTE*)(va_base), sec_len); // printf(".text节CRC32 = %x \n", CheckCRC32); return CheckCRC32; } int

    18130

    扫码关注腾讯云开发者

    领取腾讯云代金券