Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

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

Run exe from memory (x64) - C++

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

Есть необходимость запускать exe из памяти, а не с диска.
Может кто сталкивался с данным проектом? Сам находил много проектов, но они были Win32 и не работали под сборкой x64. А мне нужен именно x64, так как это проект будет использоваться в связки с другими 64-битными проектами.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.02.2014, 14:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Run exe from memory (x64) (C++):

Ошибка Faild to run IDL2CPP.exe. Не удается найти указанный файл - C++ Builder
При нажатии на кнопку New CORBA Object Implementation выдает ошибку Faild to run IDL2CPP.exe. Не удается найти указанный файл. В...

Create an in memory bitmap and draw directly to the memory - C++ WinAPI
Здравствуйте! У меня есть пара вопросов. Знаю, что рисовать в HDC можно только с одного потока. Но узнал такую вещь, что можно создать...

User32.dll на Win x64 - это x86-библиотека, x64 или. и то и другое одновременно? - C++ WinAPI
В проектах .NET функции из нее нормально импортируются при любой разрядности проекта - как x86, так и x64. Как написать такую библиотеку?

Где взять и как подцепить к Code Blocks бесплатный компилятор x64 стандарта C++11 для Windows 7 x64? - C++
Где взять и как подцепить к Code Blocks бесплатный компилятор x64 стандарта C++11 для Windows 7 x64?

LNK2019: ссылка на неразрешенный внешний символ "void __cdecl run(void)" (?run@@YAXXZ) в функции _wmain - C++
#include "stdafx.h" #include "iostream" #include "cmath" using namespace std; class A { private : double *x; double...

Run time error 7. Out of memory - VBA
Добрый день. Помогите пож-та с кодом, выдает ошибку run time error 7. out of memory Dim v As Variant With Sheets("10.1.2") v =...

13
severus-x
18 / 18 / 0
Регистрация: 21.09.2012
Сообщений: 78
28.02.2014, 17:01 #2
Вот тут об этом вроде бы хорошо написано (англ)
http://msdn.microsoft.com/en-us/magazine/cc300794.aspx
0
_lunar_
1304 / 1229 / 91
Регистрация: 03.05.2011
Сообщений: 2,912
Завершенные тесты: 1
03.03.2014, 08:01 #3
разбираться с этим https://sites.google.com/site/delphi...n7x64bytestest
или переписать приложение под dll (при вызове dllmain она сама загрузиться в память).
1
sirtheodor
0 / 0 / 0
Регистрация: 28.02.2014
Сообщений: 5
03.03.2014, 13:51  [ТС] #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.
0
_lunar_
1304 / 1229 / 91
Регистрация: 03.05.2011
Сообщений: 2,912
Завершенные тесты: 1
03.03.2014, 18:57 #5
Цитата Сообщение от sirtheodor Посмотреть сообщение
он же на delphi, насколько я понял, перевести его в с++ не получится.
что есть такого в delphi чего нет в c++? Перевести можно спокойно. Другое дело переводить с delphi на, например, c# или java.

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


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

Добавлено через 2 минуты
Цитата Сообщение от Убежденный Посмотреть сообщение
Сталкивался. Но то было давно, в эпоху Win2K/WinXP.
На современных Виндах запуск exe - очень сложный и многоэтапный
процесс, полноценно сэмулировать его вряд ли получится.
Проще скинуть exe на диск, а затем оттуда уже запускать.
Нет, совсем не проще, как было описано ранее, цель проекта - реализовать криптование приложения. Какой смысл писать приложение на диск после его проверки и декриптования, чтобы любой мог его взять и использовать?
0
Убежденный
Ушел с форума
Эксперт С++
15697 / 7207 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
03.03.2014, 19:41 #8
Цитата Сообщение от sirtheodor Посмотреть сообщение
Нет, совсем не проще, как было описано ранее, цель проекта - реализовать криптование приложения.
Возьмите какой-нибудь хороший протектор типа VmProtect и будет криптование.
А делать все это вручную, не имея нужного опыта - гиблое дело.

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

Кстати, запуск процесса из памяти все равно не спасет от снятия дампа,
так что криптование как защита - идея не самая лучшая.
Нет это не вариант. Большая часть приложения реализована, не хватает только этого проекта. Что касается VmProtect, то это не подходит из-за нашего типа защиты. Мы используем HASP и проверки при декриптование связанные с ним необходимы.
0
Убежденный
Ушел с форума
Эксперт С++
15697 / 7207 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
03.03.2014, 20:54 #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 подписываюсь под каждым словом.
0
severus-x
18 / 18 / 0
Регистрация: 21.09.2012
Сообщений: 78
04.03.2014, 00:24 #11
Извините, не совсем понял вашу проблему(
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
04.03.2014, 14:17 #12
А ты не боишься, что программой твоей невозможно будет пользоваться из-за этого? Я проверил пару способов для win32 и все они помечаются как подозрительные большинством современных антивирусов. Это значит что пользователь, скачав один раз такую программу и увидев реакцию антивируса, скорее всего больше никогда не будет ее ставить.
0
tramvon
0 / 0 / 0
Регистрация: 04.03.2014
Сообщений: 3
04.03.2014, 23:10 #13
Нет, инжектировать dll в другой проект нельзя, так как это должно быть именно приложение, сейчас объясню поподробнее. Мне необходимо реализовать криптование exe, для этого, я беру исходной приложение и оборачиваю его специальным образом и на выходе получаю новое приложение. Это приложение запускается с диска, декриптует исходное приложения, которое зашито внутри нового приложения, делая при этом необходимые проверки и запускает исходное приложение из памяти. При этом исходное приложение может быть любым, но это должно быть именно приложение.
Т.е. по сути ты пытаешься прицепить защиту к стороннему приложению? Если приложение свое, то непонятно, зачем такая система наворочена.

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

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

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

Добавлено через 2 минуты
Цитата Сообщение от tramvon Посмотреть сообщение
Т.е. по сути ты пытаешься прицепить защиту к стороннему приложению? Если приложение свое, то непонятно, зачем такая система наворочена.
Нет, защиту нужно подцеплять не к стороннему приложению, но она должна работать с любым приложением. Это связанно с тем, что мы рабочих приложений может быть несколько.
0
11.03.2014, 12:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.03.2014, 12:16
Привет! Вот еще темы с ответами:

Run-time error '7': Out of memory - Микроконтроллеры
Здравствуйте. Установил PIC Simulator IDE, при запуске Basic компилятора вылетает эта ошибка. Помогите исправить пожалуйста.

Как побороть ошибку Run-time error 7: Out of memory ? - Visual Basic
Всем привет! В приложении возникает такая ошибка! Она возникает в момент, когда я открываю нажатием кнопки окно, в котором находится...

Run-time error '9' на Windows x64 - Visual Basic
Есть дистрибутив некоего Проекта, создан в Visual Basic 6 под управлением Windows XP. Дистрибутив создан родным PDW. Устанавливается на...

.NET 2.x X64 GetThreadContext Error 998: Invalid Access Memory Location - C#
Доброго времени суток. При попытке получить контекст потока if (!GetThreadContext(handle, ref context)) throw new...


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

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

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