VFP 程序的破解
由于 VFP 程序的编译是一种伪编译过程,经过一定的处理,可以得到完整的
源代码。自 从 ReFox、UnFoxAll 等反编译软件出现后,为保护作者自己的利益,软件的加密保护就显 得十分重要,相应的,VFP 程序的加密也越来越严。但由于 VFP 固有的特点—即解释执行, VFP 的解释器必须要得到可识别的代码,所以 VFP 程序的破解相对其他语音编译的程序来 说,还是比较简单的。 一、VFP EXE 程序的特点 VFP 标准的编译 EXE 文件是如下一种格式: 可执行部分+APP 文件 结构说明 文件+结构说明 可执行部分 其中可执行部分是标准的 PE 文件,APP 部分就是 VFP 编译的应用程序代码,最后的结 构为 14 个字节,用来描述 APP 文件,其中重要的是最后 4 个字节,反映的是 APP 文件的 大小。 头部的可执行部分只是简单地加载 VFP 的解释器(解释器名称为 vfp6r.dll、vfp7r.dll、 vfp8r.dll 分别对应 6.0、7.0、8.0.版本)执行 app 文件。现在的加密软件大多利用这个特点, 自己构造一个 PE 头,利用各种壳的技术保护 APP 代码。 因此我们可以这样认为,对于 VFP 的可执行文件,除 APP 文件以外的可执行部分,都 可认为是壳。 二 APP 文件的结构 1.app 文件结构 app 文件是 vfp 生成的应用程序或 Active Document 其结构为: 字节偏移 说明 0-1 文件标识 &;Hf2fe 为 vfp 的 app 2 加密标识 bit 0 为 1,未加密 bit 0 为 0,加密,此时 bit 4(0 或 1)区分为两类 3-4 编译版本 &;H0220 -vfp 6.0/7.0 &;H021f -
vfp 5.0 5-6 文件数目 7-8 主文件位置(从 0 开始) 9-12 文件名列表地址 13-16 文件说明结构列表地址 17-20 文件名列表长度 21-36 加密类型密码表 37-38 解密 key 39-40 文件校验和 文件名
列表地址 [目录名],00,文件名,00,文件名,00,... 文件说明结构列表地址 每个文件占用 25 个 byte,总长度为文件数*25 0 文件类型 0 为代码 其他数据 1-4 文件开始地址
5-8 9-12 其他不详
文件结束地址 文件名相对文件名列表的首地址
三、VFP 的加密特点及脱壳 VFP 的加密基本上可以分为两种—文件型加密和内存型加密, 这两种加密的区分主要在 APP 文件的存放位置,存放在某个文件中就为文件型,存放在内存中就叫内存型。但对 解密者来说,关心的是算法。以上的分类加不加以区别问题不大。
1、 文件头简单替换型 这种加密方式是比较早期的一种加密方式, 能够阻止反编译
软件, APP 代码在文 但 件中以明码出现,如 xx 王 5.05B(cxsw168) 脱壳方法: 打开 HEX,查找 FEF2 找到后与 APP 文件的结构对比一下,发现没有
问题,把从 FEF2 开始到文件尾的数据存成一个文件,取名 XXX.app,脱壳完成。 2、文件隐藏型 这类加密在 exe 文件中已经没有 app
的明码了,app 文件是由主
程序运行过程中动
态 生 成 的 , 以 文 件 形 式 存 在 硬 盘 的 某 处 。 如 xx 通 用 计 划 管 理 系 统 6.02(sx168) 用 TRW2000 加载程序 下断 bpx createfilea createfilea 的定义为:
HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ); 每次中断后观察打开的文件名,经过两次 foxpro.int 下面一个就是脱壳后的文件名了。 // pointer to name of the file // access (read-write) mode // share mode // pointer to security attributes // how to create // file attributes // handle to file with attributes to copy
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
文件放在 c:\windows\history\…\…exe 因为 c:\windows\history\是 windows 的系统目录,下面的文件不可显示,程序运行结束后又会删 除这个文件,所以必须在程序没有结束前得到这个文件 方法一:用 suspend 将程序挂起,用 procdump kill 现有进程,回 dos 利用 xcopy /s 将所有文件 考出,处理 方法二、利用 copyfilea 函数
BOOL CopyFile( LPCTSTR LPCTSTR lpExistingFileName