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
至此該程式己完美爆破!!!
--------------------------------------------------------------------------------
【版權宣告】 本文純屬技術交流, 轉載請註明作者並保持文章的完整, 謝謝!
感謝看完!因環境限制,無人交流,上網也不方便,破解該程式所用的方法幾乎全靠我自己摸索,用了三天時間才跟出來~~累啊!小弟語言表達能力太差,不知各位看官有沒有看出我表達的意思,歡迎與我交流!!
相關文章
- 股市風暴4.0的外殼分析與脫殼方法(一) (7千字)2001-06-10
- 殼的工作原理脫殼2013-04-10
- 壹次脫殼法――Armadillo 雙程式標準殼 快速脫殼2015-11-15
- VBExplorer.exe脫殼教程
附脫殼指令碼2015-11-15指令碼
- ExeStealth 常用脫殼方法 + ExeStealth V2.72主程式脫殼2015-11-15
- 以殼解殼--SourceRescuer脫殼手記破解分析2004-11-16
- 脫殼基本知識2015-11-15
- SoftDefender主程式脫殼2015-11-15
- International CueClub主程式脫殼(Softwrap殼)2004-09-12
- 脫殼----對用pecompact加殼的程式進行手動脫殼
(1千字)2000-07-30
- iOS逆向學習之五(加殼?脫殼?)2019-10-10iOS
- 先分析,再脫殼(一)2003-09-04
- IconEdit2
脫殼2002-03-28
- 十、iOS逆向之《越獄砸殼/ipa脫殼》2021-03-18iOS
- C32Asm外殼脫殼分析筆記2015-11-15ASM筆記
- “愛加密” 動態脫殼法2014-11-21加密
- 360加固保動態脫殼2014-11-17
- Armadillo 3.6主程式脫殼2015-11-15
- 脫殼----對用Petite2.2加殼的程式進行手動脫殼的一點分析
(5千字)2000-07-27
- 教你如何寫UPX脫殼指令碼2019-05-11指令碼
- ☆Steel
Box☆脫殼――taos的New Protection2004-12-13
- 寫給新手
- 淺談脫殼方法2004-12-18
- EmbedPE
1.13 詳細分析和脫殼2005-01-03
- [翻譯]利用程式碼注入脫殼2015-11-15
- 脫殼後軟體減肥大法2015-11-15
- 一次簡單的脫殼2024-08-30
- Krypton
0.5加殼程式脫殼及輸入表修復記2004-10-06
- Armadillo V3.6雙程式標準殼 ------神速脫殼大法2015-11-15
- 【原創】一個dex脫殼指令碼2017-01-03指令碼
- 【分享】MEW1.1脫殼指令碼
For OM2004-12-01指令碼
- FTPrint的脫殼(asprotect) (2千字)2001-02-05FTP
- telock脫殼總結 (12千字)2001-09-27
- ACProtect 1.21專業版主程式的脫殼2015-11-15
- “天音怒放”手動脫殼及破解2015-11-15
- 菜鳥脫 UltraFXP 0.9941 殼( SVKP )+ 破解2015-11-15
- Armadillo3.60
加殼的EXE檔案脫殼全過程2004-09-08
- ASPROtect 1.22加殼的ahaview2.0脫殼 (5千字)2002-03-24View
- ArtCursors 3.03 ASPR殼軟體脫殼後修整記 (10千字)2015-11-15