-
-
[旧帖] [原创]ACprotect的脱壳[申请邀请码] 0.00雪花
-
发表于: 2009-9-19 14:54 1549
-
上次写了脱UPX压缩壳的一篇文章,有朋友说太过浅显了,一想也是,于是就有了这篇文章!
废话不多说,切入正题吧,Let’s go。
还是老方法,用PEID查一下壳:
UltraProtect 1.x -> RISCO Software Inc.,看来不怎么准确,那就用FI试一下吧,发现是1.41版本的.
是骡子是马,拉出来溜溜,直接OD载入,对于Ac保护壳,进行脱壳前,要先对OD设置一下,选项-调试设置-异常中,忽略除了内存访问之外的所有异常,而且最重要的就是找到VM.然后F9运行,程序会中断在下面异常上:
00415719 |. CD 01 INT 1
0041571B |. 40 INC EAX
0041571C |. 40 INC EAX
0041571D |. 0BC0 OR EAX,EAX
0041571F |. 75 05 JNZ SHORT UltraPro.00415726
00415721 |. 90 NOP
00415722 |. 90 NOP
00415723 |. 90 NOP
00415724 |. 90 NOP
00415725 |. 61 POPAD
堆栈窗口如下:
0012FF58 0012FFE0 指向下一个 SEH 记录的指针
0012FF5C 004156FD SE处理程序
0012FF60 01EAFFCD
0012FF64 3CC83AC5
在第二段代码 0012FF5C 004156FD SE处理程序 下内存访问断点,然后shift f9运行,程序停在下列代码上:
004156FD . 8B5C24 0C MOV EBX,DWORD PTR SS:[ESP+C]
00415701 . 8383 B8000000>ADD DWORD PTR DS:[EBX+B8],2
00415708 . 33C0 XOR EAX,EAX
0041570A . C3 RETN
0041570B /$ 64:67:FF36 00>PUSH DWORD PTR FS:[0]
00415711 |. 64:67:8926 00>MOV DWORD PTR FS:[0],ESP
00415717 |. 33C0 XOR EAX,EAX
在004156FD上下IN3断点,然后shift f9运行
0041574D |. 8B048E |MOV EAX,DWORD PTR DS:[ESI+ECX*4]
00415750 |. 8B5C8E 04 |MOV EBX,DWORD PTR DS:[ESI+ECX*4+4]
00415754 |. 33C3 |XOR EAX,EBX
00415756 |. C1C8 10 |ROR EAX,10
00415759 |. 33C2 |XOR EAX,EDX
0041575B |. 81F2 C6BA3784 |XOR EDX,8437BAC6
00415761 |. 89048E |MOV DWORD PTR DS:[ESI+ECX*4],EAX
00415764 |. 49 |DEC ECX
00415765 |.^ EB E1 \JMP SHORT UltraPro.00415748
00415767 |> 61 POPAD
00415768 |. 61 POPAD
00415769 \. C3 RETN
0041576A 00 DB 00
0041576B 00 DB 00
0041576C 00 DB 00
0041576D 00 DB 00
0041576E 00 DB 00
在0041574D下INT3断点,shift F9运行,程序停在00415761上,删除所有断点,按F4,停在00415769上,然后ctrl+T,条建设为 PUSH ebp,Ctrl+F11跟踪步入,就来到Stolen code地址上,
004254C9 . 55 PUSH EBP
004254CA . 8BEC MOV EBP,ESP
004254CC . 81EC 44 SUB ESP,44
这就是被偷的代码,查看内存,在.text区段上,下int3断点,运行来到OEP:
004010C5 0000 ADD BYTE PTR DS:[EAX],AL
004010C7 000D 0A000051 ADD BYTE PTR DS:[5100000A],CL
004010CD 46 INC ESI
004010CE B4 E8 MOV AH,0E8
004010D0 70 4B JO SHORT UltraPro.0040111D
004010D2 56 PUSH ESI
004010D3 FF15 E4634000 CALL DWORD PTR DS:[4063E4] ; UltraPro.0040D1BA
004010D9 8BF0 MOV ESI,EAX
004010DB 8A00 MOV AL,BYTE PTR DS:[EAX]
004010DD 3C 22 CMP AL,22
004010DF 75 1B JNZ SHORT UltraPro.004010FC
004010E1 56 PUSH ESI
004010E2 FF15 F4644000 CALL DWORD PTR DS:[4064F4] ; UltraPro.0040D4C6
004010E8 8BF0 MOV ESI,EAX
004010EA 8A00 MOV AL,BYTE PTR DS:[EAX]
004010EC 84C0 TEST AL,AL
004010EE 74 04 JE SHORT UltraPro.004010F4
004010F0 3C 22 CMP AL,22
004010F2 ^ 75 ED JNZ SHORT UltraPro.004010E1
由于被偷去的代码占六个字节,所以向上找六个字节,004010C7是六个字节,需要NOP一下:
004010C5 0000 ADD BYTE PTR DS:[EAX],AL
004010C7 90 NOP
004010C8 90 NOP
004010C9 90 NOP
004010CA 90 NOP
004010CB 90 NOP
004010CC 90 NOP
004010CD 46 INC ESI
004010CE B4 E8 MOV AH,0E8
004010D0 70 4B JO SHORT UltraPro.0040111D
004010D2 56 PUSH ESI
004010D3 FF15 E4634000 CALL DWORD PTR DS:[4063E4] ; UltraPro.0040D1BA
004010D9 8BF0 MOV ESI,EAX
004010DB 8A00 MOV AL,BYTE PTR DS:[EAX]
004010DD 3C 22 CMP AL,22
004010DF 75 1B JNZ SHORT UltraPro.004010FC
004010E1 56 PUSH ESI
004010E2 FF15 F4644000 CALL DWORD PTR DS:[4064F4] ; UltraPro.0040D4C6
然后在004010CC处向下粘贴stolen code:
004010C7 90 NOP
004010C8 90 NOP
004010C9 90 NOP
004010CA 90 NOP
004010CB 90 NOP
004010CC 55 PUSH EBP
004010CD 8BEC MOV EBP,ESP
004010CF 83EC 44 SUB ESP,44
004010D2 56 PUSH ESI
004010D3 FF15 E4634000 CALL DWORD PTR DS:[4063E4] ; UltraPro.0040D1BA
004010D9 8BF0 MOV ESI,EAX
004010DB 8A00 MOV AL,BYTE PTR DS:[EAX]
004010DD 3C 22 CMP AL,22
004010DF 75 1B JNZ SHORT UltraPro.004010FC
004010E1 56 PUSH ESI
并在此处新建EIP,用Lordpe脱壳之后,打开ImportREC修复,会出现比较多的无效指针,在这里,不要剪切掉,用ACprotect插件修复一下,会发现有这么一个指针异常
rva:000064AC ptr:0040D3DC,将其指向MessageBoxExA,然后修复脱壳文件即可!然后运行一下文件,发现已经脱壳了,而且能正常运行!
谢谢大家硬着头皮看完我的文章,由于是初学者,有什么不对的地方,还请大虾不吝赐教!
废话不多说,切入正题吧,Let’s go。
还是老方法,用PEID查一下壳:
UltraProtect 1.x -> RISCO Software Inc.,看来不怎么准确,那就用FI试一下吧,发现是1.41版本的.
是骡子是马,拉出来溜溜,直接OD载入,对于Ac保护壳,进行脱壳前,要先对OD设置一下,选项-调试设置-异常中,忽略除了内存访问之外的所有异常,而且最重要的就是找到VM.然后F9运行,程序会中断在下面异常上:
00415719 |. CD 01 INT 1
0041571B |. 40 INC EAX
0041571C |. 40 INC EAX
0041571D |. 0BC0 OR EAX,EAX
0041571F |. 75 05 JNZ SHORT UltraPro.00415726
00415721 |. 90 NOP
00415722 |. 90 NOP
00415723 |. 90 NOP
00415724 |. 90 NOP
00415725 |. 61 POPAD
堆栈窗口如下:
0012FF58 0012FFE0 指向下一个 SEH 记录的指针
0012FF5C 004156FD SE处理程序
0012FF60 01EAFFCD
0012FF64 3CC83AC5
在第二段代码 0012FF5C 004156FD SE处理程序 下内存访问断点,然后shift f9运行,程序停在下列代码上:
004156FD . 8B5C24 0C MOV EBX,DWORD PTR SS:[ESP+C]
00415701 . 8383 B8000000>ADD DWORD PTR DS:[EBX+B8],2
00415708 . 33C0 XOR EAX,EAX
0041570A . C3 RETN
0041570B /$ 64:67:FF36 00>PUSH DWORD PTR FS:[0]
00415711 |. 64:67:8926 00>MOV DWORD PTR FS:[0],ESP
00415717 |. 33C0 XOR EAX,EAX
在004156FD上下IN3断点,然后shift f9运行
0041574D |. 8B048E |MOV EAX,DWORD PTR DS:[ESI+ECX*4]
00415750 |. 8B5C8E 04 |MOV EBX,DWORD PTR DS:[ESI+ECX*4+4]
00415754 |. 33C3 |XOR EAX,EBX
00415756 |. C1C8 10 |ROR EAX,10
00415759 |. 33C2 |XOR EAX,EDX
0041575B |. 81F2 C6BA3784 |XOR EDX,8437BAC6
00415761 |. 89048E |MOV DWORD PTR DS:[ESI+ECX*4],EAX
00415764 |. 49 |DEC ECX
00415765 |.^ EB E1 \JMP SHORT UltraPro.00415748
00415767 |> 61 POPAD
00415768 |. 61 POPAD
00415769 \. C3 RETN
0041576A 00 DB 00
0041576B 00 DB 00
0041576C 00 DB 00
0041576D 00 DB 00
0041576E 00 DB 00
在0041574D下INT3断点,shift F9运行,程序停在00415761上,删除所有断点,按F4,停在00415769上,然后ctrl+T,条建设为 PUSH ebp,Ctrl+F11跟踪步入,就来到Stolen code地址上,
004254C9 . 55 PUSH EBP
004254CA . 8BEC MOV EBP,ESP
004254CC . 81EC 44 SUB ESP,44
这就是被偷的代码,查看内存,在.text区段上,下int3断点,运行来到OEP:
004010C5 0000 ADD BYTE PTR DS:[EAX],AL
004010C7 000D 0A000051 ADD BYTE PTR DS:[5100000A],CL
004010CD 46 INC ESI
004010CE B4 E8 MOV AH,0E8
004010D0 70 4B JO SHORT UltraPro.0040111D
004010D2 56 PUSH ESI
004010D3 FF15 E4634000 CALL DWORD PTR DS:[4063E4] ; UltraPro.0040D1BA
004010D9 8BF0 MOV ESI,EAX
004010DB 8A00 MOV AL,BYTE PTR DS:[EAX]
004010DD 3C 22 CMP AL,22
004010DF 75 1B JNZ SHORT UltraPro.004010FC
004010E1 56 PUSH ESI
004010E2 FF15 F4644000 CALL DWORD PTR DS:[4064F4] ; UltraPro.0040D4C6
004010E8 8BF0 MOV ESI,EAX
004010EA 8A00 MOV AL,BYTE PTR DS:[EAX]
004010EC 84C0 TEST AL,AL
004010EE 74 04 JE SHORT UltraPro.004010F4
004010F0 3C 22 CMP AL,22
004010F2 ^ 75 ED JNZ SHORT UltraPro.004010E1
由于被偷去的代码占六个字节,所以向上找六个字节,004010C7是六个字节,需要NOP一下:
004010C5 0000 ADD BYTE PTR DS:[EAX],AL
004010C7 90 NOP
004010C8 90 NOP
004010C9 90 NOP
004010CA 90 NOP
004010CB 90 NOP
004010CC 90 NOP
004010CD 46 INC ESI
004010CE B4 E8 MOV AH,0E8
004010D0 70 4B JO SHORT UltraPro.0040111D
004010D2 56 PUSH ESI
004010D3 FF15 E4634000 CALL DWORD PTR DS:[4063E4] ; UltraPro.0040D1BA
004010D9 8BF0 MOV ESI,EAX
004010DB 8A00 MOV AL,BYTE PTR DS:[EAX]
004010DD 3C 22 CMP AL,22
004010DF 75 1B JNZ SHORT UltraPro.004010FC
004010E1 56 PUSH ESI
004010E2 FF15 F4644000 CALL DWORD PTR DS:[4064F4] ; UltraPro.0040D4C6
然后在004010CC处向下粘贴stolen code:
004010C7 90 NOP
004010C8 90 NOP
004010C9 90 NOP
004010CA 90 NOP
004010CB 90 NOP
004010CC 55 PUSH EBP
004010CD 8BEC MOV EBP,ESP
004010CF 83EC 44 SUB ESP,44
004010D2 56 PUSH ESI
004010D3 FF15 E4634000 CALL DWORD PTR DS:[4063E4] ; UltraPro.0040D1BA
004010D9 8BF0 MOV ESI,EAX
004010DB 8A00 MOV AL,BYTE PTR DS:[EAX]
004010DD 3C 22 CMP AL,22
004010DF 75 1B JNZ SHORT UltraPro.004010FC
004010E1 56 PUSH ESI
并在此处新建EIP,用Lordpe脱壳之后,打开ImportREC修复,会出现比较多的无效指针,在这里,不要剪切掉,用ACprotect插件修复一下,会发现有这么一个指针异常
rva:000064AC ptr:0040D3DC,将其指向MessageBoxExA,然后修复脱壳文件即可!然后运行一下文件,发现已经脱壳了,而且能正常运行!
谢谢大家硬着头皮看完我的文章,由于是初学者,有什么不对的地方,还请大虾不吝赐教!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
赞赏
雪币:
留言: