作为代码执行数据?

Tam*_*lei 5 c++ windows assembly loader

我的客户要求我编写一个自定义加密可执行文件,以防止许可系统轻易破解.现在,我明白这是一种虚假的安全感,但尽管如此,他仍然坚持这一点.

所以,我挖掘了我对可移植可执行文件的了解,并提出了这个想法:

  • 加密可执行文件
  • 将它粘贴到加载程序可执行文件的末尾以及它的大小
  • 加载程序解密数据
  • 它将代码复制到使用具有可执行权限的VirtualAlloc分配的页面
  • 它找到了应用程序的入口点
  • 跳到那里,我们都准备好了.

跳到那里我有一个问题.我怎样才能做到这一点?如果我要设置一个函数指针,那么签名是什么?加载的可执行文件的main()函数的签名?或者我需要求助于集会吗?

我知道在加载代码后可能需要更正绝对地址.如何检查是否需要,以及如何实际执行此操作?

编辑:在Windows上工作并使用GCC进行编译.如有必要,我可以切换Microsoft编译器.

编辑2:澄清:我知道它几乎没有意义.我认为这代表任何类型的DRM.这取决于我的客户决定,尽管我警告他,但他仍然想要这个.

提前致谢.

Mar*_*n B 11

不幸的是,跳到代码的入口点是您最不担心的问题.一个可移植可执行(PE)文件(该文件是用于在Windows上的EXE和DLL文件的文件格式)是不是你可以加载到一个内存块,然后运行.您的自定义PE加载程序必须处理以下作业:

  • 将PE文件中的各种代码和数据部分加载到单独的内存块中.

  • 解析导入表中的依赖项以加载EXE所依赖的DLL.

  • 执行重定位.

获得所有细节可能是一项非常复杂的工作.我建议您寻找可以购买的工具来进行这种EXE加密.

编辑:谷歌快速建议您可能需要查看以下内容:

  • EXECryptor(专有)

  • RLPack(专有)

  • UPX(GPL)这个只根据我的理解进行压缩,但你可以使用Source来添加加密(如果GPL与你的需求兼容).

肯定会有更多这样的工具 - 这只是快速搜索的结果.

另一个编辑:

MSDN杂志刊登了一篇由Matt Pietrek撰写的文章,名为"深入研究Win32可移植可执行文件格式"(第1 部分,第2部分).它包含有关PE文件格式的大量信息,对您有用.一个有趣的信息:默认情况下,最新版本的Microsoft链接器似乎省略了EXE的基本重定位.您可能希望指示链接器将这些重新放入,因为您的包装EXE可能已经加载到您的有效负载EXE的首选加载地址.或者,您可以尝试为您的包装器EXE提供一个特殊的首选加载地址,希望它不会干扰有效负载EXE.

我还找到了一个讨论基本PE文件压缩器的页面.它看起来并不完全通用,可能需要一些额外的工作才能使用它.


bdo*_*lan 4

正如其他人所提到的,简单地将整个 EXE 加载到数据部分并在运行时链接它是一项艰巨的任务;但是,还有另一种选择。

获取您的输入 EXE;找到它的代码和初始化数据(包括常量)部分。重命名这些节并将它们全部转换为可读写的初始化数据节;加密内容。现在添加一个包含解密存根的新代码段,并更改其中的入口点。该存根应该就地解密段,然后将其保护更改为适合其类型的任何内容,并跳转到原始入口点。

这避免了必须实现完整 PE 加载器的所有功能,因为导入表未加密,因此普通 Windows 加载器将为您处理它们。

当然,应该指出的是,这种幼稚的方法在任何时候都无法在协同攻击中幸存——攻击者可以简单地转储进程的内存来获取原始的解密代码。为了避免这种情况,可能需要持续加密和解密代码,此时 PE 处理是您最不关心的问题。