教你如何寫UPX脫殼指令碼

BattleHeart發表於2019-05-11

一、開篇
首先要寫在前面本篇文章寫的UPX脫殼指令碼有可能不是所有的UPX都使用,僅供學如果,僅供學習怎樣去一個簡單地指令碼節省勞動力,這裡不多廢話,俗話說的好:“工欲善其事必先利器”,那麼我們今天要用的利器就是OllySubScript指令碼編寫工具,有很多這類的工具,找一個就好了!下面就是對寫指令碼的具體分析。
這裡重點說明一點:寫指令碼其實就是對在OD中進行分析得來的,這句話說通俗點就是比如我們載入OD後我們都會F8單步走,那麼對應翻譯成指令碼就是STO,我們在指令碼中寫STO就是單步走一下!
今天我們要寫的加了UPX殼的DLL,順便將DLL的重定位地址找到;著重講的是一個思路,這裡重點思路是UPX殼是開始都是pushad和結尾是popad,這裡就算是我們找到的一個特徵碼,記錄下來我們將DLL檔案載入到OD中進行檢視!首先用PEID查殼看一下殼的版本!
教你如何寫UPX脫殼指令碼
將DLL檔案載入到OD中。相信大家手託過UPX的都知道往下拉看看結尾處!
教你如何寫UPX脫殼指令碼
    我們通過這個跳轉到OEP的上面看到popad這個指令,那麼我們就可以找到一個關鍵點,也就是這個popad這裡,那麼我們就從這裡下手!進行寫指令碼!我們可以通過OD裡面的搜尋功能查詢popad出現的次數,Ctrl+F查詢popad;發現還有一個地方有這個指令,就是下面這裡:
教你如何寫UPX脫殼指令碼
       既然我們已經找到了這個關鍵點Popad了,那麼我們就來開始寫指令碼!
       首先我要在指令碼中寫找到popad這個指令的語句,用Find查詢來進行,類似於OD裡面的Ctrl+B查詢61;如果查詢成功,地址會儲存到保留變數$RESULT中,否則$RESULT將等於 0
Var cc                //這裡宣告一個變數用來儲存$RESULT的值
FIND eip, #61#         //類似於Ctrl+B,結果儲存在$RESULT當中
MOV cc,$RESULT        //將查詢的61的地址儲存在cc中,注意這裡查詢的popad是100A0A29地址處的popad,注意我們在這個地方下硬體執行斷點時候OD停不下來,那麼我們就可以ret後面進行下斷點2F-29=6,那麼我們就在這個cc基礎上加6
ADD cc,6
BPHWS cc,”x”           //在指定地址,設定硬體斷點。有三種模式: "r" - 讀取, "w" - 寫入 或者 "x" - 執行.
RUN                                //執行
MSG   $RESULT                //彈出地址下硬體執行斷點的地址(用來做測試)
BPHWC  cc                        //清楚硬體執行斷點

上面的程式碼就會執行到我們查詢的第一個popad後面的100A0A2F處斷下,程式碼是add edi,0x4,100A0A2F處下面再查詢popad的時候就是到OEP的那個Jmp上面的Popad了!




FIND eip, #61#                         //類似於Ctrl+B,結果儲存在$RESULT當中
BPHWS $RESULT, "x"
RUN  
MSG $RESULT   
BPHWC $RESULT

   這時候程式碼就會段在圖一所示的100A0A60處的popad,那麼我們接下來要做的只需要單步兩下,再對程式碼進行分析就到了OEP

STO                                         //單步F8執行
STO                                        //單步F8執行
MSG "歡迎來到OEP,By:BattleHeart"
AN eip                                //對程式進行分析
RET




    這樣初步的指令碼就寫完了,接下來就是我們所說的對DLL進行加殼之後比EXE多一個重定位的查詢;
    這裡我們說一個快速查到的UPX殼的DLL重定位地址的方法,那就是搜尋下面這幾條語句;
xchg ah,al
rol        eax,0x10
xchg ah,al
add eax,esi

    這幾條指令上面會有moveax,dword ptr ds:[ebx]dword ptr ds:[ebx]存放的就是重定位的地址。
教你如何寫UPX脫殼指令碼
        那麼我們就需要查詢這幾個指令,進行查詢重定位地址
VAR tezhengma1                //用來存放重定位地址
VAR ee                        //用來存放$RESULT的結果
FIND eip,#86c4c1c010#        //查詢上面指令
MOV ee,$RESULT
MSG $RESULT                        //這裡地址是100A0A46
SUB ee,2                                //100A0A44這個位置
BP ee                                //斷點到Mov eax,dword ptr ds:[ebx]
MOV tezhengma1,[ebx]        //既然已經斷在了這個位置那麼我們就可以取出這個值並彈出來
MSG tezhengma1
BC ee                                //清楚F2斷點


分析完畢;
       整個指令碼就是如下所示;
//UPX脫殼指令碼之一
VAR cc
VAR tezhengma1
 
VAR ee
FIND eip,#86c4c1c010#
MOV ee,$RESULT
MSG $RESULT
SUB ee,2
BP ee
MOV tezhengma1,[ebx]
MSG tezhengma1
BC ee
FIND eip, #61#  
MOV cc,$RESULT
ADD cc,6
BPHWS cc, "x"
RUN 
MSG   $RESULT
BPHWC  cc
FIND eip, #61# 
BPHWS $RESULT, "x"
RUN  
MSG $RESULT   
BPHWC $RESULT 
STO 
STO
MSG "歡迎來到OEP,By:BattleHeart"
AN eip
RET


         執行結果:
     這個是重定位處斷下的地址
教你如何寫UPX脫殼指令碼
      這個是重定位地址:別忘了減去基址哦!
教你如何寫UPX脫殼指令碼
      第一個Popad地址:
教你如何寫UPX脫殼指令碼
      斷在了popad
教你如何寫UPX脫殼指令碼

下載附件  儲存到相簿

圖八

2014-10-18 22:09 上傳

          OEP了!
教你如何寫UPX脫殼指令碼
程式下載地:連結: http://pan.baidu.com/s/1o6HmsrC 密碼: a2b6


希望大家在看的時候別忘了給點熱心值,寫文章不易啊!!各位看官

請喊我大龍哥最後編輯於:3年前

內容均為作者獨立觀點,不代表八零IT人立場,如涉及侵權,請及時告知。

相關文章