CN101908119B - 一种动态链接库dll文件的处理方法和装置 - Google Patents
一种动态链接库dll文件的处理方法和装置 Download PDFInfo
- Publication number
- CN101908119B CN101908119B CN201010253983A CN201010253983A CN101908119B CN 101908119 B CN101908119 B CN 101908119B CN 201010253983 A CN201010253983 A CN 201010253983A CN 201010253983 A CN201010253983 A CN 201010253983A CN 101908119 B CN101908119 B CN 101908119B
- Authority
- CN
- China
- Prior art keywords
- file
- dll
- dll file
- address
- function
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 38
- 230000008676 import Effects 0.000 claims abstract description 14
- 230000006870 function Effects 0.000 claims description 100
- 238000005538 encapsulation Methods 0.000 claims description 4
- 238000000605 extraction Methods 0.000 claims description 3
- 238000012986 modification Methods 0.000 claims description 3
- 230000004048 modification Effects 0.000 claims description 3
- 238000012546 transfer Methods 0.000 claims description 3
- 230000000694 effects Effects 0.000 abstract description 7
- 238000003672 processing method Methods 0.000 abstract 1
- 230000003068 static effect Effects 0.000 description 6
- 230000002950 deficient Effects 0.000 description 4
- 238000005242 forging Methods 0.000 description 4
- 238000010586 diagram Methods 0.000 description 3
- 238000004364 calculation method Methods 0.000 description 2
- 239000012467 final product Substances 0.000 description 2
- 125000004122 cyclic group Chemical group 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 238000004134 energy conservation Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000012795 verification Methods 0.000 description 1
Images
Landscapes
- Devices For Executing Special Programs (AREA)
- Stored Programmes (AREA)
Abstract
本发明实施例公开了一种动态链接库DLL文件的处理方法和装置,所述处理方法将包含有关键代码的DLL文件作为资源(具体为二进制资源)嵌入到应用程序中,所述DLL文件不再作为独立文件存在,而令破解者不能轻易定位所述关键代码及所述DLL文件的位置;同时,本发明不再直接使用LoadLibrary API函数加载所述DLL文件,整个加载过程以动态加载的方式进行,通过重定位DLL文件实际虚拟地址,并修改IAT表中的导入函数的入口地址,使得所述DLL文件中的导入函数的关键代码与所述导入函数实际所处的地址联系起来,建立动态链接,而令破解者难于判断实际加载所述DLL文件的时机和地址,实现了安全加载动态链接库DLL文件的技术效果。
Description
技术领域
本发明涉及软件维护技术领域,更具体地说,涉及一种动态链接库DLL文件的处理方法和装置。
背景技术
目前,正版软件需要有软件证书授权才能进行使用,如何保护正版软件不被破解者非法破解免费使用而损害软件供应商的利益,针对所述正版软件授权的管理至关重要。
现有的正版软件管理主要是针对具有保密效果的关键代码的管理,该种管理方式主要通过将关键代码以DLL独立的文件方式设于外部安全设备内,如硬件加密狗驱动中,或者设于网络远程证书服务器的API接口模块中,并通过静态链接或动态链接(调用API函数)加载所述DLL并调用其中函数,以进行软件后续进程。
然而,由于现有技术中的DLL文件以完整独立的文件形式存在,即使对这些DLL文件进行数字签名,且在加载DLL文件之前先对数字签名进行校验,仍可被破解者通过定位该独立文件的位置,并以静态调试的方法找到并替换数字签名所用的公钥,再伪造DLL的数字签名达到加载所述DLL文件的目的,从而破坏正版软件管理系统而免费使用该软件,影响了正版软件供应商的利益。
发明内容
有鉴于此,本发明提供一种动态链接库DLL文件的处理方法和装置,以实现将DLL文件以二进制方式嵌入到应用程序,并安全地动态加载该应用程序。
一种动态链接库DLL文件的处理方法,包括:
获取需加载应用程序中预先编译的二进制文件,该二进制文件由DLL文件封装而成;
将所述DLL文件导入内存,确定所述DLL文件的在所述内存中的实际虚拟地址;
修改地址表IAT中的导入函数的入口地址;
获取DLLMain入口函数的实际虚拟地址,调用所述入口函数完成对所述DLL文件的加载。
本实施方式将包含有关键代码的DLL文件作为资源嵌入到应用程序中,而不再作为独立文件存在,而令破解者不能轻易定位所述关键代码及所述DLL文件的位置;且该实施方式不再直接使用LoadLibrary API函数加载所述DLL文件,而令破解者难于判断实际加载所述DLL文件的时机和地址,从而实现了安全加载动态链接库DLL文件的技术效果。
优选地,所述方法还包括:计算DLL文件的CRC检验码,通过DES算法将包含有关键代码的DLL文件与对应的CRC校验码合并并加密后,输出至所述二进制文件。
为了安全起见,所述DLL文件与对应的CRC检验码合并并加密再嵌入至所述二进制文件,进一步增加了破解者定位所述所述关键代码及所述DLL文件的位置的难度。
优选地,所述获取需加载应用程序中预先编译的二进制文件具体为:
调用FindResource API函数获取所述DLL文件与对应的CRC校验码所在资源;
根据该资源调用LoadResource和LockResource API函数获得所述DLL文件与对应的CRC校验码的内存入口指针;
依据该内存入口指针获取所述加密后的DLL文件与对应的CRC校验码。
该实施方式的目的在于:在所述DLL文件与对应的CRC校验码加密的情况下,利用API函数释放所述DLL文件与所述CRC校验码,从而进行DLL文件的加载过程。
优选地,所述将DLL文件导入所述内存中具体为:通过调用VirtualAllocAPI函数分配与所述DLL文件对齐长度相等的内存,并返回所述DLL文件的内存基地址,该内存基地址存储于所述DLL文件的PE文件头中。
所述DLL文件以对齐方式存储于内存中,方便了动态寻址。
优选地,所述确定所述DLL文件的在所述内存中的实际虚拟地址包括:
从所述DLL文件的PE文件头读取所述DLL文件的基地址;
通过内存的起始地址减去所述DLL文件的基地址,得到地址偏移量;
从所述DLL文件的PE文件头中读取重定位表,遍历整个重定位表列举出其中需重新定位的入口地址;
通过所述需要重新定位的入口地址加上所述地址偏移量得到所述DLL文件的实际虚拟地址。
本实施方式为针对所述DLL文件的地址重定位过程,获得实际虚拟地址以便于导入函数的关键代码的调用。
优选地,所述修改地址表IAT中的导入函数的入口地址具体为:
读取所述PE文件头中的IAT表;
遍历所述IAT表中需导入DLL文件的文件名称;
调用GetModuleHandle API函数获得指向所述需导入的DLL文件的句柄;
以所述DLL文件的句柄和导入函数的名称为参数,调用GetProcAddressAPI函数获得所述导入函数的入口地址,并以所述导入函数的入口地址修改IAT表相应的条目。
以上实施方式是将IAT表的入口地址与所述导入函数在所述IAT表中的实际虚拟地址进行修改,从而使得所述DLL文件中的导入函数的关键代码与所述导入函数实际所处的地址联系起来,建立动态链接。
优选地,所述方法还包括:调用VirtualProtect API函数将所述内存中所述DLL文件的执行代码的节修改为PAGE_EXECUT_READWRITE属性。
修改所述DLL文件的执行代码属性使内存区域有不同的属性,确保包含执行代码的节能够被操作系统正确识别并执行。
优选地,所述获取DLLMain入口函数的实际虚拟地址,调用所述入口函数完成对所述DLL文件的加载具体为:
读取所述DLL文件的PE头文件,获取所述入口函数的相对地址;
将所述入口函数的相对地址与所述内存起始地址相加,得到所述入口函数的实际虚拟地址,根据所述入口函数的实际虚拟地址,以DLL_PROCESS_ATTACH参数调用该入口函数,完成加载。
一种动态链接库DLL文件的处理装置,包括:
编译单元,用于将DLL文件封装至二进制文件中,并将该二进制文件编译至应用程序中;
DLL文件提取单元,用于获取所述二进制文件中的DLL文件;
内存分配单元,用于将所述DLL文件导入内存;
地址确定单元,用于确定所述DLL文件在所述内存中的实际虚拟地址,并修改地址表IAT中的导入函数的入口地址;
入口函数调用单元,用于获取DLLMain入口函数的实际虚拟地址并调用所述入口函数完成对所述DLL文件的加载。
优选地,所述装置还包括:
所述编译单元具体为:加密编译单元,用于计算DLL文件的CRC检验码,通过DES算法将包含有关键代码的DLL文件与对应的CRC校验码合并并加密后,输出至所述二进制文件。
上述处理装置与动态链接库DLL的处理方法对应。
从上述的技术方案可以看出,本发明实施例将包含有关键代码的DLL文件作为资源(具体为二进制资源)嵌入到应用程序中,在加载应用程序时,释放所述DLL文件的内容,所述DLL文件不再作为独立文件存在,而令破解者不能轻易定位所述关键代码及所述DLL文件的位置;同时,本发明中,不再直接使用LoadLibrary API函数加载所述DLL文件,整个加载过程以动态加载的方式进行,通过重定位DLL文件实际虚拟地址,并修改IAT表中的导入函数的入口地址,从而调用所述DLL文件中的导入函数的关键代码与所述导入函数实际所处的地址联系起来,建立动态链接,而令破解者难于判断实际加载所述DLL文件的时机和地址。进一步地,所述DLL文件可与对应的CRC校验码同时嵌入应用程序,所述DLL文件以动态形式加载,克服了现有技术中破解者利用独立存在的DLL文件以静态调试及伪造数字签名的方式加载所述DLL文件的缺陷,实现了安全加载动态链接库DLL文件的技术效果。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1a为本发明实施例公开的一种动态链接库DLL文件的处理方法流程图;
图1b为本发明实施例公开的一种动态链接库DLL文件以对齐方式导入至内存的长度计算方法流程图;
图1c为本发明实施例公开的一种动态链接库DLL文件以对齐方式导入至内存中的布局结构示意图;
图2为本发明又一实施例公开的一种动态链接库DLL文件的处理方法流程图;
图3为本发明又一实施例公开的一种动态链接库DLL文件的处理方法流程图;
图4为本发明实施例公开的一种动态链接库DLL文件的处理装置结构示意图。
具体实施方式
为了引用和清楚起见,下文中使用的技术名词、简写或缩写总结如下:
CRC校验:Cyclic Redundancy Check,循环冗余校验码,是常用的一种差错校验方法;
DES:密码体制中的对称密码体制,是1972年美国IBM公司研制的对称密码体制加密算法。
API:Application Programming Interface,应用程序编程接口;
DLL:Dynamic Link Library,动态链接库,是包含可由多个程序同时使用的代码和数据的库;
PE:Portable Execute,文件的扩展名包括EXE、DLL、OCX等;
RVA:Relative Virtual Addresses,相对虚拟地址;
IAT:Import Address Table,导入地址表;
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明实施例公开了一种动态链接库DLL文件的处理方法和装置,以实现将DLL文件以二进制方式嵌入到应用程序,并安全地动态加载该应用程序。
图1a示出了一种动态链接库DLL文件的处理方法,包括:
步骤101:获取需加载应用程序中预先编译的二进制文件,该二进制文件由DLL文件封装而成;
在编译应用程序的执行文件(EXE文件)时,在该EXE文件的资源一节增加对于包含关键代码的DLL文件的引用,从而将所述DLL文件作为二进制资源嵌入到所述应用程序的EXE文件中。
步骤102:获取所述DLL文件内存入口指针;
加载应用程序启动后,根据所述二进制资源的ID在当前进程的资源中调用FindResource API函数查找DLL文件所在的资源,若没有找到指定资源ID对应的ID,则退出;
若查找成功,则调用LoadResource及LockResource API函数,并调用FreeResource释放对该资源的锁定,获得DLL文件所在资源的内存入口指针;
步骤103:根据所述内存指针,获取所述DLL文件,计算所述DLL文件的文件长度并以对齐方式将所述DLL文件导入至内存中;
图1b示出了所述DLL文件的导入至内存的长度计算方法,具体为:
步骤1031:从DLL内容中加载PE文件头,获得SelctionAligment字段,即对齐长度;
步骤1032:根据所述PE文件头的SizeOfHeaders字段,得到PE文头的实际长度;
步骤1033:判断所述实际长度是否能被整除,若可以整除,则进行步骤1034,否则将余数加1后进行所述步骤1033;
步骤1034:将整除值乘以对齐长度得到对齐后的PE文件头在内存中的实际长度
步骤1035:根据PE文件头中的NumberOfSections字段获得节的个数,然后循环处理每个节
步骤1036:读取节的头并获得该节的长度,将该长度除以对齐长度;
步骤1037:判断所述实际长度是否能被整除,若可以整除,则进行步骤1038,否则将余数加1后进行所述步骤1038;
步骤1038:将整除值乘以对齐长度得到对齐后的该节头在内存中的实际长度;
步骤1039:计算所述DLL文件中所有节的对齐后的长度;
步骤1040:将所述PE文件头的实际长度+对齐后所有节的长度总和,得到所述DLL文件以对齐方式导入内存所需长度。
图1c示出了本发明实施例公开的一种动态链接库DLL文件以对齐方式导入至内存中的布局结构。
步骤104:确定所述DLL文件的在所述内存中的实际虚拟地址;
从所述DLL文件的PE文件头读取所述DLL文件的基地址;
通过内存的起始地址减去所述DLL文件的基地址,得到地址偏移量;
从所述DLL文件的PE文件头中读取重定位表,遍历整个重定位表列举出其中需重新定位的入口地址;
通过所述需要重新定位的入口地址加上所述地址偏移量得到所述DLL文件的实际虚拟地址。
步骤105:修改地址表IAT中的导入函数的入口地址;
读取所述PE文件头中的IAT表;
遍历所述IAT表中需导入DLL文件的文件名称;
调用GetModuleHandle API函数获得指向所述需导入的DLL文件的句柄;
以所述DLL文件的句柄和导入函数的名称为参数,调用GetProcAddressAPI函数获得所述导入函数的入口地址,并以所述导入函数的入口地址修改IAT表相应的条目。
步骤106:调用VirtualProtect API函数将所述内存中所述DLL文件的执行代码的节修改为PAGE_EXECUT_READWRITE属性;
步骤107:获取DLLMain入口函数的实际虚拟地址,调用所述入口函数完成对所述DLL文件的加载;
读取所述DLL文件的PE头文件,获取所述入口函数的相对地址;
将所述入口函数的相对地址与所述内存起始地址相加,得到所述入口函数的实际虚拟地址,根据所述入口函数的实际虚拟地址,以DLL_PROCESS_ATTACH参数调用该入口函数,完成加载。
本实施例将包含有关键代码的DLL文件作为资源(具体为二进制资源)嵌入到应用程序中,在加载应用程序时,释放所述DLL文件的内容,所述DLL文件不再作为独立文件存在,而令破解者不能轻易定位所述关键代码及所述DLL文件的位置;
同时,本实施例中不再直接使用LoadLibrary API函数加载所述DLL文件,整个加载过程以动态加载的方式进行,通过重定位DLL文件实际虚拟地址,并修改IAT表中的导入函数的入口地址,所述DLL文件中的导入函数的关键代码与所述导入函数实际所处的地址联系起来,建立动态链接。而令破解者难于判断实际加载所述DLL文件的时机和地址,由于所述DLL文件从嵌入应用程序到动态加载,都未以独立文件的方式出现过,从而克服了现有技术中破解者利用独立存在的DLL文件以静态调试的方式加载所述DLL文件的缺陷,实现了安全加载动态链接库DLL文件的技术效果。
图2示出了又一种动态链接库DLL文件的处理方法,包括:
步骤201:获取需加载应用程序中预先编译的二进制文件,该二进制文件由DLL文件与对应的CRC校验码合并并加密后封装而成;
在编译应用程序的执行文件(EXE文件)之前,首先计算DLL文件的CRC校验码,使用DES算法将包含有关键代码的DLL文件与对应的CRC校验码合并并加密后,输出至所述二进制文件;并在编译所述应用程序的该EXE文件时,在该EXE文件的资源一节增加对所述二进制文件的引用,即可将加密后的DLL文件和对应的CRC校验码作为二进制资源嵌入到所述应用程序的EXE文件中。
步骤202:获取所述DLL文件与对应的CRC校验码所在资源的内存入口指针;
调用FindResource API函数获取所述DLL文件与对应的CRC校验码所在资源,若没有找到指定资源ID对应的资源则退出;
若查找成功,则根据该资源调用LoadResource和LockResource API函数,并调用FreeResource释放对该资源的锁定,获得所述DLL文件与对应的CRC校验码所在资源的内存入口指针;
步骤203:依据该内存入口指针获取所述加密后的DLL文件与对应的CRC校验码,利用DES算法解密后导入内存中;
使用CRC算法计算解密后的所述CRC校验码,如果破解者手动修改过加密的DLL的内容,则解密完成后CRC校验码将出现不匹配,即可判断所述DLL文件已被修改而结束加载进程;
计算所述DLL文件的导入至内存的长度的方法与上一实施例相同,可参见上一实施例的说明与图示;
步骤204:确定所述DLL文件的在所述内存中的实际虚拟地址;
步骤205:修改地址表IAT中的导入函数的入口地址;
步骤206:调用VirtualProtect API函数将所述内存中所述DLL文件的执行代码的节修改为PAGE_EXECUT_READWRITE属性;
步骤207:获取DLLMain入口函数的实际虚拟地址,调用所述入口函数完成对所述DLL文件的加载;
本实施例本实施例将包含有关键代码的DLL文件与对应的CRC校验码作为资源(具体为二进制资源)嵌入到应用程序中,在加载应用程序时,释放所述DLL文件的内容,所述DLL文件不再作为独立文件存在且是在进行加密后再嵌入的,则进一步增加了破解者定位所述关键代码及所述DLL文件的位置的难度;
同时,本实施例中不再直接使用LoadLibrary API函数加载所述DLL文件,是以直接将所述DLL文件在内存中动态加载的方式进行,而令破解者难于判断实际加载所述DLL文件的时机和地址,由于所述DLL文件从嵌入应用程序到动态加载,都未以独立文件的方式出现过,从而克服了现有技术中破解者利用独立存在的DLL文件以静态调试的方式及伪造数字签名的方式加载所述DLL文件的缺陷,实现了安全加载动态链接库DLL文件的技术效果;
同时,该方法简化了程序的发布,不再需要在发布应用程序时附带大量的DLL文件。
图3示出了又一种动态链接库DLL文件的处理方法,包括:
步骤301:获取需加载应用程序中预先编译的二进制文件,该二进制文件由DLL文件与对应的CRC校验码合并并加密后封装而成;
步骤302:获取所述DLL文件与对应的CRC校验码所在资源的内存入口指针;
步骤303:依据该内存入口指针获取所述加密后的DLL文件与对应的CRC校验码,利用DES算法解密后将所述DLL文件导入内存中;
步骤304:调用CreateFile API函数新建临时文件;
步骤305:将所述DLL文件写入所述新建临时文件中;
步骤306:调用LoadLibrary API函数并将所述新建临时文件的路径作为参数加载所述DLL文件。
上述实施例公开的所述动态链接库DLL文件的处理方法,将所述DLL文件嵌入到EXE文件中,由于该实施例在加载时将所述DLL文件写入到一个临时文件中,因此破解者难于发现实际DLL文件的内容,且该实施方式简单易行,兼容性好。
图4示出了一种动态链接库DLL文件的处理装置结构,包括:
编译单元401,用于将DLL文件封装至二进制文件中,并将该二进制文件编译至应用程序中;
DLL文件提取单元402,用于获取所述二进制文件中的DLL文件;
内存分配单元403,用于将所述DLL文件导入内存;
地址确定单元404,用于确定所述DLL文件在所述内存中的实际虚拟地址,并修改地址表IAT中的导入函数的入口地址;
入口函数调用单元405,用于获取DLLMain入口函数的实际虚拟地址并调用所述入口函数完成对所述DLL文件的加载。
需要说明的是,作为优选,在本实施例中,所述编译单元具体为:加密编译单元,用于计算DLL文件的CRC检验码,通过DES算法将包含有关键代码的DLL文件与对应的CRC校验码合并并加密后,输出至所述二进制文件。
上述处理装置与动态链接库DLL的处理方法对应。
综上所述:
本发明的实施例将包含有关键代码的DLL文件作为资源(具体为二进制资源)嵌入到应用程序中,在加载应用程序时,释放所述DLL文件的内容,所述DLL文件不再作为独立文件存在,而令破解者不能轻易定位所述关键代码及所述DLL文件的位置;同时,本发明中,不再直接使用LoadLibrary API函数加载所述DLL文件,整个加载过程以动态加载的方式进行,通过重定位DLL文件实际虚拟地址,并修改IAT表中的导入函数的入口地址,从而使得所述DLL文件中的导入函数的关键代码与所述导入函数实际所处的地址联系起来,建立动态链接,而令破解者难于判断实际加载所述DLL文件的时机和地址。进一步地,所述DLL文件可与对应的CRC校验码同时嵌入应用程序,所述DLL文件以动态形式加载,克服了现有技术中破解者利用独立存在的DLL文件以静态调试及伪造数字签名的方式加载所述DLL文件的缺陷,实现了安全加载动态链接库DLL文件的技术效果;
同时,所述该方法简化了程序的发布,不再需要在发布应用程序时附带大量的DLL文件;
本发明还同时公开了与所述方法对应的装置。
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
Claims (8)
1.一种动态链接库DLL文件的处理方法,其特征在于,包括:
获取需加载应用程序中预先编译的二进制文件,所述二进制文件由DLL文件与对应的CRC校验码合并加密后封装而成,包括:
计算DLL文件的CRC校验码,使用DES算法将包含有关键代码的DLL文件与对应的CRC校验码合并加密后封装,输出至所述二进制文件;
将所述DLL文件导入内存,确定所述DLL文件的在所述内存中的实际虚拟地址;
修改地址表IAT中的导入函数的入口地址;
获取DLLMain入口函数的实际虚拟地址,调用所述入口函数完成对所述DLL文件的加载。
2.根据权利要求1所述的方法,其特征在于,所述获取需加载应用程序中预先编译的二进制文件具体为:
调用FindResource API函数获取所述DLL文件与对应的CRC校验码所在资源;
根据该资源调用LoadResource和LockResource API函数获得所述DLL文件与对应的CRC校验码的所在资源的内存入口指针;
依据该内存入口指针获取所述加密后的DLL文件与对应的CRC校验码。
3.根据权利要求1所述的方法,其特征在于,所述将DLL文件导入所述内存中具体为:通过调用VirtualAlloc API函数分配与所述DLL文件对齐长度相等的内存,并返回所述DLL文件的内存基地址,该内存基地址存储于所述DLL文件的PE文件头中。
4.根据权利要求3所述的方法,其特征在于,所述确定所述DLL文件的在所述内存中的实际虚拟地址包括:
从所述DLL文件的PE文件头读取所述DLL文件的基地址;
通过内存的起始地址减去所述DLL文件的基地址,得到地址偏移量;
从所述DLL文件的PE文件头中读取重定位表,遍历整个重定位表列举出其中需重新定位的入口地址;
通过所述需要重新定位的入口地址加上所述地址偏移量得到所述DLL文件的实际虚拟地址。
5.根据权利要求1所述的方法,其特征在于,所述修改地址表IAT中的导入函数的入口地址具体为:
读取所述PE文件头中的IAT表;
遍历所述IAT表中需导入DLL文件的文件名称;
调用GetModuleHandle API函数获得指向所述需导入的DLL文件的句柄;
以所述DLL文件的句柄和导入函数的名称为参数,调用GetProcAddressAPI函数获得所述导入函数的入口地址,并以所述导入函数的入口地址修改IAT表相应的条目。
6.根据权利要求1所述的方法,其特征在于,还包括:调用VirtualProtectAPI函数将所述内存中所述DLL文件的执行代码的节的属性修改为PAGE_EXECUT_READWRITE。
7.根据权利要求6所述的方法,其特征在于,所述获取DLLMain入口函数的实际虚拟地址,调用所述入口函数完成对所述DLL文件的加载具体为:
读取所述DLL文件的PE头文件,获取所述入口函数的相对地址;
将所述入口函数的相对地址与所述内存起始地址相加,得到所述入口函数的实际虚拟地址,根据所述入口函数的实际虚拟地址,以DLL_PROCESS_ATTACH参数调用该入口函数,完成加载。
8.一种动态链接库DLL文件的处理装置,其特征在于,包括:
编译单元,用于计算DLL文件的CRC检验码,通过DES算法将包含有关键代码的DLL文件与对应的CRC校验码合并加密后封装,输出至二进制文件,并将该二进制文件编译至应用程序中;
DLL文件提取单元,用于获取所述二进制文件中的DLL文件;
内存分配单元,用于将所述DLL文件导入内存;
地址确定单元,用于确定所述DLL文件在所述内存中的实际虚拟地址,并修改地址表IAT中的导入函数的入口地址;
入口函数调用单元,用于获取DLLMain入口函数的实际虚拟地址并调用所述入口函数完成对所述DLL文件的加载。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201010253983A CN101908119B (zh) | 2010-08-12 | 2010-08-12 | 一种动态链接库dll文件的处理方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201010253983A CN101908119B (zh) | 2010-08-12 | 2010-08-12 | 一种动态链接库dll文件的处理方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101908119A CN101908119A (zh) | 2010-12-08 |
CN101908119B true CN101908119B (zh) | 2012-10-03 |
Family
ID=43263576
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201010253983A Active CN101908119B (zh) | 2010-08-12 | 2010-08-12 | 一种动态链接库dll文件的处理方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101908119B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107704376B (zh) * | 2016-08-11 | 2023-07-07 | 福建省天奕网络科技有限公司 | 游戏自动化测试方法及其系统 |
Families Citing this family (35)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102063597A (zh) * | 2010-12-29 | 2011-05-18 | 东莞市创锐电子技术有限公司 | 一种利用加密狗对软件进行鉴权的方法 |
CN102541567A (zh) * | 2012-01-05 | 2012-07-04 | 深圳市天拓立方通讯科技有限公司 | 一种2d手机游戏引擎及兼容手机操作系统的方法 |
CN102722403B (zh) * | 2012-05-30 | 2014-10-29 | 福建天晴数码有限公司 | 一种接管Windows桌面方法 |
CN102799815B (zh) * | 2012-06-29 | 2015-07-29 | 安科智慧城市技术(中国)有限公司 | 一种安全加载程序库的方法和装置 |
CN102999354B (zh) * | 2012-11-15 | 2015-12-02 | 北京奇虎科技有限公司 | 文件加载方法和装置 |
CN103077333B (zh) * | 2013-01-22 | 2016-01-20 | 北京理工大学 | 一种Linux系统下软件代码保护方法 |
CN103186730B (zh) * | 2013-03-26 | 2016-05-18 | 北京深思数盾科技股份有限公司 | 保护.net软件安全的方法和设备 |
CN104102500B (zh) * | 2013-04-03 | 2017-12-01 | 腾讯科技(深圳)有限公司 | 一种应用程序的进程启动方法及计算机系统 |
CN103413074B (zh) * | 2013-07-08 | 2016-03-16 | 北京深思数盾科技有限公司 | 一种通过api实现软件保护的方法和装置 |
CN103617135B (zh) * | 2013-11-26 | 2016-10-26 | 深圳市江波龙电子有限公司 | 一种存储设备中数据读取的方法及装置 |
CN105335432A (zh) * | 2014-08-11 | 2016-02-17 | 无锡华润微电子有限公司 | oracle数据库访问方法 |
CN104298932B (zh) * | 2014-10-27 | 2017-12-12 | 中国建设银行股份有限公司 | 一种so文件的调用方法及装置 |
CN104331308B (zh) * | 2014-10-30 | 2017-08-22 | 章立春 | 一种pe程序文件加载执行方法 |
CN104679561B (zh) * | 2015-02-15 | 2018-07-06 | 福建天晴数码有限公司 | 一种动态链接库文件加载的方法及系统 |
CN104731592B (zh) * | 2015-03-24 | 2017-12-15 | 无锡天脉聚源传媒科技有限公司 | 一种在应用程序中集成Bonjour服务的方法和装置 |
CN105426777B (zh) * | 2015-11-17 | 2018-09-21 | 中科创达软件股份有限公司 | 一种动态链接库文件加密、解密方法及装置 |
CN105867967A (zh) * | 2016-03-24 | 2016-08-17 | 北京金山安全软件有限公司 | 一种应用程序安装方法、装置及电子设备 |
CN107704279B (zh) * | 2016-08-08 | 2020-12-29 | 腾讯科技(深圳)有限公司 | 一种数据加载方法以及装置 |
CN106295402B (zh) * | 2016-08-16 | 2020-03-31 | 武汉斗鱼网络科技有限公司 | 一种dll文件的隐藏方法及系统 |
CN106295370B (zh) * | 2016-08-19 | 2020-02-28 | 北京奇虎科技有限公司 | 一种加固安装包的动态链接库dll文件的方法和装置 |
CN106339247A (zh) * | 2016-09-13 | 2017-01-18 | 武汉斗鱼网络科技有限公司 | 一种动态链接库文件的加载系统及加载方法 |
CN106681782B (zh) * | 2016-12-09 | 2019-12-24 | 北京奇虎科技有限公司 | 一种编译安卓安装包的动态链接库so文件的方法和装置 |
CN107092815A (zh) * | 2017-03-31 | 2017-08-25 | 武汉斗鱼网络科技有限公司 | 一种保护模块文件的方法及服务器 |
CN107196902A (zh) * | 2017-03-31 | 2017-09-22 | 武汉斗鱼网络科技有限公司 | 一种保护模块文件的方法及客户端 |
CN108255537A (zh) * | 2017-06-20 | 2018-07-06 | 广州华多网络科技有限公司 | 一种dll基地址优化方法、系统及应用程序加载方法、系统 |
CN107291513B (zh) * | 2017-07-04 | 2020-07-31 | 武汉斗鱼网络科技有限公司 | 文件加载方法及装置、计算机可读存储介质 |
CN109471671B (zh) * | 2017-09-06 | 2023-03-24 | 武汉斗鱼网络科技有限公司 | 一种程序冷启动方法和系统 |
CN108491237B (zh) * | 2018-03-29 | 2020-11-27 | 山东华软金盾软件股份有限公司 | 一种隐蔽的Dll文件注入方法 |
CN108628611B (zh) * | 2018-04-20 | 2022-02-01 | 无锡盈达聚力科技有限公司 | 一种数据调用方法及数据调用装置 |
CN109032605B (zh) * | 2018-07-05 | 2022-09-20 | 北京奇艺世纪科技有限公司 | 一种应用运行方法和装置 |
CN109086183B (zh) * | 2018-07-12 | 2022-08-16 | 武汉斗鱼网络科技有限公司 | 一种应用程序的监控方法、装置、电子设备及存储介质 |
CN109145638B (zh) * | 2018-07-20 | 2021-01-01 | 武汉斗鱼网络科技有限公司 | 一种获取自加载模块函数的方法及装置 |
CN110298175B (zh) * | 2019-07-05 | 2021-09-07 | 武汉斗鱼网络科技有限公司 | 一种dll文件的处理方法及相关装置 |
CN112434286A (zh) * | 2020-11-12 | 2021-03-02 | 浙江大华技术股份有限公司 | 动态库的调用方法、装置、电子装置和存储介质 |
WO2022151114A1 (zh) * | 2021-01-14 | 2022-07-21 | 王志平 | 一种软件动态链接的实现方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101154085A (zh) * | 2006-09-25 | 2008-04-02 | 夏普株式会社 | 显影剂回收装置及具有该显影剂回收装置的图像形成装置 |
CN101714075A (zh) * | 2009-12-17 | 2010-05-26 | 深圳市万兴软件有限公司 | 函数调用方法和装置 |
CN101719077A (zh) * | 2009-12-24 | 2010-06-02 | 北京飞天诚信科技有限公司 | 在.Net程序中注入代码的方法和装置 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6141698A (en) * | 1997-01-29 | 2000-10-31 | Network Commerce Inc. | Method and system for injecting new code into existing application code |
-
2010
- 2010-08-12 CN CN201010253983A patent/CN101908119B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101154085A (zh) * | 2006-09-25 | 2008-04-02 | 夏普株式会社 | 显影剂回收装置及具有该显影剂回收装置的图像形成装置 |
CN101714075A (zh) * | 2009-12-17 | 2010-05-26 | 深圳市万兴软件有限公司 | 函数调用方法和装置 |
CN101719077A (zh) * | 2009-12-24 | 2010-06-02 | 北京飞天诚信科技有限公司 | 在.Net程序中注入代码的方法和装置 |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107704376B (zh) * | 2016-08-11 | 2023-07-07 | 福建省天奕网络科技有限公司 | 游戏自动化测试方法及其系统 |
Also Published As
Publication number | Publication date |
---|---|
CN101908119A (zh) | 2010-12-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101908119B (zh) | 一种动态链接库dll文件的处理方法和装置 | |
CN105683990B (zh) | 用于保护动态库的方法和装置 | |
KR101471589B1 (ko) | 공통중간언어 기반 프로그램을 위한 보안 제공 방법 | |
CN102576391B (zh) | 嵌入在shell代码中的软件许可 | |
JP4073913B2 (ja) | 開放型汎用耐攻撃cpu及びその応用システム | |
WO2021217980A1 (zh) | java代码的加壳方法与系统 | |
CN104318135B (zh) | 一种基于可信执行环境的Java代码安全动态载入方法 | |
CN108363911B (zh) | 一种Python脚本混淆、水印的方法及装置 | |
CN108399319B (zh) | 源代码保护方法、应用服务器及计算机可读存储介质 | |
EP3127034A1 (en) | Software protection | |
CN112231702B (zh) | 应用保护方法、装置、设备及介质 | |
CN104268444A (zh) | 一种云OS Java源代码保护方法 | |
US20110271350A1 (en) | method for protecting software | |
CN106503494A (zh) | 一种带有片上闪存微控制器的固件保护单元及保护方法 | |
WO2020177430A1 (zh) | 应用加固的方法、装置、计算设备及计算机存储介质 | |
CN110119601B (zh) | 基于应用程序安装包的程序加固方法及装置 | |
CN108733990B (zh) | 一种基于区块链的文件保护方法及终端设备 | |
CN105447398A (zh) | 数据安全保护方法及装置 | |
CN113642020B (zh) | 配置文件的动态加密方法、装置、电子设备及存储介质 | |
CN106295263A (zh) | 一种实现应用加固的方法及装置 | |
Gautam et al. | A novel software protection approach for code obfuscation to enhance software security | |
CN202870831U (zh) | 一种新型计算机及联网认证系统 | |
CN111291333A (zh) | 一种Java应用程序加密方法及装置 | |
CN108667594B (zh) | 一种基于pki公钥算法的软件程序模块完整性检测方法 | |
CN102087689B (zh) | 一种软件重用模块的保护方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |