【问题标题】:Is it possible to solve this equation without brute forcing it?是否有可能在不暴力破解的情况下解决这个方程?
【发布时间】:2014-01-01 08:33:32
【问题描述】:

好的,所以我正在尝试从crackmes.de 注册这个程序 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没有整数解?

【问题讨论】:

  • key/0x3C has no integer solution: 没必要。如果减去 0x3C N 次,最坏的情况是下溢,但值继续。因此,即使看起来您可以用除法代替它,但在这种情况下,这没有用。顺便说一句:你应该知道密钥还是只是为了验证?
  • 密钥用于验证。我必须找到serialvar。如果 serialvar == key 那我就成功了。
  • 假设32位整数,x * 0x3C == 0x1FE339E4有四种解决方案,分别是0xb3bb40f7、0xf3bb40f7、0x33bb40f7和0x73bb40f7。
  • 尝试将问题改写为数学方程而不是代码。如果使用 32 位算术,请不要忘记以 2^32 为模……
  • 尝试数学堆栈交换。

标签: c++ c assembly


【解决方案1】:

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

首先你要解方程:

计算 = 串行变量 x 0x3C (mod 2^32)

你可能会得到多个serialvar值。

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

我没有看到任何简单的方法来解决(((i * magic1 + serialvar) &gt;&gt; 0x10) ^ serialvar)serialvar 的其他表达式。 serialvar 的前 16 位不会更改,因为&gt;&gt; 将使其与零异或。 下半部分可以通过预先计算的数组来计算。可能会有多种解决方案(这很可能)并且您的计算会分裂。 下半部分同样适用于第二个表达式。

这样总的计算开销将类似于暴力破解。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-13
    • 2019-01-01
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 2019-08-08
    • 1970-01-01
    相关资源
    最近更新 更多