开发笔记:如何对【动态链接库】文件进行加密保护?

系统 Linux
因为目前我只在Windows平台上有这个需求,这个方法相当于重写了一套动态库加载函数。那么,在Linux系统上如果也存在类似的需求,是否也有类似的:从内存缓冲区加载动态库的实现?

问题描述

昨天,因产品需求,需要在Windows操作系统下写一个小工具。

这个小工具中调用一个比较重要的DLL动态库文件,来完成一些重要的功能。

一般来说,最直接的做法就是调用Win32 API函数,来动态的加载、获取函数地址、释放:

  • LoadLibrary(...);
  • GetProcAddress(...);
  • FreeLibrary(...);

但是,由于这个动态库比较重要,如果直接把DLL文件放在文件目录中,就增加了文件被反编译的风险。

也就是说为了提高DLL文件的安全性,最好不要让用户看到/拿到文件;

即使拿到了文件,也不要让用户很容易的破解文件。

问题解决

关于分析过程就不多说了,这里直接给出目前的处理方式:

1.写一个小工具软件,对 DLL 文件进行加密

使用了AES对称加密算法,主要是为了管理秘钥简单。

图片

加密后的文件liba_enc.png与可执行文件放在一起。

此时,如果用户获取到了这个动态库,由于没有秘钥,理论上是无法解开这个文件的。

不过,道高一尺魔高一丈。。。

2.修改应用程序,对加密的 DLL 文件进行解密

这个动态库最终肯定是要被加载到应用程序的内存空间中被使用的,因此在被加载之前,需要被使用者(也就是应用程序)解密。

那么,应该解密到哪里呢?

用来加载动态库的API​函数LoadLibrary(),需要的参数是文件的路径。

也就是说:必须要把一个动态库文件的路径传递给该函数,才可以被正确的加载到内存中。

假如是在Linux​系统中,可以解压到/tmp临时文件系统中。

在动态库使用期间文件一直存在;一旦使用结束就立刻删除掉。

但是在Windows系统中没有临时文件系统之说。

即使存在类似的临时文件空间,即使该DLL文件的使用周期非常短,仍然存在暴露给用户的可能性。

只要用户有机会能够看到这个解密后的文件,就有方法把它dump出来,然后进行反编译...

图片

3.把加密的 DLL 文件解密到内存缓冲区中

目前,能想到的最好的方法就是:先把加密的DLL​文件解压到一块空闲的内存缓冲区中(比如:从堆空间中malloc出来的一块空间),然后再按照动态库的加载流程从这块缓冲区中读取字节流,加载到动态库所属的代码空间中。

刚才说过,LoadLibrary(...)函数只能接受文件路径作为参数,我们不能把缓冲区的首地址传给它,因此需要使用其它方式来加载。

刚好,在github​上看到这样一个开源C代码:

图片

图中描述的功能正是我所需要的,简直是量身定做:

  • 先把 DLL 文件读取到一个缓冲区中;
  • 再从缓冲区中加载动态库的内容;

只需要一个头文件MemoryModule.h​和一个C​文件:MemoryModule.c,提供的函数也足够简单:

HMEMORYMODULE MemoryLoadLibrary(const void *, size_t);

FARPROC MemoryGetProcAddress(HMEMORYMODULE, LPCSTR);

void MemoryFreeLibrary(HMEMORYMODULE);

与Win32​提供的3个函数在语义上是对应的,唯一的区别是加载函数传入的参数是:缓冲区的地址和长度。

经过测试证明:这个方法工作的很好,很完美的解决了我的问题!

4. Linux 操作系统怎么办?

因为目前我只在Windows平台上有这个需求,这个方法相当于重写了一套动态库加载函数。

那么,在Linux系统上如果也存在类似的需求,是否也有类似的:从内存缓冲区加载动态库的实现?

我目前还没有发现类似的代码,如果您知道的话,不妨在留言中分享一下?灰常感谢!

责任编辑:武晓燕 来源: IOT物联网小镇
相关推荐

2011-06-21 18:02:14

Qt 动态 链接库

2009-10-29 16:36:49

VB.NET .DLL

2013-03-02 18:00:38

软件加密软件授权WinLicense

2009-08-28 16:19:30

C#实现修改动态链接库

2012-05-04 08:24:14

LinuxUnix

2012-05-08 14:48:23

LinuxUnix动态链接库

2022-06-09 09:54:45

编译软件开发

2023-11-29 08:31:20

PythonRust

2022-05-03 23:44:21

Python动态链接库Ctypes

2009-07-07 20:57:20

LinuxUnix动态链接库

2024-03-01 20:59:11

C#DLL开发

2009-08-05 16:29:18

C#调用C++动态链接

2023-05-09 08:24:11

JNA链接库代码

2011-05-18 17:15:45

2022-10-24 00:03:21

动态链接库DLL

2013-09-12 12:55:53

iOS开发

2021-11-11 17:36:07

鸿蒙HarmonyOS应用

2009-02-02 17:21:58

日志文件维护MySQL日志文件

2010-05-26 18:43:42

SVN库

2022-07-12 13:23:59

静态链接库可执行文件C 目标文件
点赞
收藏

51CTO技术栈公众号