Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.51/35: Рейтинг темы: голосов - 35, средняя оценка - 4.51
0 / 0 / 1
Регистрация: 11.08.2010
Сообщений: 72

Преобразование ехе файла.

18.10.2010, 02:36. Показов 6729. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.

Подскажите, пожалуйста, как можно преобразовать ехе файл в какой-нибудь другой файл, так чтобы его можно было запустить только с помощью второго приложения(о нём будет написано ниже). Просто изменение расширение не подходит.
И второй вопрос, как запустить преобразованный ехе файл?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.10.2010, 02:36
Ответы с готовыми решениями:

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

соединение ехе файла с XML Configuration File
у меня возникла проблемка програмка при компиляцыи создала XML Configuration File без которого сама програмка не запускается! как обединить...

Как средствами Delphi реализовать извлечение ехе файла при запуске ехе?
Здорова, народ. Как средствами Delphi реализовать извлечение ехе файла при запуске ехе? Заранее спасибо!

19
 Аватар для Mikant
1322 / 995 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
18.10.2010, 02:47
ну самый лобовой способ - зашифровать сборку (просто ее текст) так, чтобы можно было раскодировать её "только с помощью второго приложения" перед запуском
1
0 / 0 / 1
Регистрация: 11.08.2010
Сообщений: 72
18.10.2010, 04:03  [ТС]
Что значит зашифровать?
Где взять метод шифровки?
И как вторым приложением её расшифровать и запустить.
Кстати, с запуском у меня проблемы.
Просто запустить и то не получается, даже без шифровок/дешифровок.
C#
1
2
3
4
System.Diagnostics.Process Proc = new System.Diagnostics.Process();
            Proc.StartInfo.FileName = @"D:\work\game.exe";
            Proc.Start();
            Proc.WaitForExit();
По идеи должна запуститься игра.
Она запускается(черный экран становится) и сразу закрывается, без ошибок.

Добавлено через 16 минут
Редактировать своё сообщение у меня не получается, поэтому продолжаю.
Покопался в интернете и понял, что Вы имели ввиду.
Исходный ехе файл можно сохранить, например, как .dat только закодированный в base64.
Затем, вторым приложением запустить этот файл.
Однако, появился вопрос.
Второе приложение - считает дат файл, декодирует в строку. А как дальше запустить? (Писать на винт исходный файл думаю не стОит.)
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
18.10.2010, 08:22
Цитата Сообщение от AlexeylForpostl Посмотреть сообщение
Редактировать своё сообщение у меня не получается
Редактирование поста доступно в течении 10 мин.
0
PB
Просто прогер
1292 / 1079 / 13
Регистрация: 13.03.2009
Сообщений: 2,502
18.10.2010, 09:53
Нужно еще явно задать путь к папке, в которой находится запускаемая прога, а то некоторые проги тупят (точнее, ступили программисты, создавшие ее) и прога ищет файлы не в своей папке.
1
0 / 0 / 1
Регистрация: 11.08.2010
Сообщений: 72
18.10.2010, 10:44  [ТС]
Нужно еще явно задать путь к папке
Подскажите, пожалуйста, как это сделать?

