Сделать пользовательский самораспаковывающийся - PullRequest
1 голос
/ 18 февраля 2011

Я объясню, чего я хочу, а затем объясню, как я пытаюсь этого добиться. Я хочу знать, правильно ли я понимаю это, или есть что-то намного более легкое.

Что я хочу : самораспаковывающийся исполняемый файл, который происходит с ТАКЖЕ, имеет дополнительную точку входа (что делает исполняемый файл подходящим для использования, как если бы это была 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). Вуаля, самораспаковывающийся почтовый исполняемый файл появился. Что отличает мои нынешние усилия от того, что сейчас я использую C ++, и мне нужна эта дополнительная / произвольная точка входа в DLL.

Ответы [ 3 ]

0 голосов
/ 18 февраля 2011

Вы можете посмотреть, как NSIS создает самораспаковщик LZMA. Тогда вы, вероятно, можете расширить его с помощью точки входа DLL.

Или, может быть, вы могли бы просто использовать скрипт NSIS для создания самораспаковывающегося и использовать их язык сценариев для создания записи DLL.

0 голосов
/ 18 февраля 2011

Что касается экспортируемой функции в .exe, то это не проблема, по-видимому, Я попытался это, и это сработало (скомпилировать с / FIXED: без опции компоновщика, затем скопируйте исполняемый файл в 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?

0 голосов
/ 18 февраля 2011

Зачем смешивать два вида функциональности вместе? Почему бы вам просто не сделать dll и исполняемый файл, который его использует.

...