逆向CRC32
问题描述:
我正在寻找一种方法来逆转a CRC32 checksum。有解决方案,但它们是badly written,extremely technical和/或in Assembly。大会(当前)超出了我的看法,所以我希望有人能够用更高级的语言拼凑出一个实现。 Ruby是理想的,但我可以解析PHP,Python,C,Java等。逆向CRC32
任何接受者?
答
如果原始字符串为4个字节或更少,则CRC32是唯一可逆的。
答
Cade Roux对翻转CRC32是正确的。
您提到的链接提供了一个解决方案,通过更改原始字节流来修复已变为无效的CRC。此修复通过更改一些(不重要的)字节并重新创建原始CRC值来实现。
+1
或者黑客入侵这个数据流,以便在重要数据(如反盗版代码)发生变化时,CRC不会发生变化。 – 2009-10-03 16:14:55
答
这是C#:
public class Crc32
{
public const uint poly = 0xedb88320;
public const uint startxor = 0xffffffff;
static uint[] table = null;
static uint[] revtable = null;
public void FixChecksum(byte[] bytes, int length, int fixpos, uint wantcrc)
{
if (fixpos + 4 > length) return;
uint crc = startxor;
for (int i = 0; i < fixpos; i++) {
crc = (crc >> 8)^table[(crc^bytes[i]) & 0xff];
}
Array.Copy(BitConverter.GetBytes(crc), 0, bytes, fixpos, 4);
crc = wantcrc^startxor;
for (int i = length - 1; i >= fixpos; i--) {
crc = (crc << 8)^revtable[crc >> (3 * 8)]^bytes[i];
}
Array.Copy(BitConverter.GetBytes(crc), 0, bytes, fixpos, 4);
}
public Crc32()
{
if (Crc32.table == null) {
uint[] table = new uint[256];
uint[] revtable = new uint[256];
uint fwd, rev;
for (int i = 0; i < table.Length; i++) {
fwd = (uint)i;
rev = (uint)(i) << (3 * 8);
for (int j = 8; j > 0; j--) {
if ((fwd & 1) == 1) {
fwd = (uint)((fwd >> 1)^poly);
} else {
fwd >>= 1;
}
if ((rev & 0x80000000) != 0) {
rev = ((rev^poly) << 1) | 1;
} else {
rev <<= 1;
}
}
table[i] = fwd;
revtable[i] = rev;
}
Crc32.table = table;
Crc32.revtable = revtable;
}
}
}
答
您可以通过备份出位,如果你知道它是与创建聚生成原始32位扭转它。但是,如果你正在寻找从给定的文件反转CRC32,并追加一系列的字节在文件的末尾来匹配原来的CRC我张贴代码在这个线程在PHP:
我花了一点时间所以我希望它能帮助有人在更棘手的问题上工作: Reversing CRC32 干杯!
你究竟是什么意思'反向' – 2009-10-03 15:53:11
只是将一个C实现移植到Python上:https://github.com/jellever/Pwnage/blob/master/reversecrc.py – 2016-05-02 22:30:07
@JelleVergeer你能指出需要的表吗为您的代码工作。我可以在这里添加什么: #Custom CRC表,用你自己的替换 table = [] – 2017-02-26 03:37:50