首页
社区
课程
招聘
[旧帖] [原创]ACprotect的脱壳[申请邀请码] 0.00雪花
发表于: 2009-9-19 14:54 1549

[旧帖] [原创]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,然后修复脱壳文件即可!然后运行一下文件,发现已经脱壳了,而且能正常运行!
谢谢大家硬着头皮看完我的文章,由于是初学者,有什么不对的地方,还请大虾不吝赐教!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回