21 / 29 / 2
Регистрация: 04.12.2013
Сообщений: 263

Запуск приложения из ресурсов (без распаковки на диск)

03.09.2014, 09:01. Показов 7223. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день всем!

Возникла необходимость запуска стороннего приложения, в формате exe-фала. Причем надо сделать так, чтобы данный сторонний файл на диске не сохранялся.

Зачем это мне нужно. Все просто. Есть желание разобраться в защите программ и когда-нибудь написать shareware-программу, защитив ее на определенное время от взлома и распространения.

Методик на эту тему много: от подсчета crc файла, до шифрования кусков кода и выполнение их по мере необходимости. Можно использовать и все вместе.

Погуглив на эту тему я понял, что толкового решения для Builder C++ нет. Все советуют или использовать сторонние утилиты (ExeCriptor, ASPProtect и т.д.) или реализовывать облачное выполнение.

Облачное выполнение для большей части фрилансеров вещь довольно дорогая и не совсем понятная в реализации. Поэтому решил шифровать части (функции) своего приложения.
Подумав на эту тему, пришел к выводу, что можно сделать несколько ехе-фалов, которые будут выполнять свою часть функционала, а эти ехе-файлы добавить в ресурсы. Конечно защита будет не очень сложная, но для большинства программистов, со стоимостью их программ в 1000 - 2000 руб. вполне пригодное.
Создал несколько ехе-фалов, которые выводят просто окна-сообщения. Создал основное приложение, добавив в его ресурсы эти самые ехе-фалы.

Теперь возник вопрос: как запустить выполнение ехе файла из ресурсов?
Ведь просто сохранять файл на диск, а потом его запускать, будет глупостью несусветной, ибо ничто не мешает этот файл с диска просто сохранить в другую папку и все. Следовательно надо запускать файл без сохранения его на диске.

Попутный вопрос: может я вообще не то реализую и есть какие-то способы проще?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.09.2014, 09:01
Ответы с готовыми решениями:

Запуск exe из ресурсов без распаковки на диск
Всем привет, как спрятать exe файл и запустить его в своей программе "не извлекая на диск"? Как я понял это делается через ресурсы,...

Запуск исполняемого файла из ресурсов без распаковки на диск
Вообщем нужна помощь как запустить .ехе с процесса программы по нажатию кнопки, не копируя .ехе на диск ... Вот нашёл код : ...

Запуск exe из ресурсов без распаковки
Всем доброго времени суток! Сразу оговорка: нужно для легальных целей - защита другой программы от декомпиляции. Никаких вирусов и...

12
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
04.09.2014, 17:42
У NT есть множество классных возможностей, которые далеко не очевидны, если только вы не читаете документацию ДЕЙСТВИТЕЛЬНО внимательно.

Одна из моих любимых - то, что я называю “временные” временные файлы.

“Временный” временный файл - это такой файл, содержимое которого никогда не сбрасывается на диск (при отсутствии нехваток памяти, конечно же). Он ведёт себя точно как файл (потому что это и есть файл), но менеджер кэша отключает отложенную запись файла, а файловая система в курсе, что страницы, содержащие метаданные файла, никогда не нужно сбрасывать на диск.

Чтобы создать “временный” файл, вы должны вызвать*CreateFile, указывая в параметре dwFlagsAndAttributes комбинацию FILE_ATTRIBUTE_TEMPORARY or FILE_FLAG_DELETE_ON_CLOSE. Эта комбинация битов работает как подсказка файловой системе, что данные файла никогда не должны сбрасываться на диск. Другими словами, такой файл может быть создан, в него могут писаться данные, из него можно читать, а система при этом ни разу даже не коснётся диска.

Видите ли, другим большим плюсом “временных” временных файлов по сравнению с буферами в памяти является то, что их размер ограничен доступным свободным местом на диске, а НЕ в памяти. Поэтому, если рендеринг в памяти может обломаться с данными в 1 Гб (потому что вы не смогли выделить непрерывный кусок памяти в 1 Гб), то у рендеринга во “временный” временный файл таких проблем нет (в предположении, что у вас есть свободное дисковое пространство). Если у вас закончится память - менеджер памяти будет сбрасывать ваш файл на диск. Конечно же, это повлияет на производительность, но, по-крайней мере, ваша операция будет успешна.
It's only temporary. Larry Osterman.
3
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
28.06.2017, 20:42
Приветствую всех. Заинтересовала эта тема. В функции CreateFile необходимо указывать путь к файлу. В случае создания "временного" временного файла что указывать в параметре lpFileName?
0
129 / 65 / 16
Регистрация: 03.09.2015
Сообщений: 832
03.07.2017, 13:17
Смотри здесь https://github.com/codecrack3/... /RunPE.cpp
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
03.07.2017, 20:22
ziqp, не увидел применения функции CreateFile в коде по ссылке. Хотя, наверное, вопрос запуска файла из памяти там раскрыт.
И все же. Если обычный исполняемый файл поместить в ресурсы приложения, то как его оттуда запустить используя функцию CreateFile и без сохранения на диск?
0
139 / 139 / 53
Регистрация: 14.06.2016
Сообщений: 467
03.07.2017, 20:53
Цитата Сообщение от d7d1cd Посмотреть сообщение
используя функцию CreateFile и без сохранения на диск
эта функция только с файлами и работает.
Цитата Сообщение от d7d1cd Посмотреть сообщение
Если обычный исполняемый файл поместить в ресурсы приложения, то как его оттуда запустить
сделать всё, что обычно делает загрузчик - установить правильный протект памяти для всех секций, настроить релоки, разрешить импорт, выполнить tls коллбэки, если есть и затем точку входа. (минимум)
эта техника - довольно таки высший пилотаж.
если желание очень сильное - гуглить ManualMapping и изучать структуру PE заголовка.
но я всё таки советую ограничиться выгрузкой временного файла на диск.
1
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
03.07.2017, 21:07
Цитата Сообщение от d7d1cd Посмотреть сообщение
все же. Если обычный исполняемый файл поместить в ресурсы приложения, то как его оттуда запустить используя функцию CreateFile и без сохранения на диск?
А как вам вы хотите что бы ответили, так что бы вы прекратили задавать глупые вопросы и все же вникли в то что вам отвечают?

Очевидно то что ответил BRcr не является прямом ответом на поставленный вопрос ибо подразумевают выгрузку файла из ресурсов на диск и запуск его с диска.Просто используется временный файл.
По крайней мере это то что я понял.

А вот ответ ziqp, интересен.
(Хотя лично сомневаюсь что там рабочий код)

Добавлено через 6 минут
Цитата Сообщение от jr_ Посмотреть сообщение
но я всё таки советую ограничиться выгрузкой временного файла на диск.
Да только тогда возникает вопрос нафига экзе тогда пихать в ресурсы.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
03.07.2017, 21:45
Цитата Сообщение от jr_ Посмотреть сообщение
эта техника - довольно таки высший пилотаж.
если желание очень сильное - гуглить ManualMapping и изучать структуру PE заголовка.
но я всё таки советую ограничиться выгрузкой временного файла на диск
+1
В последних Windows столько всего наворотили, что сделать качественный PoC
на тему "load exe from memory", который был бы для системы неотличим от
"нормального" exe, - задача практически нереальная.

Такие вещи только для мелких трюков типа выполнить 20 байт и быстро
завершиться, пока все не грохнулось.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
03.07.2017, 21:47
И антивирусы такое любят )))
1
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
03.07.2017, 21:53
О, да!

Но мне как-то показывали один трюк, который работает в том числе и на последних версиях
Windows - сохранить exe-файл в NTFS-поток, а затем запустить его оттуда. После чего поток
можно удалять. Все никак руки не дойдут поковырять этот способ (например, куда будут
выгружаться страницы памяти при нехватке ресурсов?)
0
129 / 65 / 16
Регистрация: 03.09.2015
Сообщений: 832
08.07.2017, 19:35
Не совсем понял что такое PoC..
Но сам давно пользуюсь запуском файла в памяти в моем проекте. Если в проекте парочка форм, кнопочки и запуск файла в памяти на кнопку, а не автоматически, то антивирям всеравно.
Конечно, это не тот код, который я привел выше. В своем я делаю массив из байтов памяти, складываю и запускаю в памяти
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
08.07.2017, 21:57
Цитата Сообщение от ziqp Посмотреть сообщение
сам давно пользуюсь запуском файла в памяти в моем проекте
ziqp, покажите как Вы это делаете.
0
129 / 65 / 16
Регистрация: 03.09.2015
Сообщений: 832
09.07.2017, 20:47
h файл с функцией:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
typedef LONG (WINAPI * NtUnmapViewOfSection)(HANDLE ProcessHandle, PVOID BaseAddress);
 
class runPE{
public:
void run(LPSTR szFilePath, PVOID pFile) 
{
  PIMAGE_DOS_HEADER IDH;     
    PIMAGE_NT_HEADERS INH;     
    PIMAGE_SECTION_HEADER ISH; 
    PROCESS_INFORMATION PI;    
    STARTUPINFOA SI;           
    PCONTEXT CTX;              
    PDWORD dwImageBase;        
    NtUnmapViewOfSection xNtUnmapViewOfSection;
    LPVOID pImageBase;         
    int Count;                 
    IDH = PIMAGE_DOS_HEADER(pFile);
    if (IDH->e_magic == IMAGE_DOS_SIGNATURE)
    {
        INH = PIMAGE_NT_HEADERS(DWORD(pFile) + IDH->e_lfanew);
        if (INH->Signature == IMAGE_NT_SIGNATURE)
        {
            RtlZeroMemory(&SI, sizeof(SI));
            RtlZeroMemory(&PI, sizeof(PI));
            if (CreateProcessA(szFilePath, NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &SI, &PI))
            {
                CTX = PCONTEXT(VirtualAlloc(NULL, sizeof(CTX), MEM_COMMIT, PAGE_READWRITE));
                CTX->ContextFlags = CONTEXT_FULL;
                if (GetThreadContext(PI.hThread, LPCONTEXT(CTX)))
                {
                    ReadProcessMemory(PI.hProcess, LPCVOID(CTX->Ebx + 8), LPVOID(&dwImageBase), 4, NULL);
                    if (DWORD(dwImageBase) == INH->OptionalHeader.ImageBase)
                    {
                        xNtUnmapViewOfSection = NtUnmapViewOfSection(GetProcAddress(GetModuleHandleA("ntdll.dll"), "NtUnmapViewOfSection"));
                        xNtUnmapViewOfSection(PI.hProcess, PVOID(dwImageBase));
                    }
                    pImageBase = VirtualAllocEx(PI.hProcess, LPVOID(INH->OptionalHeader.ImageBase), INH->OptionalHeader.SizeOfImage, 0x3000, PAGE_EXECUTE_READWRITE);
                    if (pImageBase)
                    {
                        WriteProcessMemory(PI.hProcess, pImageBase, pFile, INH->OptionalHeader.SizeOfHeaders, NULL);
                        for (Count = 0; Count < INH->FileHeader.NumberOfSections; Count++)
                        {
                            ISH = PIMAGE_SECTION_HEADER(DWORD(pFile) + IDH->e_lfanew + 248 + (Count * 40));
                            WriteProcessMemory(PI.hProcess, LPVOID(DWORD(pImageBase) + ISH->VirtualAddress), LPVOID(DWORD(pFile) + ISH->PointerToRawData), ISH->SizeOfRawData, NULL);
                        }
                        WriteProcessMemory(PI.hProcess, LPVOID(CTX->Ebx + 8), LPVOID(&INH->OptionalHeader.ImageBase), 4, NULL);
                        CTX->Eax = DWORD(pImageBase) + INH->OptionalHeader.AddressOfEntryPoint;
                        SetThreadContext(PI.hThread, LPCONTEXT(CTX));
                        ResumeThread(PI.hThread);
                    }
 
                }
            }
        }
    }
    VirtualFree(pFile, 0, MEM_RELEASE);
}
};
Запуск:
C++
1
2
3
4
runPE runner; //запуск в памяти
    TCHAR szFilePath[1024];
    GetModuleFileNameA(0, LPSTR(szFilePath), 1024);
    runner.run(LPSTR(szFilePath), shellcode);
