EasyBoot5.03脫殼+暴破

看雪資料發表於2004-11-17

【破解作者】 lelfei
【作者郵箱】 lelfei#sina.com
【使用工具】 Peid0.92,FI3.01,OllyDBG1.10,LordPE,UltraEdit,...
【破解平臺】 Win2000
【軟體名稱】 EasyBoot 5.0.3.426 , 2004年9月22日
【下載地址】 http://cn.ezbsystems.com
【軟體簡介】 EasyBoot是一款整合化的中文光碟啟動選單製作工具,它可以製作光碟啟動選單、自動生成啟動檔案、並生成可啟動ISO檔案。只要透過CD-R/W燒錄軟體即可製作完全屬於自己的啟動光碟。
【軟體大小】 2.40M
【加殼方式】 未知
【破解宣告】 我是一隻小菜鳥,偶得一點心得,願與大家分享:)
--------------------------------------------------------------------------------
【破解內容】



一、脫殼:

觀察:

用Peid和FI偵察,發現殼為“ASPack 2.12 -> Alexey Solodovnikov”,但實際並非如此。

下手:

用Fly修改的OllyDBG1.10載入程式,停在入口處:

程式碼:
005AB001 E>pushad                      <--程式入口點 005AB002   call EasyBoot.005AB00A 005AB007   jmp 45B7B4F7

可以單步跟,我們用最快速的方法到達偽OEP:

查詢按“Ctrl+F”,輸入命令“Popad”,再按三次“Ctrl+L”(繼續查詢),來到005AB3AF處,再“F4”到這裡:
程式碼:
005AB3A9   mov dword ptr ss:[ebp+3A8],eax 005AB3AF   popad                             ;<--F4來到這裡 005AB3B0   jnz short EasyBoot.005AB3BA 005AB3B2   mov eax,1 005AB3B7   retn 0C 005AB3BA   push EasyBoot.00401428            ;可以看見偽OEP了 005AB3BF   retn                              ;返回到 00401428 (EasyBoot.00401428) 00401428   jmp short EasyBoot.0040143A            ;<--偽OEP入口 0040142A   db 66                                  ;  CHAR 'f' 0040142B   db 62                                  ;  CHAR 'b' 0040142C   db 3A                                  ;  CHAR ':' 0040142D   db 43                                  ;  CHAR 'C' 0040142E   db 2B                                  ;  CHAR '+' 0040142F   db 2B                                  ;  CHAR '+' 00401430   db 48                                  ;  CHAR 'H' 00401431   db 4F                                  ;  CHAR 'O' 00401432   db 4F                                  ;  CHAR 'O' 00401433   db 4B                                  ;  CHAR 'K' 00401434   nop 00401435   db E9 00401436   dd offset EasyBoot.___CPPdebugHook 0040143A   mov eax,dword ptr ds:[50708B] 0040143F   shl eax,2 發現偽OEP處的程式碼並不像我們常見的程式入口點程式碼,繼續往下跟: 0040143A   mov eax,dword ptr ds:[50708B] 0040143F   shl eax,2 00401442   mov dword ptr ds:[50708F],eax 00401447   push edx 00401448   push 0                               ; /pModule = NULL 0040144A   call EasyBoot.00506066               ; \GetModuleHandleA 0040144F   mov edx,eax 00401451   call EasyBoot.004E303C 00401456   pop edx 00401457   call EasyBoot.004E2FA0 0040145C   call EasyBoot.004E307C 00401461   push 0                               ; /Arg1 = 00000000 00401463   call EasyBoot.004E4690               ; \EasyBoot.004E4690 00401468   pop ecx 00401469   push EasyBoot.00507034 0040146E   push 0                               ; /pModule = NULL 00401470   call EasyBoot.00506066               ; \GetModuleHandleA 00401475   mov dword ptr ds:[507093],eax 0040147A   push 0 0040147C   jmp EasyBoot.004EE16C                ;<--這裡跳向真正的OEP 00401481 E>jmp EasyBoot.004E46DC 004EE16C   push ebp                    ;<--真實的OEP,觀察這裡的程式碼 004EE16D   mov ebp,esp 004EE16F   add esp,-0C 004EE172   push ebx 004EE173   push esi 004EE174   push edi 004EE175   mov esi,dword ptr ss:[ebp+8] 004EE178   mov eax,dword ptr ds:[esi+10] 004EE17B   and eax,1 004EE17E   mov dword ptr ds:[51F1A0],eax 004EE183   call EasyBoot.004EADB4

在004EE16C處DUMP記憶體,存為“Dump.exe”。

修復IAT:

執行ImportREC1.6,選擇當前的程式“EasyBoot.exe”,填入OEP:000EE16C,獲取輸入表,可以看到僅有Kernel32.dll中的函式呼叫。

不知道各位高手是怎麼解決這個問題的,我摸索出一個解決辦法如下:

在函式框中點滑鼠右鍵->高階命令選單->獲取API呼叫資訊,填入地址範圍00000000-FFFFFFFF,只勾選“獲取‘Call X’scheme”,確定後會發現找到一大串;

點“顯示無效函式”,在函式框中點滑鼠右鍵->刪除指標資料,FixDump生成dump_.exe。

修正OEP:

用OllyDBG載入剛生成的Dump_.exe,執行出錯,還是由於程式呼叫[ESI+XX]引起的,在殼中OEP處ESI=ESP+4=[0012FFC0]=00507034,而脫殼後ESI=ESP+4=[0012FFC8]=005616A8,需要平衡堆疊。

在程式碼段的空白處,我選在該段的結尾處,輸入下面程式碼:
程式碼:
00506FF0 1>mov dword ptr ss:[esp+4],fix_dump.00507034   ;<--恢復堆疊資料 00506FF8   jmp fix_dump.004EE16C                        ;<--跳到真正的OEP

用LordPE修改程式的OEP為00106FF0,儲存為fix_dump_.exe,試執行之,成功!





二、爆破:

觀察:

未註冊版有煩人的彈出視窗提示,還有功能限制,在“關於”裡輸入註冊碼,發現為重啟驗證,登錄檔裡存有註冊資訊,使用者名稱為明碼儲存,註冊碼為加密形式儲存。

下手:

既然存到登錄檔裡,我們就從登錄檔入手:

