1. 程式人生 > >加殼脫殼]尋找真正的入口(OEP)--廣義ESP定律

加殼脫殼]尋找真正的入口(OEP)--廣義ESP定律

  ESP定律,ESP的適用範圍是什麼,ESP定律的原理是什麼,如何使用ESP定律? 作者:Lenus FROM: poptown.gamewan.com/bbs E-MAIL:[email protected] 1.前言  在論壇上看到很多朋友,不知道什麼是ESP定律,ESP的適用範圍是什麼,ESP定律的原理是什麼,如何使用ESP定律?看到了我在""調查結果發現,大家對ESP定律很感興趣,當然因為實在是太好用了,現在我就來告訴大傢什麼是ESP定律,它的原理是什麼! BTW:在看完了手動脫殼入門十八篇了以後,再看這篇文章也許會對你更有幫助! 在下面地址下載: http://www.jetdown.com/down/down.asp?id=37350&no=1 2.準備知識  在我們開始討論ESP定律之前,我先給你講解一下一些簡單的彙編知識。  1.call  這個命令是訪問子程式的一個彙編基本指令。也許你說,這個我早就知道了!別急請繼續看完。  call真正的意義是什麼呢?我們可以這樣來理解:1.向堆疊中壓入下一行程式的地址;2.JMP到call的子程式地址處。例如: 00401029    . E8 DA240A00    call 004A3508
0040102E    . 5A             pop edx 在執行了00401029以後,程式會將0040102E壓入堆疊,然後JMP到004A3508地址處!  2.RET  與call對應的就是RET了。對於RET我們可以這樣來理解:1.將當前的ESP中指向的地址出棧;2.JMP到這個地址。  這個就完成了一次呼叫子程式的過程。在這裡關鍵的地方是:如果我們要返回父程式,則當我們在堆疊中進行堆疊的操作的時候,一定要保證在RET這條指令之前,ESP指向的是我們壓入棧中的地址。這也就是著名的"堆疊平衡"原理! 3.狹義ESP定律  ESP定律的原理就是"堆疊平衡"原理。  讓我們來到程式的入口處看看吧!  1.這個是加了UPX殼的入口時各個暫存器的值! EAX 00000000 ECX 0012FFB0 EDX 7FFE0304 EBX 7FFDF000 ESP 0012FFC4 EBP 0012FFF0 ESI 77F51778 ntdll.77F51778 EDI 77F517E6 ntdll.77F517E6 EIP 0040EC90 note-upx.<ModuleEntryPoint> C 0 ES 0023 32bit 0(FFFFFFFF) P 1 CS 001B 32bit 0(FFFFFFFF) A 0 SS 0023 32bit 0(FFFFFFFF) Z 0 DS 0023 32bit 0(FFFFFFFF) S 1 FS 0038 32bit 7FFDE000(FFF) T 0 GS 0000 NULL D 0 O 0 LastErr ERROR_MOD_NOT_FOUND (0000007E)  2.這個是UPX殼JMP到OEP後的暫存器的值! EAX 00000000 ECX 0012FFB0 EDX 7FFE0304 EBX 7FFDF000 ESP 0012FFC4 EBP 0012FFF0 ESI 77F51778 ntdll.77F51778 EDI 77F517E6 ntdll.77F517E6 EIP 004010CC note-upx.004010CC C 0 ES 0023 32bit 0(FFFFFFFF) P 1 CS 001B 32bit 0(FFFFFFFF) A 0 SS 0023 32bit 0(FFFFFFFF) Z 1 DS 0023 32bit 0(FFFFFFFF) S 0 FS 0038 32bit 7FFDE000(FFF) T 0 GS 0000 NULL D 0 O 0 LastErr ERROR_MOD_NOT_FOUND (0000007E) 呵呵~是不是除了EIP不同以外,其他都一模一樣啊! 為什麼會這樣呢? 我們來看看UPX的殼的第一行: 0040EC90 n> 60               pushad      //****
注意這裡***** 0040EC91     BE 15B04000      mov esi,note-upx.0040B015 PUSHAD就是把所有暫存器壓棧!我們在到殼的最後看看: 0040EE0F     61               popad      //****注意這裡***** 0040EE10   - E9 B722FFFF      jmp note-upx.004010CC   //JMP到OEP POP就是將所有暫存器出棧! 而當我們PUSHAD的時候,ESP將暫存器壓入了0012FFC0--0012FFA4的堆疊中!如下: 0012FFA4   77F517E6 返回到 ntdll.77F517E6 來自 ntdll.77F78C4E           //EDI
0012FFA8   77F51778 返回到 ntdll.77F51778 來自 ntdll.77F517B5          //ESI 0012FFAC   0012FFF0                                                    //EBP 0012FFB0   0012FFC4                                                   //ESP 0012FFB4   7FFDF000                                                  //EBX 0012FFB8   7FFE0304                                                 //EDX 0012FFBC   0012FFB0                                                //ECX 0012FFC0   00000000                                               //EAX 所以這個時候,在教程上面就告訴我們對ESP的0012FFA4下硬體訪問斷點。也就是說當程式要訪問這些堆疊,從而恢復原來暫存器的值,準備跳向苦苦尋覓的OEP的時候,OD幫助我們中斷下來。 於是我們停在0040EE10這一行! 總結:我們可以把殼假設為一個子程式,當殼把程式碼解壓前和解壓後,他必須要做的是遵循堆疊平衡的原理,讓ESP執行到OEP的時候,使ESP=0012FFC4。 4.廣義ESP定律  很多人看完了教程就會問:ESP定律是不是就是0012FFA4,ESP定律的適用範圍是不是隻能是壓縮殼!  我的回答是:NO!  看完了上面你就知道你如果用0012FFA8也是可以的,ESP定律不僅用於壓縮殼他也可以用於加密殼!!!  首先,告訴你一條經驗也是事實---當PE檔案執行開始的時候,也就是進入殼的第一行程式碼的時候。暫存器的值總是上面的那些值,不信你自己去試試!而當到達OEP後,絕大多的程式都第一句都是壓棧!(除了BC編寫的程式,BC一般是在下面幾句壓棧)  現在,根據上面的ESP原理,我們知道多數殼在執行到OEP的時候ESP=0012FFC4。這就是說程式的第一句是對0012FFC0進行寫入操作!  最後我們得到了廣義的ESP定律,對只要在0012FFC0下,硬體寫入斷點,我們就能停在OEP的第二句處!! 下面我們來舉個例子,就脫殼進階第一篇吧!  載入OD後,來到這裡: 0040D042 N> B8 00D04000      mov eax,Notepad.0040D000 //停在這裡 0040D047     68 4C584000      push Notepad.0040584C 0040D04C     64:FF35 00000000 push dword ptr fs:[0]    //第一次硬體中斷,F9 0040D053     64:8925 00000000 mov dword ptr fs:[0],esp 0040D05A     66:9C            pushfw 0040D05C     60               pushad 0040D05D     50               push eax 直接對0012FFC0下硬體寫入斷點,F9執行。(注意硬體中斷) 在0040D04C第一次硬體中斷,F9繼續! 0040D135     A4               movs byte ptr es:[edi],byte ptr ds:[esi] //訪問異常,不管他 shift+F9繼續 0040D136     33C9             xor ecx,ecx 0040D138     83FB 00          cmp ebx,0 0040D13B   ^ 7E A4            jle short Notepad.0040D0E1 第二次硬體中斷。 004058B5       64             db 64                                 //斷在這裡 004058B6       89             db 89 004058B7       1D             db 1D 004058B8       00             db 00 004058B9       00             db 00 這裡也不是,F9繼續! 004010CC   /. 55             push ebp 004010CD   |. 8BEC           mov ebp,esp //斷在這裡,哈哈,到了!(如果發現有花指令,用ctrl+A分析一下就能顯示出來) 004010CF   |. 83EC 44        sub esp,44 004010D2   |. 56             push esi 快吧!還不過癮,在來一個例子。 脫殼進階第二篇 如果按上面的方法斷不下來,程式直接運行了!沒什麼,我們在用另一種方法! 載入後停在這裡,用外掛把OD隱藏! 0040DBD6 N>^/E9 25E4FFFF      jmp Note_tEl.0040C000                  //停在這裡 0040DBDB     0000             add byte ptr ds:[eax],al 0040DBDD     0038             add byte ptr ds:[eax],bh 0040DBDF     A4               movs byte ptr es:[edi],byte ptr ds:[esi] 0040DBE0     54               push esp    F9執行,然後用SHIFT+F9跳過異常來到這裡: 0040D817   ^/73 DC            jnb short Note_tEl.0040D7F5       //到這裡 0040D819     CD20 64678F06    vxdcall 68F6764 0040D81F     0000             add byte ptr ds:[eax],al 0040D821     58               pop eax 在這裡對0012FFC0下硬體寫入斷點!(命令列裡鍵入HW 12FFC0)SHIFT+F9跳過異常,就來到OEP的第二行處:(用CTRL+A分析一下) 004010CC   /. 55             push ebp 004010CD   |. 8BEC           mov ebp,esp                       //斷在這裡 004010CF   |. 83EC 44        sub esp,44 004010D2   |. 56             push esi 004010D3   |. FF15 E4634000 call dword ptr ds:[4063E4] 004010D9   |. 8BF0           mov esi,eax 004010DB   |. 8A00           mov al,byte ptr ds:[eax] 004010DD   |. 3C 22          cmp al,22 就這樣我們輕鬆搞定了兩個加密殼的找OEP問題! 5.總結  現在我們可以輕鬆的回答一些問題了。  1.ESP定律的原理是什麼?  堆疊平衡原理。  2.ESP定律的適用範圍是什麼?  幾乎全部的壓縮殼,部分加密殼。只要是在JMP到OEP後,ESP=0012FFC4的殼,理論上我們都可以使用。但是在何時下斷點避開校驗,何時下斷OD才能斷下來,這還需要多多總結和多多積累。歡迎你將你的經驗和我們分享。  3.是不是隻能下斷12FFA4的訪問斷點?  當然不是,那只是ESP定律的一個體現,我們運用的是ESP定律的原理,而不應該是他的具體數值,不能說12FFA4,或者12FFC0就是ESP定律,他們只是ESP定律的一個應用罷了!  4.對於STOLEN CODE我們怎麼辦?  哈哈,這正是尋找STOLEN CODE最好的辦法!當我們斷下時,正好斷在了殼處理STOLEN CODE的地方,在F8一會就到OEP了! 6.後話  以上的方法原理都是我自己總結,自己的經驗,如果有什麼不對的地方,有什麼沒解釋清楚的地方。還請海涵!但是如果覺得我很厲害,那就大可不必,因為ESP定律也是別人教我的,不是我第一個提出來的!我只是個比你們早飛一點的菜鳥罷了^-^  看了上面的文字希望能對你在尋找OEP的時候有幫助,但是別忘了一句話:菜鳥認為找OEP很難,高手認為修復才是最難! 好了,下一篇應該寫IAT的修復原理了!讓我們共同努力吧! 最後如果轉載註明作者並保持文章的完整, 謝謝你看完 

相關推薦

]尋找真正入口OEP--廣義ESP定律

  ESP定律,ESP的適用範圍是什麼,ESP定律的原理是什麼,如何使用ESP定律? 作者:Lenus FROM: poptown.gamewan.com/bbs E-MAIL:[email protected] 1.前言  在論壇上看到很多朋友,不知道什麼是E

破解入門-----實戰"ESP定律法"

ESP定律法的步驟     ESP定理脫殼(ESP在OD的暫存器中,我們只要在命令列下ESP的硬體訪問斷點,就會一下來到程式的OEP了!) (1)開始就點F8,注意觀察OD右上角的暫存器中ESP有沒突現(變成紅色)(這只是一  般情況下,更確切的說我們選擇的ESP值是關鍵

2017年10月30日360最新虛擬後完全修復

在csdn也發一份吧,留作備份 一.說明 網上關於360的脫殼文章一大堆一大堆的,但是早在2016年秋季,360就已經虛擬化oncreate函式的指令到so層去運行了,卻沒有關於如何完全修復的文章,於是就有了本文,僅供於學習交流啥,希望為加固技術的發展貢獻力量,歡迎轉載,為

一個基於xposed和inline hook的一代工具

注:1.手機要api  21版本以上xposed要支援art模式才可以,手機脫殼時要在art模式下2.E/Xposed(28813):  java.lang.UnsatisfiedLinkError:  dlopen  failed:  couldn't  map ;/dat

HTML學習筆記 CSS塊元素偽類選擇器 第三節 原創

筆記 solid oct 元素 是否 選擇器 size set 區域 <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title&g

pc端頁面載更多條信息loading

加載 set () mar top scrollto margin 多條 .get $(window).scroll(function() { var viewHeight =$(window).height();//可見高度 var contentHeight =$("#

nyoj 尋找最大數

out 數字 esp 數據 time return tin while 標記 尋找最大數(二) 時間限制:1000 ms | 內存限制:65535 KB 難度:2 描述 給你一個數字n(可能有前綴0)。 要求從高位到低位,進行 進棧出棧 操作,是最後輸出的結果最

類的真正形態十三

C++ 類 class 我們之前在 C++ 中表示類的時候,是用 struct 表示的。那麽經過這些改進,結構體 struct 變得越來越不像它在 C 語言中的樣子了。因此在 C++ 總提供了新的關鍵字 class 用於類定義,class 和 struct 的用法是完全相同的。

、減、乘、除四則運算

0 在加法中扮演的角色,和 1 在乘法中扮演的角色十分相像 群論的觀點就是 0 是加法的單位元,1 是乘法的單位元; 四則運算都是二元運算,需要兩個運算元; 結合律(associativity),也

回溯法尋找數獨java

import java.util.Calendar; import java.util.Date; public class Matrix {  private int matrix[][];  private long timeAfter=0;   private long timeBefore

C++-基類的析構函數為什麽要virtual虛析構函數

nbsp 分享圖片 spa 防止 too bsp 測試 ++i tails 知識背景 要弄明白這個問題,首先要了解下C++中的動態綁定。 關於動態綁定的講解,請參閱: C++中的動態類型與動態綁定、虛函數、多態實現 正題

商城購物車減控制元件的簡單封裝,解決ListView中資料錯亂的問題

在上一篇文章中,我們學習了商城購物車加減控制元件的簡單封裝,知道了封裝的思路過程和使用方法。還沒有看過上一篇文章的朋友,建議先去閱讀 商城購物車加減控制元件的簡單封裝 。這段時間收到一些小夥伴的反饋,在ListView或者是RecyclerView中存在ite

webview攔截css,js,圖片後載本地外部儲存的檔案shouldOverrideUrlLoading

說明: Android WebView的快取機制就不多說了,這裡是單獨自己攔截css,js和圖片等自己進行快取。 需求:Android客戶端需要攔截網頁的每個css,js,圖片等,然後根據實際情況判斷來使用本地儲存卡或者assets中的js,css和圖片資源。 實現:

[App Store Connect幫助]二、 添、編輯和刪除用戶2查看並編輯您的個人帳戶

tps 對話框 arrow -a cat 底部 lists ica 個人信息 您可以在 App Store Connect 的“編輯個人資料”中查看和編輯個人信息。如果您的 Apple ID 與多個帳戶相關聯,您可以在您的用戶帳戶之間切換。 查

類的載連接初始化順序

void string 字節碼 ole name 階段 face interface sna 1.數組對象的使用,不會導致對應類的初始化。 在創建 ClassName[]數組時,並不會創建對應對象,也不會初始化對應類,會創建一個編譯時類型 [+L+類全名 如下: p

機器學習數學原理2——廣義線性模型

機器學習數學原理(2)——廣義線性模型 這篇博文主要介紹的是在機器學習中的迴歸問題以及分類問題中的一個非常具有概括性的模型:廣義線性模型(Generalized Linear Models,簡稱GLMs),這類模型包括了迴歸問題中的正態分佈,也包含了分類問題中的伯努利分佈。隨著我們的

矩陣論筆記——廣義逆矩陣

當 A 滿秩時,方程 Ax=b 的解為 x=A−1b。但當 A 不滿秩,甚至方程 Ax=b 無解時,我們也希望用某種逆 A† 的形式表示方程的(近似)解 x=A†b。這便是廣義逆的作用。 0 投影變換與投影矩陣 投影矩陣的求法: (1)M→M:P{L,

OEP即程序入口查找 --- 基本思路和常見方法

dash xxxx 適合 往回 去掉 nbsp 忽略 回車 p地址 OEP:程序的入口點,軟件加殼就是隱藏了OEP(或者用了假的OEP), 只要我們找到程序真正的OEP,就可以立刻脫殼。 PUSHAD (壓棧) 代表程序的入口點, POPAD (出棧) 代表程序的

吃雞輔助

脫殼查殼 molebox 直接忽視載入od 單步 發現esp定律就能搞定找到OEP 有可能是vc 與易語言(外掛)因為目前看沒有加密 直接dump 修復iat時發現不能運行那很定是iat修復錯了 只有一種可能IAT被加密果然有的被加密這就有意思了 一般大部分是有些是無效的就直接去掉 正好入坑了重新開始 先

實踐之尋找OEP——兩次內存斷點法

ring 步驟 oca http cad 指定 技術分享 異常 所有 0x00 前言 對於加殼程序第一件事就是要找到OEP(oringinal Entry point),由於加殼的緣故,當PE文件載入OD或者其他調試軟件時進入的的往往是殼程序的入口地址。所以要進行逆