Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
sirtheodor
0 / 0 / 0
Регистрация: 28.02.2014
Сообщений: 5
#1

Run exe from memory (x64) - C++

28.02.2014, 14:59. Просмотров 1949. Ответов 13
Метки нет (Все метки)

Есть необходимость запускать exe из памяти, а не с диска.
Может кто сталкивался с данным проектом? Сам находил много проектов, но они были Win32 и не работали под сборкой x64. А мне нужен именно x64, так как это проект будет использоваться в связки с другими 64-битными проектами.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.02.2014, 14:59     Run exe from memory (x64)
Посмотрите здесь:
C++ Builder Ошибка Faild to run IDL2CPP.exe. Не удается найти указанный файл
C++ WinAPI Create an in memory bitmap and draw directly to the memory
User32.dll на Win x64 - это x86-библиотека, x64 или. и то и другое одновременно? C++ WinAPI
Где взять и как подцепить к Code Blocks бесплатный компилятор x64 стандарта C++11 для Windows 7 x64? C++
C++ LNK2019: ссылка на неразрешенный внешний символ "void __cdecl run(void)" (?run@@YAXXZ) в функции _wmain
C++ Out of memory
Прочитать список всех запущенных Exe и проверить, запущен ли Exe C++ Builder
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
severus-x
18 / 18 / 0
Регистрация: 21.09.2012
Сообщений: 78
28.02.2014, 17:01     Run exe from memory (x64) #2
Вот тут об этом вроде бы хорошо написано (англ)
http://msdn.microsoft.com/en-us/magazine/cc300794.aspx
_lunar_
1243 / 1169 / 85
Регистрация: 03.05.2011
Сообщений: 2,821
Записей в блоге: 4
Завершенные тесты: 1
03.03.2014, 08:01     Run exe from memory (x64) #3
разбираться с этим https://sites.google.com/site/delphi...n7x64bytestest
или переписать приложение под dll (при вызове dllmain она сама загрузиться в память).
sirtheodor
0 / 0 / 0
Регистрация: 28.02.2014
Сообщений: 5
03.03.2014, 13:51  [ТС]     Run exe from memory (x64) #4
Цитата Сообщение от severus-x Посмотреть сообщение
Вот тут об этом вроде бы хорошо написано (англ)
http://msdn.microsoft.com/en-us/magazine/cc300794.aspx
Это не совсем то, что я имел ввиду. На сколько я понял, там описано, как собрать проект под 64 бита, но те проекты, которые я находил не совместимы с х64, в частности из-за ассемблерных вставок.

Добавлено через 6 минут
Цитата Сообщение от _lunar_ Посмотреть сообщение
разбираться с этим https://sites.google.com/site/delphi...n7x64bytestest
или переписать приложение под dll (при вызове dllmain она сама загрузиться в память).
Натыкался на этот проект, но он же на delphi, насколько я понял, перевести его в с++ не получится. Или я что-то не понимаю?

Что касается переписывания приложения под dll. Я находил 2 проекта, которые реализуют загрузку dll из памяти и собираются под х64, но я не уверен, что их получится переписать. Проблема в том, что при загрузке dll из памяти необходимо загрузить их в уже имеющийся процесс, а в случае с exe - процесс необходимо создать. А в тех проектах, где была реализована загрузка exe из памяти под Win32, именно с этой частью возникали проблемы при попытки собрать проект под x64.
_lunar_
1243 / 1169 / 85
Регистрация: 03.05.2011
Сообщений: 2,821
Записей в блоге: 4
Завершенные тесты: 1
03.03.2014, 18:57     Run exe from memory (x64) #5
Цитата Сообщение от sirtheodor Посмотреть сообщение
он же на delphi, насколько я понял, перевести его в с++ не получится.
что есть такого в delphi чего нет в c++? Перевести можно спокойно. Другое дело переводить с delphi на, например, c# или java.

Цитата Сообщение от sirtheodor Посмотреть сообщение
Проблема в том, что при загрузке dll из памяти необходимо загрузить их в уже имеющийся процесс, а в случае с exe - процесс необходимо создать.
не вижу никаких проблем. Вы пишите, что ваш проект будет использоваться в связке с другим проектом, инжектите вашу dll в этот другой проект и всё.
Убежденный
Системный программист
Эксперт С++
15296 / 6928 / 1096
Регистрация: 02.05.2013
Сообщений: 11,338
Завершенные тесты: 1
03.03.2014, 19:11     Run exe from memory (x64) #6
Цитата Сообщение от sirtheodor Посмотреть сообщение
Есть необходимость запускать exe из памяти, а не с диска.
Может кто сталкивался с данным проектом?
Сталкивался. Но то было давно, в эпоху Win2K/WinXP.
На современных Виндах запуск exe - очень сложный и многоэтапный
процесс, полноценно сэмулировать его вряд ли получится.
Проще скинуть exe на диск, а затем оттуда уже запускать.
sirtheodor
0 / 0 / 0
Регистрация: 28.02.2014
Сообщений: 5
03.03.2014, 19:31  [ТС]     Run exe from memory (x64) #7
Цитата Сообщение от _lunar_ Посмотреть сообщение
что есть такого в delphi чего нет в c++? Перевести можно спокойно. Другое дело переводить с delphi на, например, c# или java.


