【文章标题】: “超级奇怪的未知壳”脱壳笔记
【文章作者】: csjwaman
【下载地址】: http://bbs.pediy.com/showthread.php?s=&threadid=30232
【加壳方式】: q3说估计是坛子里某位兄弟自己的私家壳
【使用工具】: OD/PELord/ImportREC
【操作平台】: win2k
【作者声明】: 本来想等原帖楼主chinadev的教程的,等了等没见发帖。我就先发了。请chinadev不要见怪。
--------------------------------------------------------------------------------
【详细过程】
OD载入程序,忽略所有异常,运行后异常:
004DE8EC 61 POPAD
004DE8ED A1 DBA6F0FE MOV EAX,DWORD PTR DS:[FEF0A6DB]///这里异常后退出。
004DE8F2 61 POPAD
004DE8F3 72 67 JB SHORT 004DE95C ; sm.004DE95C
004DE8F5 C2 01DB RETN 0DB01
004DE8F8 CB RETF ; 远距返回
004DE8F9 D5 BC AAD 0BC
004DE8FB D5 BF AAD 0BF
004DE8FD F2: PREFIX REPNE: ; 多余的前缀
004DE8FE 1C BD SBB AL,0BD
004DE900 E0 2A LOOPDNE SHORT 004DE92C ; sm.004DE92C
堆栈:
0012FFC0 004DE730 返回到 sm.004DE730 来自 sm.004DEABB
稍微看一下就可以发现上方面这些代码是被加密过的。到返回处看看:
004DE6FC 2A26 SUB AH,BYTE PTR DS:[ESI]
004DE6FE 25 244000E8 AND EAX,E8004024
004DE703 01E9 ADD ECX,EBP
004DE705 5E POP ESI
004DE706 83EE 05 SUB ESI,5
004DE709 81EE 641B4000 SUB ESI,401B64
004DE70F 81C6 791D4000 ADD ESI,401D79
004DE715 B9 1E000000 MOV ECX,1E
004DE71A EB 0A JMP SHORT 004DE726 ; sm.004DE726
004DE71C 8136 25342A37 XOR DWORD PTR DS:[ESI],372A3425 ///这个xor会不会就是加密用的?
004DE722 49 DEC ECX
004DE723 83C6 04 ADD ESI,4
004DE726 83F9 00 CMP ECX,0
004DE729 ^ 77 F1 JA SHORT 004DE71C ; sm.004DE71C
004DE72B E8 8B030000 CALL 004DEABB ///进入这个CALL看看
004DE730 E8 00000000 CALL 004DE735 ///返回地址。
004DE735 58 POP EAX
004DE736 2D A21B4000 SUB EAX,401BA2
004DE73B 8D80 55194000 LEA EAX,DWORD PTR DS:[EAX+401955]
004DE741 2D E8040000 SUB EAX,4E8
004DE746 C3 RETN
进入 CALL 004DEABB后:
004DEABB 55 PUSH EBP
004DEABC 8BEC MOV EBP,ESP
004DEABE 83C4 E8 ADD ESP,-18
004DEAC1 56 PUSH ESI
004DEAC2 53 PUSH EBX
004DEAC3 E8 68FCFFFF CALL 004DE730 ; sm.004DE730
004DEAC8 8BD8 MOV EBX,EAX
004DEACA 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX
004DEACD 2B98 D4000000 SUB EBX,DWORD PTR DS:[EAX+D4]
004DEAD3 895D FC MOV DWORD PTR SS:[EBP-4],EBX
004DEAD6 E8 AE110000 CALL 004DFC89 ; sm.004DFC89
004DEADB 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004DEADE 0340 3C ADD EAX,DWORD PTR DS:[EAX+3C]
004DEAE1 0FB750 06 MOVZX EDX,WORD PTR DS:[EAX+6]
004DEAE5 8955 F4 MOV DWORD PTR SS:[EBP-C],EDX
004DEAE8 E8 C0010000 CALL 004DECAD ; sm.004DECAD
004DEAED 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004DEAF0 0340 3C ADD EAX,DWORD PTR DS:[EAX+3C]
004DEAF3 52 PUSH EDX
004DEAF4 8BD0 MOV EDX,EAX
004DEAF6 51 PUSH ECX
004DEAF7 33C9 XOR ECX,ECX
004DEAF9 66:8B4A 14 MOV CX,WORD PTR DS:[EDX+14]
004DEAFD 83C0 04 ADD EAX,4
004DEB00 83C0 14 ADD EAX,14
004DEB03 03C1 ADD EAX,ECX
004DEB05 59 POP ECX
004DEB06 5A POP EDX
004DEB07 8BD8 MOV EBX,EAX
004DEB09 EB 4B JMP SHORT 004DEB56 ; sm.004DEB56
004DEB0B 8B73 0C MOV ESI,DWORD PTR DS:[EBX+C]
004DEB0E 0375 FC ADD ESI,DWORD PTR SS:[EBP-4]
004DEB11 8975 F0 MOV DWORD PTR SS:[EBP-10],ESI
004DEB14 53 PUSH EBX
004DEB15 813E 212A7E26 CMP DWORD PTR DS:[ESI],267E2A21
004DEB1B 75 32 JNZ SHORT 004DEB4F ; sm.004DEB4F
004DEB1D 8B43 10 MOV EAX,DWORD PTR DS:[EBX+10]
004DEB20 8945 E8 MOV DWORD PTR SS:[EBP-18],EAX
004DEB23 FF75 E8 PUSH DWORD PTR SS:[EBP-18]
004DEB26 E8 AF0B0000 CALL 004DF6DA ; sm.004DF6DA
004DEB2B 8945 EC MOV DWORD PTR SS:[EBP-14],EAX
004DEB2E FF75 E8 PUSH DWORD PTR SS:[EBP-18]
004DEB31 FF75 F0 PUSH DWORD PTR SS:[EBP-10]
004DEB34 FF75 EC PUSH DWORD PTR SS:[EBP-14]
004DEB37 E8 DB0C0000 CALL 004DF817 ; sm.004DF817
004DEB3C FF75 F0 PUSH DWORD PTR SS:[EBP-10]
004DEB3F FF75 EC PUSH DWORD PTR SS:[EBP-14]
004DEB42 E8 D8140000 CALL 004E001F ; sm.004E001F
004DEB47 FF75 EC PUSH DWORD PTR SS:[EBP-14]
004DEB4A E8 290C0000 CALL 004DF778 ; sm.004DF778
004DEB4F 5B POP EBX
004DEB50 83C3 28 ADD EBX,28
004DEB53 FF4D F4 DEC DWORD PTR SS:[EBP-C]
004DEB56 837D F4 00 CMP DWORD PTR SS:[EBP-C],0
004DEB5A ^ 77 AF JA SHORT 004DEB0B ; sm.004DEB0B
004DEB5C 8B5D F8 MOV EBX,DWORD PTR SS:[EBP-8]
004DEB5F 833B 00 CMP DWORD PTR DS:[EBX],0
004DEB62 74 09 JE SHORT 004DEB6D ; sm.004DEB6D
004DEB64 6A 22 PUSH 22
004DEB66 6A 64 PUSH 64
004DEB68 E8 600E0000 CALL 004DF9CD ; sm.004DF9CD
004DEB6D 6A 11 PUSH 11
004DEB6F E8 2E0D0000 CALL 004DF8A2 ///这个是解密下一行代码的。
004DEB74 E8 73FDFFFF CALL 004DE8EC ///这里就是那个异常CALL。
004DEB79 6A 00 PUSH 0
004DEB7B 6A 11 PUSH 11
004DEB7D E8 9F0D0000 CALL 004DF921 ; sm.004DF921
004DEB82 5B POP EBX
004DEB83 5E POP ESI
004DEB84 E8 02000000 CALL 004DEB8B ; sm.004DEB8B
004DEB89 C9 LEAVE
004DEB8A C3 RETN
重新载入程序,不忽略所有异常,运行程序,第一个异常时搜索全部命令XOR DWORD PTR DS:[ESI],372A3425
共搜索到6处,全部下断。然后shift+f9通过异常,直到在XOR DWORD PTR DS:[ESI],372A3425处断下。
第一次断下:
004DE70F 81C6 791D4000 ADD ESI,401D79
004DE715 B9 1E000000 MOV ECX,1E
004DE71A EB 0A JMP SHORT 004DE726
004DE71C 8136 25342A37 XOR DWORD PTR DS:[ESI],372A3425///断下。ESI=4DE90C
004DE722 49 DEC ECX
004DE723 83C6 04 ADD ESI,4
004DE726 83F9 00 CMP ECX,0
004DE729 ^ 77 F1 JA SHORT 004DE71C ///循环
004DE72B E8 8B030000 CALL 004DEABB ; sm.004DEABB
004DE730 E8 00000000 CALL 004DE735 ; sm.004DE735
004DE735 58 POP EAX
到4DE90C处看看:
004DE8EC 55 PUSH EBP
004DE8ED 8BEC MOV EBP,ESP
004DE8EF 83C4 D4 ADD ESP,-2C
004DE8F2 56 PUSH ESI
004DE8F3 57 PUSH EDI
004DE8F4 53 PUSH EBX
004DE8F5 E8 36FEFFFF CALL 004DE730 ; sm.004DE730
004DE8FA 8BF0 MOV ESI,EAX
004DE8FC 8BD8 MOV EBX,EAX
004DE8FE 2B98 D4000000 SUB EBX,DWORD PTR DS:[EAX+D4]
004DE904 895D F0 MOV DWORD PTR SS:[EBP-10],EBX
004DE907 8DBE 08030000 LEA EDI,DWORD PTR DS:[ESI+308]///原来是有意修改代码,使代码不能正常运行。
004DE90D C745 DC 0000000>MOV DWORD PTR SS:[EBP-24],0
004DE914 E9 80010000 JMP 004DEA99 ; sm.004DEA99
004DE919 8B17 MOV EDX,DWORD PTR DS:[EDI]
004DE91B 0BD2 OR EDX,EDX
上面循环结束后,代码:
004DE8EC 55 PUSH EBP
004DE8ED 8BEC MOV EBP,ESP
004DE8EF 83C4 D4 ADD ESP,-2C
004DE8F2 56 PUSH ESI
004DE8F3 57 PUSH EDI
004DE8F4 53 PUSH EBX
004DE8F5 E8 36FEFFFF CALL 004DE730 ; sm.004DE730
004DE8FA 8BF0 MOV ESI,EAX
004DE8FC 8BD8 MOV EBX,EAX
004DE8FE 2B98 D4000000 SUB EBX,DWORD PTR DS:[EAX+D4]
004DE904 895D F0 MOV DWORD PTR SS:[EBP-10],EBX
004DE907 8DBE 08030025 LEA EDI,DWORD PTR DS:[ESI+25000308]///被修改了,执行这里时程序出错。
004DE90D F3:6F REP OUTS DX,DWORD PTR ES:[EDI] ; I/O 命令
004DE90F EB 25 JMP SHORT 004DE936 ; sm.004DE936
004DE911 34 2A XOR AL,2A
004DE913 37 AAA
004DE914 CC INT3
004DE915 B4 2B MOV AH,2B
004DE917 37 AAA
004DE918 25 BF3D3CF7 AND EAX,F73C3DBF
004DE91D 41 INC ECX
004DE91E 29BC72 3C2962D5 SUB DWORD PTR DS:[EDX+ESI*2+D562293C],ED>
可见XOR DWORD PTR DS:[ESI],372A3425是有意修改代码,使代码不能正常执行。NOP掉!
第二次断下:
004DF1B1 81C6 591D4000 ADD ESI,401D59
004DF1B7 B9 1E000000 MOV ECX,1E
004DF1BC EB 0A JMP SHORT 004DF1C8 ; sm.004DF1C8
004DF1BE 8136 25342A37 XOR DWORD PTR DS:[ESI],372A3425///断下。ESI=4DE8E3
004DF1C4 49 DEC ECX
004DF1C5 83C6 04 ADD ESI,4
004DF1C8 83F9 00 CMP ECX,0
004DF1CB ^ 77 F1 JA SHORT 004DF1BE ; sm.004DF1BE
004DF1CD EB 6B JMP SHORT 004DF23A ; sm.004DF23A
004DF1CF 83F8 6E CMP EAX,6E
004DF1D2 75 30 JNZ SHORT 004DF204 ; sm.004DF204
上面循环后,代码:
004DE8EC 61 POPAD///被修改。
004DE8ED A1 DBA6F0FE MOV EAX,DWORD PTR DS:[FEF0A6DB]///这里异常。
004DE8F2 61 POPAD
004DE8F3 72 67 JB SHORT 004DE95C ; sm.004DE95C
004DE8F5 C2 01DB RETN 0DB01
004DE8F8 CB RETF ; 远距返回
004DE8F9 D5 BC AAD 0BC
004DE8FB D5 BF AAD 0BF
004DE8FD F2: PREFIX REPNE: ; 多余的前缀
同样NOP掉!
然后在4DE8EC处下断,断下后往下找到:
004DEA96 83C7 0C ADD EDI,0C
004DEA99 833F 00 CMP DWORD PTR DS:[EDI],0
004DEA9C ^ 0F85 77FEFFFF JNZ 004DE919 ; sm.004DE919
004DEAA2 837F 04 00 CMP DWORD PTR DS:[EDI+4],0
004DEAA6 ^ 0F85 6DFEFFFF JNZ 004DE919 ; sm.004DE919
004DEAAC 837F 08 00 CMP DWORD PTR DS:[EDI+8],0
004DEAB0 ^ 0F85 63FEFFFF JNZ 004DE919 ; sm.004DE919
004DEAB6 5B POP EBX
004DEAB7 5F POP EDI
004DEAB8 5E POP ESI
004DEAB9 C9 LEAVE
004DEABA C3 RETN///找到这里,F4下来。
004DEABB 55 PUSH EBP
返回到:
004DEB6D 6A 11 PUSH 11
004DEB6F E8 2E0D0000 CALL 004DF8A2 ; sm.004DF8A2
004DEB74 E8 73FDFFFF CALL 004DE8EC///此CALL顺利通过。
004DEB79 6A 00 PUSH 0///返回到这里。
004DEB7B 6A 11 PUSH 11
004DEB7D E8 9F0D0000 CALL 004DF921///重新加密CALL 004DE8EC
004DEB82 5B POP EBX
004DEB83 5E POP ESI
004DEB84 E8 02000000 CALL 004DEB8B///F7
004DEB89 C9 LEAVE
004DEB8A C3 RETN
004DEB8B 55 PUSH EBP
004DEB8C 8BEC MOV EBP,ESP
004DEB8E 83C4 E4 ADD ESP,-1C
004DEB91 56 PUSH ESI
004DEB92 E8 99FBFFFF CALL 004DE730 ; sm.004DE730
004DEB97 8BF0 MOV ESI,EAX
004DEB99 8BD0 MOV EDX,EAX
004DEB9B 2B90 D4000000 SUB EDX,DWORD PTR DS:[EAX+D4]
004DEBA1 8955 F8 MOV DWORD PTR SS:[EBP-8],EDX
004DEBA4 8B90 E4040000 MOV EDX,DWORD PTR DS:[EAX+4E4]
004DEBAA 52 PUSH EDX
004DEBAB E8 7F0A0000 CALL 004DF62F ; sm.004DF62F
004DEBB0 5A POP EDX
004DEBB1 2BC2 SUB EAX,EDX
004DEBB3 C1E8 0C SHR EAX,0C
004DEBB6 0AC0 OR AL,AL
004DEBB8 74 05 JE SHORT 004DEBBF ; sm.004DEBBF
004DEBBA 8845 E7 MOV BYTE PTR SS:[EBP-19],AL
004DEBBD EB 19 JMP SHORT 004DEBD8 ; sm.004DEBD8
004DEBBF B9 03000000 MOV ECX,3
004DEBC4 C1E8 07 SHR EAX,7
004DEBC7 49 DEC ECX
004DEBC8 0AC0 OR AL,AL
004DEBCA 74 05 JE SHORT 004DEBD1 ; sm.004DEBD1
004DEBCC 8845 E7 MOV BYTE PTR SS:[EBP-19],AL
004DEBCF EB 07 JMP SHORT 004DEBD8 ; sm.004DEBD8
004DEBD1 83F9 00 CMP ECX,0
004DEBD4 76 02 JBE SHORT 004DEBD8 ; sm.004DEBD8
004DEBD6 ^ EB EC JMP SHORT 004DEBC4 ; sm.004DEBC4
004DEBD8 E8 FF060000 CALL 004DF2DC ; sm.004DF2DC
004DEBDD 8946 4C MOV DWORD PTR DS:[ESI+4C],EAX
004DEBE0 8B96 D0000000 MOV EDX,DWORD PTR DS:[ESI+D0]
004DEBE6 8955 FC MOV DWORD PTR SS:[EBP-4],EDX
004DEBE9 8975 F4 MOV DWORD PTR SS:[EBP-C],ESI
004DEBEC 5E POP ESI
004DEBED E8 3D0A0000 CALL 004DF62F ; sm.004DF62F
004DEBF2 83E0 03 AND EAX,3
004DEBF5 8BD0 MOV EDX,EAX
004DEBF7 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]
004DEBFA 0BD2 OR EDX,EDX
004DEBFC 75 08 JNZ SHORT 004DEC06 ; sm.004DEC06
004DEBFE 8D80 DC000000 LEA EAX,DWORD PTR DS:[EAX+DC]
004DEC04 EB 1A JMP SHORT 004DEC20 ; sm.004DEC20
004DEC06 83FA 01 CMP EDX,1
004DEC09 75 08 JNZ SHORT 004DEC13 ; sm.004DEC13
004DEC0B 8D80 F4020000 LEA EAX,DWORD PTR DS:[EAX+2F4]
004DEC11 EB 0D JMP SHORT 004DEC20 ; sm.004DEC20
004DEC13 83FA 02 CMP EDX,2
004DEC16 75 05 JNZ SHORT 004DEC1D ; sm.004DEC1D
004DEC18 8D40 58 LEA EAX,DWORD PTR DS:[EAX+58]
004DEC1B EB 03 JMP SHORT 004DEC20 ; sm.004DEC20
004DEC1D 8D40 18 LEA EAX,DWORD PTR DS:[EAX+18]
004DEC20 FF70 10 PUSH DWORD PTR DS:[EAX+10]
004DEC23 8F45 18 POP DWORD PTR SS:[EBP+18]
004DEC26 FF70 0C PUSH DWORD PTR DS:[EAX+C]
004DEC29 8F45 14 POP DWORD PTR SS:[EBP+14]
004DEC2C FF70 08 PUSH DWORD PTR DS:[EAX+8]
004DEC2F 8F45 10 POP DWORD PTR SS:[EBP+10]
004DEC32 FF70 04 PUSH DWORD PTR DS:[EAX+4]
004DEC35 8F45 0C POP DWORD PTR SS:[EBP+C]
004DEC38 FF30 PUSH DWORD PTR DS:[EAX]
004DEC3A 8F45 08 POP DWORD PTR SS:[EBP+8]
004DEC3D 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
004DEC40 0345 FC ADD EAX,DWORD PTR SS:[EBP-4]///EAX=4A9ED8 这就是OEP!
004DEC43 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
004DEC46 68 00020000 PUSH 200
004DEC4B E8 8A0A0000 CALL 004DF6DA ; sm.004DF6DA
004DEC50 8945 F0 MOV DWORD PTR SS:[EBP-10],EAX///EAX=12f000 程序将入口代码放到12f000处执行。只要将EAX的值改为4A9ED8,就可以把移走的代码放回原处。
004DEC53 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]
004DEC56 8D90 F0000000 LEA EDX,DWORD PTR DS:[EAX+F0]
004DEC5C 8955 EC MOV DWORD PTR SS:[EBP-14],EDX
004DEC5F 8B90 F0020000 MOV EDX,DWORD PTR DS:[EAX+2F0]///[EAX+2F0]处保存着stolen code的长度,这里是0xB个字节。
004DEC65 8955 E8 MOV DWORD PTR SS:[EBP-18],EDX
004DEC68 837D E8 00 CMP DWORD PTR SS:[EBP-18],0
004DEC6C 75 05 JNZ SHORT 004DEC73 ; sm.004DEC73
004DEC6E 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004DEC71 EB 35 JMP SHORT 004DECA8 ; sm.004DECA8
004DEC73 FF75 E8 PUSH DWORD PTR SS:[EBP-18]
004DEC76 FF75 EC PUSH DWORD PTR SS:[EBP-14]
004DEC79 FF75 F0 PUSH DWORD PTR SS:[EBP-10]
004DEC7C E8 960B0000 CALL 004DF817 ; sm.004DF817
004DEC81 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
004DEC84 0345 E8 ADD EAX,DWORD PTR SS:[EBP-18]
004DEC87 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
004DEC8A 0355 E8 ADD EDX,DWORD PTR SS:[EBP-18]
004DEC8D B1 3D MOV CL,3D
004DEC8F 80F1 55 XOR CL,55
004DEC92 024D E7 ADD CL,BYTE PTR SS:[EBP-19]
004DEC95 8808 MOV BYTE PTR DS:[EAX],CL///修改4A9ED8+b处的代码,nop掉!
004DEC97 8950 01 MOV DWORD PTR DS:[EAX+1],EDX///修改4A9ED8+b+1处的代码,nop掉!
004DEC9A B1 B4 MOV CL,0B4
004DEC9C 80F1 77 XOR CL,77
004DEC9F 2A4D E7 SUB CL,BYTE PTR SS:[EBP-19]
004DECA2 8848 05 MOV BYTE PTR DS:[EAX+5],CL///修改4A9ED8+b+1+5处的代码,nop掉!
004DECA5 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
004DECA8 8945 04 MOV DWORD PTR SS:[EBP+4],EAX
004DECAB C9 LEAVE
004DECAC C3 RETN///返回OEP!
返回后:
004A9ED8 55 PUSH EBP///OEP!DUMP下来。
004A9ED9 8BEC MOV EBP,ESP
004A9EDB 83C4 F0 ADD ESP,-10
004A9EDE B8 809A4A00 MOV EAX,4A9A80
004A9EE3 E8 BCC2F5FF CALL 004061A4 ; sm.004061A4
004A9EE8 A1 04C54A00 MOV EAX,DWORD PTR DS:[4AC504]
004A9EED 8B00 MOV EAX,DWORD PTR DS:[EAX]
004A9EEF E8 30FEFCFF CALL 00479D24 ; sm.00479D24
004A9EF4 8B0D F4C54A00 MOV ECX,DWORD PTR DS:[4AC5F4] ; sm.004B1D34
004A9EFA A1 04C54A00 MOV EAX,DWORD PTR DS:[4AC504]
004A9EFF 8B00 MOV EAX,DWORD PTR DS:[EAX]
004A9F01 8B15 10504A00 MOV EDX,DWORD PTR DS:[4A5010] ; sm.004A505C
004A9F07 E8 30FEFCFF CALL 00479D3C ; sm.00479D3C
004A9F0C 8B0D C8C54A00 MOV ECX,DWORD PTR DS:[4AC5C8] ; sm.004AFD1C
这时用ImportREC修复IAT,用追踪1就可以全部找回。
--------------------------------------------------------------------------------
【经验总结】
无。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2006年08月09日 16:58:53
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课