文件名称:手动脱壳“ASProtect 1.2x - 1.3x”
目标程序:病毒样本
操作环境:Windows XP-SP2
使用工具:Ollydbg 1.10版
编写作者:Coderui
编写时间:2009年01月05日
联系方式:[email protected]
作者博客:http://hi.baidu.com/coderui
---------------------------------------------------------------------------------------------
介绍:
“ASProtect”加密壳是一款商业壳,由于版本和其中的设置众多,所以加壳后的样本总是五花八门,都不好脱。最近准备利用工作之余把“ASProtect”加密壳的所有版本都试着脱一下(从低版本开始),顺便记点笔记以备后期查阅时使用!下文如有表达错误的地方还请多多指正,谢谢!
---------------------------------------------------------------------------------------------
OD设置:(OD设置为不忽略任何异常。[F2]:下软断点、[F4]:执行到当前代码处、[F7]:单步步入、[F8]单步步过、[F9]运行。)
请按照注解顺序观看(00)-(01)-(02)…(99),不然很容易混乱。
; (00) 病毒样本载入后,OD提示错误“不知如何继续,因为内存地址 E072C4B2 不可读. 请尝试更改 EIP 或忽略程序异常.”
; (01) 我们使用[Shift+F9]忽略异常。
10034000 > 68 01500610 PUSH virus.10065001 ; (02) OD停在这里,我们[F9]运行。
10034005 E8 01000000 CALL virus.1003400B
1003400A C3 RETN
1003400B C3 RETN
.
.
.
00D3FF66 0000 ADD BYTE PTR DS:[EAX],AL ; (03) OD停在这里,提示“内存访问”异常。我们使用[Shift+F9]忽略异常,并继续运行。
00D3FF68 E8 33C05A59 CALL 5A2EBFA0
00D3FF6D 59 POP ECX
00D3FF6E 64:8910 MOV DWORD PTR FS:[EAX],EDX
00D3FF71 EB 0F JMP SHORT 00D3FF82
00D3FF73 ^ E9 F02EFCFF JMP 00D02E68
00D3FF78 E8 67FBFFFF CALL 00D3FAE4
00D3FF7D E8 4232FCFF CALL 00D031C4
00D3FF82 E8 05E9FFFF CALL 00D3E88C
00D3FF87 33C0 XOR EAX,EAX
00D3FF89 5A POP EDX
00D3FF8A 59 POP ECX
00D3FF8B 59 POP ECX
00D3FF8C 64:8910 MOV DWORD PTR FS:[EAX],EDX
00D3FF8F 68 A4FFD300 PUSH 0D3FFA4
00D3FF94 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
00D3FF97 E8 5C37FCFF CALL 00D036F8
00D3FF9C C3 RETN
.
.
.
00D3E2BB 90 NOP ; (04) OD停在这里,提示“INT3”异常。我们使用[Shift+F9]忽略异常,并继续运行。
00D3E2BC EB 01 JMP SHORT 00D3E2BF
00D3E2BE 6966 81 FE47467>IMUL ESP,DWORD PTR DS:[ESI-7F],744647FE
00D3E2C5 05 31C040EB ADD EAX,EB40C031
00D3E2CA 0231 ADD DH,BYTE PTR DS:[ECX]
00D3E2CC C031 DB SAL BYTE PTR DS:[ECX],0DB ; 移位常量超出 1..31 的范围
00D3E2CF 64:8F03 POP DWORD PTR FS:[EBX]
00D3E2D2 83C4 04 ADD ESP,4
00D3E2D5 EB 01 JMP SHORT 00D3E2D8
.
.
.
00D3F004 0000 ADD BYTE PTR DS:[EAX],AL ; (05) OD停在这里,提示“内存访问”异常。我们使用[Shift+F9]忽略异常,并继续运行。
00D3F006 E8 33C05A59 CALL 5A2EB03E
00D3F00B 59 POP ECX
00D3F00C 64:8910 MOV DWORD PTR FS:[EAX],EDX
00D3F00F EB 0F JMP SHORT 00D3F020
00D3F011 ^ E9 523EFCFF JMP 00D02E68
00D3F016 E8 A5FEFFFF CALL 00D3EEC0
00D3F01B E8 A441FCFF CALL 00D031C4
00D3F020 A1 9C2BD400 MOV EAX,DWORD PTR DS:[D42B9C]
00D3F025 C600 CF MOV BYTE PTR DS:[EAX],0CF
00D3F028 EB 7E JMP SHORT 00D3F0A8
00D3F02A E8 1D35FCFF CALL 00D0254C
.
.
.
00D3F382 0000 ADD BYTE PTR DS:[EAX],AL ; (06) OD停在这里,提示“内存访问”异常。我们使用[Shift+F9]忽略异常,并继续运行。
00D3F384 E8 33C05A59 CALL 5A2EB3BC
00D3F389 59 POP ECX
00D3F38A 64:8910 MOV DWORD PTR FS:[EAX],EDX
00D3F38D EB 2F JMP SHORT 00D3F3BE
00D3F38F ^ E9 D43AFCFF JMP 00D02E68
00D3F394 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
00D3F397 50 PUSH EAX
00D3F398 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00D3F39B 50 PUSH EAX
00D3F39C A1 242BD400 MOV EAX,DWORD PTR DS:[D42B24]
00D3F3A1 8B00 MOV EAX,DWORD PTR DS:[EAX]
00D3F3A3 E8 B45DFFFF CALL 00D3515C
.
.
.
00D3E2BB 90 NOP ; (07) OD停在这里,提示“INT3”异常。这里是最后一处异常,也是一处反调试的暗桩。这里不能使用[Shift+F9]去忽略异常,那样会使程序退出。这里我们应该单步[F8]直接走过去。
00D3E2BC EB 01 JMP SHORT 00D3E2BF ; (08) 跳。
00D3E2BE 6966 81 FE47467>IMUL ESP,DWORD PTR DS:[ESI-7F],744647FE
00D3E2C5 05 31C040EB ADD EAX,EB40C031
00D3E2CA 0231 ADD DH,BYTE PTR DS:[ECX]
00D3E2CC C031 DB SAL BYTE PTR DS:[ECX],0DB ; 移位常量超出 1..31 的范围
00D3E2CF 64:8F03 POP DWORD PTR FS:[EBX]
00D3E2D2 83C4 04 ADD ESP,4
00D3E2D5 EB 01 JMP SHORT 00D3E2D8
.
.
.
00D3E2BF 66:81FE 4746 CMP SI,4647 ; (09) 跳到这里后,[F8]单步向下走。
00D3E2C4 74 05 JE SHORT 00D3E2CB ; (10) 跳。
00D3E2C6 31C0 XOR EAX,EAX
00D3E2C8 40 INC EAX
00D3E2C9 EB 02 JMP SHORT 00D3E2CD
00D3E2CB 31C0 XOR EAX,EAX ; (11) 跳到这里后,[F8]单步向下走。
00D3E2CD 31DB XOR EBX,EBX
00D3E2CF 64:8F03 POP DWORD PTR FS:[EBX]
00D3E2D2 83C4 04 ADD ESP,4
00D3E2D5 EB 01 JMP SHORT 00D3E2D8 ; (12) 跳。
.
.
.
00D3E2D8 5F POP EDI ; (13) 跳到这里后,[F8]单步向下走。
00D3E2D9 5E POP ESI
00D3E2DA 5B POP EBX
00D3E2DB C3 RETN ; (14) 返回。
.
.
.
00D3E48C 84C0 TEST AL,AL ; (15) 返回到这里,[F8]单步向下走。
00D3E48E 74 1B JE SHORT 00D3E4AB
00D3E490 45 INC EBP
00D3E491 EB 18 JMP SHORT 00D3E4AB
00D3E493 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]
00D3E496 8A00 MOV AL,BYTE PTR DS:[EAX]
00D3E498 84C0 TEST AL,AL
00D3E49A 74 04 JE SHORT 00D3E4A0
00D3E49C 3C 02 CMP AL,2
00D3E49E 75 0B JNZ SHORT 00D3E4AB
00D3E4A0 8B5D F4 MOV EBX,DWORD PTR SS:[EBP-C]
00D3E4A3 FF53 FC CALL DWORD PTR DS:[EBX-4]
00D3E4A6 84C0 TEST AL,AL
00D3E4A8 74 01 JE SHORT 00D3E4AB
00D3E4AA 45 INC EBP
00D3E4AB 33C0 XOR EAX,EAX
00D3E4AD 5A POP EDX
00D3E4AE 59 POP ECX
00D3E4AF 59 POP ECX
00D3E4B0 64:8910 MOV DWORD PTR FS:[EAX],EDX
00D3E4B3 EB 2E JMP SHORT 00D3E4E3
00D3E4B5 ^ E9 AE49FCFF JMP 00D02E68
00D3E4BA 8D55 EC LEA EDX,DWORD PTR SS:[EBP-14]
00D3E4BD 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00D3E4C0 E8 E78BFCFF CALL 00D070AC
00D3E4C5 8B4D EC MOV ECX,DWORD PTR SS:[EBP-14]
00D3E4C8 8D45 F0 LEA EAX,DWORD PTR SS:[EBP-10]
00D3E4CB BA 28E5D300 MOV EDX,0D3E528 ; ASCII "90_"
00D3E4D0 E8 CB54FCFF CALL 00D039A0
00D3E4D5 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
00D3E4D8 50 PUSH EAX
00D3E4D9 E8 F277FDFF CALL 00D15CD0
00D3E4DE E8 E14CFCFF CALL 00D031C4
00D3E4E3 FF45 FC INC DWORD PTR SS:[EBP-4]
00D3E4E6 8345 F4 08 ADD DWORD PTR SS:[EBP-C],8
00D3E4EA 837D FC 05 CMP DWORD PTR SS:[EBP-4],5
00D3E4EE ^ 0F85 71FFFFFF JNZ 00D3E465 ; (16) 这里是循环,可以不去重复跟。
00D3E4F4 33C0 XOR EAX,EAX ; (17) 直接[F4]执行到这里。
00D3E4F6 5A POP EDX
00D3E4F7 59 POP ECX
00D3E4F8 59 POP ECX
00D3E4F9 64:8910 MOV DWORD PTR FS:[EAX],EDX
00D3E4FC 68 16E5D300 PUSH 0D3E516
00D3E501 8D45 EC LEA EAX,DWORD PTR SS:[EBP-14]
00D3E504 BA 02000000 MOV EDX,2
00D3E509 E8 0E52FCFF CALL 00D0371C
00D3E50E C3 RETN ; (18) 返回。
.
.
.
00D3E516 5F POP EDI ; (19) 返回到这里,[F8]单步向下走。
00D3E517 5E POP ESI
00D3E518 5B POP EBX
00D3E519 8BE5 MOV ESP,EBP
00D3E51B 5D POP EBP
00D3E51C C3 RETN ; (20) 返回。
.
.
.
00D401AB E8 CCF6FFFF CALL 00D3F87C ; (21) 返回到这里,[F8]单步向下走。
00D401B0 A3 88B6D400 MOV DWORD PTR DS:[D4B688],EAX
00D401B5 E8 8EABFFFF CALL 00D3AD48
00D401BA E8 D55CFEFF CALL 00D25E94
00D401BF 59 POP ECX
00D401C0 5A POP EDX
00D401C1 5B POP EBX
00D401C2 C3 RETN ; (22) 返回。
.
.
.
00D0ED08 68 1F8724DD PUSH DD24871F ; (23) 返回到这里,[F8]单步向下走。
00D0ED0D 68 2C2A0000 PUSH 2A2C
00D0ED12 68 900A0200 PUSH 20A90
00D0ED17 68 C0200000 PUSH 20C0
00D0ED1C 68 44CC0000 PUSH 0CC44
00D0ED21 68 00F00400 PUSH 4F000
00D0ED26 FF35 D434D400 PUSH DWORD PTR DS:[D434D4]
00D0ED2C E8 23D1FFFF CALL 00D0BE54
00D0ED31 310424 XOR DWORD PTR SS:[ESP],EAX
00D0ED34 8B05 D434D400 MOV EAX,DWORD PTR DS:[D434D4]
00D0ED3A 010424 ADD DWORD PTR SS:[ESP],EAX
00D0ED3D C3 RETN ; (24) 返回。
00D0ED3E C3 RETN
.
.
.
00D401D8 68 E1288508 PUSH 88528E1 ; (25) 返回到这里,[F8]单步向下走。
00D401DD 68 E0020000 PUSH 2E0
00D401E2 68 04590100 PUSH 15904
00D401E7 68 C4170000 PUSH 17C4
00D401EC 68 10EA0300 PUSH 3EA10
00D401F1 68 00F00400 PUSH 4F000
00D401F6 FF35 D434D400 PUSH DWORD PTR DS:[D434D4]
00D401FC E8 01000000 CALL 00D40202 ; (26) 这个CALL要[F7]单步步入。
00D40201 8183 C404E84A B>ADD DWORD PTR DS:[EBX+4AE804C4],E8FFFCBC
00D4020B 0100 ADD DWORD PTR DS:[EAX],EAX
00D4020D 0000 ADD BYTE PTR DS:[EAX],AL
00D4020F 8183 C4043104 2>ADD DWORD PTR DS:[EBX+43104C4],1E824
00D40219 0000 ADD BYTE PTR DS:[EAX],AL
00D4021B 68 83C4048B PUSH 8B04C483
00D40220 05 D434D400 ADD EAX,0D434D4
00D40225 E8 02000000 CALL 00D4022C
00D4022A E8 6883C404 CALL 05988597
00D4022F 010424 ADD DWORD PTR SS:[ESP],EAX
00D40232 C3 RETN
00D40233 C3 RETN
.
.
.
00D40202 83C4 04 ADD ESP,4 ; (27) 步入后来到这里。[F8]单步向下走。
00D40205 E8 4ABCFCFF CALL 00D0BE54 ; (28) [F8]单步步过。
00D4020A E8 01000000 CALL 00D40210 ; (29) 这个CALL要[F7]单步步入。
00D4020F 8183 C4043104 2>ADD DWORD PTR DS:[EBX+43104C4],1E824
00D40219 0000 ADD BYTE PTR DS:[EAX],AL
00D4021B 68 83C4048B PUSH 8B04C483
00D40220 05 D434D400 ADD EAX,0D434D4
00D40225 E8 02000000 CALL 00D4022C
00D4022A E8 6883C404 CALL 05988597
00D4022F 010424 ADD DWORD PTR SS:[ESP],EAX
00D40232 C3 RETN
00D40233 C3 RETN
.
.
.
00D40210 83C4 04 ADD ESP,4 ; (30) 步入后来到这里。[F8]单步向下走。
00D40213 310424 XOR DWORD PTR SS:[ESP],EAX
00D40216 E8 01000000 CALL 00D4021C ; (31) 这个CALL要[F7]单步步入。
00D4021B 68 83C4048B PUSH 8B04C483
00D40220 05 D434D400 ADD EAX,0D434D4
00D40225 E8 02000000 CALL 00D4022C
00D4022A E8 6883C404 CALL 05988597
00D4022F 010424 ADD DWORD PTR SS:[ESP],EAX
00D40232 C3 RETN
.
.
.
00D4021C 83C4 04 ADD ESP,4 ; (32) 步入后来到这里。[F8]单步向下走。
00D4021F 8B05 D434D400 MOV EAX,DWORD PTR DS:[D434D4]
00D40225 E8 02000000 CALL 00D4022C ; (33) 这个CALL要[F7]单步步入。
00D4022A E8 6883C404 CALL 05988597
00D4022F 010424 ADD DWORD PTR SS:[ESP],EAX
00D40232 C3 RETN
00D40233 C3 RETN
.
.
.
00D4022C 83C4 04 ADD ESP,4 ; (34) 步入后来到这里。[F8]单步向下走。
00D4022F 010424 ADD DWORD PTR SS:[ESP],EAX
00D40232 C3 RETN ; (35) 返回。
00D40233 C3 RETN
.
.
.
00D3FADC E8 E7FEFFFF CALL 00D3F9C8 ; (36) 返回到这里。这个CALL要[F7]单步步入。
00D3FAE1 C3 RETN
.
.
.
00D3F9C8 53 PUSH EBX ; (37) 步入后来到这里。[F8]单步向下走。
00D3F9C9 56 PUSH ESI
00D3F9CA 57 PUSH EDI
00D3F9CB 83C4 DC ADD ESP,-24
00D3F9CE A1 9C2BD400 MOV EAX,DWORD PTR DS:[D42B9C]
00D3F9D3 C600 DF MOV BYTE PTR DS:[EAX],0DF
00D3F9D6 A1 50B6D400 MOV EAX,DWORD PTR DS:[D4B650]
00D3F9DB 894424 14 MOV DWORD PTR SS:[ESP+14],EAX
00D3F9DF B8 34E8D300 MOV EAX,0D3E834
00D3F9E4 894424 18 MOV DWORD PTR SS:[ESP+18],EAX
00D3F9E8 BA C8F9D300 MOV EDX,0D3F9C8
00D3F9ED 2BD0 SUB EDX,EAX
00D3F9EF 895424 1C MOV DWORD PTR SS:[ESP+1C],EDX
00D3F9F3 B8 40E6D300 MOV EAX,0D3E640
00D3F9F8 8B15 F02BD400 MOV EDX,DWORD PTR DS:[D42BF0]
00D3F9FE 8B12 MOV EDX,DWORD PTR DS:[EDX]
00D3FA00 2B02 SUB EAX,DWORD PTR DS:[EDX]
00D3FA02 894424 20 MOV DWORD PTR SS:[ESP+20],EAX
00D3FA06 EB 06 JMP SHORT 00D3FA0E
00D3FA08 FF25 C3EB01E8 JMP DWORD PTR DS:[E801EBC3]
00D3FA0E 68 A7E8D300 PUSH 0D3E8A7
00D3FA13 58 POP EAX
00D3FA14 40 INC EAX
00D3FA15 68 1DFAD300 PUSH 0D3FA1D
00D3FA1A 50 PUSH EAX
00D3FA1B ^ EB ED JMP SHORT 00D3FA0A ; (38) 跳。