UPX 1.24w NotCompressibleException (MS VC++ .NET Pro)
От: RealSQUALL Украина  
Дата: 04.09.05 11:34
Оценка:
#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

BOOL WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    const char sAppName[] = "Application Name";
    const char sCaptName[] = "Window Caption";
    WNDCLASSEX wclass;

    wclass.cbClsExtra = 0;
    wclass.cbSize = sizeof(wclass);
    wclass.cbWndExtra = 0;
    wclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wclass.hInstance = hInstance;
    wclass.lpfnWndProc = WndProc;
    wclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    wclass.style = CS_HREDRAW | CS_VREDRAW;
    wclass.lpszMenuName = NULL;
    wclass.lpszClassName = sAppName;

    RegisterClassEx(&wclass);

    HWND hwnd = CreateWindow(sAppName, sCaptName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);

    MSG msg;
    while(GetMessage(&msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    RECT rect;

    switch(iMsg)
    {
    case WM_PAINT:
        hdc = BeginPaint(hwnd, &ps);
        GetClientRect(hwnd, &rect);
        DrawText(hdc, "Wow! I'm here!!!", -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
        EndPaint(hwnd, &ps);
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }

    return DefWindowProc(hwnd, iMsg, wParam, lParam);
}


Из этого (ИМХО программа тривиальнее почти некуда) MS VC++ .NET Pro делает EXE, размером 23Кб (при конфигурации "Release").


upx124w\upx.exe -9 program.exe
... upx: program.exe: CantPackException: file is possibly packed/protected (try --force) ...

upx124w\upx.exe -9f program.exe
.. upx: program.exe: NotCompressibleException ...



В то же время ASPack 2.12 со свистом превращает его в 17.5Кб execuable.

Вопрос. Хочу сжимать UPX'ом (к нему больше доверия). Как это можно сделать? (скажу, что такой-же текст, собраный MS VC++ 4 жмётся "на ура").
Re: UPX 1.24w NotCompressibleException (MS VC++ .NET Pro)
От: adontz Грузия http://adontz.wordpress.com/
Дата: 04.09.05 11:52
Оценка:
Здравствуйте, RealSQUALL, Вы писали:

RSQ>Вопрос. Хочу сжимать UPX'ом (к нему больше доверия). Как это можно сделать? (скажу, что такой-же текст, собраный MS VC++ 4 жмётся "на ура").


Указывай --force. Судя по документации это не ошибка, а предупреждение, что при упаковке некоторые метаданные PE могут ыть потеряны. Собственно у меня проблем при использовании --force никогда не возникало.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: UPX 1.24w NotCompressibleException (MS VC++ .NET Pro)
От: gear nuke  
Дата: 04.09.05 12:08
Оценка:
Здравствуйте, RealSQUALL, Вы писали:

[nuked]

RSQ>Из этого (ИМХО программа тривиальнее почти некуда) MS VC++ .NET Pro делает EXE, размером 23Кб (при конфигурации "Release").


Вот чуть исправленный вариант:
#include <windows.h>

#pragma comment(linker, "/subsystem:windows")
#pragma comment(linker, "/entry:myMain")

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

BOOL WINAPI myMain()//HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    HINSTANCE hInstance = (HINSTANCE)0x400000;
        
    const char sAppName[] = "Application Name";
    const char sCaptName[] = "Window Caption";
    WNDCLASSEX wclass;

    wclass.cbClsExtra = 0;
    wclass.cbSize = sizeof(wclass);
    wclass.cbWndExtra = 0;
    wclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wclass.hInstance = hInstance;
    wclass.lpfnWndProc = WndProc;
    wclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    wclass.style = CS_HREDRAW | CS_VREDRAW;
    wclass.lpszMenuName = NULL;
    wclass.lpszClassName = sAppName;

    RegisterClassEx(&wclass);

    HWND hwnd = CreateWindow(sAppName, sCaptName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, SW_SHOWDEFAULT/*nCmdShow*/);

    MSG msg;
    while(GetMessage(&msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    RECT rect;

    switch(iMsg)
    {
    case WM_PAINT:
        hdc = BeginPaint(hwnd, &ps);
        GetClientRect(hwnd, &rect);
        DrawText(hdc, "Wow! I'm here!!!", -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
        EndPaint(hwnd, &ps);
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }

    return DefWindowProc(hwnd, iMsg, wParam, lParam);
}

Если не шаманить с объединением секций, получаем exe 2Kb.

RSQ>
upx124w\upx.exe -9 program.exe

RSQ>... upx: program.exe: CantPackException: file is possibly packed/protected (try --force) ...

RSQ>upx124w\upx.exe -9f program.exe

RSQ>.. upx: program.exe: NotCompressibleException ...
RSQ>


RSQ>В то же время ASPack 2.12 со свистом превращает его в 17.5Кб execuable.


Есть ещё куча других пакеров — FSG, PeX, ...

RSQ>Вопрос. Хочу сжимать UPX'ом (к нему больше доверия).


Лучше не использовать пакеры. Некоторые файерволлы начинают ругаться при скачивании таких файлов .

RSQ>Как это можно сделать? (скажу, что такой-же текст, собраный MS VC++ 4 жмётся "на ура").


Обнулить поле LOAD CONFIGURATION Table в IMAGE_OPTIONAL_HEADER (найти его можно с помощью PEview) или использовать способ, предложенный adontz.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[2]: UPX 1.24w NotCompressibleException (MS VC++ .NET Pro
От: RealSQUALL Украина  
Дата: 04.09.05 13:32
Оценка:
Собрал. Получил 10Кб — WoW! И не думал, что студия на такое способна.

#pragma comment(linker, "/subsystem:windows")

Тут ты указываешь компилятору, что приложению не надо консоли (отсюда отпадает необходимость в 3м параметре WinMain()), т.к. оно само создаст всё для себя необходимое. И даёшь студии (или ОС) возможность не ломать себе голову и не искать WinMain(), а сразу работать таким образом.

#pragma comment(linker, "/entry:myMain")

Эта директива говорит, что точкой входа в программу теперь будет не функция WinMain(), а функция myMain(). Тоесть ОС теперь будет вызывать не WinMain, а myMain (куда только денется три параметра — )
BOOL WINAPI myMain()

Таким образом HINSTANCE hInstance оказывается недоступным, и поэтому ты делаешь
HINSTANCE hInstance = (HINSTANCE)0x400000;

Вот тут у меня ещё один вопрос. Как я думал, при запуске приложения ОС создаёт ему уникальный номер, который будет "номером процесса" и передаёт его через WinMain. Ты же, здесь, отбрасываешь этот вариант и сам указываешь номер процесса. Тоесть приложение запустилось, ему присвоился номер (??? ???) и теперь ты говоришь "нет, предидущий номер нафик — использовать мой".

Параметр int nCmdShow тоже можно не необходим (всё равно либо 1 либо, реже, 7) — ты использовал SW_SHOWDEFAULT.

Ну а теперь я не понимаю — куда сократилось 16Кб? Если только и всего — было указано, что приложению не нужно консоли и немного подрихтована WinMain().
Re[3]: UPX 1.24w NotCompressibleException (MS VC++ .NET Pro
От: adontz Грузия http://adontz.wordpress.com/
Дата: 04.09.05 13:45
Оценка:
Здравствуйте, RealSQUALL, Вы писали:

RSQ>Собрал. Получил 10Кб — WoW! И не думал, что студия на такое способна.


Дело в том, что ты только что избавился от CRT. У глобальных переменных больше не вызываются конструкторы, Си+ исключения не работают. Вобщем проблем больше, чем пользы.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[3]: UPX 1.24w NotCompressibleException (MS VC++ .NET Pro
От: gear nuke  
Дата: 04.09.05 14:04
Оценка:
Здравствуйте, RealSQUALL, Вы писали:

RSQ>Собрал. Получил 10Кб — WoW!


У меня получилось 2Kb.
Компилировал так:
cl u.cpp kernel32.lib user32.lib gdi32.lib

Попробуйте добавить ключ линкера /opt:nowin98
cl u.cpp kernel32.lib user32.lib gdi32.lib /link /opt:nowin98

RSQ>И не думал, что студия на такое способна.


Можно и полтора килобайта, если объеденить секции PE файла:
#pragma comment(linker, "/merge:.rdata=.text")

Хорошая статья по теме: Анатомия C Run-Time, или Как сделать программу немного меньшего размера
Автор(ы): Виталий Брусенцев
Дата: 19.01.02
Статья посвящена вопросам оптимизации размера выполняемых модулей, генерируемых различными
компиляторами C++ (основное внимание уделено MS Visual С++). С этой целью рассматриваются особенности Библиотеки исполнения C/C++ и ее реализаций, а также процессы компиляции и компоновки приложений. Приведены практические приемы, позволяющие в ряде случаев уменьшить размер приложения до величины 3-4 килобайта.


RSQ>
RSQ>#pragma comment(linker, "/subsystem:windows")

RSQ>Тут ты указываешь компилятору, что приложению не надо консоли (отсюда отпадает необходимость в 3м параметре WinMain()), т.к. оно само создаст всё для себя необходимое. И даёшь студии (или ОС) возможность не ломать себе голову и не искать WinMain(), а сразу работать таким образом.

Единственная цель прагмы — установить в заголовке PE файла флаг IMAGE_SUBSYSTEM_WINDOWS_GUI. Если прагму не указать, то линкер не будет знать, какой флаг нужно устанавливать. (Есть ещё IMAGE_SUBSYSTEM_WINDOWS_CUI — консольное приложение, и другие).

RSQ>
RSQ>#pragma comment(linker, "/entry:myMain")

RSQ>Эта директива говорит, что точкой входа в программу теперь будет не функция WinMain(), а функция myMain(). Тоесть ОС теперь будет вызывать не WinMain, а myMain (куда только денется три параметра — )

Почти так. Только в случае с WinMain точкой входа будет функция из CRT, которая передаёт параметры в WinMain. Поскольку точка входа переопределена, то параметров нет, и если они нужны, их нужно получать самостоятельно.

RSQ>
RSQ>BOOL WINAPI myMain()

RSQ>Таким образом HINSTANCE hInstance оказывается недоступным, и поэтому ты делаешь
RSQ>
RSQ>HINSTANCE hInstance = (HINSTANCE)0x400000;

Верно.

RSQ>Вот тут у меня ещё один вопрос. Как я думал, при запуске приложения ОС создаёт ему уникальный номер, который будет "номером процесса" и передаёт его через WinMain. Ты же, здесь, отбрасываешь этот вариант и сам указываешь номер процесса. Тоесть приложение запустилось, ему присвоился номер (??? ???) и теперь ты говоришь "нет, предидущий номер нафик — использовать мой".


hInstance — это анахронизм времён windows 3.1. В 32х разрядных ОС hInstance равен адресу загрузки файла. Для exe он по умолчанию равен 0x400000 (можно изменить указав линкеру ключ /BASE:xxxxx)

RSQ>Параметр int nCmdShow тоже можно не необходим (всё равно либо 1 либо, реже, 7) — ты использовал SW_SHOWDEFAULT.


RSQ>Ну а теперь я не понимаю — куда сократилось 16Кб? Если только и всего — было указано, что приложению не нужно консоли и немного подрихтована WinMain().


Исчезла куча ненужного для данного приложения кода из библиотеки libc.lib.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[3]: UPX 1.24w NotCompressibleException (MS VC++ .NET Pro
От: RealSQUALL Украина  
Дата: 04.09.05 14:08
Оценка:
Хех — чудеса в решете.

После
#pragma comment(linker, "/entry:WinMain")

EXE-шник становится меньше. Но тогда программа запускается, появляется в процессах и дальше ничего.

Тоесть теперь параметры WinMain не работают. Значит
#pragma comment(linker, "/subsystem:windows")

BOOL WINAPI WinMain(
    HINSTANCE hInstance, // указывается явно
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, // отменяется стоЯщей выше прагмой
    int nCmdShow // указывается явно
)


Тогда получается, что освобождая ОС от поиска start point'a в программе экономится 16Кб исп. файла
Re[4]: UPX 1.24w NotCompressibleException (MS VC++ .NET Pro
От: adontz Грузия http://adontz.wordpress.com/
Дата: 04.09.05 14:09
Оценка: 4 (1)
Здравствуйте, gear nuke, Вы писали:

GN>hInstance — это анахронизм времён windows 3.1. В 32х разрядных ОС hInstance равен адресу загрузки файла. Для exe он по умолчанию равен 0x400000 (можно изменить указав линкеру ключ /BASE:xxxxx)


Это нигде не документированно. Надо пользоваться GetModuleHandle(NULL) для EXE и первым параметром DllMain для DLL
Кроме того менять имя стандартной точки входа не объязательно. По умолчанию это

__declspec(noreturn) extern "C" void __cdecl WinMainCRTStartup()
__declspec(noreturn) extern "C" void __cdecl mainCRTStartup()
extern "C" BOOL WINAPI _DllMainCRTStartup(HANDLE hDllHandle, DWORD reason, LPVOID)

Уже нельзя делать return msg.wParam, надо ExitProcess(msg.wParam);

И по поводу "кучи ненужного кода" — не согласен.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[4]: UPX 1.24w NotCompressibleException (MS VC++ .NET Pro
От: gear nuke  
Дата: 04.09.05 14:11
Оценка:
Здравствуйте, adontz, Вы писали:

RSQ>>Собрал. Получил 10Кб — WoW! И не думал, что студия на такое способна.


A>Дело в том, что ты только что избавился от CRT. У глобальных переменных больше не вызываются конструкторы, Си+ исключения не работают. Вобщем проблем больше, чем пользы.


Это всё верно, но для данного случая не важно . Кроме того, __try __except всё равно будет работать, что в некоторых случаях достаточно. Форум же по WinAPI, а не С++ .
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[4]: UPX 1.24w NotCompressibleException (MS VC++ .NET Pro
От: adontz Грузия http://adontz.wordpress.com/
Дата: 04.09.05 14:11
Оценка:
Здравствуйте, RealSQUALL, Вы писали:

RSQ>Тогда получается, что освобождая ОС от поиска start point'a в программе экономится 16Кб исп. файла


OS и так ничего не ищет — адрес точки входа указан в заголовке EXE файла. Просто в обычной программе WinMain это не entry point. Вызывается _WinMainCRTStartUp которая подготавливает много чего и уже потом вызывает WinMain.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[5]: UPX 1.24w NotCompressibleException (MS VC++ .NET Pro
От: adontz Грузия http://adontz.wordpress.com/
Дата: 04.09.05 14:15
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Это всё верно, но для данного случая не важно . Кроме того, __try __except всё равно будет работать, что в некоторых случаях достаточно. Форум же по WinAPI, а не С++ .


Ну Hello World и на ассемблере можно написать
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[5]: UPX 1.24w NotCompressibleException (MS VC++ .NET Pro
От: gear nuke  
Дата: 04.09.05 14:25
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, gear nuke, Вы писали:


GN>>hInstance — это анахронизм времён windows 3.1. В 32х разрядных ОС hInstance равен адресу загрузки файла. Для exe он по умолчанию равен 0x400000 (можно изменить указав линкеру ключ /BASE:xxxxx)


A>Это нигде не документированно.


А как же:

The /BASE option sets a base address for the program, overriding the default location for an .exe file (at 0x400000)


A>Надо пользоваться GetModuleHandle(NULL) для EXE и первым параметром DllMain для DLL


Я бы заменил слово "надо" на "правильнее". Для dll тоже есть альтернативный способ — взять адрес любой функции или статической переменной, расположенной в первых (0x100000 — размер PE заголовка) байтах файла, и сделать с ним операцию & 0xfff00000. Релоки сделают всю остальную работу при загрузке файла . Правда, тут польза сомнительна, разве что для вирей каких-то.

A>Кроме того менять имя стандартной точки входа не объязательно. По умолчанию это


A>__declspec(noreturn) extern "C" void __cdecl WinMainCRTStartup()

A>__declspec(noreturn) extern "C" void __cdecl mainCRTStartup()
A>extern "C" BOOL WINAPI _DllMainCRTStartup(HANDLE hDllHandle, DWORD reason, LPVOID)

Писанины больше .

A>Уже нельзя делать return msg.wParam, надо ExitProcess(msg.wParam);


Можно. В стеке лежит адрес возврата в kernel32.dll.

A>И по поводу "кучи ненужного кода" — не согласен.


Применительно к данной программе он не нужен.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[6]: UPX 1.24w NotCompressibleException (MS VC++ .NET Pro
От: adontz Грузия http://adontz.wordpress.com/
Дата: 04.09.05 14:28
Оценка:
Здравствуйте, gear nuke, Вы писали:

A>>Это нигде не документированно.

GN>А как же:

The /BASE option sets a base address for the program, overriding the default location for an .exe file (at 0x400000)


Тfк в том-то всё и дело, что default. Нигде не написано, что base address of EXE file always is 0x400000.

A>>Уже нельзя делать return msg.wParam, надо ExitProcess(msg.wParam);

GN>Можно. В стеке лежит адрес возврата в kernel32.dll.

Это не одно и то же. return завершит главный поток, но не приложение.

A>>И по поводу "кучи ненужного кода" — не согласен.

GN>Применительно к данной программе он не нужен.

И она никогда не вырастет?
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[6]: UPX 1.24w NotCompressibleException (MS VC++ .NET Pro
От: gear nuke  
Дата: 04.09.05 14:34
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, gear nuke, Вы писали:


GN>>Это всё верно, но для данного случая не важно . Кроме того, __try __except всё равно будет работать, что в некоторых случаях достаточно. Форум же по WinAPI, а не С++ .


A>Ну Hello World и на ассемблере можно написать


В случае Hello World никакого выигрыша от использования ассемблера не будет, в отличае от более сложных проектов . Другое дело, если заказчик хочет сорцы — то он предпочитает языки для которых проще найти человека способного сопровождать код.

А вообще, исходля из названия топика можно предположить, что требуется минимальный размер exe.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[2]: UPX 1.24w NotCompressibleException (MS VC++ .NET Pro
От: retalik www.airbandits.com/
Дата: 04.09.05 14:38
Оценка:
Здравствуйте, adontz, Вы писали:

A>Указывай --force. Судя по документации это не ошибка, а предупреждение, что при упаковке некоторые метаданные PE могут ыть потеряны. Собственно у меня проблем при использовании --force никогда не возникало.


Не надо указывать --force. И вообще, не пакуйте UPX-ом executables, сделанные 2003 студией. Под windows 2003 такой EXE, скорее всего, упадет. Один из авторов UPX говорит, что проблема известная, но фиксить они ее в ближайшее время не собираются.
Успехов,
Виталий.
Re[7]: UPX 1.24w NotCompressibleException (MS VC++ .NET Pro
От: adontz Грузия http://adontz.wordpress.com/
Дата: 04.09.05 14:39
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>А вообще, исходля из названия топика можно предположить, что требуется минимальный размер exe.


Например у меня была DLL с кучей текстовых строк. При сжатии размер уменьшился с 3Мб, до 260Кб.
А если таких DLL много, то вопрос может стоять как поместиться ли приложение на носитель XYZ.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[7]: UPX 1.24w NotCompressibleException (MS VC++ .NET Pro
От: gear nuke  
Дата: 04.09.05 14:40
Оценка:
Здравствуйте, adontz, Вы писали:

A>>>Это нигде не документированно.

GN>>А как же:

The /BASE option sets a base address for the program, overriding the default location for an .exe file (at 0x400000)


A>Так в том-то всё и дело, что default. Нигде не написано, что base address of EXE file always is 0x400000.


Это можно гаронтировать используя вышеприведённый ключик .

A>>>Уже нельзя делать return msg.wParam, надо ExitProcess(msg.wParam);

GN>>Можно. В стеке лежит адрес возврата в kernel32.dll.

A>Это не одно и то же. return завершит главный поток, но не приложение.


В случае, когда tread всего один, это будет одно и тоже.
И вот что находится по адресу лежащему в стеке (на который попадёт return):
7C816D4F    50              push    eax
7C816D50    E8 545FFFFF     call    kernel32.ExitThread


A>>>И по поводу "кучи ненужного кода" — не согласен.

GN>>Применительно к данной программе он не нужен.

A>И она никогда не вырастет?


У меня плохо получается предсказывать будущее .
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[8]: UPX 1.24w NotCompressibleException (MS VC++ .NET Pro
От: gear nuke  
Дата: 04.09.05 14:43
Оценка: +1
Здравствуйте, adontz, Вы писали:

GN>>А вообще, исходля из названия топика можно предположить, что требуется минимальный размер exe.


A>Например у меня была DLL с кучей текстовых строк. При сжатии размер уменьшился с 3Мб, до 260Кб.


Я бы не стал упаковывать такую dll — это снизит производительность, поскольку секции PE после распаковки будут отображаться на файл подкачки, а не на оригинальный PE.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[3]: UPX 1.24w NotCompressibleException (MS VC++ .NET Pro
От: adontz Грузия http://adontz.wordpress.com/
Дата: 04.09.05 14:44
Оценка:
Здравствуйте, retalik, Вы писали:

R>Не надо указывать --force. И вообще, не пакуйте UPX-ом executables, сделанные 2003 студией. Под windows 2003 такой EXE, скорее всего, упадет. Один из авторов UPX говорит, что проблема известная, но фиксить они ее в ближайшее время не собираются.


Мои как раз там сейчас и работают. Ссылку на описание проблемы не дашь?
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[4]: UPX 1.24w NotCompressibleException (MS VC++ .NET Pro
От: gear nuke  
Дата: 04.09.05 14:45
Оценка:
Здравствуйте, RealSQUALL, Вы писали:

RSQ>Хех — чудеса в решете.


RSQ>После

RSQ>
RSQ>#pragma comment(linker, "/entry:WinMain")
RSQ>

RSQ>EXE-шник становится меньше. Но тогда программа запускается, появляется в процессах и дальше ничего.

RSQ>Тоесть теперь параметры WinMain не работают. Значит

RSQ>
RSQ>#pragma comment(linker, "/subsystem:windows")

RSQ>BOOL WINAPI WinMain(
RSQ>    HINSTANCE hInstance, // указывается явно
RSQ>    HINSTANCE hPrevInstance,
RSQ>    LPSTR lpCmdLine, // отменяется стоЯщей выше прагмой
RSQ>    int nCmdShow // указывается явно
RSQ>)
RSQ>

WinMain нельзя указывать в качестве входной точки, поскольку параметры для неё не определены!!
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.