欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

Acprotect1.09g标准版脱壳+伪修复

程序员文章站 2024-01-16 23:22:16
【脱文作者】 weiyi75[Dfcg]     【作者邮箱】 weiyi75@sohu.com     【作者主页】 Dfcg官方...

【脱文作者】 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 &n