编辑: jingluoshutong | 2013-05-06 |
1.5.5147) 【加壳方式】:?无 【保护方式】:?机器码+序列号 【编写语言】:?Borland Delphi 6.0 - 7.0 [Overlay] 【使用工具】:?PEID,IDA?Pro?with?Hex-Rays?plugin,DeDe,OllyICE,Syser,VMware 【软件介绍】:?瑞泰尼尔安全防御系统软件 (英文名称: Returnil Virtual System 2010,以下简称RVS)是瑞泰尼尔公司采用最新虚拟技术实现的新一代桌面安全系统.和传统的杀毒软件完全不同,瑞泰尼尔防毒系统软件可以瞬间 克隆 用户当前的操作系统, 制造 出实际存在于用户内存中的虚拟操作系统,并利用虚拟的操作系统来替代真实的操作系统,从而以达到保护真实操作系统的目的. 【作者声明】:?大道向前,一步一个脚印! 【破解过程】 前期处理 RVS Lite 2011安装后会在:1)Windows\System32\Drivers目录下复制驱动文件;
2)在系统盘根目录下创建RETURNIL文件夹,里面存放配置文件和数据;
3)在Program Files目录下创建Returnil Virtual System Lite 2011文件夹,里面只有一个主程序RvsCore.exe. 就先从RvsCore.exe下手,用PEiD 查壳显示Borland Delphi 6.0 - 7.0 [Overlay],用KANAL插件分析有ADLER
32、CRC
32、MD
5、ZLIB算法.直接拖到IDA里分析,并将几处算法标注上.IDA分析Delphi程序时要手动加载sig(Barland Visual Component Library &
Packages).默认加载了SHE for vc7/8,没用,但也不知道怎么去掉.Delphi程序也有异常处理,不过找不到sig就算了,影响不大.有些库函数识别不出来,可以有DeDe配合使用. Delphi逆向分析中较困难的就是一些VCL、RTL库函数被IDA识别成unknowlib,还有许多虚函数的调用,例如:call?[edx+0xC],此外Pascal的参数传递方式也比较让人不习惯.虽然有DeDe这样强大的逆向工具,但个人在处理以上问题是仍需要较强的手动分析逆向技巧.Delphi的参数传递: EAX:第一个参数;
??EDX:第二个参数;
??ECX:第三个参数;
??[ESP+8]第四,[ESP+C]第五...(如果有的话)(引自myskydog的《Delphi逆向分析---quick batch逆向》http://bbs.pediy.com/showthread.php?t=80205) 定位关键代码 RvsCore.exe程序有个注册界面,输入注册码确定后软件会重启计算机进行验证,在DeDe是找到确定按键的处理过程,大致看了下,没找到突破口.又看了软件的几个界面,把一些按键试了下,发现在软件主界面的下方有一个提示试用版的状态栏,在DeDe是定位此状态栏的创建过程PROC_5EBCD0.在PROC_5EBCD0里有条件判断,分别指向1)Registered;
2)Expired;
3)Trial Version.(软件支持多种语言,字符串有多层引用,有点烦人) CODE:005EC52D mov eax, ds:ppBaseAddress CODE:005EC532 mov eax, [eax] CODE:005EC534 mov al, [eax+0E25h] ;
al = 0(registered), 2(expired), CODE:005EC534 ;
4(expired), 1(trial) CODE:005EC53A sub al,
1 CODE:005EC53C jb short Registered CODE:005EC53E dec al CODE:005EC540 jz Expired CODE:005EC546 sub al,
2 CODE:005EC548 jz Expired CODE:005EC54E jmp Trial CODE:005EC553 CODE:005EC553 CODE:005EC553 Registered:CODE XREF: PROC_5EBCD0+86Cj CODE:005EC553 mov edx, ds:strRegistered CODE:005EC559 mov edx, [edx] CODE:005EC55B mov eax, [ebp+var_4] CODE:005EC55E mov eax, [eax+470h] CODE:005EC564 call @Controls@TControl@SetText$qqrx17System@AnsiString ;
Controls::TControl::SetText(System::AnsiString) [edx+0E25h]是注册标志,只要能找到对它赋值的地方,一般就找到的算法核心的地方.对于面向对象程序而言,想要用静态分析的方法找到某个变量的赋值操作是很困难的,得用动态调试.在OllyICE中加载程序,对内存中注册标志所在的位置下断点,运行程序,发现程序只有读注册标志,没有写操作.没有头绪,一顿乱翻,突然发现任务管理器里有两个RvsCore.exe,想到这种软件一般会往系统里添加服务,一看,果然.将Rvssrv服务停止,在OllyICE添加程序启动命令 Cservice,下断点,运行,程序直接退出,也没写注册标志的操作,服务没有启动.一步一步运行,缩小范围,发现是在某个与服务有关的Windows API调用后程序退出,猜测是系统服务不能以常规方法调试.上网搜,只看到使用注册表用Windbg调试系统服务,而我用OllyICE试不成功.看来以后要转而用Windbg了.现在只能在虚拟机里用Syser试试.添加启动命令 Cservice,添加断点,直接运行程序可是退出.偶然情况下,点了重启服务,发现Syser断下来了.原来注册标志是放在系统地址里(跟系统的内存管理有关),系统地址的断点在程序结束后是不会被Syser清除的,所以当RvsCore.exe以服务的方式再次启动并且访问断点所在的地址时被Syser断下.找到写注册标志的代码段: CODE:005FF787 mov eax, ds:off_60BB0C CODE:005FF78C mov eax, [eax] CODE:005FF78E mov al, [eax+14h] ;