一道題入門逆向分析

2019-06-22 +8 91693人圍觀 ,發現 2 個不明物體 數據安全

0×00 前言

將自己學習逆向破解的知識總結一下,主要是逆向的入門知識以及自己的學習感悟,包括逆向時的一些思路和補丁,注冊機,保護殼等方面的一些知識,有不到之處請師傅們斧正。

演示程序【提取碼:dd2b 】

工具包【 提取碼:wirx 】

0×01 基礎篇

逆向一個小程序時,我們要做的第一步應該是收集信息,比如該程序有哪些功能,重要字符串,通過程序的一些行為猜測調用了哪些API函數,是否加殼等,這些信息有助于我們理解程序的運行邏輯,為后面的破解做好鋪墊。比如我們通過PEID發現未加殼,進入不同的功能模塊,發現了具有參考價值的重要字符串,通過彈窗行為可以猜測程序調用了Messagebox()函數等API函數。搜集完信息后,我們可以加以猜測,猜對了可以減少工作量,比如Serial模塊,猜測是程序會自動生成一個固定序列號或者利用用戶輸入值進行一定操作后生成新的序列號等。

圖片.png圖一

通過圖一可以看到程序主要有兩個部分,一個是單純地輸入序列號,一個是要求輸入用戶名和序列號。

Serial部分

在Serial部分,嘗試著隨便輸入幾個序列號都報錯,接下來通過OD打開,用智能搜索可以發現很多有價值的線索。經過前面的探索,現在我們已經知道了各個字符串出現的位置,并且我們甚至可以大概猜測出輸入正確的序列號之后會出現的情況。 

圖片.png

圖二 

圖片.png

圖三

雙擊Failed!后程序自動定位到相應匯編代碼處。上下移動可以發現本模塊的開始部分“0042F47E  |. 55   push ebp”,用F2在此處下一個斷點,繼續運行程序會發現程序停留在斷點處,使用F8繼續運行,最終彈出報錯框。

圖片.png

圖四

圖片.png

圖五 圖片.png

圖六

分析進行到這里,很顯然我們會猜想序列號為“Hello Dude!”,驗證結果如下:

圖片.png 圖七

重要匯編代碼分析:

0042F47E  |.  55                     push ebp                             ;  Serial部分開始處!

0042F47F  |.  68 2CF54200   push Demo.0042F52C

0042F484  |.  64:FF30           push dword ptr fs:[eax]

0042F487  |.  64:8920            mov dword ptr fs:[eax],esp

0042F48A  |.  8D45 FC          lea eax,[local.1]                 ;取參數1地址

0042F48D  |.  BA 40F54200  mov edx,Demo.0042F540 ;  Hello

0042F492  |.  E8 7142FDFF   call Demo.00403708        ;  賦值給參數1

0042F497  |.  8D45 F8           lea eax,[local.2]                   ;取參數2地址

0042F49A  |.  BA 50F54200   mov edx,Demo.0042F550 ;  Dude!

0042F49F  |.  E8 6442FDFF   call Demo.00403708        ;  賦值給參數2

0042F4A4  |.  FF75 FC           push [local.1]                

0042F4A7  |.  68 60F54200   push Demo.0042F560        ;字符串空格的地址

0042F4AC  |.  FF75 F8          push [local.2]                

0042F4AF  |.  8D45 F4          lea eax,[local.3]                     ;取參數3地址

0042F4B2  |.  BA 03000000   mov edx,0x3

0042F4B7  |.  E8 F044FDFF   call Demo.004039AC     ; 拼接參數1,空格,參數2并賦值給參數3

0042F4BC  |.  8D55 F0           lea edx,[local.4]                    ;取參數4地址

0042F4BF  |.  8B83 E0010000 mov eax,dword ptr ds:[ebx+0x1E0]

0042F4C5  |.  E8 8EB5FEFF   call Demo.0041AA58     ; 將輸入框中的字符串賦值給參數4

0042F4CA  |.  8B45 F0           mov eax,[local.4]

0042F4CD  |.  8B55 F4           mov edx,[local.3]

0042F4D0  |.  E8 2745FDFF   call Demo.004039FC      ;判斷參數3,4字符串是否相等

