FoxShell 1.20使用说明
(User Guide)
感谢您选择品琳居工作室的VFP加密系列产品。FoxShell是FoxLock的姐妹产品,目前在国内不单独注册,只作为FoxLock共享版的一个附送产品(她是FoxLock 2.7正式发布前的一个过渡产品)。如果您想追求比较高的加密强度,请注册FoxLock共享版或商业版。
这个版本的FoxShell具有一定的加密强度,可以抵御目前所有的VFP解密工具,并对未知的解密工具具有比较好的防御性。非FoxLock注册用户只能用到本软件最基本的加密功能,加密后的文件同样无任何限制且能够防止目前所有的VFP加密工具解码。
一、FoxShell的安装
在FoxShell的官方主页上可以下载到FoxShell的安装文件,只有Setup.Exe单个文件。运行这个安装文件,按提示完成FoxShell的安装
二、FoxShell的启动
双击桌面上的“FoxShell 1.20 专业版”即可启动FoxShell,在弹出语言选择窗口中可以选择您的缺省语言,在FoxShell 1.20版中,自带了简体中文、繁体中文和英文三种语言。
三、基本设置
在上面的系统设置中,我们可以关联一个FoxShell的项目文件,
项目文件里面保存了对目标文件的加密设置,下次我们加密的时候可以直接点击该图标或者使用FoxShell来打开这个项目文件。
四、软件注册
FoxShell现在在国内不能实行单独注册,她只作为FoxLock共享版的一个附加产品赠送FoxLock共享版的注册用户。如果您要获取注册版的FoxShell,您只能够通过注册FoxLock共享版来取得。
在填写好注册信息后,按“生成注册信息”按钮,系统将会提示您:
我会在受到注册信息文件后第一时间给用户发送注册授权文件,用户在收到注册授权文件后,把该文件放在FoxShell的安装目录,重新启动FoxShell即可完成注册。
如果您已经获取FoxShell 1.10的授权文件,只需要填写与1.10相同的注册信息并把授权文件复制到FoxShell 1.20的安装目录即可完成注册。
没有注册的用户只能使用FoxShell最简单的加密方式,里面的一些核心功能无法实现。
五、使用FoxShell来加密VFP程序
1、如何进行简单加密
您可以通过打开要加密的VFP程序,选择好加密后文件的存放目录,按加密即可。当然,您可以通过打开项目文件的形式来执行加密。
2、通过项目文件进行设置性加密
注意:FoxShell 1.20的项目文件由于作了比较大的改动,所以不能直接打开FoxShell 1.10的项目,请自行新建项目文件。
六、SDK(软件开发包)
FoxShell 1.20开始提供SDK的接口,使用SDK可以通过VC++/ASM等写出一些VFP本身不能实现的功能。这些功能在加密后自然生效,在被脱壳后自动实效。
FoxShell 1.20初步加入了HardWare(硬件)、MD5、CRCS、SHA512四个内置的SDK,SDK的例子可以在安装目录\SDK\SAMPLE\里面找到。FoxShell另外一个激动人心的功能是可以将任意一个没有被加壳的
DLL转换成SDK文件,在加密后您可以不附带这个DLL而调用DLL里面的全部功能。值得注意的是,原来的函数名须加上SDK_的前缀。
例如:原来有个DLL名叫MyDll.Dll,里面有个函数Add(nValue1,nValue2),原来的声明为:
Declare Long Add In "MyDll.Dll" Long, Long,则转换成SDK的声明应该为
Declare Long SDK_Add In "Kernel32" Long, Long,函数名由Add()变成了SDK_Add()
七、使用SDK函数
FoxLock为用户提供了函数扩展开发接口,可以实现VFP不能实现的功能(如取硬件信息等),SDK函数在加密后会进行名称碎码,这样别人即使能够还原某部分代码的前提下,也读不懂带有SDK函数的注册模块。
1、SDK的调试 * FoxShell中暂时不提供SDK的调试器 *
SDK的调试可以使用软件目录下的SDK自目录下的Debuger目录的Debuger.Exe,Debuger一经启动,立即会监视系统中VFP开发环境(支持VFP6~VFP9),接管SDK函数,方便用户进行调试。如下图所示:
2、SDK的声明
*************************************************************************************
&& 声明 SDK
&& SDK 1.01 Written By Aming Plindge Studio, 2005.04
*************************************************************************************
*************************************************************************************
* 硬件信息SDK声明 保存在HardWare.SDK中
* --------------------------------------------------------------------
* 主板相关
* --------------------------------------------------------------------
SDK_GetBiosSerial(nType)
函数功能:取主板序列号(已经支持WINDOWS 2003 SP1)
参数:nType(0
示返回Ascii,1表示返回16进制字符)
返回:字符cString
参考声明:Declare String SDK_GetBiosSerial In "Kernel32" Long
* --------------------------------------------------------------------
* 网卡相关
* --------------------------------------------------------------------
SDK_GetMacData(nType)
函数功能:取系统装置的所有网卡信息
参数:nType(0表示返回网卡的数目,-1表示返回网卡信息集的地址)
返回:数值
参考声明: Declare Long SDK_GetMacData In "Kernel32" Long
SDK_GetMacInfo(nNumber, nType)
函数功能:取指定的某个网卡的信息
参数:nNumber表示第几个网卡(不能超过上面SDK_GetMacData(0)所取得的网卡总数)
nType表示要取网卡的信息,0 表示网卡类型,1表示网卡名称,2表示网卡的物理地址
返回:字符cString
参考声明:Declare String SDK_GetMacInfo In "Kernel32" Long, Long
*************************************************************************************
例子:
LOCAL i, m, n
m = SDK_GetMacData(0)
n = SDK_GetMacData(-1)
? "取网卡个数: 共" + LTRIM(STR(m)) + "个,网卡信息地址: " + LTRIM(STR(n))
FOR i = 0 TO m - 1
? "第" + LTRIM(STR(i + 1)) + "个网卡信息: "
? " 类型:" + SDK_GetMacInfo (i, 0)
? " 名称:" + SDK_GetMacInfo (i, 1)
? " 地址:" + SDK_GetMacInfo (i, 2)
ENDFOR
*************************************************************************************
* --------------------------------------------------------------------
* CPU 相关
* --------------------------------------------------------------------
SDK_GetCpuNumber
函数功能:取系统CPU的个数
参数:无
返回:数值nNumber
参考声明:Declare Long SDK_GetCpuNumber In "Kernel32"
· 注意,在超线程的CPU中,可能得到2个CPU,可以再通过下面的SDK_GetCpuSerial函数来进一步判断,当CPU序列号相同可能就是超线程的CPU了。
SDK_GetCpuSerial(nNumber)
函数功能:取某个CPU的序列号
参数:nNumber 表示第几个CPU
返回:16进制字符cString
参考声明:Declare String SDK_GetCpuSerial In "Kernel32" Long
SDK_GetCpuName(nNumber)
函数功能:取某个CPU的名称
参数:nNumber表示第几个CPU
返回:字符cString
参考声明:Declare String SDK_GetCpuName In "Kernel32" Long
SDK_GetCpuVendor(nNumber)
函数功能:取某个CPU的制造信息
参数:nNumber表示第几个CPU
返回:字符cString
参考声明:Declare String SDK_GetCpuVendor In "Kernel32" Long
*************************************************************************************
例子:
LOCAL i, m
m = SDK_GetCpuNumber()
? "取 CPU 个数: 共" + LTRIM(STR(m)) + "个"
FOR i = 1 TO m
? "第" + LTRIM(STR(i)) + "个CPU信息: "
? " 标记:" + SDK_GetCpuVendor(i)
? " 名称:" + SDK_GetCpuName(i)
? " 序列号:" + SDK_GetCpuSerial(i)
ENDFOR
*************************************************************************************
* --------------------------------------------------------------------
* 硬盘相关
* --------------------------------------------------------------------
SDK_GetHardDisk
函数功能:取系统硬盘的个数
参数:无
返回:数值nNumber
参考声明:Declare Long SDK_GetHardDisk In "Kernel32"
SDK_GetModelNumber(nNumber)
函数功能:取系统某个硬盘的型号
参数:nNumber表示第几个硬盘
参考声明:Declare String SDK_GetModelNumber In "Kernel32" Long
SDK_GetSerialNumber(nNumber)
函数功能:取系统某个硬盘的序列号
参数:nNumber表示第几个硬盘
返回:字符cString
参考声明:Declare String SDK_GetSerialNumber In "Kernel32" Long
SDK_GetFirmwareRevision(nNumber)
函数功能:取系统某个硬盘的修正号
参数:nNumber表示第几个硬盘
返回:字符cString
参考声明:Declare String SDK_GetFirmwareRevision In "Kernel32" Long
*************************************************************************************
例子:
LOCAL i, m
m = SDK_GetHardDisk()
n = 0
? "共" + LTRIM(STR(m)) + "个硬盘"
FOR i = 0 TO m - 1
n = n + 1
? "编号为" + LTRIM(STR(i +1)) + "的硬盘的物理信息: "
? " 序列号:" + SDK_GetSerialNumber(i)
? " 型号:" + SDK_GetModelNumber(i)
? " 修正号:" + SDK_GetFirmwarereVision(i)
ENDFOR
*************************************************************************************
*************************************************************
************************
* --------------------------------------------------------------------
* MD5 保存在MD5.SDK中
* --------------------------------------------------------------------
SDK_Get_CRAM_MD5(cString,cPassword)
函数功能:某段字符经过某个密码运算后的MD5值
参数:cString表示要进行MD5运算的字符,cPassword表示参与MD5运算的密码
返回:16进制的字符
参考声明:Declare String SDK_Get_CRAM_MD5 In "Kernel32" String @, String @
SDK_Get_Digest_MD5(cString)
参考声明:Declare String SDK_Get_String_MD5 In "Kernel32" String @
函数功能:某段字符经数字运算后的MD5值
参数:cString表示要进行MD5运算的字符
返回:Ascii字符
注意:可以配合SDK_EnHex(cString) 函数使得返回值为16进制的可打印字符
参考声明:Declare String SDK_Get_Digest_MD5 In "Kernel32" String @
SDK_Get_String_MD5(cString)
函数功能:某段字符经字符运算后的MD5值
参数:cString表示要进行MD5运算的字符
返回:16进制的字符
参考声明:Declare String SDK_Get_String_MD5 In "Kernel32" String @
*************************************************************
************************
* --------------------------------------------------------------------------------------
* CRCS 保存在 CRCS.SDK中,用于检测文件或字符是否被修改过
* --------------------------------------------------------------------------------------
SDK_Crc32(nAddress,nSize,nSeed)
函数功能:取某段内存的CRC32值
参数:nAddress表示内存地址,nSize表示要计算的长度,nSeed表示种子的长度
返回:数值nValue
参考声明:Declare Long SDK_Crc32 In "Kernel32" Long, Long, Long
SDK_Crc32String(cString)
函数功能:取某段字符串的CRC32值
参数:cString表示要进行CRC32运算的字符
返回:数值nValue
参考声明:Declare Long SDK_Crc32String In "Kernel32" String
SDK_Crc32File(cFileName)
函数功能:取某个文件的CRC32值
参数:cFileName表示要进行CRC32运算的文件的完整途径
返回:数值nValue
参考声明:Declare Long SDK_Crc32File In "Kernel32" String @
SDK_Adler32(nAddress,nSize,nSeed)
函数功能:取某段内存的Adler32值
参数:nAddress表示内存地址,nSize表示要计算的长度,nSeed表示种子的长度
返回:数值nValue
参考声明:Declare Long SDK_Adler32 In "Kernel32" Long, Long, Long
SDK_Adler32String(cString)
函数功能:取某段字符串的Adler32值
参数:cString表示要进行Adler32运算的字符
返回:数值nValue
参考声明:Declare Long SDK_Adler32String In "Kernel32" String
SDK_Adler32File(cFileName)
函数功能:取某个文件的Adler32值
参数:cFileName表示要进行Adler32运算的文件的完整途径
返回:数值nValue
参考声明:Declare Long SDK_Adler32File In "Kernel32" String @
八、致谢
圈中朋友:ForGat、Kvllz、Ljtt、Hying、HeXer、GoldSun等。
参与测试的用户:一丁(特别感谢为我制作了个CHM的帮助)、GJ168、真爱无敌等。
有任何建议或问题请发邮件:
foxlock@163.com
技术支持QQ:
48843388
主页:
http://www.foxlock.net
可以按此按钮将调试器放系统的小任务栏。鼠标双击小任务栏的图标可以显示本窗体。
这个勾勾打上后,当您的目标EXE更新了版本则自动读取新的版本信息,否则直接读入上次加密保存的版本信息。
该区域填写产品相关信息。
注意:版本号的格式为 主版本,次版本,修正版本及私有版本,如1.20.1998.1,版本号填写格式不正确可能会引起编译资源失败。
FoxShell提供两种不同的加密强度:A和B,加密强度B的强度比A高,而加密强度B所要求的环境比较严格,加密后的文件请作测试。
FoxShell的保护密码长度支持<64K的任何文本,密码并非越长越好,因为参与运算的是密码的检校值而并非密码的本身。不同的密码所产生的加密密匙不同。
FoxShell提供25个级别的压缩级别,压缩级别越大,压缩率就越大,压缩所花费的时间越多。但并不影响运行时刻的速度。这个是由于所采用的压缩引擎自身的机制所决定的。
如果设置了不允许修改程序,那么再加壳后必须进行检校。注:FoxShell 1.20的引导程序本身已经过强壳加密,实际无须作二次加密。
FoxShell 1.20提供多线程和多部分解码,其实无须将线程设置的太多和文件分割得太细,每个线程(每部分)负责500K~1M已足够,因为加密后程序的处理数据流速度基本可达到10M/秒。
FoxShell 1.20 加入了程序的乱码功能,可以将变量名、属性名、函数名等进行乱码(在内存中存在的程序、表单片段照样保持乱码状态),这样即使反编译者可以得到文件,也无法正确反编译,因为涉及的变量名、属性名、函数名都已破乱不堪。
定义您改名前运行库和资源库的所在位置,方便程序在加密过程中自动生成相应的运行库和资源库,发布时使用系统生成的、改名后的运行库和资源库即可。
当你的系统准备运行于简体中文系统,在资源库的定位应为vfpxrchs.dll,繁体中文系统对应是vfpxrcht.dll,英文系统则是vfpxrenu.dll。上面的x表示VFP的版本号,目前是介于6~9之间。
FoxShell 1.20支持VFP的运行库和资源库随意该名(不得大于16字符),后缀名也可以任意改动,如上图。
鼠标双击列表的SDK库文件可以查看该SDK库里面包含的函数,如下图所示:
当你选了这个勾勾,加密过程中程序会自动分析您采用了哪些SDK库并将该SDK库编译进加密后的程序中。否则需要手动将SDK库添加进来。如果没有使用SDK则不需要作任何选择。
系统自动分析所采用的SDK函数
列举已经安装的SDK库。库保存在安装目录的SDK\Library子目录中。
把SDK库手动添加到SDK库待编译列表中。
保存所作的提示修改到配置文件中去。
选择提示的语言。可以自行编辑Runtime.INI增加您新的语言种类。
双击鼠标可以进入下图的编辑窗口。可以对提示窗口进行定制和设计。
、、、均表示回车换行。
演示设计结果。