本帖最後由 zf616545 於 2014-10-2 22:14 編輯
esp定律算是我們在脫殼當中最常使用的方法之一,也特別適合像我一樣的新手!而今天文章說的是esp脫殼的原理和分析!只有知道原理了,我們的技術才能走得列遠!
一.準備知識
在我們開始討論esp定律之前,我先給你講解一下一些簡單的彙編知識。
1.call
這個命令是訪問子程式的乙個彙編基本指令。也許你說,這個我早就知道了!別急請繼續看完。call真正的意義是什麼呢?我們可以這樣來理解:
1.向堆疊中壓入下一行程式的位址;
2.jmp到call的子程式位址處。
例如:**:
00401029.e8 da240a00 call 004a3508
0040102e.5a pop edx
在執行了00401029以後,程式會將0040102e壓入堆疊,然後jmp到004a3508位址處!
2.retn
與call對應的就是retn了。對於retn我們可以這樣來理解:
1.將當前的esp中指向的位址出棧;
2.jmp到這個位址。
這個就完成了一次呼叫子程式的過程。在這裡關鍵的地方是:如果我們要返回父程式,則當我們在堆疊中進行堆疊的操作的時候,
一定要保證在retn這條指令之前,esp指向的是我們壓入棧中的位址。這也就是著名的「堆疊平衡」原理!
3.狹義esp定律
esp定律的原理就是「堆疊平衡」原理。
讓我們來到程式的入口處看看吧!
1.這個是加了aspack殼的入口時各個暫存器的值!
**:eax 00000000
ecx 0012ffb0
edx 7ffe0304 //堆疊值
ebx 7ffdf000 //堆疊值
esp 0012ffc4
ebp 0012fff0
esi 77f57d70 ntdll.77f57d70
edi 77f944a8 ntdll.77f944a8
eip 0040d000 aspack.
2.這個是aspack殼jmp到oep後的暫存器的值!
**:eax 004010cc
aspack.004010cc
ecx 0012ffb0
edx 7ffe0304 //堆疊值
ebx 7ffdf000 //堆疊值
esp 0012ffc4
ebp 0012fff0
esi 77f57d70 ntdll.77f57d70
edi 77f944a8 ntdll.77f944a8
eip 004010cc aspack.004010cc
呵呵~是不是除了eip不同以外,eax儲存當前oep值,其他都一模一樣啊!
為什麼會這樣呢?我們來看看
0040d000 a> 60 pushad //注意這裡esp=0012ffc4
0040d001 e8 00000000 call aspack.0040d006 //esp=0012ffa4
pushad就是把所有暫存器壓棧!我們在到殼的最後看看:
**:0040d558 61 popad //esp=0012ffa4
0040d559 75 08 jnz short aspack.0040d563 //注意這裡esp=0012ffc4
也就是說當我們對esp的0012ffa4下硬體訪問斷點之後。當程式要通過堆疊訪問這些值,從而恢復原來暫存器的值,
準備跳向苦苦尋覓的oep的時候,od幫助我們中斷下來。
小結:我們可以把殼假設為乙個子程式,當殼把**解壓前和解壓後,他必須要做的是遵循堆疊平衡的原理。
因為大家對esp理解各有異同,但是,大同小異!一般理解可以為:
1、在命令列下斷hr esp-4(此時的esp就是od載入後當前顯示的值)
2、hr esp(關鍵標誌下一行**所指示的esp值(單步通過))
ESP定律的原理
殼 在一開始會使用pushad指令將所有的暫存器入棧,此時esp所指向的記憶體記錄著某乙個暫存器的值。然後我們esp指向的記憶體處下乙個硬體記憶體訪問斷點 執行完殼 後會將所有的暫存器值出棧以平衡堆疊popad,cpu需要訪問原esp記錄的值,殼 解壓完程式 後,最後平衡堆疊時必然要從esp所指向的...
反 「ESP定律「 的方法以及原理。
對於在2000 2005 左右出的一些殼,esp 定律無疑是他們的噩夢,它幾乎能對他們進行秒殺哦。當乙個外國的高手提出 堆疊平衡 的時候,這種方法被用來對付加了殼的程式,秒殺當時的很多殼。回到正題,堆疊平衡,我想知道一點破解的人都應該知道,它可以用於脫絕大部分的壓縮殼,一些早期的加密殼,想 upx,...
ESP定律的原理及其適用範圍
在我們開始討論esp定律之前,我先給你講解一下一些簡單的彙編知識。1.call 這個命令是訪問子程式的乙個彙編基本指令。也許你說,這個我早就知道了!別急請繼續看完。call真正的意義是什麼呢?我們可以這樣來理解 2.jmp到call的子程式位址處。例如 00401029.e8 da240a00 ca...