在命令列裡輸入:bp RegOpenKeyExA,按F9執行程式,中斷後觀察ESP+4和ESP+8處的字元,直到分別為“hKey = HKEY_CURRENT_USER”和“Subkey = "SOFTWARE\EasyBoot Systems\EasyBoot\3.0"”為止,(在我的電腦上是按了5次F9),關閉斷點,然後按“Alt+F9”返回程式,來到:
程式碼:
00402630   push ecx                          ; /pHandle 00402631   push fix_dump.0050A3A5            ; |Subkey = "SOFTWARE\EasyBoot Systems\EasyBoot\3.0" 00402636   push 80000001                     ; |hKey = HKEY_CURRENT_USER 0040263B   call <jmp.&advapi32.RegOpenKeyA>  ; \RegOpenKeyA 00402640   test eax,eax                      ;<--返回到這裡 00402642   jnz fix_dump.004026C9             ;判斷是否有登錄檔資訊 00402648   mov dword ptr ss:[ebp-40],400 0040264F   lea eax,dword ptr ss:[ebp-40] 00402652   push eax                          ; /pBufSize 00402653   lea edx,dword ptr ss:[ebp-648]    ; | 00402659   push edx                          ; |Buffer 0040265A   lea ecx,dword ptr ss:[ebp-3C]     ; | 0040265D   push ecx                          ; |pValueType 0040265E   push 0                            ; |Reserved = NULL 00402660   push fix_dump.0050A3CC            ; |ValueName = "" 00402665   push dword ptr ss:[ebp-38]        ; |hKey 00402668   call <jmp.&advapi32.RegQueryValue>; \RegQueryValueExA 0040266D   test eax,eax 0040266F   jnz short fix_dump.004026C1 ・・・ 0040272A   lea edx,dword ptr ss:[ebp-248] 00402730   push edx                          ; /Arg2 00402731   lea ecx,dword ptr ss:[ebp-148]    ; | 00402737   push ecx                          ; |Arg1 00402738   call fix_dump.004397F8            ; \fix_dump.004397F8讀註冊資訊 0040273D   add esp,8                         ;<--到這裡可以看到註冊資訊 00402740  mov dword ptr ds:[50A5AC],eax      ;置註冊標誌位1 00402745  mov eax,dword ptr ds:[50A5AC] 0040274A  test eax,eax                       ;判斷註冊資訊是否存在 0040274C  je short fix_dump.0040276B 0040274E  lea edx,dword ptr ss:[ebp-248] 00402754  push edx 00402755  lea ecx,dword ptr ss:[ebp-148] 0040275B  push ecx 0040275C  call fix_dump.004017D3             ;關鍵CALL,比較註冊碼,跟進 00402761  add esp,8 00402764  mov dword ptr ds:[50A5AC],eax      ;儲存註冊標誌位1 00402769  jmp short fix_dump.00402772 0040276B  xor eax,eax                        ;清除註冊標誌位1 0040276D  mov dword ptr ds:[50A5AC],eax 跟進0040275C處的關鍵CALL: 004017D3   $  55  push ebp 004017D4   .  8BE>mov ebp,esp 004017D6   .  81C>add esp,-4C0 004017DC   .  33C>xor eax,eax ・・・註冊碼計算過程,有興趣的同志可以慢慢跟:) 00401A93  xor ecx,ecx 00401A95  mov dword ptr ss:[ebp-2C],ecx 00401A98  lea eax,dword ptr ss:[ebp-468] 00401A9E  mov edx,dword ptr ds:[eax] 00401AA0  mov ecx,dword ptr ss:[ebp-34] 00401AA3  mov eax,dword ptr ds:[ecx] 00401AA5  cmp edx,eax 00401AA7  jnz short fix_dump.00401B13       ;關鍵比較1,跳則完完 00401AA9  lea edx,dword ptr ss:[ebp-468] 00401AAF  mov dword ptr ss:[ebp-3C],edx 00401AB2  dec dword ptr ds:[5145C0] 00401AB8  mov ecx,dword ptr ss:[ebp-34] 00401ABB  mov dword ptr ss:[ebp-40],ecx 00401ABE  mov eax,dword ptr ss:[ebp-3C] 00401AC1  mov edx,dword ptr ds:[eax] 00401AC3  mov ecx,dword ptr ss:[ebp-40] 00401AC6  mov eax,dword ptr ds:[ecx] 00401AC8  cmp edx,eax 00401ACA  jnz short fix_dump.00401B13       ;關鍵比較2,跳則完完 00401ACC  mov edx,dword ptr ss:[ebp-3C] 00401ACF  mov ecx,dword ptr ds:[edx+C] 00401AD2  mov eax,dword ptr ss:[ebp-40] 00401AD5  mov edx,dword ptr ds:[eax+4] 00401AD8  cmp ecx,edx 00401ADA  jnz short fix_dump.00401B13       ;關鍵比較3,跳則完完 00401ADC  dec dword ptr ds:[5145C0] 00401AE2  mov ecx,dword ptr ss:[ebp-28] 00401AE5  add ecx,46 00401AE8  mov dword ptr ds:[5083D8],ecx 00401AEE  mov eax,dword ptr ss:[ebp-28] 00401AF1  not eax 00401AF3  mov edx,dword ptr ds:[5145C0] 00401AF9  cmp eax,edx 00401AFB  jnz short fix_dump.00401B29       ;關鍵比較4,跳則完完 00401AFD  mov dword ptr ds:[5145C0],5000    ;置註冊標誌位2 00401B07  mov dword ptr ds:[50B5F4],5500    ;置註冊標誌位3 00401B11  jmp short fix_dump.00401B29 00401B13  add dword ptr ss:[ebp-34],8 00401B17  inc dword ptr ss:[ebp-2C] 00401B1A  mov ecx,dword ptr ss:[ebp-2C] 00401B1D  cmp ecx,1D0 00401B23  jl fix_dump.00401A98 00401B29  mov eax,dword ptr ss:[ebp-28] 00401B2C  add eax,46 00401B2F  mov edx,dword ptr ds:[5083D8] 00401B35  cmp eax,edx 00401B37  je short fix_dump.00401B3F 00401B39  dec dword ptr ds:[5145C0] 00401B3F  lea ecx,dword ptr ss:[ebp-10] 00401B42  push ecx                          ; /Arg2 00401B43  push dword ptr ss:[ebp+8]         ; |Arg1 00401B46  call fix_dump.00445CDC            ; \fix_dump.00445CDC 00401B4B  add esp,8 00401B4E  push dword ptr ss:[ebp-14]        ; /Arg2 00401B51  push dword ptr ss:[ebp-10]        ; |Arg1 00401B54  call fix_dump.00442538            ; \fix_dump.00442538  再次判斷 00401B59  add esp,8 00401B5C  test eax,eax 00401B5E  je short fix_dump.00401B64        ;關鍵比較5,不跳則影響註冊標誌位1 00401B60  xor eax,eax 00401B62  jmp short fix_dump.00401B69 00401B64  mov eax,1 00401B69  mov esp,ebp 00401B6B  pop ebp 00401B6C  retn