Но опять же, это мы запустим приложение из ехе файла.
Как мне запустить ехе файл из переменной string'овского типа?
0
 Аватар для Dimarik__
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444
18.10.2010, 19:45
по поводу шифрования. Можно exe файл открыть как двоичный и провести шифрование. Да хотя бы шифром цезаря. А потом аналогичным расшифровать
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8729 / 3681 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
18.10.2010, 20:47
Цитата Сообщение от AlexeylForpostl Посмотреть сообщение
Как мне запустить ехе файл из переменной string'овского типа?
Из string'а никогда в жизни. Вам надо запускать EXE из памяти, а на C# это нереально. Так что Вам по любому придется его куда расшифровывать на диск, и потом запускать. Что-бы запустить EXE из памяти нужно минимум 2 вещи:
1) Знание PE формата.
2) Загрузчик написанный на native языке, коим C# не является.
0
PB
Просто прогер
1292 / 1079 / 13
Регистрация: 13.03.2009
Сообщений: 2,502
18.10.2010, 21:02
Цитата Сообщение от SSTREGG Посмотреть сообщение
1) Знание PE формата.
Не обязательно.
Все можно сделать с помощью API, правда, антивирусы не любят когда проги запускаются из павмяти.
0
90 / 89 / 13
Регистрация: 28.09.2010
Сообщений: 262
18.10.2010, 21:07
Если вторая exe-шка тоже на C# - никаких проблем с шифрованием, загрузкой и запуском из памяти.
0
0 / 0 / 1
Регистрация: 11.08.2010
Сообщений: 72
18.10.2010, 22:09  [ТС]
Если вторая exe-шка тоже на C# - никаких проблем с шифрованием, загрузкой и запуском из памяти.
Да, естественно.
Подробнее расскажите, пожалуйста. Если можно с примерами. Спасибо.
0
18.10.2010, 23:35

Не по теме:

Цитата Сообщение от PB Посмотреть сообщение
Не обязательно.
Все можно сделать с помощью API, правда, антивирусы не любят когда проги запускаются из павмяти.
Ясное дело, что не на пальцах всё делается. А заголовок PE кто за тебя будет заполнять? Без знания что, куда и как вряд-ли что-то получится... А после этого ещё надо передать выполнение потока в Main функцию приложения...

0
 Аватар для HIMen
4340 / 1509 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
18.10.2010, 23:45
Цитата Сообщение от AlexeylForpostl Посмотреть сообщение
Подскажите, пожалуйста, как можно преобразовать ехе файл в какой-нибудь другой файл, так чтобы его можно было запустить только с помощью второго приложения(о нём будет написано ниже).
Почему бы тогда просто не сделать один exe, который будет делать все
0
PB
Просто прогер
1292 / 1079 / 13
Регистрация: 13.03.2009
Сообщений: 2,502
18.10.2010, 23:57
Цитата Сообщение от SSTREGG Посмотреть сообщение
А заголовок PE кто за тебя будет заполнять? Без знания что, куда и как вряд-ли что-то получится...
Да пожалуйста.
Много раз тестировал - работает, но антивирусы ругаются.

Код на бейсике (PureBasic).

Первый аргумент процедуры - указатель на буфер памяти, где хранится код исполняемого файла, PE формата. Т .е. берём обычный исполняемый файл, копируем его в память и "скармливаем" процедуре RunPE
Второй аргумент - командная строка для запускаемого файла.
Code
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
Structure IMAGE_SECTION_HEADER 
  SecName.b[8] 
  StructureUnion 
    PhysicalAddr.l 
    VirtualSize.l 
  EndStructureUnion 
  VirtualAddress.l 
  SizeOfRawData.l 
  PointerToRawData.l 
  PointerToRelocations.l 
  PointerToLinenumbers.l 
  NumberOfRelocations.w 
  NumberOfLinenumbers.w 
  Characteristics.l 
EndStructure 
 
Structure IMAGE_SECTION_HEADERS 
  ish.IMAGE_SECTION_HEADER[95] 
EndStructure 
 
