【发布时间】: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 为模……
-
尝试数学堆栈交换。