註冊過程總結:

把經過處理的註冊碼與真註冊碼分4段比較,(即4個關鍵比較),有一段出錯立即跳出;如果全部都正確則置2個標誌位,(即註冊標誌位2和註冊標誌位3),再經過一次計算,將結果返回時放到註冊標誌位1。

於是爆破如下:修改關鍵比較1、關鍵比較2、關鍵比較3、關鍵比較4為9090(即兩個NOP),修改關鍵比較5為JMP,試執行之,顯示為“本產品授權給:asdf”,成功!

去暗樁:

程式還有暗樁,在預覽介面中點滑鼠右鍵會直接退出。

如何攔截退出程式的程式碼呢?我有一個笨方法:回溯找CALL法。辦法很笨,但還是比較有效的。

重新載入程式,下斷:“bp ExitProcess”,在預覽介面中點滑鼠右鍵,果然斷下,看堆疊:
程式碼:
0012F580    004EDFEC   /CALL 到 ExitProcess 來自 fix_dump.004EDFE7 是004EDFE7處呼叫ExitProcess的。回溯檢視004EDFE7處的程式碼: 004EDFE0  /$>push ebp                          ;Local Call from 004ED390 004EDFE1  |.>mov ebp,esp 004EDFE3  |.>mov eax,dword ptr ss:[ebp+8] 004EDFE6  |.>push eax                          ; /ExitCode 004EDFE7  \.>call <jmp.&kernel32.ExitProcess>  ; \ExitProcess 向上看004EDFE0處,有一個CALL入口“Local Call from 004ED390”。再回溯到004ED390處: 004ED334  /$  5>push ebp                       ;Local Calls from 004ED3AB, 004ED3C3, 004ED3D6, 004ED3E6 004ED335  |.  8>mov ebp,esp 004ED337  |.  5>push ebx 004ED338  |.  8>mov ebx,dword ptr ss:[ebp+8] 004ED33B  |.  E>call fix_dump.004EE138 004ED340  |.  8>test ebx,ebx 004ED342  |.  7>jnz short fix_dump.004ED360 004ED344  |.  8>cmp dword ptr ds:[51EFEC],0 004ED34B  |.  7>je short fix_dump.004ED353 004ED34D  |.  F>call dword ptr ds:[51EFEC] 004ED353  |>  E>call fix_dump.004EE0CC 004ED358  |.  F>call dword ptr ds:[51EFF0]    ;  fix_dump.004ED330 004ED35E  |.  E>jmp short fix_dump.004ED367 004ED360  |>  3>xor eax,eax 004ED362  |.  A>mov dword ptr ds:[51EFEC],eax 004ED367  |>  8>cmp dword ptr ss:[ebp+C],0 004ED36B  |.  7>jnz short fix_dump.004ED396 004ED36D  |.  8>test ebx,ebx 004ED36F  |.  7>jnz short fix_dump.004ED37D 004ED371  |.  F>call dword ptr ds:[51EFF4]    ;  fix_dump.004ED330 004ED377  |.  F>call dword ptr ds:[51EFF8]    ;  fix_dump.004ED330 004ED37D  |>  E>call fix_dump.004EE148 004ED382  |.  E>call fix_dump.004E5EEC 004ED387  |.  E>call fix_dump.004E76EC 004ED38C  |.  8>mov edx,dword ptr ss:[ebp+10] 004ED38F  |.  5>push edx 004ED390  |.  E>call fix_dump.004EDFE0        ;呼叫退出程式CALL 004ED395  |.  5>pop ecx 004ED396  |>  E>call fix_dump.004EE148 004ED39B  |.  5>pop ebx 004ED39C  |.  5>pop ebp 004ED39D  \.  C>retn