Procedure RunPE(lBuff, parameters.s) 
  Protected *idh.IMAGE_DOS_HEADER  = lBuff 
  Protected *ish.IMAGE_SECTION_HEADERS 
  Protected pi.PROCESS_INFORMATION 
  Protected *inh.IMAGE_NT_HEADERS 
  Protected si.STARTUPINFO 
  Protected lpBaseAddres.l 
  Protected Ctx.CONTEXT 
  Protected Addr.l, RET.l, i.l 
  
  CreateProcess_(#NUL, ProgramFilename() + " " + parameters, #NUL, #NUL, #False, #CREATE_SUSPENDED, #NUL, #NUL, @si, @pi) 
  Ctx\ContextFlags = #CONTEXT_INTEGER 
  If GetThreadContext_(pi\hThread, Ctx) = 0      : Goto EndThread : EndIf 
  ReadProcessMemory_(pi\hProcess, Ctx\Ebx + 8, @Addr, 4, #NUL) 
  If ZwUnmapViewOfSection_(Pi\hProcess, Addr)    : Goto EndThread : EndIf 
  If lBuff = 0                                   : Goto EndThread : EndIf 
  *inh = lBuff + *idh\e_lfanew 
  lpBaseAddres = VirtualAllocEx_(pi\hProcess, *inh\OptionalHeader\ImageBase, *inh\OptionalHeader\SizeOfImage, #MEM_COMMIT | #MEM_RESERVE, #PAGE_EXECUTE_READWRITE) 
  WriteProcessMemory_(pi\hProcess, lpBaseAddres, lBuff, *inh\OptionalHeader\SizeOfHeaders, @ret) 
  *ish = *inh\OptionalHeader + *inh\FileHeader\SizeOfOptionalHeader 
  For i = 0 To *inh\FileHeader\NumberOfSections - 1 
    WriteProcessMemory_(pi\hProcess, lpBaseAddres + *ish\ish[i]\VirtualAddress, lBuff + *ish\ish[i]\PointerToRawData, *ish\ish[i]\SizeOfRawData, @ret) 
  Next 
  WriteProcessMemory_(pi\hProcess, Ctx\Ebx + 8, @lpBaseAddres, 4, #NUL) 
  Ctx\Eax = lpBaseAddres + *inh\OptionalHeader\AddressOfEntryPoint 
  SetThreadContext_(pi\hThread, Ctx) 
  ResumeThread_(pi\hThread) 
  ProcedureReturn 
  EndThread: 
  TerminateProcess_(pi\hProcess, #NUL) 
  CloseHandle_(pi\hThread) 
  CloseHandle_(pi\hProcess) 
EndProcedure
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8729 / 3681 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
19.10.2010, 00:14
PB, примера я не просил И это не загрузчик, винда за тебя уже спроецировала файл в память и всё заполнила, ты лишь перенаправляешь поток в свой процесс, грубо говоря.

Эти проблемы, скажем так, описывались для ТС... До тех пока не стало ясно, что у него именно .net.
0
PB
Просто прогер
1292 / 1079 / 13
Регистрация: 13.03.2009
Сообщений: 2,502
19.10.2010, 00:17
Цитата Сообщение от SSTREGG Посмотреть сообщение
И это не загрузчик, винда за тебя уже спроецировала файл в память
Какая разница?
Ведь задача выполнена - исполняемый файл запущен не с диска, а из памяти.

Тем более, что я писал что для запуска из памяти не обязательно создавать свой загрузчик.
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8729 / 3681 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
19.10.2010, 00:30
Цитата Сообщение от PB Посмотреть сообщение
исполняемый файл запущен не с диска, а из памяти.
Перед этим он был запущен.
Цитата Сообщение от PB Посмотреть сообщение
что для запуска из памяти не обязательно писать свой загрузчик.
... если файл уже существует на носителе ) а если же задача стоит запустить EXE, который представляет из себя массив байт находящихся в памяти, то без загрузчика не обойтись.
0
PB
Просто прогер
1292 / 1079 / 13
Регистрация: 13.03.2009
Сообщений: 2,502
19.10.2010, 01:00
Цитата Сообщение от SSTREGG Посмотреть сообщение
Перед этим он был запущен
Нет!

Цитата Сообщение от SSTREGG Посмотреть сообщение
задача стоит запустить EXE, который представляет из себя массив байт находящихся в памяти
Если, скажем, взять и программно скопировать в память все содержимое исполняемого файла. Это по вашему будет массив байт?
Так вот, процедура RunPE запускает файл из памяти именно такого формата. Т. е. обычный PE файл, но находящийся не на диске, а в памяти.

Для примера, я взял стантадрный блокнот (NOTEPAD.exe) из ХРюши, упаковал его и "вшил" в свою прогу (она в прикрепленном файле).
После запуска проги-родителя, производится распаковка дочерней проги - блокнота из исполняемого файла в память и указатель на этот участок памяти передается процедуре RunPE.
Т. е. эти манипуляции (распаковка и запуск), производятся без извлечения на диск.
Вложения
Тип файла: rar NOTEPAD_Mem.rar (37.6 Кб, 47 просмотров)
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8729 / 3681 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
19.10.2010, 01:28
Цитата Сообщение от PB Посмотреть сообщение
Нет!
Согласен, ошибочка вышла. Запущен был еще раз свой процесс, который будет выступать в роли "носителя". Каждому своё, имхо.
Цитата Сообщение от PB Посмотреть сообщение
Если, скажем, взять и программно скопировать в память все содержимое исполняемого файла. Это по вашему будет массив байт?
А что это будет по вашему? Строка? )
0
90 / 89 / 13
Регистрация: 28.09.2010
Сообщений: 262
19.10.2010, 03:00
Вот пример

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
59
60
61
62
63
64
65
66
67
68
69
70
    public static void Main(string[] args)
        {
            if (args.Length<2)
            {
                Console.WriteLine("Неверные параметры");
                Console.WriteLine("Нажмите любую клавишу");
                Console.ReadKey();
                return;
            }
            
            
            if (!File.Exists(args[0]))
            {
                Console.WriteLine("Неверное имя файла!");
                Console.WriteLine("Нажмите любую клавишу");
                Console.ReadKey();
                return;
            }
            
            if (File.Exists(args[1]))
            {
                File.Delete(args[1]);
            }
            //Шифруем
            
            RC2 RC2alg = RC2.Create("RC2");
            FileStream inStream = File.Open(args[0], FileMode.Open);
            FileStream outStream=File.Open(args[1], FileMode.Create);
            byte[] key=RC2alg.Key;
            byte[] iv=RC2alg.IV;
            //По идее Key и IV надо где-то хранить, либо как-то динамически генерировать
 
            CryptoStream crStream=new CryptoStream(outStream,RC2alg.CreateEncryptor(key,iv), CryptoStreamMode.Write);
            CopyStream(inStream,crStream);
            crStream.Close();
            inStream.Close();
            outStream.Close();
            
            
            //Дешифруем и запускаем
            
            inStream = File.Open(args[1], FileMode.Open);
            MemoryStream mOutStream=new MemoryStream();
            
            crStream=new CryptoStream(inStream,RC2alg.CreateDecryptor(key,iv), CryptoStreamMode.Read);
            CopyStream(crStream,mOutStream);
            
            crStream.Close();
            inStream.Close();
            
            byte[] coff=mOutStream.ToArray();
            mOutStream.Close();
            
            Assembly ass=Assembly.Load(coff);
            ass.EntryPoint.Invoke(null,new object[]{new string[0]});
                
            
            
            
        }
        
        public static void CopyStream(Stream input, Stream output)
        {
            byte[] buffer=new byte[4096];
            int read;
            while ((read=input.Read(buffer,0,buffer.Length))!=0)
            {
                output.Write(buffer,0,read);
            }
        }
В общем - параметр 1 - исходный файл, параметр 2 - выходной, зашифрованный.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.10.2010, 03:00
Помогаю со студенческими работами здесь

Куда и как внедрять в новую ЕХЕ иконку упаковываемого ЕХЕ?
Привет всем программерам! Давно не заходил я не этот форум. Сделал программу чтото типа упаковщика ЕХЕ. Проблема такая,куда и как...

Структура ехе файла
Где можно подробно прочитать про структуру ехе? мне например надо данные о файле получить, ресурсы, классы, указатели на экспортируемые...

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

Создания ехе файла
Всем привет, хочу попросить помощи в создании exe файла из двух asm.(MASM). Суть программы: очистка экрана и вывод символа по...

Создание .ехе файла
У меня установлена Borland Developer Studio Turbo C++. При создании программки, создается и .ехе файл. У меня на компе он запускается и...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru