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

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

我不是要求某人为我做这件事,我只是问它是否可能没有暴力强迫。

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

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

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) + 0x73317331; } unsigned int computed = 0; for( int i = 0; i < serialvar; i++ ) { computed += 0x3C; } 

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

我们知道,“serialvar”是我必须生成的未知变量。 (然后我会生成一个基于串口的)

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

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

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

如果我理解正确,你有computed的最终值,你想知道unknown的值……

首先,你必须解决这个等式:

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

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

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

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

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