這個CALL入口有多個呼叫,於是重新執行程式,在004ED334下斷,看堆疊呼叫:

0012F59C    004ED3B0   返回到 fix_dump.004ED3B0 來自 fix_dump.004ED334

再回溯到004ED334處。。。。

・・・

經過幾次回溯後來到這裡:
程式碼:
00435773  mov edx,dword ptr ds:[50A5AC]  ;取註冊標誌位1 00435779  test edx,edx 0043577B  je short fix_dump.004357BE     ;未註冊時跳走 0043577D  push fix_dump.0052D668         ; /Arg2 = 0052D668 ASCII "1111111111111111" 00435782  push fix_dump.0052D564         ; |Arg1 = 0052D564 ASCII "asdf" 00435787  call fix_dump.0043425F         ; \fix_dump.0043425F  判斷註冊碼 0043578C  add esp,8 0043578F  mov ecx,dword ptr ds:[5145C0]  ;取註冊標誌位2 00435795  cmp ecx,5000 0043579B  je short fix_dump.004357BE     ;未註冊時執行退出命令 0043579D  push 0                         ; /Arg1 = 00000000 0043579F  call fix_dump.004ED3A0         ; \fix_dump.004ED3A0  <--退出程式的Call 004357A4  pop ecx 004357A5  jmp short fix_dump.004357BE 004357A7  push dword ptr ds:[521748]     ; /Arg1 = 00000000; Case 2E of switch 0043527D

又找到一個比較註冊碼的CALL:00435787。跟進後發現與程式啟動時的比較過程完全一樣,同樣修改5處,可突破右鍵退出的限制。

那麼如何找到其他判斷註冊碼的地方呢?我找了一投機取巧的辦法:

因為程式在判斷註冊碼後都有一個置註冊標誌位的命令:

C705 C0455100 00500000    mov dword ptr ds:[5145C0],5000  ;置註冊標誌位2
C705 F4B55000 00550000    mov dword ptr ds:[50B5F4],5500  ;置註冊標誌位3

而這二句的十六進位制程式碼與所在程式的位置無關,都是C705C045510000500000C705F4B5500000550000,

在UltraEdit中搜尋該程式碼,根據找到的實體地址再轉換到程式的偏移地址,一共可以找到4處,分別修改即可。

--------------------------------------------------------------------------------
【爆破地址】


爆破修改如下:
程式碼:
查詢地址|物理偏移|原值|修改 00001AFD:00001AA7:756A->9090    ;啟動時檢查,己修改           00001ACA:7547->9090           00001ADA:7537->9090           00001AFB:752C->9090           00004B6E:7404->EB04 00004B0D:00004AB7:756A->9090    ;右鍵檢查           00004ADA:7547->9090           00004AEA:7537->9090           00004B0B:752C->9090           00004B6E:7404->EB04 00034589:00034533:756A->9090           00034556:7547->9090           00034566:7537->9090           00034587:752C->9090           000345EA:7404->EB04 00035D31:00035CDB:756A->9090           00035CFE:7547->9090           00035D0E:7537->9090           00035D2F:752C->9090           00035D92:7404->EB04

至此該程式己完美爆破!!!


--------------------------------------------------------------------------------

【版權宣告】 本文純屬技術交流, 轉載請註明作者並保持文章的完整, 謝謝!





感謝看完!因環境限制,無人交流,上網也不方便,破解該程式所用的方法幾乎全靠我自己摸索,用了三天時間才跟出來~~累啊!小弟語言表達能力太差,不知各位看官有沒有看出我表達的意思,歡迎與我交流!!

相關文章