一般來說,你不能「不乘法」,但在某些情況下,你可以:那些你認爲知道的數字是奇數的情況。 (當然,也就是說你知道沒有溢出的情況,所以你可以用普通的舊分區不乘法,但imul
不會告訴你無符號溢出)
奇數有modular multiplicative inverse模2因爲2的冪只包含2的因子分解,而奇數不包含2,所以它們的gcd將爲1)。
所以,假設我們知道esi
是0xF9FDEFF3而相乘的結果是0x34000000,我們可以計算出0xF9FDEFF3的倒數是這樣的:(edi
是輸入)
lea ecx, [edi + 1]
mov eax, 2
mov esi, eax
imul ecx, edi
sub ecx, 1
mov edx, ecx
imul edx, edi
sub esi, edx
imul ecx, esi
mov esi, eax
mov edx, ecx
imul edx, edi
sub esi, edx
mov edx, esi
imul edx, ecx
imul edi, edx
sub eax, edi
imul eax, edx
原來被0x657f413b。現在0x657f413b * 0x34000000 = 0x149DD93FFC000000,截斷爲0xFC000000。
如果你知道的數字是偶數,你仍然可以解決known * x == output
爲x
,但是可能沒有解決方案或許多,從來沒有解決方案。你可以認爲這實際上是output = (k * x) << d
,其中已知= 2 d k(有k個奇數),應該清楚的是輸出的d
低位最好是零或者將不存在解決方案,並且如果他們是零然後d
高位x
可以是任何東西。
我認爲在100%確定性的情況下不可能在所描述的情況下推斷ESI值。 – Bhoot