0042F4D5  |.  75 1A                jnz short Demo.0042F4F1      ; 關鍵跳

 *******************************************************************************************

0042F4D7  |.  6A 00                push 0x0

0042F4D9  |.  B9 64F54200   mov ecx,Demo.0042F564          ;  Congratz!

0042F4DE  |.  BA 70F54200   mov edx,Demo.0042F570          ;  God Job dude !! =)

0042F4E3  |.  A1 480A4300   mov eax,dword ptr ds:[0x430A48]

0042F4E8  |.  8B00                 mov eax,dword ptr ds:[eax]

0042F4EA  |.  E8 81ACFFFF   call Demo.0042A170                ;  彈出序列號正確時的結果

0042F4EF  |.  EB 18               jmp short Demo.0042F509

*****************************************************************************

0042F4F1  |>  6A 00               push 0x0

0042F4F3  |.  B9 84F54200   mov ecx,Demo.0042F584           ;  Failed!

0042F4F8  |.  BA 8CF54200   mov edx,Demo.0042F58C         ;  Try Again!!

0042F4FD  |.  A1 480A4300   mov eax,dword ptr ds:[0x430A48]

0042F502  |.  8B00                  mov eax,dword ptr ds:[eax]

0042F504  |.  E8 67ACFFFF   call Demo.0042A170                ;  彈出序列號錯誤時的結果

*****************************************************************************

Serial+Name部分:

通過查看文本字符串,再運行一下即可大致了解該部分程序的主要運行邏輯。 

圖片.png

圖八

可以看到“Try Again!”和“Sorry, The serial is incorrect!”分別出現了兩次,考慮到要求輸入用戶名與序列號,猜測應該是先滿足一個條件后,再判斷是否滿足另一個條件,只有兩個條件都滿足的情況下才彈出正確信息。同樣,雙擊第一個“Try Again!”所在行,程序跳轉至相應匯編代碼處,上下移動可以發現這就是我們要尋找的關鍵代碼。同樣在入口代碼處設置一個斷點,繼續運行,在輸入框中隨便輸入一些信息,點擊“Check it Baby!”按鈕會發現程序動不了。

圖片.png

圖九

圖片.png

圖十

此時程序將停留在斷點處,我們在OD中選擇F8單步步過,一直按F8,最終會發現在堆棧窗口會冒出一個特別的值:“CW-4674-CRACKED”,猜測是我們需要的序列號。

圖片.png

圖十一

驗證結果如下: 

圖片.png

圖十二

重要匯編代碼分析:

0042F9A9  |.  55                           push ebp

0042F9AA  |.  68 67FB4200         push Demo.0042FB67

0042F9AF      64:FF30                 push dword ptr fs:[eax]

0042F9B2  |.  64:8920                  mov dword ptr fs:[eax],esp

0042F9B5  |.  C705 50174300>   mov dword ptr ds:[0x431750],0x29          ;全局變量賦值0x29

0042F9BF  |.  8D55 F0                 lea edx,[local.4] ;EDX 0012F92C            ;取第四個參數地址

0042F9C2  |.  8B83 DC010000    mov eax,dword ptr ds:[ebx+0x1DC]

0042F9C8  |.  E8 8BB0FEFF       call Demo.0041AA58                                ;獲取Name輸入框中的內容并賦值給第四個參數

0042F9CD  |.  8B45 F0                mov eax,[local.4]

0042F9D0  |.  E8 DB40FDFF      call Demo.00403AB0

0042F9D5 |. A3 6C174300          mov dword ptr ds:[0x43176C],eax           

0042F9DA  |.  8D55 F0                lea edx,[local.4]

0042F9DD  |.  8B83 DC010000   mov eax,dword ptr ds:[ebx+0x1DC]

0042F9E3  |.  E8 70B0FEFF       call Demo.0041AA58

0042F9E8  |.  8B45 F0                mov eax,[local.4]

0042F9EB  |.  0FB600                 movzx eax,byte ptr ds:[eax]                      ;EAX 39

0042F9EE  |.  8BF0                    mov esi,eax    

0042F9F0  |.  C1E6 03               shl esi,0x3      

0042F9F3  |.  2BF0                     sub esi,eax     

