當程序載入OD之后?
004AC460?>?$??60????????????pushad;程序停在這里?F8?指向pushad指令
pushad是把寄存器中數據入棧?棧中數據如下:
0012FFA4???7C930208???|EDI? <--?ESP指向棧頂
0012FFA8???FFFFFFFF |ESI
0012FFAC???0012FFF0 |EBP
0012FFB0???0012FFC4 |ESP
0012FFB4???7FFDE000 |EBX
0012FFB8???7C92E4F4???|EDX??
0012FFBC???0012FFB0 |ECX
0012FFC0???00000000 |EAX
此時ESP指向棧頂?地址為0012FFA4?,脫殼從這里開始-.-~
來到數據段即內存地址0012FFA4?在這下斷點?-?硬件訪問?-?word
然后F9??--?這里就能找到OEP
那么我的理解就是?匯編指令之前前先把各個寄存器保存起來,然后執行殼的操作比如解壓,
等殼的工作完成之后需要恢復各個寄存器的值?,我們在棧中已經設置了一個斷點,所以當程序訪問棧中數據(popad,我們在0012FFA4?下斷點是EDI的值,當程序恢復EDI寄存器)時就被我們給斷了下來?,當然并不是斷在pop?EDI指令上,而是斷在popad的下一條指令,因為popad是一步到位恢復寄存器的。
然后在尋找OEP,一般是jmp大跳?然后就看到了期待已久的55機器碼了?dump之-.-~
可以理解為殼的執行是一個子程序?,子程序運行前都要保持寄存器,完事之后恢復寄存器,返回主程序
我們在恢復寄存器的地方下斷點,然后???...
以上就是我對ESP定律的理解,雖然還未成功脫的一殼,但是各大網站論壇都在談論ESP之威武,據說可脫所以壓縮殼,所以大概找了些文章看看,ESP定律就是利用堆棧平衡找到程序結束繼而找到OEP。
以上為個人理解,為了不誤人子弟,有錯誤大神請指出?
?
popad:相當于
push EAX
push ECX
push EDX
push EBX
push ESP
push EBP
push ESI
push EDI