制作自定义自提取器

时间:2011-02-17 21:08:17

标签: c++ sdk compression 7zip lzma

我会解释我想要的东西,然后我将解释我是如何努力实现它的。我想知道我是否正确地对待这个问题,或者是否有更容易的事情。

我想要的是什么:一个自解压的可执行文件也会有一个额外的入口点(这使得可执行文件可以像DLL一样使用)。附加入口点必须是压缩有效负载的一部分。奇怪的是,切入点不会执行任何LZMA功能(请不要问为什么......长篇故事)。仅供参考:使用DLL入口点制作可执行文件是一件小事 - 我已经知道如何做到这一点。

我是如何追求这个:我已经下载了LZMA SDK并将构建我自己的C ++自提取器。似乎没有LZMA API文档。显然,如果我想学习如何使用LZMA,我必须阅读。\ C \ util \ 7z \ 7zmain.c或。\ cpp \ 7zip \ bundles \ lzmaCon \ lzmaAlone.cpp。我不知道研究这些是否是最快的学习工具。

一旦我创建了自解压代码,那么我将添加我需要的DLL入口点并构建。生成的EXE自提取器我将与一个zip文件连接(一个DOS命令应该足以连接这两个文件)。这应该达到我的目标。

思想?

P.S。顺便说一句,这部分年前我已经部分完成了。我创建了一个自我提取器(我认为是C#)可执行文件,然后我用一个zip文件(通过DOS命令)连接起来。 Voila,一个自解压缩的zip可执行文件出现了。是什么让我目前的努力与众不同,现在我正在使用C ++,我需要这个额外的/任意的DLL入口点。

3 个答案:

答案 0 :(得分:0)

为什么要将两种功能结合在一起?你为什么不制作一个dll和一个使用它的可执行文件。

答案 1 :(得分:0)

您可以查看NSIS如何创建LZMA自动提取器。然后你可以使用DLL入口点扩展它。

或许您可以使用NSIS脚本生成自解压程序并使用其脚本语言来创建DLL条目。

答案 2 :(得分:0)

对于.exe中的导出函数,显然不是问题, 我试过这个并且它工作了(使用/ FIXED:NO链接器选项编译, 然后将可执行文件复制到2.exe,然后尝试运行原始可执行文件和2.exe)

#include <stdio.h>
#include <windows.h>

//#pragma comment(linker,"/FIXED:NO")

extern "C"
__declspec(dllexport)
void __cdecl func( void ) {
  int a;
  __asm {
    call m0
    m0: pop a
  }
  printf( "dll func! @ %08X\n", a );
}

typedef void (*__cdecl pfunc)( void );

int main( void ) {

  HMODULE h = LoadLibrary( "2.exe" );
  printf( "h=%08X\n", h );

  void* p = GetProcAddress( h, "func" );
  printf( "p=%08X\n", p );

  pfunc f = pfunc(p);
  f();

}

至于lzma,它的问题就更少了,如果原始来源看起来太复杂,请试着看http://nishi.dreamhosters.com/u/lzma.rar (lzmadec.c)

我不太明白附加一个zip文件的想法...你的意思是.zipx 用lzma压缩?或者你真的需要看看zlib?