是否有可能在没有暴力强迫的情况下解决这个等式?

时间:2014-01-01 08:33:33

标签: c++ c assembly

是的,所以我想从crackmes.de尝试keygen这个程序 http://crackmes.de/users/lutio/keygenme1_by_lutio/

我不是要求某人为我做这件事,我只是在没有强制性的情况下询问是否可能。

我通常不会遇到这类问题,但由于某些原因,该用户不使用用户名中的任何变量,只使用序列号。他还说强盗不允许解决他的关键因素。我相信没有暴力强迫就无法解决。

有人确实知道它是否可以在没有强制执行的情况下解决?这基本上就是我的代码:

    unsigned int key = 0x1FE339E4; //compute == this for success

    unsigned int serialvar = unknown; //gennerated according to serial
    unsigned int magic1 = 0x1FE339E7;

    for( int i = 0; i < 0x10; i++ ) {

        serialvar = (((magic1 * i + serialvar) << 0x10) ^ serialvar) + 0x13371337;
        serialvar = (((i * magic1 + serialvar) >> 0x10) ^ serialvar) + 0x73317331;

    }



    unsigned int computed = 0;

    for( int i = 0; i < serialvar; i++ ) {
        computed += 0x3C;
    }

是的,所以在代码的最后,为了成功并点击“goodboy”,我们的unsigned int计算必须等于key。

众所周知,“serialvar”是我必须生成的未知变量。 (然后我将根据其生成一个序列)

在我的数学和布尔代数水平上,我相信这个等式是不可能解决的。

现在我不确定这个数学语句是否正确......但如果我拿出键并将其除以0x3C ......我没有得到整数!

这不是说这是不可能解决的吗?由于key / 0x3C没有整数解?

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您的最终价值为computed,并且您想知道unknown的价值......

首先你需要解决这个等式:

computed = serialvar x 0x3C(mod 2 ^ 32)

你可能会得到serialvar的多个值。

之后你必须扭转16折循环..

我没有看到如何解决(((i * magic1 + serialvar) >> 0x10) ^ serialvar)serialvar的另一个表达式的任何简单方法。 serialvar的前16位不会更改,因为>>将使xor与零相对。 下半部分可以通过预先计算的数组来计算。可能会有多种解决方案(这是非常可能的),您的计算将会分裂。 对于第二个表达式,下半部分也是如此。

这样,总计算费用将类似于强制执行。