好友
阅读权限40
听众
最后登录1970-1-1
|
本帖最后由 silly 于 2010-4-9 20:09 编辑
有朋友让我帮他整一下,查壳发现是ASP,好一整欢喜,没想到跟了两步,发现我是那么的天真[s:363] ~!(联想到XX说过的,"很傻很天真~!"[s:373] ).
下面把脱壳和修复记录复制上上来,分享给大家,希望能给大家有点帮助.
//剛開始加載的時候是這個:
367C1000 > $ 68 01503237 push 37325001
367C1005 ? E8 01000000 call 367C100B
367C100A . C3 retn
367C100B ? C3 retn
367C100C . 7B 56 jpo short 367C1064
367C100E ? FF48 C6 dec dword ptr [eax-3A]
//F7跟到這裡
37325001 60 pushad
37325002 E8 03000000 call 3732500A
37325007 - E9 EB045D45 jmp shell32.7C8F54F7
3732500C 55 push ebp
3732500D C3 retn
//然後在代碼段地址下斷點:
//如果有心思可以F7一直跟,不算遠,我不到10分種就到下面,按F2 ^_^
Memory map, 条目 35
地址=367C1000
大小=000F1000 (987136.)
属主=奇迹 367C0000
区段=
包含=代码
类型=Imag 01001002
访问=R
初始访问=RWE
//F9就會到這裡,不要按F8,否則會飛了的.
//直接F7
37325503 0BC0 or eax, eax
37325505 74 1B je short 37325522
37325507 8BF8 mov edi, eax
37325509 B9 0C000000 mov ecx, 0C
3732550E F3:A4 rep movs byte ptr es:[edi], byte ptr>
37325510 EB 10 jmp short 37325522
//F7跟到下面
37325522 89A5 29040000 mov dword ptr [ebp+429], esp
37325528 6A 40 push 40
3732552A 68 00100000 push 1000
3732552F FFB5 08040000 push dword ptr [ebp+408]
37325535 6A 00 push 0
37325537 FF95 F0030000 call dword ptr [ebp+3F0]
3732553D 8985 CC010000 mov dword ptr [ebp+1CC], eax
37325543 8B9D 00040000 mov ebx, dword ptr [ebp+400]
37325549 039D 0D040000 add ebx, dword ptr [ebp+40D]
3732554F 50 push eax
37325550 53 push ebx
37325551 E8 04010000 call 3732565A
37325556 6A 40 push 40
37325558 68 00100000 push 1000
3732555D FFB5 08040000 push dword ptr [ebp+408]
37325563 6A 00 push 0
37325565 FF95 F0030000 call dword ptr [ebp+3F0]
//再按上面的方法,在代碼段下斷點
//F9一下到這裡
00D026B7 F3:A5 rep movs dword ptr es:[edi], dword p>
00D026B9 89C1 mov ecx, eax
00D026BB 83E1 03 and ecx, 3
00D026BE F3:A4 rep movs byte ptr es:[edi], byte ptr>
00D026C0 5F pop edi
00D026C1 5E pop esi
00D026C2 C3 retn
00D026C3 8D740E FC lea esi, dword ptr [esi+ecx-4]
00D026C7 8D7C0F FC lea edi, dword ptr [edi+ecx-4]
00D026CB C1F9 02 sar ecx, 2
// F7跟到下面
00D40686 8B1424 mov edx, dword ptr [esp]
00D40689 B9 08000000 mov ecx, 8
00D4068E 8BC3 mov eax, ebx
00D40690 8B28 mov ebp, dword ptr [eax]
00D40692 FF55 04 call dword ptr [ebp+4]
00D40695 8BC3 mov eax, ebx
00D40697 8B10 mov edx, dword ptr [eax]
00D40699 FF52 08 call dword ptr [edx+8]
00D4069C 8B03 mov eax, dword ptr [ebx]
00D4069E FF50 10 call dword ptr [eax+10]
00D406A1 50 push eax
00D406A2 8BC3 mov eax, ebx
00D406A4 8B10 mov edx, dword ptr [eax]
00D406A6 FF52 0C call dword ptr [edx+C]
00D406A9 8BC8 mov ecx, eax
00D406AB 8BD7 mov edx, edi
00D406AD 83EA 08 sub edx, 8
00D406B0 8B4424 04 mov eax, dword ptr [esp+4]
00D406B4 83C0 08 add eax, 8
00D406B7 E8 6CBFFCFF call 00D0C628
00D406BC 83C6 0C add esi, 0C
00D406BF 837E 04 00 cmp dword ptr [esi+4], 0
00D406C3 ^ 77 98 ja short 00D4065D
00D406C5 8BC3 mov eax, ebx ;這裡F4
00D406C7 E8 EC25FCFF call 00D02CB8
00D406CC 5A pop edx
00D406CD 5D pop ebp
00D406CE 5F pop edi
00D406CF 5E pop esi
00D406D0 5B pop ebx
00D406D1 C3 retn
//F7跟到下面:
00D40A80 55 push ebp
00D40A81 8BEC mov ebp, esp
00D40A83 83C4 EC add esp, -14
00D40A86 53 push ebx
00D40A87 56 push esi
00D40A88 57 push edi
00D40A89 A1 CC64D400 mov eax, dword ptr [D464CC]
00D40A8E C600 E2 mov byte ptr [eax], 0E2
00D40A91 A1 3065D400 mov eax, dword ptr [D46530]
00D40A96 8B00 mov eax, dword ptr [eax]
00D40A98 8B40 08 mov eax, dword ptr [eax+8]
00D40A9B 8945 F4 mov dword ptr [ebp-C], eax
00D40A9E A1 3065D400 mov eax, dword ptr [D46530]
//往下看到這裡
//(這段是解密代碼用的,沒仔細看了,現在去看看,就會發現代碼段已經解密,IAT依然沒解密)
00D40B33 8B45 FC mov eax, dword ptr [ebp-4]
00D40B36 E8 3958FCFF call 00D06374
00D40B3B 8B53 04 mov edx, dword ptr [ebx+4]
00D40B3E 8BC6 mov eax, esi
00D40B40 E8 6B1AFCFF call 00D025B0
00D40B45 83C3 0C add ebx, 0C
00D40B48 8B43 04 mov eax, dword ptr [ebx+4]
00D40B4B 85C0 test eax, eax
00D40B4D ^ 77 88 ja short 00D40AD7
00D40B4F 837D F4 00 cmp dword ptr [ebp-C], 0 ;在這裡F4
00D40B53 74 08 je short 00D40B5D
00D40B55 8B45 F4 mov eax, dword ptr [ebp-C]
00D40B58 8B55 F0 mov edx, dword ptr [ebp-10]
00D40B5B 8910 mov dword ptr [eax], edx
00D40B5D 5F pop edi
00D40B5E 5E pop esi
00D40B5F 5B pop ebx
00D40B60 8BE5 mov esp, ebp
00D40B62 5D pop ebp
00D40B63 C3 retn
//F8繼續,這裡之後IAT表解密:
00D40DA8 68 E00FD400 push 0D40FE0 ; ASCII "85"
00D40DAD E8 7A56FDFF call 00D1642C
00D40DB2 A1 2464D400 mov eax, dword ptr [D46424]
00D40DB7 8B00 mov eax, dword ptr [eax]
00D40DB9 E8 9E54FFFF call 00D3625C
00D40DBE 84C0 test al, al
00D40DC0 75 0A jnz short 00D40DCC
//F8一直到這裡:
00D41B08 68 A6E47DF1 push F17DE4A6
00D41B0D 68 E0020000 push 2E0
00D41B12 68 60600100 push 16060
00D41B17 68 14150000 push 1514
00D41B1C 68 F0050400 push 405F0
00D41B21 68 00900500 push 59000
00D41B26 FF35 D474D400 push dword ptr [D474D4]
00D41B2C E8 01000000 call 00D41B32 ;F7跟進去看看
// 一整忙乎後會到下面
// 耐心點這裡要好一整才到下面
00D413CE A1 E45CD500 mov eax, dword ptr [D55CE4]
00D413D3 894424 04 mov dword ptr [esp+4], eax
00D413D7 897C24 10 mov dword ptr [esp+10], edi
00D413DB A1 4464D400 mov eax, dword ptr [D46444]
00D413E0 8B00 mov eax, dword ptr [eax]
00D413E2 E8 D118FCFF call 00D02CB8
00D413E7 A1 B45CD500 mov eax, dword ptr [D55CB4]
00D413EC E8 C718FCFF call 00D02CB8
00D413F1 A1 CC64D400 mov eax, dword ptr [D464CC]
00D413F6 C600 E3 mov byte ptr [eax], 0E3
00D413F9 8BD4 mov edx, esp
00D413FB A1 F05CD500 mov eax, dword ptr [D55CF0]
00D41400 E8 2FC0FFFF call 00D3D434
00D41405 E8 9E39FFFF call 00D34DA8
00D4140A E8 51F1FFFF call 00D40560 ;這裡就跳進OEP
00D4140F 83C4 24 add esp, 24
00D41412 5F pop edi
00D41413 5E pop esi
00D41414 5B pop ebx
00D41415 C3 retn
//F7跟進來後的樣子:
00D40560 23F7 and esi, edi ; 奇迹.367C0000
00D40562 337424 08 xor esi, dword ptr [esp+8]
00D40566 C1CE 6D ror esi, 6D
00D40569 68 00000000 push 0
00D4056E EB 02 jmp short 00D40572
00D40570 CD20 2BF65E0B vxdjump B5EF62B
00D40576 F6 ??? ; 未知命令
00D40577 0F85 DD000000 jnz 00D4065A
//跟了一翻後發現在這裡了:
01E40000 68 C7F54A50 push 504AF5C7
01E40005 B9 6327F71F mov ecx, 1FF72763
01E4000A 59 pop ecx
01E4000B E8 14000000 call 01E40024
01E40010 8CD5 mov bp, ss
01E40012 EA DB7851B6 B72>jmp far 24B7:B65178DB
//
01E40048 FF3403 push dword ptr [ebx+eax]
01E4004B 5A pop edx
01E4004C 81C2 2EE48208 add edx, 882E42E
01E40052 66:BE 4D07 mov si, 74D
01E40056 81F2 CF5BD52A xor edx, 2AD55BCF
01E4005C 8BF0 mov esi, eax
01E4005E 81F2 5C59EB4F xor edx, 4FEB595C
01E40064 BF 68067B2F mov edi, 2F7B0668
01E40069 52 push edx
01E4006A 66:81D9 B2AF sbb cx, 0AFB2
01E4006F 8F0418 pop dword ptr [eax+ebx]
01E40072 0FBFF6 movsx esi, si
01E40075 81F7 F1252920 xor edi, 202925F1
01E4007B 83EB 02 sub ebx, 2
01E4007E BE F3EA2544 mov esi, 4425EAF3
01E40083 4B dec ebx
01E40084 4B dec ebx
01E40085 66:81EE DCEA sub si, 0EADC
01E4008A 81FB D4FFFFFF cmp ebx, -2C
01E40090 0F85 0B000000 jnz 01E400A1
01E40096 E9 1F000000 jmp 01E400BA ;這裡F4
01E4009B 8647 74 xchg byte ptr [edi+74], al
01E4009E 9D popfd
01E4009F 12E3 adc ah, bl
01E400A1 ^ E9 A2FFFFFF jmp 01E40048
// 計算出OEP,最後JMP跳過去,^_^終於跟到OEP了,飛向光明之顛了.
01E400BA BB 2AA24A00 mov ebx, 4AA22A
01E400BF 335C24 08 xor ebx, dword ptr [esp+8]
01E400C3 5B pop ebx
01E400C4 8D4435 0E lea eax, dword ptr [ebp+esi+E]
01E400C8 8D4428 F2 lea eax, dword ptr [eax+ebp-E]
01E400CC 2BC5 sub eax, ebp
01E400CE 58 pop eax
01E400CF 8D8428 9B345E5E lea eax, dword ptr [eax+ebp+5E5E349B>
01E400D6 2BC5 sub eax, ebp
01E400D8 03C3 add eax, ebx
01E400DA 5C pop esp
01E400DB - FFE0 jmp eax ; 奇迹.368B1204
01E400DD C3 retn
//現在應該可以DUMP了.
//再用ImportRec修復後,發現啟動出錯,仔細跟來看,到底是麼原因:
//發現入口是有亂碼的
368B1204 . 55 push ebp
368B1205 . 8BEC mov ebp, esp
368B1207 . 83C4 F0 add esp, -10
368B120A . 53 push ebx
368B120B . B8 340C8B36 mov eax, 368B0C34
368B1210 . E8 875AF1FF call 367C6C9C
368B1215 .- E9 823DA700 jmp 37324F9C ;這裡跟進去
368B121A 2F das
368B121B 96 xchg eax, esi
368B121C D5 EA aad 0EA
368B121E 5B pop ebx
368B121F 3B9E 9E8BBDD4 cmp ebx, dword ptr [esi+D4BD8B9E]
368B1225 1321 adc esp, dword ptr [ecx]
368B1227 ^ 7F EA jg short 368B1213
368B1229 3D EBECE829 cmp eax, 29E8ECEB
368B122E 52 push edx
368B122F B2 A7 mov dl, 0A7
368B1231 847C1E CB test byte ptr [esi+ebx-35], bh
//最厭惡這樣的殼了,偷代碼了,啟動不了很正常.
//打從破過一次SF花了很多時間和精力後,凡是碰到這樣的殼,一般都會放棄.
//
37324F9C 68 9F4A3237 push 37324A9F
37324FA1 ^ E9 3E07FDFF jmp 372F56E4 ;這樣的方式讓想起了VMP,TMD.
37324FA6 0000 add byte ptr [eax], al
37324FA8 0000 add byte ptr [eax], al
//是不是我記憶有問題,發現越來越像VMP了, T_T
372F56E4 60 pushad
372F56E5 9C pushfd
372F56E6 FC cld
372F56E7 E8 00000000 call 372F56EC
372F56EC 5F pop edi
372F56ED 81EF EC562F37 sub edi, 372F56EC
372F56F3 8BC7 mov eax, edi
372F56F5 81C7 00542F37 add edi, 372F5400
372F56FB 3B47 2C cmp eax, dword ptr [edi+2C]
372F56FE 75 02 jnz short 372F5702
372F5700 EB 36 jmp short 372F5738
//記錄一下
372F8208 872C24 xchg dword ptr [esp], ebp
372F820B 8B2424 mov esp, dword ptr [esp]
372F820E 68 CB3C0000 push 3CCB
372F8213 891C24 mov dword ptr [esp], ebx
372F8216 B3 76 mov bl, 76
372F8218 C0E3 05 shl bl, 5
372F821B 80C3 37 add bl, 37
372F821E ^ 0F8E 53E1FFFF jle 372F6377
//發現了幾次跳轉
372F6379 FEC3 inc bl
372F637B 0F8F 23170000 jg 372F7AA4
372F6381 80E3 7D and bl, 7D
372F6384 0F86 AD550000 jbe 372FB937
372F638A 50 push eax
372F638B E9 4E450000 jmp 372FA8DE
//經過一翻跟後實在沒有耐心了
//煩了,用點快捷的辦法,開始不是PUSHFD PUSHAD嘛,這個都是成對出現的,我們找
//POPAD POPFD
372FA948 BB 30000000 mov ebx, 30 ;F4在這裡碰碰運氣,果真斷下了^_^
372FA94D 01D3 add ebx, edx
372FA94F C703 00000000 mov dword ptr [ebx], 0
372FA955 5B pop ebx
372FA956 61 popad ;在這裡找到了
372FA957 ^ E9 7BDBFFFF jmp 372F84D7
//跳轉後來到這裡
372F84D7 9D popfd ;找到,果真
372F84D8 ^ E9 0CDAFFFF jmp 372F5EE9
372F84DD 80EB DD sub bl, 0DD
372F84E0 ^ E9 24DEFFFF jmp 372F6309
//跳轉後返回了,具體幹嘛了,我也不知道,實在沒心思看了
372F5EE9 C3 retn ;返回了
372F5EEA E9 B1430000 jmp 372FA2A0
//返回後調用這個函數?
367C7024 $- FF25 08648C36 jmp dword ptr [<&kernel32.GetLastErr>; ntdll.RtlGetLastWin32Error
//看來並沒有結束,這樣的是最讓我厭惡的了.
37324A6D 68 CE4B3237 push 37324BCE
37324A72 ^ E9 6D0CFDFF jmp 372F56E4
//看好上面的RETN,就不至於跟丟了.
//不知道是麼函數體被加密了.
//返回後到入口處~!
368B1281 A1 CC978B36 mov eax, dword ptr [368B97CC]
368B1286 8B00 mov eax, dword ptr [eax]
368B1288 E8 1706F7FF call 368218A4
//錯誤我們在這裡找到了
368189A6 8B53 08 mov edx, dword ptr [ebx+8]
368189A9 8BC5 mov eax, ebp
368189AB E8 C005FBFF call 367C8F70
368189B0 85C0 test eax, eax
//正好是這個地方,我們跟進去看看,希望不要太BT
367C8F70 $- E9 8B7068CB jmp 01E50000
367C8F75 98 db 98
367C8F76 5E db 5E ; CHAR '^'
367C8F77 04 db 04
367C8F78 10 db 10
367C8F79 16 db 16
//@_@,不會吧,讓我要把代碼從這亂碼中撿出來???
01E50000 F2: prefix repne:
01E50001 EB 01 jmp short 01E50004
01E50003 F2: prefix repne:
01E50004 56 push esi
01E50005 57 push edi
01E50006 53 push ebx
01E50007 BE 168E4100 mov esi, 418E16
01E5000C 65:EB 01 jmp short 01E50010
01E5000F 9A C1E66681 DEF>call far FEDE:8166E6C1
01E50016 8BC7 mov eax, edi
01E50018 EC in al, dx
01E50019 8DB41D 88BB4200 lea esi, dword ptr [ebp+ebx+42BB88]
01E50020 F2: prefix repne:
//我們把可疑的代碼全部羅略出來看看
01E50004 56 push esi
01E50005 57 push edi
01E50006 53 push ebx
01E50007 BE 168E4100 mov esi, 418E16
01E50010 C1E6 66 shl esi, 66
01E50013 81DE FE8BC7EC sbb esi, ECC78BFE
01E50019 8DB41D 88BB4200 lea esi, dword ptr [ebp+ebx+42BB88]
01E50024 2BF3 sub esi, ebx
01E50026 8D7408 2B lea esi, dword ptr [eax+ecx+2B]
01E5002A 2BF1 sub esi, ecx
01E50034 8D740E D5 lea esi, dword ptr [esi+ecx-2B]
01E50038 2BF1 sub esi, ecx
01E5003A 037C24 38 add edi, dword ptr [esp+38]
01E5003E C1DF CB rcr edi, 0CB
01E50045 BF 524A4900 mov edi, 494A52
01E5004A 83EF 25 sub edi, 25
01E50052 0BFD or edi, ebp
01E50058 8D7C0A 4A lea edi, dword ptr [edx+ecx+4A]
01E5005C 2BF9 sub edi, ecx
01E50063 8D7C1F B6 lea edi, dword ptr [edi+ebx-4A]
01E50067 2BFB sub edi, ebx
01E50069 09C0 or eax, eax
01E5006B 74 03 je short 01E50070
01E5006D 8B40 FC mov eax, dword ptr [eax-4]
01E50070 09D2 or edx, edx
01E50072 74 03 je short 01E50077
01E50074 8B52 FC mov edx, dword ptr [edx-4]
01E5007B 8D4C11 FF lea ecx, dword ptr [ecx+edx-1]
01E5007F 2BCA sub ecx, edx
01E5008A 33CF xor ecx, edi
01E5008C 8D48 1B lea ecx, dword ptr [eax+1B]
01E5008F 83E9 1B sub ecx, 1B
01E50092 39D1 cmp ecx, edx
01E50094 76 02 jbe short 01E50098
01E50096 89D1 mov ecx, edx
01E50098 39C9 cmp ecx, ecx
01E5009A F3:A6 repe cmps byte ptr es:[edi], byte ptr>
01E5009C 74 2A je short 01E500C8
01E5009E 8A5E FF mov bl, byte ptr [esi-1]
01E500A1 80FB 61 cmp bl, 61
01E500A4 72 08 jb short 01E500AE
01E500A6 80FB 7A cmp bl, 7A
01E500A9 77 03 ja short 01E500AE
01E500AB 80EB 20 sub bl, 20
01E500AE 8A7F FF mov bh, byte ptr [edi-1]
01E500B1 80FF 61 cmp bh, 61
01E500B4 72 08 jb short 01E500BE
01E500B6 80FF 7A cmp bh, 7A
01E500B9 77 03 ja short 01E500BE
01E500BB 80EF 20 sub bh, 20
01E500BE 38FB cmp bl, bh
01E500C0 ^ 74 D8 je short 01E5009A
01E500C2 0FB6C3 movzx eax, bl
01E500C5 0FB6D7 movzx edx, bh
01E500C8 29D0 sub eax, edx
01E500CA 5B pop ebx
01E500CB 5F pop edi
01E500CC 5E pop esi
01E500CD C3 retn
//上面一段的二進制代碼
56 57 53 BE 16 8E 41 00 C1 E6 66 81 DE FE 8B C7 EC 8D B4 1D 88 BB 42 00 2B F3 8D 74 08 2B 2B F1
8D 74 0E D5 2B F1 03 7C 24 38 C1 DF CB BF 52 4A 49 00 83 EF 25 0B FD 8D 7C 0A 4A 2B F9 8D 7C 1F
B6 2B FB 09 C0 74 03 8B 40 FC 09 D2 74 03 8B 52 FC 8D 4C 11 FF 2B CA 33 CF 8D 48 1B 83 E9 1B 39
D1 76 02 89 D1 39 C9 F3 A6 74 2A 8A 5E FF 80 FB 61 72 08 80 FB 7A 77 03 80 EB 20 8A 7F FF 80 FF
61 72 08 80 FF 7A 77 03 80 EF 20 38 FB 74 D8 0F B6 C3 0F B6 D7 29 D0 5B 5F 5E C3 C3
//我加了個區段,把代碼給補了進去~!運行正確^_^,有點慣例的做法,不過,最好的辦法就是
//找函數原始位置,補進去,這樣就不用再加區段了,但是這樣方便操作點.
367C8F70 - E9 8B10BD00 jmp 3739A000 ;新加區段的地址
367C8F75 98 db 98
367C8F76 5E db 5E ; CHAR '^'
367C8F77 04 db 04
367C8F78 10 db 10
//
Memory map, 条目 62
地址=3739A000
大小=00010000 (65536.)
属主=dumped_ 367C0000
区段=.mgAdd
类型=Imag 01001002
访问=R
初始访问=RWE
//實際還有好多沒補,到是現在運行起來了^_^.
先就这样了,以后碰到了,慢慢补,这个不一定能把全部偷走的代码一次补全,慢慢来~~!Yeah~~!
看雪傳送門:
http://bbs.pediy.com/showthread.php?p=788693#post788693
//原始程序:
奇迹.part1.rar
(3 MB, 下载次数: 29)
奇迹.part2.rar
(2.14 MB, 下载次数: 18)
//脫殼後程序:
bakdumped_Fix.part1.rar
(3 MB, 下载次数: 11)
bakdumped_Fix.part2.rar
(1.94 MB, 下载次数: 12)
- By Menting
2010.04.09 |
免费评分
-
查看全部评分
|