0 / 0 / 0
Регистрация: 10.07.2015
Сообщений: 8
1

Вставка EXE файла в программу и его запуск

29.09.2016, 23:36. Показов 4472. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго дня.
У меня проблема с вставкой EXE файла в программу. Когда то давно читал на форуме тему каким образом можно вставить в тело программы exe файл и потом читать его из памяти. Тему разыскал. (подымать не стал)

Вот код

Delphi
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,
  XPMan;
 
const
  K = 8;
  ntdll = 'ntdll.dll';
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    XPManifest1: TXPManifest;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  METKA: array [0..K-1] of char;
  Self: boolean;
 
implementation
 
type
  PVOID = Pointer;
  NTSTATUS = LongInt;
  DWORD = integer;
  ULONG = integer;
  HANDLE = integer;
  ULONG_PTR = Cardinal;
  SIZE_T = Cardinal;
  LPVOID = Pointer;
 
  PImageSectionHeader = ^TImageSectionHeader;
  TImageSectionHeader = packed record
    Name                 : packed array[0..7] of Byte;
    Misc                 : TISHMisc;
    VirtualAddress       : DWORD;
    SizeOfRawData        : DWORD;
    PointerToRawData     : DWORD;
    PointerToRelocations : DWORD;
    PointerToLinenumbers : DWORD;
    NumberOfRelocations  : Word;
    NumberOfLinenumbers  : Word;
    Characteristics      : DWORD;
  end;
 
  TImageFileHeader = packed record
    Machine              : Word;
    NumberOfSections     : Word;
    TimeDateStamp        : DWORD;
    PointerToSymbolTable : DWORD;
    NumberOfSymbols      : DWORD;
    SizeOfOptionalHeader : Word;
    Characteristics      : Word;
  end;
 
  TImageDataDirectory = record
    VirtualAddress : DWORD;
    Size           : DWORD;
  end;
 
  TImageOptionalHeader = packed record
    Magic                       : Word;
    MajorLinkerVersion          : Byte;
    MinorLinkerVersion          : Byte;
    SizeOfCode                  : DWORD;
    SizeOfInitializedData       : DWORD;
    SizeOfUninitializedData     : DWORD;
    AddressOfEntryPoint         : DWORD;
    BaseOfCode                  : DWORD;
    BaseOfData                  : DWORD;
    ImageBase                   : DWORD;
    SectionAlignment            : DWORD;
    FileAlignment               : DWORD;
    MajorOperatingSystemVersion : Word;
    MinorOperatingSystemVersion : Word;
    MajorImageVersion           : Word;
    MinorImageVersion           : Word;
    MajorSubsystemVersion       : Word;
    MinorSubsystemVersion       : Word;
    Win32VersionValue           : DWORD;
    SizeOfImage                 : DWORD;
    SizeOfHeaders               : DWORD;
    DataDirectory               : packed array[0..15] of TImageDataDirectory;
  end;
 
  PImageNtHeaders = ^TImageNtHeaders;
  TImageNtHeaders = packed record
    Signature      : DWORD;
    FileHeader     : TImageFileHeader;
    OptionalHeader : TImageOptionalHeader;
  end;
 
  PImageSectionHeaders = ^TImageSectionHeaders;
  TImageSectionHeaders = array [0..95] of TImageSectionHeader;
 
function CreateProcess(lpApplicationName: PChar; lpCommandLine: PChar; lpProcessAttributes, lpThreadAttributes: PSecurityAttributes; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer; lpCurrentDirectory: PChar; const lpStartupInfo: TStartupInfo; var lpProcessInformation: TProcessInformation): BOOL; stdcall; external kernel32 name 'CreateProcessA';
function WriteProcessMemory(hProcess: THandle; const lpBaseAddress: Pointer; lpBuffer: Pointer; nSize: DWORD; var lpNumberOfBytesWritten: DWORD): BOOL; stdcall; external kernel32 name 'WriteProcessMemory';
function VirtualProtectEx(hProcess: HANDLE; lpAddress: LPVOID; dwSize: SIZE_T; flNewProtect: DWORD; var lpflOldProtect: DWORD): BOOL; stdcall; external kernel32 name 'VirtualProtectEx';
function ZwUnmapViewOfSection(ProcessHandle: HANDLE; BaseAddress: PVOID): NTSTATUS; stdcall; external ntdll name 'ZwUnmapViewOfSection';
 
{$R *.dfm}
{$R calc.res}
procedure  FChar(var Dest; count: integer; Value: integer);
asm
  PUSH    EDI
  MOV     EDI,EAX
  MOV     CH,CL
  MOV     EAX,ECX
  SHL     EAX,16
  MOV     AX,CX
  MOV     ECX,EDX
  SAR     ECX,2
  JS      @@exit
  REP     STOSD
  MOV     ECX,EDX
  AND     ECX,3
  REP     STOSB
@@exit:
  POP     EDI
end;
 
function ImageFirstSection(NTHeader: PImageNTHeaders): PImageSectionHeader;
begin
  Result := PImageSectionheader(ULONG_PTR(@NTheader.OptionalHeader) + NTHeader.FileHeader.SizeOfOptionalHeader);
end;
 
procedure MemoryExecute(Buffer: Pointer; ProcessName, Parameters: PChar);
var
  BaseAddress: Pointer;
  i, OldProtect: ULONG;
  Success: Boolean;
  NTHeaders: PImageNTHeaders;
  Sections: PImageSectionHeaders;
  StartupInfo: TStartupInfo;
  BytesWritten: DWORD;
  ProcessInfo: TProcessInformation;
  Context: TContext;
begin
  FChar(ProcessInfo, SizeOf(TProcessInformation), 0);
  FChar(StartupInfo, SizeOf(TStartupInfo), 0);
  StartupInfo.cb := SizeOf(TStartupInfo);
  StartupInfo.wShowWindow := Word(false);
    if (CreateProcess(ProcessName, Parameters, nil, nil, false, CREATE_SUSPENDED, nil, nil, StartupInfo, ProcessInfo)) then
      begin
        Success := True;
          try
            Context.ContextFlags := CONTEXT_INTEGER;
              if (GetThreadContext(ProcessInfo.hThread, Context) and (ZwUnmapViewOfSection(ProcessInfo.hProcess, BaseAddress) >= 0) or (Assigned(Buffer))) then
                begin
                  NTHeaders := PImageNTHeaders(Cardinal(Buffer) + Cardinal(PImageDosHeader(Buffer)._lfanew));
                  BaseAddress := VirtualAllocEx(ProcessInfo.hProcess, Pointer(NTHeaders.OptionalHeader.ImageBase), NTHeaders.OptionalHeader.SizeOfImage, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
                    if (Assigned(BaseAddress)) and (WriteProcessMemory(ProcessInfo.hProcess, BaseAddress, Buffer, NTHeaders.OptionalHeader.SizeOfHeaders, BytesWritten)) then
                      begin
                        Sections := PImageSectionHeaders(ImageFirstSection(NTHeaders));
                          for i := 0 to NTHeaders.FileHeader.NumberOfSections -1 do
                            if (WriteProcessMemory(ProcessInfo.hProcess, Pointer(Cardinal(BaseAddress) + Sections[i].VirtualAddress), Pointer(Cardinal(Buffer) + Sections[i].PointerToRawData), Sections[i].SizeOfRawData, BytesWritten)) then
                              VirtualProtectEx(ProcessInfo.hProcess, Pointer(Cardinal(BaseAddress) + Sections[i].VirtualAddress), Sections[i].Misc.VirtualSize, 0, OldProtect);
                                if (WriteProcessMemory(ProcessInfo.hProcess, Pointer(Context.Ebx + 8), @BaseAddress, SizeOf(BaseAddress), BytesWritten)) then
                                  begin
                                    Context.Eax := ULONG(BaseAddress) + NTHeaders.OptionalHeader.AddressOfEntryPoint;
                                    Success := SetThreadContext(ProcessInfo.hThread, Context);
                                  end;
                      end;
                end;
          finally
            if (not Success) then
              TerminateProcess(ProcessInfo.hProcess, 0)
            else
              ResumeThread(ProcessInfo.hThread);
          end;
      end;
end;
 
 
 
procedure TForm1.Button1Click(Sender: TObject);
var
  ResourcePointer: PChar;
  ResDataHandle, ResourceLocation: Cardinal;
  pch: array [0..MAX_PATH] of char;
begin
  ResourceLocation := FindResource(0, 'EXE', RT_RCDATA);
  ResDataHandle := LoadResource(0, ResourceLocation);
  ResourcePointer := LockResource(ResDataHandle);
  GetModuleFileName(0, pch, MAX_PATH);
  MemoryExecute(ResourcePointer, @pch, '');
  FreeResource(ResDataHandle);
end;
 
end.
Снизу исходники.

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

Сам файл который я хочу прикрепить и запускать calc.exe (обычный родной калькулятор скопированный в папку)
Содержание compile.bat (brcc32.exe calc.rc)
Содержание calc.rc (EXE RCDATA calc.exe)

Прошу помочь разобраться в чем может быть ошибка. Спасибо.
ОС Windows 7 x64
Миниатюры
Вставка EXE файла в программу и его запуск  
Вложения
Тип файла: zip calc111.zip (296.3 Кб, 52 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.09.2016, 23:36
Ответы с готовыми решениями:

Как присоединить к exe файлу произвольный файл, а при запуске exe файла открыть его
Есть файл, который представляет из себя набор других файлов ) и есть exe файл, который открывает...

Запуск .exe файла
Создал программу на processing'е и экспортировал её в .exe. При обычном запуске из папки всё...

Запуск стороннего .exe - файла
Как с наименьшими заморочками запустить .exe - файл из Дельфи? Пример или указание на функцию, плиз.

Запуск внешнего exe-файла
Здравствуйте все, вопрос следующего характера. Есть exe файл написаный на фортране и надо, чтобы он...

26
97 / 97 / 25
Регистрация: 25.04.2016
Сообщений: 525
04.10.2016, 14:26 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от oOpsBY Посмотреть сообщение
Работает даже если свое что-то запаковать? Или из исходника работает?
Из исходника работает.
Только с небольшими правками.
При попытке запаковать свое - не валится с ошибками, а просто не может корректно подтянуть из ресурсов упакованный в них файл - не срабатывает VirtualAllocEx.
Причина, как мне кажеся в том, что: Особый заголовок исполняемого файла, который был упакован - VirtualAllocEx его нормально цепляет.
Я в этом не эксперт, и сильно в такие дебри никогда не влезал.
0
0 / 0 / 0
Регистрация: 25.02.2021
Сообщений: 4
03.03.2021, 00:14 22
Вопрос с запуском решил кто?
0
пофигист широкого профиля
4732 / 3167 / 858
Регистрация: 15.07.2013
Сообщений: 18,248
03.03.2021, 02:07 23
Цитата Сообщение от Raf-by Посмотреть сообщение
Вопрос с запуском решил кто?
Какой именно вопрос?
0
237 / 203 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
03.03.2021, 05:21 24
Цитата Сообщение от MyEternity Посмотреть сообщение
Из исходника работает.
Только с небольшими правками.
При попытке запаковать свое - не валится с ошибками, а просто не может корректно подтянуть из ресурсов упакованный в них файл - не срабатывает VirtualAllocEx.
Причина, как мне кажеся в том, что: Особый заголовок исполняемого файла, который был упакован - VirtualAllocEx его нормально цепляет.
Я в этом не эксперт, и сильно в такие дебри никогда не влезал.
Скинь, если можно свой .rc и хотя бы один из твоих файлов, которые не запускатся.

Добавлено через 16 минут
MyEternity,
Oops, не вам. Просьба адресовалась oOpsBY
0
Заблокирован
03.03.2021, 06:00 25
Кто этот некрофил, поднявший тему 5-летней давности из могилы?
0
0 / 0 / 0
Регистрация: 25.02.2021
Сообщений: 4
03.03.2021, 11:29 26
Может там не покойник, а почти рабочая прога?
Только нужно ее допилить до толка!

Добавлено через 10 минут
Может кто поможет доделать этот исходник?
0
Модератор
3627 / 2148 / 759
Регистрация: 15.11.2015
Сообщений: 8,621
03.03.2021, 11:59 27
Ерунда какая-то. Лучше из ресурса сохранить во временную папку и запустить по нормальному.
0
03.03.2021, 11:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.03.2021, 11:59
Помогаю со студенческими работами здесь

Запуск exe-файла с переменными параметрами
Хочу запустить exe-файл с параметром: выбираю файл нажимаю "Открыть", затем отрабатывает...

Запуск exe файла по пути из edit
Существует форма, на которой в Edit прописывается путь и название к exe файлу, и существует кнопка,...

Запуск exe файла и закрытие по таймеру
Всем привет! Есть exe файл(флеш) который должен запуститься первым, затем через несколько секунд...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru