|
論壇說明 | 標記討論區已讀 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
|
主題工具 | 顯示模式 |
2004-04-02, 09:39 PM | #1 |
榮譽會員
|
Obsidium的衣服不難脫!
【軟體名稱】:用Obsidium 1.0.0.61(破解版)加的殼!
【下載頁面】:http://yock.8866.org/down/O-Angela01.rar 【軟體大小】:(裡面有加殼的程序,我DUMP出來的程序和我解密IAT後的程序)很小. 【應用平台】:WIN9X/WINNT/WIN2K/WINXP 【軟體簡介】:一個有保護殼 【軟體限制】:吃掉OEP的一些字元,把IAT也給換成自己的了! 【文章作者】:輝仔Yock 【作者聲明】:本人發表這篇文章只是為了學習和研究!!!請不用於商業、非法用途,讀者看了文章後所做的事情與我無關,我也不會負責,請讀者看了文章後三思而後行!(在這裡最此軟體的作者以萬二分的歉意鞠躬...) 【破解工具】:Ollydbg 1.10Aen(作者終於出新版了!希望fly可以快快把他修改一下,可以避開仙劍和老王的殼裡面D陷阱) HH-ImportREC1.42(感謝漢化人和這個軟體的作者!) ————————————————————————————————— 【過 程】:這個殼非常棒,我個人也極度喜歡.他很溫柔,很有心思,也很...... 我是用看學老大製作的一個CrackMe來試驗的.OHOH 廢話不說了,開始吧 用OD載入,忽略所有異常(除記憶體) 然後用OD隱藏插件把檢查除錯器的函數給做一下手腳(也要感謝一下這個作者.沒有這個東西.我們這個脫殼人可人暈暈的!) 差點忘記一件很重要的事情.執行娃娃最新做的[WIN優化大師]的註冊機------其實要的是這個音樂.而且是不段循環播放D 現在可以按F9沖了!啦啦啦..... 第一次異常: 00414F40 CD 01 INT 1 00414F42 40 INC EAX 00414F43 40 INC EAX 00414F44 EB 03 JMP SHORT 00414F49 ; O-Angela.00414F49 第二次異常: 004153AD A5 MOVS DWORD PTR ES:[EDI], DWORD PTR [E> 004153AE EB 03 JMP SHORT 004153B3 ; O-Angela.004153B3 第三次異常: 003A0AB9 CD 01 INT 1 003A0ABB 40 INC EAX 003A0ABC 40 INC EAX 第四次異常: 003A0E12 800406 00 ADD BYTE PTR [ESI+EAX], 0 003A0E16 EB 02 JMP SHORT 003A0E1A 第五次異常: 003A11A6 8B00 MOV EAX, [EAX] 003A11A8 EB 02 JMP SHORT 003A11AC 第六次異常: 003A1646 8B00 MOV EAX, [EAX] 003A1648 EB 02 JMP SHORT 003A164C 第七次異常: 003A1864 CD 68 INT 68 003A1866 EB 04 JMP SHORT 003A186C 第八次異常: 003A1CE1 8B02 MOV EAX, [EDX] 003A1CE3 EB 02 JMP SHORT 003A1CE7 第九次異常: 003A33EA 0FB753 06 MOVZX EDX, WORD PTR [EBX+6] 003A33EE EB 01 JMP SHORT 003A33F1 第十次異常: 003A3A7F 800406 00 ADD BYTE PTR [ESI+EAX], 0 003A3A83 EB 03 JMP SHORT 003A3A88 第十一次異常: 003A4C57 A5 MOVS DWORD PTR ES:[EDI], DWORD PTR [E> 003A4C58 EB 03 JMP SHORT 003A4C5D 最後一次異常: 003A4EC9 CD 01 INT 1 003A4ECB 40 INC EAX 003A4ECC 40 INC EAX 003A4ECD EB 04 JMP SHORT 003A4ED3 ---------------------------------------------------------------------------- 在最後一次異常的時候按Alt+m開啟[記憶體映像],然後找到401000-XXXXXXXX這個塊,在這個塊上面下記憶體訪問斷點!(按一下F2) 接著咱們按Ctrl+F9來通過最後一次異常來到下面: 00401E81 FF DB FF //來到了這裡! 00401E82 15 DB 15 00401E83 3C DB 3C ; CHAR '<' ...... ...... ---------------------------------------------------------------------------- 然後我們在這些看不懂的代碼上按OD強大的功能------右鍵表單 接著找到[偶個人喜歡叫他做照妖鏡}Analysis------>Analyse code (也就是Ctrl+A) 這些看不懂的代碼馬上現形,呵呵看你這個妖精跑哪裡去! 00401E5B BF DB BF 00401E5C 72 DB 72 ; CHAR 'r' 00401E5D F6 DB F6 00401E5E 90 NOP 00401E5F 7A DB 7A ; CHAR 'z' 00401E60 CE DB CE 00401E61 B3 DB B3 00401E62 D1 DB D1 00401E63 2D DB 2D ; CHAR '-' 00401E64 62 DB 62 ; CHAR 'b' 00401E65 62 DB 62 ; CHAR 'b' 00401E66 5C DB 5C ; CHAR '\' 00401E67 23 DB 23 ; CHAR '#' 00401E68 11 DB 11 00401E69 61 DB 61 ; CHAR 'a' 00401E6A C7 DB C7 00401E6B 3D DB 3D ; CHAR '=' 00401E6C 94 DB 94 00401E6D 19 DB 19 00401E6E EF DB EF 00401E6F 8A DB 8A 00401E70 40 DB 40 ; CHAR '@' 00401E71 87 DB 87 00401E72 8B DB 8B 00401E73 7D DB 7D ; CHAR '}' 00401E74 CB DB CB 00401E75 26 DB 26 ; CHAR '&' 00401E76 . 0C E8 OR AL, 0E8 00401E78 . F9 STC 00401E79 . F7C6 DE44894A TEST ESI, 4A8944DE 00401E7F . 1C 0E SBB AL, 0E 00401E81 . FF15 3C504000 CALL [40503C] //我們停在這裡!往上看 //很正常,現在的有保護可都在OEP處動手腳,搞得一個漂亮得程序亂七八糟 00401E87 . 33D2 XOR EDX, EDX 00401E89 . 8AD4 MOV DL, AH 00401E8B . 8915 28654000 MOV [406528], EDX 00401E91 . 8BC8 MOV ECX, EAX 00401E93 . 81E1 FF000000 AND ECX, 0FF 00401E99 . 890D 24654000 MOV [406524], ECX 00401E9F . C1E1 08 SHL ECX, 8 ------------------------------------------------------------------- 我們怎麼把OEP的代碼弄回來呢?看看堆棧吧! 0012FF90 003A5968 0012FF94 0000000A 0012FF98 003A57D8 0012FF9C 000001BB 0012FFA0 0012DB30 0012FFA4 004A4634 0012FFA8 0012FF4C 0012FFAC 0012FFC0 0012FFB0 0012FFE0 Pointer to next SEH record 0012FFB4 00402990 SE handler //這裡的代碼記下來! 0012FFB8 004050C8 O-Angela.004050C8 //這裡的代碼記下來! 呵呵,現在簡單了,找一個C++ 6.0的程序,複製OEP的代碼回來! PUSH EBP MOV EBP, ESP PUSH -1 PUSH XXXXXX //這裡就是堆棧裡面的值,貼下來吧 PUSH XXXXXX //同上 MOV EAX, FS:[0] PUSH EAX MOV FS:[0], ESP SUB ESP, 58 PUSH EBX PUSH ESI PUSH EDI MOV [EBP-18], ESP ----------------------------------------------------------------- 那麼我們要的OEP的這些代碼復原後的一樣如下(接著就是用LordPE把她弄出來咯): 00401E5B >/$ 55 PUSH EBP 00401E5C |. 8BEC MOV EBP, ESP 00401E5E |. 6A FF PUSH -1 00401E60 |. 68 C8504000 PUSH 4050C8 00401E65 |. 68 90294000 PUSH 402990 00401E6A |. 64:A1 0000000>MOV EAX, FS:[0] 00401E70 |. 50 PUSH EAX 00401E71 |. 64:8925 00000>MOV FS:[0], ESP 00401E78 |. 83EC 58 SUB ESP, 58 00401E7B |. 53 PUSH EBX 00401E7C |. 56 PUSH ESI 00401E7D |. 57 PUSH EDI 00401E7E |. 8965 E8 MOV [EBP-18], ESP 00401E81 |. FF15 3C504000 CALL [40503C] (如果是98記事本就不能這樣找OEP,比較麻煩,到現在為止還沒有想到什麼好辦法) ============================================================================================================= 找了點時間,寫下了下面這些(IAT解密) Obsidium這個殼實在是麻煩. 我們開始吧: 下面是我通過自己所有的辦法找到的!(前提要知道IAT的原是位置,這個要靠You自己琢磨,其實看看那些CALL[XXXXXX]這樣的代碼就知道啦!) 通過記憶體斷點,我們來大下面這裡! 003A4035 C8 000000 ENTER 0, 0 003A4039 53 PUSH EBX 003A403A 56 PUSH ESI 003A403B 57 PUSH EDI 003A403C 8B5D 14 MOV EBX, [EBP+14] 003A403F 8B75 10 MOV ESI, [EBP+10] 003A4042 8B7D 0C MOV EDI, [EBP+C] 003A4045 8B5B 04 MOV EBX, [EBX+4] 003A4048 66:F706 2000 TEST WORD PTR [ESI], 20 //注意這裡,改成 //TEST WORD PTR [ESI], 8 003A404D 74 46 JE SHORT 003A4095 //注意這裡,改成 // JnE SHORT 003A4095 003A404F 66:F706 0200 TEST WORD PTR [ESI], 2 003A4054 75 1F JNZ SHORT 003A4075 003A4056 66:C706 0400 MOV WORD PTR [ESI], 4 003A405B 8B45 14 MOV EAX, [EBP+14] 003A405E 6A 01 PUSH 1 003A4060 6A 00 PUSH 0 003A4062 FF76 04 PUSH DWORD PTR [ESI+4] 003A4065 6A 00 PUSH 0 003A4067 FF75 18 PUSH DWORD PTR [EBP+18] 003A406A FF50 40 CALL [EAX+40] //密碼學算法(煩),計算正確函數指針 003A406D 85C0 TEST EAX, EAX 003A406F 74 39 JE SHORT 003A40AA //注意這裡,改成 //JE SHORT 003A4095 003A4071 8907 MOV [EDI], EAX 003A4073 EB 20 JMP SHORT 003A4095 003A4075 66:C706 0400 MOV WORD PTR [ESI], 4 003A407A 8B45 14 MOV EAX, [EBP+14] 003A407D 0FB756 02 MOVZX EDX, WORD PTR [ESI+2] 003A4081 6A 01 PUSH 1 003A4083 52 PUSH EDX 003A4084 6A 00 PUSH 0 003A4086 FF76 04 PUSH DWORD PTR [ESI+4] 003A4089 FF75 18 PUSH DWORD PTR [EBP+18] 003A408C FF50 40 CALL [EAX+40] //密碼學算法(煩),計算正確函數指針 003A408F 85C0 TEST EAX, EAX 003A4091 74 17 JE SHORT 003A40AA //注意這裡,改成 //JE SHORT 003A4095 003A4093 8907 MOV [EDI], EAX 003A4095 83C6 08 ADD ESI, 8 003A4098 83C7 04 ADD EDI, 4 003A409B FF4D 08 DEC DWORD PTR [EBP+8] 003A409E ^ 75 A8 JNZ SHORT 003A4048 003A40A0 33C0 XOR EAX, EAX 003A40A2 40 INC EAX 003A40A3 5F POP EDI 003A40A4 5E POP ESI 003A40A5 5B POP EBX 003A40A6 C9 LEAVE 003A40A7 C2 1400 RETN 14 上面是這個殼為了防止某些函數指針不能有保護的解密器,我修改之後就變成瞭解密所有函數指針的解密器了 ^_^ ======================================================================================= 003A40B3 C8 000000 ENTER 0, 0 003A40B7 53 PUSH EBX 003A40B8 56 PUSH ESI 003A40B9 57 PUSH EDI 003A40BA 8B5D 14 MOV EBX, [EBP+14] 003A40BD 8B75 10 MOV ESI, [EBP+10] 003A40C0 8B7D 0C MOV EDI, [EBP+C] 003A40C3 8B5B 04 MOV EBX, [EBX+4] 003A40C6 66:833E 08 CMP WORD PTR [ESI], 8 003A40CA 0F85 97000000 JNZ 003A4167 003A40D0 8B46 04 MOV EAX, [ESI+4] 003A40D3 83F8 00 CMP EAX, 0 003A40D6 74 44 JE SHORT 003A411C 003A40D8 83F8 01 CMP EAX, 1 003A40DB 74 4E JE SHORT 003A412B 003A40DD 83F8 02 CMP EAX, 2 003A40E0 74 58 JE SHORT 003A413A 003A40E2 83F8 03 CMP EAX, 3 003A40E5 74 11 JE SHORT 003A40F8 003A40E7 83F8 04 CMP EAX, 4 003A40EA 75 7B JNZ SHORT 003A4167 003A40EC 8B45 18 MOV EAX, [EBP+18] 003A40EF 05 F2199C00 ADD EAX, 9C19F2 003A40F4 8907 MOV [EDI], EAX 003A40F6 EB 6F JMP SHORT 003A4167 003A40F8 8B45 14 MOV EAX, [EBP+14] 003A40FB 68 C5B1662D PUSH 2D66B1C5 003A4100 6A 00 PUSH 0 003A4102 FF50 20 CALL [EAX+20] //這裡很重要,一些關鍵指針是否能解密就要靠這裡了! //進去看看! 003A4105 50 PUSH EAX 003A4106 53 PUSH EBX 003A4107 E8 B3030000 CALL 003A44BF 003A410C 53 PUSH EBX 003A410D E8 22030000 CALL 003A4434 003A4112 8BCB MOV ECX, EBX 003A4114 8D5C03 01 LEA EBX, [EBX+EAX+1] 003A4118 8BC1 MOV EAX, ECX 003A411A EB 2B JMP SHORT 003A4147 003A411C 8B45 14 MOV EAX, [EBP+14] 003A411F 68 0F1ACF4C PUSH 4CCF1A0F 003A4124 6A 00 PUSH 0 003A4126 FF50 20 CALL [EAX+20] //這裡很重要,一些關鍵指針是否能解密就要靠這裡了! //進去看看!同上 003A4129 EB 1C JMP SHORT 003A4147 003A412B 8B45 14 MOV EAX, [EBP+14] 003A412E 68 A41A86D0 PUSH D0861AA4 003A4133 6A 00 PUSH 0 003A4135 FF50 20 CALL [EAX+20] //這裡很重要,一些關鍵指針是否能解密就要靠這裡了! //進去看看!同上 003A4138 EB 0D JMP SHORT 003A4147 003A413A 8B45 14 MOV EAX, [EBP+14] 003A413D 68 E313B41D PUSH 1DB413E3 003A4142 6A 00 PUSH 0 003A4144 FF50 20 CALL [EAX+20] //這裡很重要,一些關鍵指針是否能解密就要靠這裡了! //進去看看!同上 003A4147 C603 B8 MOV BYTE PTR [EBX], 0B8 003A414A 8943 01 MOV [EBX+1], EAX 003A414D 8B55 18 MOV EDX, [EBP+18] 003A4150 81C2 5F189C00 ADD EDX, 9C185F 003A4156 8D43 0A LEA EAX, [EBX+A] 003A4159 2BD0 SUB EDX, EAX 003A415B C643 05 E9 MOV BYTE PTR [EBX+5], 0E9 003A415F 8953 06 MOV [EBX+6], EDX 003A4162 891F MOV [EDI], EBX //注意這裡,改成 //NOP掉 003A4164 83C3 0A ADD EBX, 0A 003A4167 83C6 08 ADD ESI, 8 003A416A 83C7 04 ADD EDI, 4 003A416D 8B45 14 MOV EAX, [EBP+14] 003A4170 8958 04 MOV [EAX+4], EBX 003A4173 FF4D 08 DEC DWORD PTR [EBP+8] 003A4176 ^ 0F85 4AFFFFFF JNZ 003A40C6 003A417C 5F POP EDI 003A417D 5E POP ESI 003A417E 5B POP EBX 003A417F C9 LEAVE 003A4180 C2 1400 RETN 14 //這裡的幾個Call都是進入到下面0041411C這個地址的, ============================================================================== 0041411C 60 PUSHAD 0041411D E8 00000000 CALL 00414122 00414122 5B POP EBX 00414123 81EB B8569C00 SUB EBX, 9C56B8 00414129 8B9B AE569C00 MOV EBX, [EBX+9C56AE] 0041412F 8B4424 24 MOV EAX, [ESP+24] 00414133 33C9 XOR ECX, ECX 00414135 8B4483 48 MOV EAX, [EBX+EAX*4+48] 00414139 8B5424 28 MOV EDX, [ESP+28] 0041413D 51 PUSH ECX 0041413E 51 PUSH ECX 0041413F 51 PUSH ECX 00414140 52 PUSH EDX 00414141 50 PUSH EAX 00414142 FF53 40 CALL [EBX+40] //最好在這裡下一個硬體斷點,留意每次的這個值,如果在這個CALL執行之後EDI的值不是IAT的地址或是不指向記憶體的話就要看EAX的值來決定新的起點! //十分重要! //我會再最後總結的時候做一個例子出來,希望你能看明白! ----------------- 00414145 85C0 TEST EAX, EAX 00414147 0F84 8B000000 JE 004141D8 //這裡改成 //00414145 8907 MOV [EDI], EAX//呵呵,我們把正確的指針放進去正確的地址! //00414147 90 NOP //00414148 90 NOP //00414149 90 NOP //0041414A 90 NOP //0041414B 90 NOP //0041414C 90 NOP ------------------ 0041414D 8BF0 MOV ESI, EAX 0041414F 83EC 28 SUB ESP, 28 00414152 8BFC MOV EDI, ESP 00414154 C74424 4C 02000>MOV DWORD PTR [ESP+4C], 2 0041415C 897424 50 MOV [ESP+50], ESI 00414160 803E C2 CMP BYTE PTR [ESI], 0C2 00414163 74 2D JE SHORT 00414192 00414165 803E C3 CMP BYTE PTR [ESI], 0C3 00414168 74 28 JE SHORT 00414192 0041416A 56 PUSH ESI 0041416B FF53 24 CALL [EBX+24] 0041416E 83F8 FF CMP EAX, -1 00414171 74 47 JE SHORT 004141BA 0041414D 8BF0 MOV ESI, EAX 0041414F 83EC 28 SUB ESP, 28 00414152 8BFC MOV EDI, ESP 00414154 C74424 4C 02000>MOV DWORD PTR [ESP+4C], 2 0041415C 897424 50 MOV [ESP+50], ESI 00414160 803E C2 CMP BYTE PTR [ESI], 0C2 00414163 74 2D JE SHORT 00414192 00414165 803E C3 CMP BYTE PTR [ESI], 0C3 00414168 74 28 JE SHORT 00414192 0041416A 56 PUSH ESI 0041416B FF53 24 CALL [EBX+24] 0041416E 83F8 FF CMP EAX, -1 00414171 74 47 JE SHORT 004141BA 00414173 F7C2 00060000 TEST EDX, 600 00414179 75 17 JNZ SHORT 00414192 0041417B 56 PUSH ESI 0041417C 57 PUSH EDI 0041417D 8BC8 MOV ECX, EAX 0041417F F3:A4 REP MOVS BYTE PTR ES:[EDI], BYTE PTR> 00414181 5F POP EDI 00414182 5E POP ESI 00414183 803F CC CMP BYTE PTR [EDI], 0CC 00414186 74 38 JE SHORT 004141C0 00414188 03F0 ADD ESI, EAX 0041418A 03F8 ADD EDI, EAX 0041418C FF4C24 4C DEC DWORD PTR [ESP+4C] 00414190 ^ 75 CE JNZ SHORT 00414160 00414192 C607 E9 MOV BYTE PTR [EDI], 0E9 00414195 8BC6 MOV EAX, ESI 00414197 2BC7 SUB EAX, EDI 00414199 83E8 05 SUB EAX, 5 0041419C 8947 01 MOV [EDI+1], EAX 0041419F 8BC4 MOV EAX, ESP 004141A1 8B4C24 48 MOV ECX, [ESP+48] 004141A5 8039 CC CMP BYTE PTR [ECX], 0CC 004141A8 74 16 JE SHORT 004141C0 004141AA 894C24 50 MOV [ESP+50], ECX 004141AE 894424 4C MOV [ESP+4C], EAX 004141B2 83C4 28 ADD ESP, 28 004141B5 61 POPAD 004141B6 83C4 04 ADD ESP, 4 004141B9 C3 RETN 小小總結: 00414142這個地址的Call執行之後,如果EAX=0的話,就要新建起源到004141D8這個地址去, 如果EDI的值不是指向IAT或是無效的話就要新建起源到0041414D這個地址. 打好所有的修正檔之後,我們現在就可以按F9咯,然後在最後一次異常對上面的OEP下段,接著就是把OEP的代碼補上,然後就可以DUMP ------------------------------------------------------------------ 【總 結】: 好了,說了那麼久,終於把這個東西的身體弄出個樣! 這個時候我們開啟 ImportREC 輸入 OEP=00401E5B ,很快就可以找到所有解密出來的函數指針了!OHOH 把所有無效的指針都剪掉,接下來的應該不用我教了吧. 修復好IAT之後我們執行一下看看.啦啦啦... 現在1.10版的基本一樣,只是在解密器加了一些花命令.Easy... 最後在這裡真心感謝你花了那麼多時間看這篇文章!謝謝了... 2004.1.28 晚 by 輝仔Yock |
送花文章: 3,
|