脫殼 esp定律原理

2021-07-26 12:56:46 字數 1923 閱讀 5623

本帖最後由 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...