Вид shellcode:
C++
1
2
3
4
unsigned char shellcode[] = {
    77,90,144,0,3,0,0,0,4,0,0,0, и т. д. (раньше значения были в 16-ричном, но в один момент решил, что и так сойдет
        };
const unsigned int size = 52736; //кол-во байтов образа
Добавлено через 9 минут
Минус метода в том, что слишком большой образ не скомпилируется
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.07.2017, 20:47
Помогаю со студенческими работами здесь

Запуск приложения из ресурсов
Нужно реализовать запуск стороннего приложения которое лежит в ресурсах моего. Пробовал так: System.Byte bts =...

Запуск приложения из ресурсов, переименование окна
Здравствуйте. Есть приложение, мне надо сделать так,чтобы вначале запускалась моя программа, затем нужно,чтобы запускалась вторая...

Как скопировать файл на диск из ресурсов приложения?
Всем добрый вечер! Очень срочная проблема. У меня в солюшне несколько проектов. В основном проекте есть папка с картинками -...

Хранение ресурсов приложения без БД
Помогите пожалуйста, как лучше организовать приложение. Создаю, грубо говоря, книгу. В левой части формы - TreeView с главами и собственно...

Запуск .exe из приложения (не извлекая его на жёсткий диск)
Доброго времени суток, такой вопрос, наткнулся на тему, в ней выложен исходник проекта, в котором приложение при запуске имеет одну кнопку,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

Новые блоги и статьи
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
PowerShell и онлайн сервисы. Валюта (floatrates.com руб.)
iNNOKENTIY21 11.11.2025
PowerShell функция floatrates-rub Примеры вызова: # Указанная валюта 'EUR' floatrates-rub -Code 'EUR' # Список имеющихся кодов валют floatrates-rub -Available function floatrates-rub {
PowerShell и онлайн сервисы. Погода (RP5.ru)
iNNOKENTIY21 11.11.2025
PowerShell функция Get-WeatherRP5rss для получения погоды с сервиса RP5 Примеры вызова Get-WeatherRP5rss с указанием id 5484 — Москва (восток, Измайлово) и переносом строки:. . .
PowerShell и онлайн сервисы. Погода (wttr)
iNNOKENTIY21 11.11.2025
PowerShell Функция для получения погоды с сервиса wttr Примеры вызова: Погода в городе Омск с прогнозом на день, можно изменить прогноз на более дней, для этого надо поменять запрос:. . .
PowerShell и онлайн сервисы. Валюта (ЦБР)
iNNOKENTIY21 11.11.2025
# Получение курса валют function cbr (] $Valutes = @('USD', 'EUR', 'CNY')) { $url = 'https:/ / www. cbr-xml-daily. ru/ daily_json. js' $data = Invoke-RestMethod -Uri $url $esc = 27 . . .
И решил я переделать этот ноут в машину для распределенных вычислений
Programma_Boinc 09.11.2025
И решил я переделать этот ноут в машину для распределенных вычислений Всем привет. А вот мой компьютер, переделанный из ноутбука. Был у меня ноут асус 2011 года. Со временем корпус превратился. . .
Мысли в слух
kumehtar 07.11.2025
Заметил среди людей, что по-настоящему верная дружба бывает между теми, с кем нечего делить.
Новая зверюга
volvo 07.11.2025
Подарок на Хеллоуин, и теперь у нас кроме Tuxedo Cat есть еще и щенок далматинца: Хочу еще Симбу взять, очень нравится. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru