• 标 题:Acprotect1.09g标准版脱壳+伪修复
  • 作 者:David
  • 时 间:2004年2月22日 03:35
  • 链 接:http://bbs.pediy.com

【脱文作者】 weiyi75[Dfcg]
 
【作者邮箱】 weiyi75@sohu.com
 
【作者主页】 Dfcg官方大本营
 
【使用工具】 Ollydbg1.10b抗Antidbg版,ImportREC1.42,LoadPe,Winhex
 
【破解平台】 Win2000/XP
 
【软件名称】 Acprotect1.09g标准版
 
【软件简介】 强劲的加密软件,反目前任何一种调试器,发现就Kill掉。加密兼容性很好,可与其它加密软件配合多次加密,反脱壳保护(部分代码动态解压),部分程序Stolen Code,与Asprotect不同,它不是用00代替的。
 
【软件大小】 1.36M

【加壳方式】 UltraProtect 1.x -> RISCO Software Inc

【破解声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享。

【破解目的】 手动跟踪寻找Stolen Code具体内容,补充指向壳中的代码.

前言:   虽然大侠们现在都在研究Acprotect1.21新版,我们这些菜鸟是睬着大侠们开发出的路走的,个人认为,脱壳技术更新很快,基础不打牢盲目跟着跑最终是一无所或,Acprotect是一个很强的壳,历代版本变化很大,自1.09g到1.10之间的解码技术完全不同,遇到1.09g加密的程序我们也要能识别出来。跟踪过Acprotect的脱友都知道,从最后一次Seh异常都到Oep处至少有几千条小跳转,一不小心就跑飞,至少的两个小时才能到Oep,用内存断点,和模拟跟踪虽然很容易到达Oep,但如果遇到Stolen Code的程序你怎么办,当然高手一看就可以补上Stolen Code。如果入口特征不熟的人怎么办,我们来寻找一下Stolen Code的具体位置吧。

之前大家先找几个未加壳的C++,Dephi等程序,用Od载入观察前面几句代码执行时Esp值的变化,

举个例子。

005B1AF3    55              PUSH EBP
005B1AF4    8BEC            MOV EBP,ESP  //执行完这句后,  ebp和esp的值相同,一般都以12ffc0=12ffc0居多。
005B1AF6    83C4 F4         ADD ESP,-0C

这几句是C++,Dephi几乎都有的特征码,加壳软件在Stolen Code时都要对12ffc0进行访问,这也是我们的跟踪断点。

第二点,这次目标是加密程序本身,通过FLY大侠的完美卸载Xp,videofixer等先前脱文我们知道一般Dephi程序脱壳后有部分代码指向壳中,没有一起脱出来,本文也是一样的,不用浪费时间演示一遍脱壳修复也不能运行的过程了。现在要做的就是让程序在运行时把这段代码解压在程序内,具体过程如下。

1. 用PEDITOR给其加个新的区段:名字如:New,大小00050000,关于大小设置一般在20000-50000之间,越大越安全,太小的值无法放下所有失去的代码,然后用WinHex在程序末尾粘贴00050000长度的00字节。可以写入某些字符以便查找,如:David 

然后用PEDITOR rebuilder PE,初学者先看看程序能否运行。

2. 用Unkillod载入“增肥”后ACProtect.exe,忽略所有异常选项,插件隐藏OD

00597000 >  60              PUSHAD       //开始点。
00597001    FC              CLD
00597002    66:81C8 D0EE    OR AX,0EED0
00597007    4A              DEC EDX
00597008    40              INC EAX
00597009    87C1            XCHG ECX,EAX
0059700B    F9              STC
0059700C    74 03           JE SHORT ACProtec.00597011
0059700E    75 01           JNZ SHORT ACProtec.00597011
00597010    72 66           JB SHORT ACProtec.00597078
00597012    D3E0            SHL EAX,CL
00597014    EB 01           JMP SHORT ACProtec.00597017
.............................................................

命令行下断点 BP GlobalAlloc
 
断点含义请看Api手册,估计是分配内存用的。

F9运行,中断5次,Ctrl+F9返回程序领空。不同的程序,需要中断的次数不同,看作手脚的具体位置,如果怕错过,就中断一次后,马上Ctrl+F9返回程序领空,一般是3到5次之间。

0059AD3E    8BF8            MOV EDI,EAX  //我的理解是这句为特征码,EAX值是程序即将写入的内存地址,就是我们脱壳后失去的代码,做个手脚吧。

0059AD40    81C7 A00F0000   ADD EDI,0FA0

0059AD46    50              PUSH EAX

0059AD47    B9 70170000     MOV ECX,1770

0059AD4C    8DB5 F5204000   LEA ESI,DWORD PTR SS:[EBP+4020F5]

0059AD52    F3:A4           REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>

0059AD54    5A              POP EDX

0059AD55    8BF2            MOV ESI,EDX

0059AD57    81C6 A00F0000   ADD ESI,0FA0

0059AD5D    8BFE            MOV EDI,ESI

0059AD5F    B9 70170000     MOV ECX,1770

0059AD64    AC              LODS BYTE PTR DS:[ESI]

0059AD65    32C3            XOR AL,BL

0059AD67    AA              STOS BYTE PTR ES:[EDI]

0059AD68  ^ E2 FA           LOOPD SHORT ACProtec.0059AD64

.............................................................

 

Alt+M打开内存镜像窗口,

 

内存镜像

地址       大小       Owner      区段       Contains      类型   访问      初始访问  映射为

 

00506000   00001000   ACProtec   .rdata                   Imag   R         RWE

00507000   0000D000   ACProtec   .reloc                   Imag   R         RWE

00514000   00083000   ACProtec   .rsrc      resources     Imag   R         RWE

00597000   00021000   ACProtec   .perplex   SFX,imports   Imag   R         RWE

005B8000   00050000   ACProtec   new        data          Imag   R         RWE //我们新建的区段,双击这行。

 

出现一个转存窗口,看见右边AscII码的David没有,右键-搜索-二进制字符-AscII方式填入David,确定得到具体位置5B80FC

 

005B80FC  44 61 76 69 64 00 00 00 00 00 00 00 00 00 00 00  David...........

 

确定添加字节开始在005B80FC 处 

 

0059AD3E    8BF8            MOV EDI,EAX  //我的立即是这句为特征码,EAX值是程序即将写入的内存地址,就是我们脱壳后失去的代码,做个手脚吧。修改信息框下面寄存器EAX地址为005B80FC,修改正确将看到David字符。

0059AD40    81C7 A00F0000   ADD EDI,0FA0

0059AD46    50              PUSH EAX

0059AD47    B9 70170000     MOV ECX,1770

0059AD4C    8DB5 F5204000   LEA ESI,DWORD PTR SS:[EBP+4020F5]

0059AD52    F3:A4           REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>

0059AD54    5A              POP EDX

0059AD55    8BF2            MOV ESI,EDX

0059AD57    81C6 A00F0000   ADD ESI,0FA0

0059AD5D    8BFE            MOV EDI,ESI

0059AD5F    B9 70170000     MOV ECX,1770

0059AD64    AC              LODS BYTE PTR DS:[ESI]

0059AD65    32C3            XOR AL,BL

0059AD67    AA              STOS BYTE PTR ES:[EDI]

0059AD68  ^ E2 FA           LOOPD SHORT ACProtec.0059AD64

.............................................................

 

3. 清除断点,命令行 d 12ffc0

 

在12ffc0处下硬件写入Dword断点。

 

Alt+M打开内存镜像窗口。

 

内存镜像

地址       大小       Owner      区段       Contains      类型   访问      初始访问  映射为

 

00400000   00001000   ACProtec              PE header     Imag   R         RWE

00401000   000D0000   ACProtec   CODE       code          Imag   R         RWE  //对准它下内存访问断点。

 

呵呵,内存加硬件断点双剑合壁,Acprotect你还不投降。

 

005B1AF4    8BEC            MOV EBP,ESP //F9一次就到达这里?什么地方。

005B1AF6    83C4 F4         ADD ESP,-0C

005B1AF9    60              PUSHAD

005B1AFA    60              PUSHAD

005B1AFB    E8 00000000     CALL ACProtec.005B1B00

 

看寄存器 Esp= 0012FFC0 Ebp=0012FFF0 这是程序入口Push ebp语句执行过后的特征。滚动条往上看。

 

005B1AF2    61              POPAD

005B1AF3    55              PUSH EBP     //Stolen Code

005B1AF4    8BEC            MOV EBP,ESP  //Stolen Code  共六个字节。

005B1AF6    83C4 F4         ADD ESP,-0C  //Stolen Code

005B1AF9    60              PUSHAD

005B1AFA    60              PUSHAD

 

继续F9

 

0059E6B3    C600 E9         MOV BYTE PTR DS:[EAX],0E9    //程序再这里循环几次

0059E6B6    8948 01         MOV DWORD PTR DS:[EAX+1],ECX

0059E6B9  ^ EB DE           JMP SHORT ACProtec.0059E699

0059E6BB    61              POPAD

0059E6BC    C3              RETN

................................................................

 

004D058A    B8 94024D00     MOV EAX,ACProtec.004D0294  //最后到达伪Oep,滚动条往上看。

004D058F    E8 0465F3FF     CALL ACProtec.00406A98

004D0594    A1 D0794F00     MOV EAX,DWORD PTR DS:[4F79D0]

004D0599    8B00            MOV EAX,DWORD PTR DS:[EAX]

004D059B    E8 90CDF7FF     CALL ACProtec.0044D330

004D05A0    8B0D AC774F00   MOV ECX,DWORD PTR DS:[4F77AC]            ; ACProtec.004FC8A4

004D05A6    A1 D0794F00     MOV EAX,DWORD PTR DS:[4F79D0]

004D05AB    8B00            MOV EAX,DWORD PTR DS:[EAX]

004D05AD    8B15 F4024C00   MOV EDX,DWORD PTR DS:[4C02F4]            ; ACProtec.004C0340

004D05B3    E8 90CDF7FF     CALL ACProtec.0044D348

................................................................

 

004D0584    D2DD            RCR CH,CL  //真Oep,入口代码六个字节被替换。

004D0586    9B              WAIT       //被替换

004D0587    C001 F3         ROL BYTE PTR DS:[ECX],0F3   //被替换

004D058A    B8 94024D00     MOV EAX,ACProtec.004D0294

004D058F    E8 0465F3FF     CALL ACProtec.00406A98

004D0594    A1 D0794F00     MOV EAX,DWORD PTR DS:[4F79D0]

004D0599    8B00            MOV EAX,DWORD PTR DS:[EAX]

004D059B    E8 90CDF7FF     CALL ACProtec.0044D330

004D05A0    8B0D AC774F00   MOV ECX,DWORD PTR DS:[4F77AC]            ; ACProtec.004FC8A4

004D05A6    A1 D0794F00     MOV EAX,DWORD PTR DS:[4F79D0]

004D05AB    8B00            MOV EAX,DWORD PTR DS:[EAX]

004D05AD    8B15 F4024C00   MOV EDX,DWORD PTR DS:[4C02F4]            ; ACProtec.004C0340

004D05B3    E8 90CDF7FF     CALL ACProtec.0044D348

004D05B8    8B0D DC764F00   MOV ECX,DWORD PTR DS:[4F76DC]            ; ACProtec.004FC89C

004D05BE    A1 D0794F00     MOV EAX,DWORD PTR DS:[4F79D0]

004D05C3    8B00            MOV EAX,DWORD PTR DS:[EAX]

004D05C5    8B15 6C004C00   MOV EDX,DWORD PTR DS:[4C006C]            ; ACProtec.004C00B8

004D05CB    E8 78CDF7FF     CALL ACProtec.0044D348

................................................................

 

004D0584    55              PUSH EBP   //补充上替换的六个字节代码,OD插件修正入口点D0584,重建输入表选方式2或Loadpe dump full

004D0585    8BEC            MOV EBP,ESP

004D0587    83C4 F4         ADD ESP,-0C

004D058A    B8 94024D00     MOV EAX,ACProtec.004D0294

004D058F    E8 0465F3FF     CALL ACProtec.00406A98

004D0594    A1 D0794F00     MOV EAX,DWORD PTR DS:[4F79D0]

004D0599    8B00            MOV EAX,DWORD PTR DS:[EAX]

004D059B    E8 90CDF7FF     CALL ACProtec.0044D330

004D05A0    8B0D AC774F00   MOV ECX,DWORD PTR DS:[4F77AC]            ; ACProtec.004FC8A4

004D05A6    A1 D0794F00     MOV EAX,DWORD PTR DS:[4F79D0]

004D05AB    8B00            MOV EAX,DWORD PTR DS:[EAX]

004D05AD    8B15 F4024C00   MOV EDX,DWORD PTR DS:[4C02F4]            ; ACProtec.004C0340

004D05B3    E8 90CDF7FF     CALL ACProtec.0044D348

004D05B8    8B0D DC764F00   MOV ECX,DWORD PTR DS:[4F76DC]            ; ACProtec.004FC89C

004D05BE    A1 D0794F00     MOV EAX,DWORD PTR DS:[4F79D0]

004D05C3    8B00            MOV EAX,DWORD PTR DS:[EAX]

004D05C5    8B15 6C004C00   MOV EDX,DWORD PTR DS:[4C006C]            ; ACProtec.004C00B8

004D05CB    E8 78CDF7FF     CALL ACProtec.0044D348

................................................................

4. 修复IAT

关闭OD,打开加壳程序,ImportREC用跟踪等级3修复程序。

5. 运行脱壳修复程序,出现一个写内存错误提示,确定后进入程序界面,不能加密程序。

6. 怎么最近总是伪破解,伪脱壳,反复回顾过程,不知哪里有问题,反复几次仍然如此,估计过不了RSAKEY嵌入解码技术。

7. 虽然主程序修复脱壳失败,但它加密的程序强度就没有这么高,仍然不失为一个好方法,注意只适用于早期的Acprotect1.09g一下版本加密的程序。 

 
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!