1
我編譯:'push ebp''pop ebp'沒有被使用,但是當被移除時仍然會破壞代碼。
"
int x_add(int a, int b)
{
return a+b;
}
"
,並得到
"
push ebp
mov ebp,esp
mov edx,[ebp+08]
mov eax,[ebp+0c]
pop ebp
ret
"
我簡化了組裝到
"
mov eax,[esp+0c]
add eax,[esp+08]
ret
"
當我運行"x_add(1, 1);"
返回-1 所以我代替代碼試圖找到破了什麼。
"
push ebp
mov eax,[esp+0c]
add eax,[esp+08]
pop ebp
ret
"
按預期工作,返回1 + 1 = 2。 那麼爲什麼ebp必須在開始時被推送,然後如果從未在代碼中使用,最終會彈出ebp?
所以..沒有這個推/流行,你沒有注意到ESP的價值(因此這些偏移用於尋址)是不同於推/流行,對吧?你*做了*,交互調試,對吧?短版本:'push ebp'修改'esp',所以如果你刪除推/彈出,你必須調整你的偏移量。 – WhozCraig
是一個新的調試器。當我指向它時,IDA很糟糕,代碼塊跳過了代碼。我使用的是Cheat引擎,並沒有考慮檢查堆棧指針。 – CatOfBlades
如果您要在啓用優化的情況下編譯代碼,則會更簡單,更易於理解。 –