我要说的很对,我有一个破解程序,该程序内部需要输入密码,以便您可以完成挑战。

我很容易找到带有密码的cmp指令,但是数字密码乘以2。

在程序中没有任何可以乘或除的密码,然后这一定是由其他原因引起的。

,所以我必须将密码的十六进制值转换为十进制并除以2才能得到真实的密码。

这是cmp指令:

CMP DWORD PTR SS:[EBP-C],961DB0



0x961DB0 / 2为密码。
EBP-C为密码。


我想知道为什么在此cmp指令中密码要乘以2。



源代码的照片,我没有



非常感谢您。

评论

可以用真实代码替换这些照片吗?它将使问题变得更好,并为其他人重现。

#1 楼

cmp指令不会将任何东西乘以2。相反,您在ollydbg屏幕截图中看到的代码片段是从您附加的质量欠佳的源代码图像执行的以下行:

if ((!key) || (key > (0x1337 * 2000)))


首先,在地址中将0x01051C09key0进行比较。如果key等于0,则跳至0x01051C18。否则,将key0x0961DB0进行比较。如果key小于或等于0x0961DB0,则进行另一个跳转。如果key大于0x0961DB0,则执行继续到0x01051C18

您应该已经猜到了,0x0961DB0只是0x1337乘以2000。

0x01051C180x01051C22的指令就是实现调用wrong的过程,将eax设置为正确的返回值(1),然后跳转到执行prolog和ret函数的位置(我假设是)。

评论


谢谢,但是假设我们没有源代码,如何确定0x0961DB0为0x1337 * 2000?

– AqueleCaraComNome
18-09-23在1:25



我们不一定认识到这一点。相反,我们可以将条件写为键> 0x0961DB0。基本上是一样的。

– NirIzr
18-09-23在1:27

现在我明白了,谢谢您澄清问题。

– AqueleCaraComNome
18-09-23在1:32