не вижу никаких проблем. Вы пишите, что ваш проект будет использоваться в связке с другим проектом, инжектите вашу dll в этот другой проект и всё.
Нет, инжектировать dll в другой проект нельзя, так как это должно быть именно приложение, сейчас объясню поподробнее. Мне необходимо реализовать криптование exe, для этого, я беру исходной приложение и оборачиваю его специальным образом и на выходе получаю новое приложение. Это приложение запускается с диска, декриптует исходное приложения, которое зашито внутри нового приложения, делая при этом необходимые проверки и запускает исходное приложение из памяти. При этом исходное приложение может быть любым, но это должно быть именно приложение.

Добавлено через 2 минуты
Цитата Сообщение от Убежденный Посмотреть сообщение
Сталкивался. Но то было давно, в эпоху Win2K/WinXP.
На современных Виндах запуск exe - очень сложный и многоэтапный
процесс, полноценно сэмулировать его вряд ли получится.
Проще скинуть exe на диск, а затем оттуда уже запускать.
Нет, совсем не проще, как было описано ранее, цель проекта - реализовать криптование приложения. Какой смысл писать приложение на диск после его проверки и декриптования, чтобы любой мог его взять и использовать?
Убежденный
Системный программист
Эксперт С++
15296 / 6928 / 1096
Регистрация: 02.05.2013
Сообщений: 11,338
Завершенные тесты: 1
03.03.2014, 19:41     Run exe from memory (x64) #8
Цитата Сообщение от sirtheodor Посмотреть сообщение
Нет, совсем не проще, как было описано ранее, цель проекта - реализовать криптование приложения.
Возьмите какой-нибудь хороший протектор типа VmProtect и будет криптование.
А делать все это вручную, не имея нужного опыта - гиблое дело.

Кстати, запуск процесса из памяти все равно не спасет от снятия дампа,
так что криптование как защита - идея не самая лучшая.
sirtheodor
0 / 0 / 0
Регистрация: 28.02.2014
Сообщений: 5
03.03.2014, 19:54  [ТС]     Run exe from memory (x64) #9
Цитата Сообщение от Убежденный Посмотреть сообщение
Возьмите какой-нибудь хороший протектор типа VmProtect и будет криптование.
А делать все это вручную, не имея нужного опыта - гиблое дело.

Кстати, запуск процесса из памяти все равно не спасет от снятия дампа,
так что криптование как защита - идея не самая лучшая.
Нет это не вариант. Большая часть приложения реализована, не хватает только этого проекта. Что касается VmProtect, то это не подходит из-за нашего типа защиты. Мы используем HASP и проверки при декриптование связанные с ним необходимы.
Убежденный
Системный программист
Эксперт С++
15296 / 6928 / 1096
Регистрация: 02.05.2013
Сообщений: 11,338
Завершенные тесты: 1
03.03.2014, 20:54     Run exe from memory (x64) #10
Приведу две цитаты со StackOverflow:

1.
It's actually quite easy. Similar technique has been described in a paper I read like 3 years ago.

Windows allow you to call the CreateProcess function with CREATE_SUSPENDED flag, that tells the API to keep the process suspended until the ResumeThread function is called.

This gives us time to grab the suspended thread's context using GetThreadContext function, then the EBX register will hold a pointer to the PBE(Process Enviroment Block) structure, which we need to determine the base address.

From the layout of the PBE structure we can see that the ImageBaseAddress is stored at the 8th byte, therefore [EBX+8] will give us actual base address of the process being suspended.

Now we need the in-memory EXE and do appropiate alignment if the alignment of memory and in-memory EXE differs.

If the base address of suspended process and in-memory exe matches, plus if the imageSize of the in-memory exe is lesser or equal to the suspended process' we can simply use WriteProcessMemory to write in-memory exe into the memory space of the suspended process.

But if the aforementioned conditions weren't met, we need a little more magic. First, we need to unmap the original image using ZwUnmapViewOfSection, and then allocate enough memory using VirtualAllocEx within the memory space of the suspended process. Now we need to write the in-memory exe into the memory space of the suspended process using the WriteProcessMemory function.

Next, patch the BaseAddress of the in-memory exe into the PEB->ImageBaseAddress of the suspended process.