0042F9F5  |.  8D55 EC               lea edx,[local.5]    

0042F9F8  |.  8B83 DC010000   mov eax,dword ptr ds:[ebx+0x1DC]

0042F9FE  |.  E8 55B0FEFF       call Demo.0041AA58

0042FA03  |.  8B45 EC                mov eax,[local.5]  

0042FA06  |.  0FB640 01             movzx eax,byte ptr ds:[eax+0x1]              ;EAX 38

0042FA0A  |.  C1E0 04                shl eax,0x4                                               ; EAX 380;將eax中的內容左移四位

0042FA0D  |.  03F0                      add esi,eax     

0042FA0F  |.  8935 54174300      mov dword ptr ds:[0x431754],esi

0042FA15  |.  8D55 F0                 lea edx,[local.4] 

0042FA18  |.  8B83 DC010000   mov eax,dword ptr ds:[ebx+0x1DC]

0042FA1E  |.  E8 35B0FEFF      call Demo.0041AA58

0042FA23  |.  8B45 F0                mov eax,[local.4]

0042FA26  |.  0FB640 03           movzx eax,byte ptr ds:[eax+0x3]                 ;EAX 036

0042FA2A  |.  6BF0 0B              imul esi,eax,0xB    

0042FA2D  |.  8D55 EC             lea edx,[local.5]

0042FA30  |.  8B83 DC010000  mov eax,dword ptr ds:[ebx+0x1DC]

0042FA36  |.  E8 1DB0FEFF     call Demo.0041AA58

0042FA3B  |.  8B45 EC              mov eax,[local.5]

0042FA3E  |.  0FB640 02           movzx eax,byte ptr ds:[eax+0x2]               ;EAX 37

0042FA42  |.  6BC0 0E              imul eax,eax,0xE                                        ; EAX 302

0042FA45  |.  03F0                    add esi,eax          

0042FA47  |.  8935 58174300   mov dword ptr ds:[0x431758],esi

0042FA4D  |.  A1 6C174300     mov eax,dword ptr ds:[0x43176C] 

0042FA52  |.  E8 D96EFDFF    call Demo.00406930

0042FA57  |.  83F8 04              cmp eax,0x4

0042FA5A  |.  7D 1D                jge short Demo.0042FA79

****************************************************************************

0042FA5C  |.  6A 00                push 0x0

0042FA5E  |.  B9 74FB4200   mov ecx,Demo.0042FB74                 ; Try Again!

0042FA63  |.  BA 80FB4200   mov edx,Demo.0042FB80                 ; Sorry , The serial is incorect !

0042FA68  |.  A1 480A4300   mov eax,dword ptr ds:[0x430A48]

0042FA6D  |.  8B00                mov eax,dword ptr ds:[eax]

0042FA6F  |.  E8 FCA6FFFF  call Demo.0042A170

0042FA74  |.  E9 BE000000    jmp Demo.0042FB37                         ;程序結束

****************************************************************************

0042FA79  |>  8D55 F0              lea edx,[local.4]

0042FA7C  |.  8B83 DC010000 mov eax,dword ptr ds:[ebx+0x1DC]

0042FA82  |.  E8 D1AFFEFF     call Demo.0041AA58

0042FA87  |.  8B45 F0               mov eax,[local.4]                               ;算法開始

0042FA8A  |.  0FB600                movzx eax,byte ptr ds:[eax]             ;EAX 039,取用戶名字符串地址中的第一個字節入eax

0042FA8D  |. F72D 50174300    imul dword ptr ds:[0x431750]           ;EAX 921,乘以0x29

0042FA93  |. A3 50174300         mov dword ptr ds:[0x431750],eax ;

0042FA98  |.  A1 50174300         mov eax,dword ptr ds:[0x431750]

0042FA9D  |. 0105 50174300      add dword ptr ds:[0x431750],eax   ;

0042FAA3  |.  8D45 FC                lea eax,[local.1]

0042FAA6  |.  BA ACFB4200       mov edx,Demo.0042FBAC            ;CW   

0042FAAB  |.  E8 583CFDFF      call Demo.00403708

0042FAB0  |.  8D45 F8               lea eax,[local.2]

0042FAB3  |.  BA B8FB4200      mov edx,Demo.0042FBB8               ; CRACKED

0042FAB8  |.  E8 4B3CFDFF     call Demo.00403708

0042FABD  |.  FF75 FC               push [local.1]

0042FAC0  |.  68 C8FB4200       push Demo.0042FBC8                   ;  -

0042FAC5  |.  8D55 E8               lea edx,[local.6]                              ;取第六個參數地址

0042FAC8  |.  A1 50174300        mov eax,dword ptr ds:[0x431750]

0042FACD  |.  E8 466CFDFF     call Demo.00406718                     ;EAX 1242H,取出算法計算結果變成字符串傳入參數6

0042FAD2  |.  FF75 E8               push [local.6]                             ;將ASCII4674壓入棧0012F924

0042FAD5  |.  68 C8FB4200       push Demo.0042FBC8               ;  -

0042FADA  |.  FF75 F8                push [local.2]      

0042FADD  |.  8D45 F4                lea eax,[local.3]

0042FAE0  |.  BA 05000000         mov edx,0x5

0042FAE5  |.  E8 C23EFDFF       call Demo.004039AC               ;拼接字符串;將CW-4674-CRACKED傳入參數3

0042FAEA  |.  8D55 F0                 lea edx,[local.4]  

0042FAED  |.  8B83 E0010000     mov eax,dword ptr ds:[ebx+0x1E0]

0042FAF3  |.  E8 60AFFEFF        call Demo.0041AA58             ;Serial輸入框中的內容傳入參數4

0042FAF8  |.  8B55 F0                  mov edx,[local.4] 

0042FAFB  |.  8B45 F4                  mov eax,[local.3]                   ;EAX 0128A5CC ASCII CW-4674-CRACKED

0042FAFE  |.  E8 F93EFDFF        call Demo.004039FC           ;寄存器傳參比較參數3,4

0042FB03  |.  75 1A                      jnz short Demo.0042FB1F  ;關鍵跳

****************************************************************************

0042FB05  |.  6A 00                     push 0x0

0042FB07  |.  B9 CCFB4200       mov ecx,Demo.0042FBCC      ; Congratz !!

0042FB0C  |.  BA D8FB4200       mov edx,Demo.0042FBD8     ;Good job dude =)

0042FB11  |.  A1 480A4300         mov eax,dword ptr ds:[0x430A48]

0042FB16  |.  8B00                      mov eax,dword ptr ds:[eax]

0042FB18  |.  E8 53A6FFFF       call Demo.0042A170

0042FB1D  |.  EB 18                    jmp short Demo.0042FB37

****************************************************************************

0042FB1F  |>  6A 00                    push 0x0

0042FB21  |.  B9 74FB4200         mov ecx,Demo.0042FB74     ;Try Again!

0042FB26  |.  BA 80FB4200         mov edx,Demo.0042FB80     ;Sorry , The serial is incorect !

0042FB2B  |.  A1 480A4300         mov eax,dword ptr ds:[0x430A48]

0042FB30  |.  8B00                       mov eax,dword ptr ds:[eax]

0042FB32  |.  E8 39A6FFFF        call Demo.0042A170       ;彈出最終結果;點擊確定后跳轉至下一行0042FB3

0×02 高級篇

注冊機

每次輸入用戶名后再通過堆棧窗口來查找序列號有些麻煩,我們可以編寫一個注冊機來讓程序自動彈出正確序列號。我們可以通過打補丁使程序自動彈出正確序列號,補丁代碼有多種設置方式,通常設置在文件的空白區域(補丁代碼較少時),擴展最后節區后或者添加新節區后在打補丁。下面我們通過第三種方式來實現:添加一個新區段后再打補丁。通過PE增加區段工具可以增加一個新的區段,不過增加完區段后,我們還要改變該區段的權限,使之可讀可寫可執行,這里我用的是LordPE:

圖片.png

圖十三

圖片.png

圖十四

通過OD打開剛才增加了messagebox區段的程序,我們可以看到該區段在程序中的位置,接著調轉到相應位置去編寫補丁程序,下面演示中,我們從4EC010處開始編寫。

圖片.png

圖十五

圖片.png

圖十六

call Acid_bur.0041AA58下面兩行代碼nop掉,并跳轉至我們自己寫的代碼處:

圖片.png圖十七

圖片.png

圖十八

push的都是地址,可以修改標題和內容的地址,再調用相應的MessageboxA函數;當程序通過一系列的算法算出注冊碼的時候,再用彈窗注冊機彈出。

圖片.png

圖十九

圖片.png

圖二十

補充:上述實例中,由于我們在增加的區段中調用的Messagebox( )為編寫者自己封裝的程序,因此當我們將其放置到其他環境中去運行時,可能會出現如下情況: 圖片.png

圖二十一

圖片.png

圖二十二

補充:只有使用Windows系統的庫函數才能避免這類問題,比如上圖中的jmp.&user32.MessageBoxA函數。

圖片.png

圖二十三

內嵌補丁

如果我們選擇在程序的空白區域編寫補丁代碼,有時會報錯:“在可執行文件中無法定位數據”,因為在增加代碼后,整個代碼長度可能會超出Code區段的大小。另外,有時會遇到對象程序經過運行時壓縮(或加密處理)而難以直接修改的情況,此時我們都可以選擇內嵌補丁。

圖片.png圖二十四

內嵌補丁(Inline Code Patch):難以直接修改指定代碼時,插入并運行被稱為“洞穴代碼”的補丁代碼后,對程序打補丁。

圖片.png

圖二十五

左側是典型的運行時壓縮或加密代碼,EP代碼先將加密的OEP代碼解密,然后再跳轉到OEP代碼處,若要打補丁的代碼存在于經過加密的OEP區域是很難打補丁的,因為解密過程中可能會解出完全不同的結果。此時可以在文件中另外設置被稱為“洞穴代碼”的“補丁代碼”,EP代碼解密后修改JMP指令,運行洞穴代碼。在洞穴代碼中執行補丁代碼后,再跳轉到OEP處。即每次運行另外的補丁代碼時都要對進程內存的代碼打補丁。它與一般修改代碼的方式不同在于: 圖片.png

圖二十六

保護殼:一段專門負責保護軟件不被非法修改或反編譯的程序。通常將  分為兩類,一類是壓縮殼,另一類是加密殼。壓縮殼可以幫助縮減 PE 文件的大小,隱藏了 PE 文件內部代碼和資源,便于網絡傳輸和保存;加密殼最主要的功能是保護 PE 免受代碼逆向分析。由于加密殼的主要目的不再是壓縮文件資源,所以加密殼保護的 PE 程序通常比原文件大得多。目前加密殼大量用于對安全性要求高,對破解敏感的應用程序,同時也有惡意程序用于避免(降低)殺毒軟件的檢測查殺。

圖片.png圖二十七

殼的加載過程:

a:保存入口參數;(加殼程序初始化時保存各寄存器的值,外殼執行完畢,恢復各寄存器值,最后再跳到原程序執行)

b:獲取所需函數 API;

c:解密各區塊數據;(處于保護源程序代碼和數據的目的,一般會加密源程序文件的各個區塊,在程序執行時外殼將這些區塊數據解密,以讓程序正常運行)

d:跳轉回原程序入口點。

脫殼技巧:關于脫殼技巧部分,網絡上有很多很棒的資源,我就不造輪子了,主要有這幾種:單步跟蹤法、ESP定律法、內存鏡像法、一步到達OEP法、最后一次異常法、SFX自動脫殼法等等。

*本文作者:Boringrole,轉載請注明來自FreeBuf.COM

相關推薦
發表評論

已有 2 條評論

取消
Loading...
Boringrole

這家伙太懶,還未填寫個人描述!

1 文章數 1 評論數 0 關注者

最近文章

特別推薦

活動預告

填寫個人信息

姓名
電話
郵箱
公司
行業
職位
css.php 重庆百变王牌走势图 竞彩比分直播188 手游实况足球解说怎么赚钱 p3试机号 newifi能不能赚钱 007球探足球即时比分 榨果汁怎么赚钱 闲鱼老手赚钱 足球直播室 环球富翁捕鱼平台 自己赚钱能力 黑龙江6+1 汽车管家怎么赚钱 陕西麻将技巧与口诀 江苏快三 dnf金团打手赚钱吗 在借贷宝放款能赚钱么