使用天乐软件加密狗(JDProtect)保护您的软件,防止程序被跟踪/逆向/反编译/破解

作者:庄晓立(liigo)

日期:2011-4-8

原创链接:http://blog.csdn.net/liigo/archive/2011/04/08/6310677.aspx

转换请注明出处:http://blog.csdn.net/liigo

 

  天乐软件加密狗(JDProtect),貌似几年前的软件,也很久没人更新了,这个暂且不管。本文并非推荐软件,而是介绍软件用法。本人(liigo)也不对此软件的质量和使用效果做任何评价,因为我也不甚了解。

  JDProtect本质上是一个加壳软件,同时又跟硬件加密狗用法比较相似,据说是一款结合了加壳和硬件加密狗双重优势的软件。其作者在文档中介绍说:

  普通的加壳软件实际上是给主程序穿了一件衣服,这件衣服(即外壳)跟主程序之间没有任何逻辑上的联系,加壳后的程序运行时,先运行外壳,由外壳完成反跟踪及还原主程序等任务,等任务完成后,再跳到原主程序入口,到此,外壳便失去了它存在的价值,而且由于外壳对于主程序而言是不具有依赖性的(即主程序不会再去访问外壳,实际上主程序根本不知道外壳的存在),因此可以进行脱壳操作,使脱壳下来的程序依然可用。   JDProtect软件狗的思路正是基于对上述加壳软件弱点的认识,提出了壳即是狗,狗即是壳的概念,通过技术手段把外壳和主程序有机地结合起来,使外壳成为主程序不可缺少的有血有肉的一部分,加壳后的程序运行时,仍然先运行外壳,由外壳完成反跟踪及还原主程序等任务,等任务完成后,再跳到原主程序入口,但到此,外壳仍然不可丢弃,因为主程序随时都可以通过访问狗中资源的方式访问外壳,检查外壳的真实性。如果进行脱壳操作,即相当于拿掉了狗,使脱壳下来的程序成为一个不完整的程序,无法运行。

  JDProtect软件给用户提供一个.lib文件、必要的头文件(C/C++的.h,汇编的.inc),和一个加壳加密加狗处理主程序(以下称为加狗程序)。其使用流程是,用户在自己的软件中调用.lib中的接口函数(进行必要的检测/核对),编译生成EXE后交给加狗程序处理生成新的EXE,后者即可对外发布了。加狗操作时可以指定用户ID、用户INFO、四个暗码(DWORD),还可以定义一个使用伪汇编编写的自定义算法(有诸多限制),用户通过接口函数操作以上数据和算法。

.h里的接口函数:

extern "C" DWORD __stdcall GetHardID(DWORD InParam); extern "C" DWORD __stdcall GetUserID(); extern "C" VOID __stdcall GetUserInfo(LPTSTR lpBuff); extern "C" DWORD __stdcall GetSeedCode(DWORD InParam); extern "C" DWORD __stdcall GetMyCode(DWORD InParam); extern "C" DWORD __stdcall GetSecretCode(int num);

  它的.lib文件是一个空壳导入库文件,并没有实质功能代码,可能只是充当一个占位符,实质的加壳加密保护代码,是在后来加狗程序处理EXE时加进去的。作者提供了汇编语言的头文件.inc和C/C++的.h,并附有VC++6.0调用示例,说明这个JDProtect是主要针对汇编、C/C++用户服务的。作者还在文档中期望Delphi、C++ Builder、VB也能使用JDProtect,并希望有用户协助编写例程。我(liigo)个人对此表示怀疑,因为.lib并不是一个被多种编程语言普遍支持的一项技术(DLL才是)。

  易语言可以调用.lib。能被VC++调用的lib,易语言自然也不在话下。在易语言中调用.lib,只需准确填写好函数声明,除了需要填写基本的返回值类型、参数类型、所在lib文件外,最关键的是填写函数在.lib内的符号名称。怎么知道符号名称呢?一个方法是凭经验推断:stdcall的函数Func,其符号名称应该是_Func@n,其中n是函数参数入栈字节数(通常是4的倍数),例如上面GetHardID函数的符号就是_GetHardID@4;cdecl的函数Func的符号名称应该是_Func。更准确的方法是去.lib内部查询到底是什么符号,可以用VC++自带的dumpbin.exe这个小软件,命令行:dumpbin /all tlzj.lib > tlzj.txt,将tlzj.lib信息输出到tlzj.txt文本文件中,结果大致如下图:

有了具体的符号名称,在易语言中声明调用lib中的函数就很简单了,跟声明调用DLL如出一辙(符号名称填写到“在库中对应命令名”一栏):

  现在你知道为什么我用“填写”这个词了吧?在易语言中是以填写表格的形式声明和定义函数(如上图)。易语言默认以stdcall调用约定调用lib/dll内的函数;如果被调用的函数是cdecl,可在上图中的“在库中对应命令名”一栏最前面添加字符@,以告知易语言以cdecl调用约定调用该函数。另外多说一句,对于.lib中不是以“extern "C"”导出的C++函数,其符号名称通常怪异如“?vc_time2@@YAHXZ”(参见C++名称修饰(Name mangling)),易语言也同样支持调用它——只要你把符号名称填对了就行。易语言对.LIB和.DLL的调用支持是比较完善的。

  为了简化使用,我(liigo)为JDProtect开发了易语言调用模块“天乐软件狗(JDProtect)模块.ec”,易语言的普通用户不用任何技术前提,就可以很方便的调用JDProtect提供的开发接口了。下面是我(liigo)对此模块及其例程编写的简单的使用文档:

' 使用方法步骤: ' 1、静态编译生成EXE (此程序不支持非静态编译,也不支持在IDE中调试运行) ' 2、运行JDProtect.exe,选择刚才生成的EXE,输入各个参数,点击“加狗”按钮 ' 3、加狗操作后的EXE就可以正常运行了 ' 4、加狗后会自动生成与EXE文件名一样、后缀为.dog的配置文件,双击它可查看或修改加狗参数 ' 模块和例程作者:liigo,http://blog.csdn.net/liigo,QQ:175199125

下载:JDProtect_0.90e,含易语言开发模块及其源码和例程 ——因为添加了易语言的内容,我(liigo)私自修改版本号为0.90e(原版本号是0.90b),在此向作者说抱歉啦。

全文完,谢谢收看。

 

你可能感兴趣的:(源代码,易语言)