EAX register of the thread context holds EntryPoint address, which we need to rewrite with the EntryPoint address of the in-memory exe. Now we need to save the altered thread context using the SetThreadContext function.

Voila! We're ready to call the ResumeThread function on the suspended process to execute it!
2.
This is a major hack, and you should really avoid doing it. If you want to start a new process then the only guaranteed way to make it work without issue is to launch an executable that resides in the filesystem. Anything else is a hack and you can't rely on it working in the future.
В п.2 подписываюсь под каждым словом.
severus-x
18 / 18 / 0
Регистрация: 21.09.2012
Сообщений: 78
04.03.2014, 00:24     Run exe from memory (x64) #11
Извините, не совсем понял вашу проблему(
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
04.03.2014, 14:17     Run exe from memory (x64) #12
А ты не боишься, что программой твоей невозможно будет пользоваться из-за этого? Я проверил пару способов для win32 и все они помечаются как подозрительные большинством современных антивирусов. Это значит что пользователь, скачав один раз такую программу и увидев реакцию антивируса, скорее всего больше никогда не будет ее ставить.
tramvon
0 / 0 / 0
Регистрация: 04.03.2014
Сообщений: 3
04.03.2014, 23:10     Run exe from memory (x64) #13
Нет, инжектировать dll в другой проект нельзя, так как это должно быть именно приложение, сейчас объясню поподробнее. Мне необходимо реализовать криптование exe, для этого, я беру исходной приложение и оборачиваю его специальным образом и на выходе получаю новое приложение. Это приложение запускается с диска, декриптует исходное приложения, которое зашито внутри нового приложения, делая при этом необходимые проверки и запускает исходное приложение из памяти. При этом исходное приложение может быть любым, но это должно быть именно приложение.
Т.е. по сути ты пытаешься прицепить защиту к стороннему приложению? Если приложение свое, то непонятно, зачем такая система наворочена.

А по существу вопроса - можно попробовать запускать раскриптованный EXE как DLL - по сути они не слишком отличаются, загрузил, настроил адреса, импорт/экспорт, прыгнул на точку входа, как-то так

Добавлено через 3 минуты
Нет это не вариант. Большая часть приложения реализована, не хватает только этого проекта. Что касается VmProtect, то это не подходит из-за нашего типа защиты. Мы используем HASP и проверки при декриптование связанные с ним необходимы
А в чем проблема? Делаете у себя в коде проверки наличия HASP'а, а сам код проверки защищаете VMProtect'ом - используете виртуализацию и мутацию кода, чтобы сложнее вскрыть было. А то, что вы сами наваяете, скорее всего будет для взлома гораздо проще, чем защита VMProtect'ом.

Добавлено через 3 минуты
Кстати, запуск процесса из памяти все равно не спасет от снятия дампа,
так что криптование как защита - идея не самая лучшая.
Кстати да. А если использовать VMProtect, то такой проблемы не возникает - он использует виртуализацию кода - выполняет защищенные части на своей виртуальной машине, которая при каждой обработке протектором разная. Виртуальная машина обеспечивает сложность вскрытия даже при наличии дампа памяти, а генерация новой VM при каждой обработке обеспечивает то, что поломать могут только какую-то конкретную версию, каждый новый релиз не будет совместим со старым кряком.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.03.2014, 12:16     Run exe from memory (x64)
Еще ссылки по теме:
Memory leak C++ WinAPI
Visual C++ out of memory Visual C++ 6
Memory Manager C++
memory can't be 'written' C++
Visual C++ Shared memory

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

Или воспользуйтесь поиском по форуму:
sirtheodor
0 / 0 / 0
Регистрация: 28.02.2014
Сообщений: 5
11.03.2014, 12:16  [ТС]     Run exe from memory (x64) #14
Цитата Сообщение от DrOffset Посмотреть сообщение
А ты не боишься, что программой твоей невозможно будет пользоваться из-за этого? Я проверил пару способов для win32 и все они помечаются как подозрительные большинством современных антивирусов. Это значит что пользователь, скачав один раз такую программу и увидев реакцию антивируса, скорее всего больше никогда не будет ее ставить.
Нет, у меня такой проблемы не возникало. У меня есть рабочая версия приложения Win32.

Добавлено через 2 минуты
Цитата Сообщение от tramvon Посмотреть сообщение
Т.е. по сути ты пытаешься прицепить защиту к стороннему приложению? Если приложение свое, то непонятно, зачем такая система наворочена.
Нет, защиту нужно подцеплять не к стороннему приложению, но она должна работать с любым приложением. Это связанно с тем, что мы рабочих приложений может быть несколько.
Yandex
Объявления
11.03.2014, 12:16     Run exe from memory (x64)
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru