一般寄存器EAX
存儲了call
中的返回值
假設:EAX 12345678
那麼:
AX 5678
AH 56
AL 78
test al,al
→ 用來對兩個操作數進行邏輯與操作,但是並不改變操作數!只改變標誌位!
je xxx
(運算結果爲0,那麼標誌位Z
爲1,跳轉實現)
如上所述,如果call
中的一系列操作導致了EAX
爲0,那麼下面就一定會跳轉。
爲了實現我們爆破的目的,我們不要讓其跳轉,可以F7
進入這個call
,
然後直接在段首進行更改: mov eax,1
,緊接着下面加一個retn
,退出這個call
,
再保存更改,達到了破解的目的。
PS:
當有一千個跳轉,每個都依賴了該`call`的返回值,我們不可能去`nop`或修改掉每個關鍵跳,
但我們可以直接修改關鍵`call`的返回值 以達到同樣的目的。