破解平臺Win2K+SP4
軟件名稱大嘴日語5.0
大嘴日語融合了逆向學習和瘋狂英語這兩種有效的英語學習方法的精髓。
並且具有創新性,集日語聽、說、讀、寫、記、查功能於壹體,解決了困擾國人的日語學習問題。
是壹款集日語口語和記憶日語單詞為壹體的綜合教育軟件。
外殼模式EXEStealth 2.75a+ASPack+UPX
在調試之前,最好重命名OLLYDBG.EXE·CMD.EXE,因為shell中有壹些代碼可以檢測父進程,如下所示:
0123 CCA 0 813F 434d 442 e CMP dword ptr ds:[EDI],2E444D43[EDI]是測試父程序的名稱,0x43、0x4d、0x44和0x2e的ASCII字符是“CMD”。
0123CCA6 74 3B je短bmjapane . 0123 CCE 3;如果父程序不是CMD.EXE,它不會跳轉,然後它會過度修改ZF寄存器為1。
0123CCA8 90 nop
0123 CCA 90 nop
0123CCAA 90 nop
0123 cab 90 nop
0123 CAC 83EE 0C sub ESI,0C
0123 ccaf AD lods dword ptr ds:[ESI]
0123CCB0 0306添加eax,dword ptr ds:[esi]
0123CCB2 0346 04添加eax,dword ptr ds:[esi+4]
0123CCB5 8BD8 mov ebx,eax
0123 CCB 7 8d b5 a 1194100 lea ESI,dword ptr ss:[ebp+4119a 1]
0123 CBD AD lods dword ptr ds:[ESI]
0123 CBE 0bc 0或eax,eax
0123 CCC 0 74 0E je short bmjapane
0123CCC2 90 nop
0123CCC3 90 nop
0123CCC4 90 nop
0123CCC5 90 nop
0123CCC6 2BC3 sub eax,ebx
0123 CCC 8 74 19 je short bmjapane . 0123 CCE 3
0123 CCA 90 nop
0123 CCB 90 nop
0123CCCC 90 nop
0123 CCD 90 nop
0123 CCE ^ EB ed jmp short BM japane
0123 cd0 B8 90010000 mov eax 190
0123 cd5 E8 c 6 efffff致電BmJapane.0123BCA0
0123 ccda 8 DBD 69324000 lea EDI,dword ptr ss:[ebp+403269]
0123CCE0 03F8添加edi,eax
0123 CCE 2 AB stos dword ptr es:[EDI];如果不向前跳,調試器將無法處理這裏的異常,進程將退出。
0123CCE3 FFB5 30FE4000推送dword ptr ss:[ebp+40fe 30];跳到這裏
0123CCE9 50推送eax
在同壹個目錄下的Config.ini文件的另壹個副本,當它出來時,文件是不完整的,程序需要重新安裝。
用配置文件覆蓋備份文件即可;
-
用OD加載程序,停在這裏:(EXEStealth,第壹個shell)
0124 a060 & gt;/EB 58 jmp short BM japane . 0124 a0ba
0124A062 |53推送ebx
0124 a063 | 68 61726577推送77657261
0124A068 |61 popad
0124A069 |72 65 jb短BmJapane.0124A0D0
忽略除內存異常以外的所有異常,5次內存異常後到此處(按Shift+F9 4次):
0078700d 64:8925 0000000 & gt;mov雙字指針文件系統:[0],esp
00787014 33C0 xor eax,eax
00787016 8908 mov dword ptr ds:[eax],ecx內存異常
00787018 0000添加字節指針ds:[eax],al
0078701A 0000添加字節ptr ds:[eax],al
此時的堆棧是:
0012 ffbc FFFFFFFF SEH鏈末端
0012FFC0 00D9DAA8 SE處理器
0012FFC4 7C4E87F5返回內核132.7 c4e 87 f 5
0012 ffc 8 005616 A8 bmjapane . 005616 A8
在D9DAA8處斷開點,然後按Shift+F9。
00D9DAA8 B8 A7C8D9F0 mov eax,F0D9C8A7
00 d9 daad 8d 88 24120010 lea ecx,dword ptr ds:[eax+10001224]
00 d9 dab 3 8941 01 mov dword ptr ds:[ecx+1],eax
00D9DAB6 8B5424 04 mov edx,dword ptr ss:[esp+4]
00D9DABA 8B52 0C mov edx,dword ptr ds:[edx+C]
00D9DABD C602 E9 mov字節ptr ds:[edx],0E9
00D9DAC0 83C2 05添加edx,5
00D9DAC3 2BCA sub ecx,edx
00 d9 DAC 5 894 a FC mov dword ptr ds:[EDX-4],ecx
00D9DAC8 33C0 xor eax,eax
00D9DACA C3 retn
去RETN後,看原地址的代碼:
0078700d 64:8925 0000000 & gt;mov雙字指針文件系統:[0],esp
00787014 33C0 xor eax,eax
00787016-E9 b06a 6100 jmp bmjapane . 00 d9 dacb;在這裏中斷,程序在這裏中斷,然後將標誌寄存器的TP設置為0,繼續運行。
0078701B 0000添加字節指針ds:[eax],al
0078701D 0000添加字節ptr ds:[eax],al
00D9DACA C3 retn
00D9DACB B8 A7C8D9F0 mov eax,f 0d 9 c 8 a 7;所以我跳到了這裏
00 d9 dad 0 64:8f 05 0000000 & gt;彈出雙字指針文件系統:[0]
00D9DAD7 83C4 04添加esp,4
00D9DADA 55推送ebp
00D9DADB 53推送ebx
00D9DADC 51推送ecx
00D9DADD 57推送edi
00D9DADE 56 push esi
00D9DADF 52推送edx
00 d9da E0 8d 98 DD 110010 lea ebx,dword ptr ds:[eax+100011DD]
直走到這裏:
00D9DB70 5E pop esi
00D9DB71 5F pop edi
00D9DB72 59 pop ecx
00D9DB73 5B pop ebx
00D9DB74 5D流行音樂ebp
00 d9 db 75-FFE 0 jmp eax;EAX=B55001
-
又跳到下壹層樓,像壹個包裝殼。
00B55001 60 pushad
00B55002 E8 03000000呼叫BmJapane.00B5500A
00b 55007-E9 EB 045d 45 jmp 461254 f 7
00B5500C 55推送ebp
00B5500D C3返回
00B5500E E8 01000000致電BmJapane.00B55014
00b 55013 EB 5D jmp short BM japane . 00b 55072
用Ctrl+S直接找popad。
來到這裏:
00b 553 a 9 8985 a 8030000 mov dword ptr ss:[ebp+3 A8],eax
00B553AF 61 popad
00b 553 b 075 08 jnz short BM japane . 00b 553 ba
00B553B2 B8 01000000 mov eax,1
00B553B7 C2 0C00返回0C
00B553BA 68 0000000推送0;跑到這裏就變成推90fc10了。
00B553BF C3返回
-
到達下壹層貝殼,也就是UPX貝殼。
0090FC10 60 pushad
0090 fc 11 BE 00707800 mov ESI,BmJapane.00787000
0090 fc 16 8d be 00 A0 C7 ff lea EDI,dword ptr ds:[esi+FFC7A000]
0090FC1C 57推送edi
0090FC1D 83CD FF或ebp,FFFFFFFF
0090FC20 EB 10 jmp短BmJapane.0090FC32
0090FC22 90 nop
0090FC23 90 nop
0090FC24 90 nop
0090FC25 90 nop
0090FC26 90 nop
0090FC27 90 nop
0090FC28 8A06 mov al,字節指針ds:[esi]
0090FC2A 46 inc esi
0090FC2B 8807 mov字節ptr ds:[edi],al
0090FC2D 47 inc edi
0090FC2E 01DB添加ebx,ebx
0090 fc30 75 07 jnz short BM japane . 0090 fc39
還可以訪問popad並找到以下內容:
0090FD9B 66:8B07 mov ax,word ptr ds:[edi]
0090FD9E 83C7 02添加edi,2
0090 FDA 1 ^ EB E2 jmp short BM japane . 0090 FD 85
0090FDA3 61 popad
0090 FDA 4 ^ e9 8b 1dd 7 ff jmp bmjapane . 00681b 34
-
我們已經達到了計劃的目標。用OllDUMP轉儲程序,或者用LordPE轉儲,但是我們需要用ir修復IAT。
00681B34 55推送ebp
00681B35 8BEC mov ebp,esp
00681B37 83C4 F0添加esp,-10
00681B3A 53推送ebx
00681B3B B8 9c 146800 mov eax,bmjapane . 068149 c
00681B40 E8 175DD8FF致電BmJapane.0040785C
00681b 45 8b 1D d 0906800 mov ebx,dword ptr ds:[6890d 0];BmJapane.0068AC18
00681B4B 8B03 mov eax,dword ptr ds:[ebx]
00681B4D E8 CE22E1FF致電BmJapane.00493E20
00681B52 8B03 mov eax,dword ptr ds:[ebx]
00681B54 BA 7c 1e 6800 mov EDX,BmJapane.00681E7C
00681b 59 E8 aa 1ee 1FF致電BmJapane.00493A08
00681B5E 8B0B mov ecx,dword ptr ds:[ebx]
-
運行它,程序報告壹個錯誤。
“地址1000100A出現訪問違規。讀取地址1000100A。”
用LordPE看內存空間:
列表視圖中的項目總數:26
-
路徑圖像基本圖像大小
-
d:\ BM Japanese \ BM Japanese . exe 00400000 00001000
c:\ win nt \ system32 \ ntdll . dll 77f 80000 0007 b000
c:\ win nt \ system32 \ kernel 32 . dll 7c4e 0000 000 b 9000
c:\ win nt \ system32 \ user 32 . dll 77e 10000 00065000
c:\ win nt \ system32 \ GDI 32 . dll 77f 40000 0003 c 000
c:\ win nt \ system32 \ imm32 . dll 75e 60000 0001a 000
c:\ win nt \ system32 \ advapi 32 . dll 7c2d 0000 00062000
c:\ win nt \ system32 \ rpcrt 4 . dll 77d 30000 00071000
d:\ BM Japanese \ data \ data . dat 10000000000037000
c:\ win nt \ system32 \ comctl 32 . dll 71710000 00084000
c:\ win nt \ system32 \ com DLG 32 . dll 76b 30000 0003 e000
c:\ win nt \ system32 \ shlwapi . dll 70bd 0000 00065000
c:\ win nt \ system32 \ msvcrt . dll 78000000000045000
c:\ win nt \ system32 \ shell32 . dll 782 f 0000 00248000
c:\ win nt \ system32 \ hhctrl . ocx 5d 300000 00080000
c:\ win nt \ system32 \ ole32 . dll 77a 50000 000 f 7000
c:\ win nt \ system32 \ oleaut32 . dll 779 b 0000 0009 b 000
c:\ win nt \ system32 \ msacm 32 . dll 77410000 00013000
c:\ win nt \ system32 \ winmm . dll 77570000 00030000
c:\ win nt \ system32 \ version . dll 77820000 00007000
c:\ win nt \ system32 \ lz32 . dll 759 b 0000 00006000
c:\ win nt \ system32 \ winspool . drv 77800000 0001e 000
c:\ win nt \ system32 \ MPR . dll 76620000 00011000
c:\ win nt \ system32 \ wsock 32 . dll 75050000 00008000
c:\ win nt \ system32 \ ws2 _ 32 . dll 75030000 00014000
c:\ win nt \ system32 \ ws2 help . dll 75020000 00008000
地址是data.dat的空間,如果用PEID查的話就是壹個ASPack shell的DLL文件。查輸出表,只有兩個函數。
分別是HDSerialNumRead和WEP。
仍有壹個DLL未加載。當然會有誤差。
重新加載原始文件並加載庫斷點。幾次之後,它在這裏斷裂:
01240873 53推送ebx
01240874 FF95 94e 24100呼叫dword ptr ss:[ebp+41e 294];加載庫a。數據\數據\數據.數據
0124087A 0BC0或eax,eax
0124087 c 75 34 jnz short bmjapane . 012408 B2
然後來到這裏:
01240941 53推送ebx
01240942 ff b5 17fc 4000 push dword ptr ss:[ebp+40fc 17]
01240948 FF95 8ce 24100呼叫dword ptr ss:[ebp+41 e28c];kernel32。GetProcAddress
0124094 e 3B9D 1 ffc 4000 CMP ebx,dword ptr ss:[ebp+40FC1F]
獲取HDSerialNumRead的地址。
用Alt+M,打開內存鏡像,
按F2在10001000處斷開斷點,按F9到達此處。
10001003 CC int3
10001004 CC int3
10001005 E9 66010000 jmp數據. 10001170
1000100 a & gt;E9 310B0000 jmp數據. 10001B40 -|jmp
1000100 f & gt;E9 3C0C0000 jmp數據. 10001C50
10001014 E9 c 7030000 jmp數據. 100013E0
10001019 E9 52000000 jmp數據
1000101E E9 0d 020000 jmp數據. 10001230
10001023 E9 78080000 jmp數據
10001028 E9 93020000 jmp數據. 100012C0
1000102d E9 be 040000 jmp數據
10001032 E9 89070000 jmp數據. 100017C0
10001037 CC int3
10001038 CC int3
- |
10001B40 55推送ebp
10001b 41 8 bec mov ebp,esp
10001B43 81EC d 4070000副esp,7D4
10001B49 53推送ebx
10001B4A 56推送esi
按CTRL+F9,然後返回主程序:
0059C567 8D45 C4利埃克斯,德沃德ptr ss:[ebp-3C]
0059C56A E8 518AE6FF致電BmJapane.00404FC0
0059C56F E8 D0F1FFFF調用bmjapane . 0059 b 744;jmp到數據。HDSerialNumRead
0059C574 8BD0 mov edx,eax
0059C576 8D45 C4利埃克斯,德沃德ptr ss:[ebp-3C]
原來調用59B744是data.HDSerialNumRead的函數的地址調用,直接上圖看壹下:
0059 b744-FF25 2 CCC 6800 jmp dword ptr ds:[68 cc2c];數據。HDSerialNumRead
嗯,正確的地址填68CC20就行了。
使用OD從DUMP加載程序,並在斷點處加載LibraryA。程序中斷後,按Alt+F9返回用戶代碼:
0047 e97b/0f 85 ee 000000 jnz oll . 0047 ea6f
0047E981 |68 ACEA4700推送oll . 0047 eaac;ASCII "imm32.dll "
0047 e986 | E8 d 594 F8 ff call & lt;jmp。& ampkernel32。LoadLibraryA & gt
0047 e98b | A3 88326800 mov dword ptr ds:[683288],eaxIMM32.75E6萬
0047E990 | 833D 88326800 0 & gtcmp雙字指針ds:[683288],0
0047 e997 | 0F84 d 2000000 je ol . 0047 ea6f
下到代碼,找到出口:
0047EA8D 5B pop ebx用戶32.77E10000
0047EA8E 59 pop ecx
0047EA8F 5D流行樂ebp
0047EA90 C3返回
0047EA91 0000添加字節ptr ds:[eax],al
找個地方添加您自己的代碼:
不再使用Block ExeS,只用於編寫代碼:
註意:LoadLibraryA的調用是“調用00407 e60”;GetProcAddress的調用是“調用00407D50”。
如果情況不同,就要相應修改。
0047 ea8d-E9 6e b5 DC 00 jmp oll . 0124 a000
0047EA92 C3返回
0124A000 68 30A02401推oll . 0124 a030;ASCII”。\data\Data.dat "
0124 a005 E8 56de 1 BFF call & lt;jmp。& ampkernel32。LoadLibraryA & gt
0124A00A 68 40A02401推oll . 0124 a040;ASCII "HDSerialNumRead "
0124A00F 50推eaxEAX是LoadLibraryA之後的DLL句柄。
0124 a 010 E8 3 BDD 1 BFF call & lt;jmp。& ampkernel32。GetProcAddress & gt
0124 a 015 A3 2ccc 6800 mov dword ptr ds:[68 cc2c],eax
0124A01A 5B pop ebx
0124A01B 59 pop ecx
0124A01C 5D流行樂
0124A01D 90 nop
0124 a 01E-E9 6f 4a 23 ff jmp oll . 0047 ea 92
0124A023 90 nop
-
反代碼到程序
0067D1E9 ^\EB CE jmp短轉儲
0067D1EB E8 80C4E4FF呼叫轉儲. 004C9670
0067D1F0 68 FFFF0000推0FFFF
0067D1F5 6A 0D推送0D
0067d 1f 7 E8 7 CB 2d 8 ff call & lt;jmp。& amp用戶32。ExitWindowsEx & gt;關了~
0067D1FC E9 CD060000 jmp轉儲. 0067D8CE
當然,這麽危險的API是不能被程序誤用的。如果您希望它指向您自己的代碼,請直接在IAT中更改它:
0067d 1f 7 E8 7 CB 2d 8 ff call & lt;jmp。& amp用戶32。ExitWindowsEx & gt最初的電話是00408478。
去408478看看:
00408478-FF25 50c 96800 jmp dword ptr ds:[& lt;& amp用戶32。ExitWindowsEx & gt;用戶32。ExitWindowsEx
編寫您自己的代碼:
0124A000 83C4 0C添加esp,0C
0124A003 FF7424 F4推送dword ptr ss:[esp-C];來電後恢復RETN的地址。
0124A007 C3返回
更改IAT表:
00408478-E9 831be 400 jmp exit _ fix . 0124 a000
0040847D 90 nop
運行,程序沒問題,....
脫殼完成
後記,EXEStealth的IAT還原部分,更有意思:
00FDE535 8B07 mov eax,dword ptr ds:[EDI];EDI是加密函數名結構的基址(可以這麽說)。
00FDE537 09C0或eax,eax
00FDE539 74 3C je短BM japane . 00 FDE 577;IAT表是否完成,如果完成,跳過。
00FDE53B 8B5F 04 mov ebx,dword ptr ds:[edi+4]
00FDE53E 8D8430 BC43BE00 lea eax,dword ptr ds:[eax+esi+BE43BC]
00FDE545 01F3添加ebx,esi
00FDE547 50推動eax
00FDE548 83C7 08添加edi,8;函數名結構基址+8字節,指向第3項。
00FDE54B FF96 1045BE00調用dword ptr ds:[ESI+be 4510];加載庫a
00FDE551 95 xchg eax,ebp
00FDE552 8A07 mov al,byte ptr ds:[EDI];讀取第3項的值。
00FDE554 47 inc edi函數名結構的基址是+1,指向第四項,即函數名。
00FDE555 08C0或al,al;看AL(函數名第3項)是否為空。
^ 74 DC je short BmJapane
00FDE559 89F9 mov ecx,edi讀出函數名,並把它放在ECX。
00FDE55B 57推送edi函數名
12月48日
00 FDE 55d F2:AE repne scas byte ptr es:[EDI];這條指令的作用其實是計算下壹個函數的基址。
00FDE55F 55 push ebp
00FDE560 FF96 1445BE00呼叫dword ptr ds:[ESI+be 4514];GetProcAddress
00FDE566 09C0或eax,eax
00 FDE 568 74 07 je short BM japane . 00 FDE 571;壹般情況下不會跳。這裏是無法獲取函數地址的情況。
00 FDE 56 a 8903 mov dword ptr ds:[ebx],eax獲取地址並將其填入[ebx] (IAT表)。
00FDE56C 83C3 04添加ebx,4;IAT表地址+4字節
00FDE56F ^ EB E1 jmp短BmJapane.00FDE552
下面是其中壹個函數的函數結構,與上面的相關:
35 02 00 00 24 B9 99 00 01 61 63 6d 4d 65 74 72 5..$ acmMetr
| - 1 - | | - 2 - | 3 | - 4 -
69 63 73 ics
- |
1->;用leaEAX,dword ptrds: [EAX+ESI+be43bc]指明這個函數屬於哪個DLL文件,並將DLL文件的地址傳遞給eax。
2->;這部分加上基址(401000),作為程序填充IAT表的地址。
3->;標識函數所在的DLL是否與前壹個函數的DLL相同。
4->;函數名