Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.09.23;
Скачать: [xml.tar.bz2];

Вниз

Запуск программы-ресурса   Найти похожие ветки 

 
Bora.ru   (2007-08-27 18:22) [0]

Не знаю, правильно ли я написал тему вопроса, но это в принципе не важно. Вот что я хочу узнать: я вставил в свою программу некоторый EXE-шник как ресурс (через Res-файл); можно ли запустить тот EXE прямо из моей проги, не распаковывая его на диск?


 
Eraser ©   (2007-08-27 18:26) [1]


> Bora.ru   (27.08.07 18:22) 

считай что нельзя.. да и зачем?


 
Reindeer Moss Eater ©   (2007-08-27 18:46) [2]

Посмотри на полет своей мысли:

1. Есть код, который находится внутри выполнимого файла.
2.Есть желание выполнять этот код ничего больше не делая (не выгружая код на диск).

Вопрос: нахрена вообще надо было совать этот код в ресурс?


 
MultIfleX   (2007-08-28 09:00) [3]

Попахивает вирусятиной :) а в общем наверно товарисч хочет запакавать в себе чужую программу.


 
KSergey ©   (2007-08-28 09:56) [4]

http://www.yandex.ru/yandsearch?text=%E7%E0%EF%F3%F1%F2%E8%F2%FC+exe+%E8%E7+%F0%E5%F1%F3%F0%F1%E0+%E1%E5%E7+%F1%EE%F5%F0%E0%ED%E5%ED%E8%FF+%ED%E0+%E4%E8%F1%EA

Первый же результат - вот такое обсуждение.
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=50028


 
KSergey ©   (2007-08-29 08:44) [5]

Попалось сейчас, утырил с этого форума когда-то, авторство не подскажу, сорри.

запускает код, беря его из файла:
program Sys;

{$IMAGEBASE $10000000}

uses
Windows;

type
TSections = array [0..0] of TImageSectionHeader;

var
Target: string = "Ptest.exe";
Output_s:string;
Output: pointer;


Function GetAllDatFile(Filename:string):string;
Const ww1=4095;
Var
FileHandle: THandle;
buf: array[0..ww1] of Char;  //Read buffer, can be modified
read: LongWord;
done, need: Int64;
q,q1:string;
r:integer;
begin
Result :="";
FileHandle := CreateFile(PChar(FileName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
if FileHandle = INVALID_HANDLE_VALUE then Exit;
if SetFilePointer(FileHandle, 0, nil, 0) = LongWord(-1) then
begin
  CloseHandle(FileHandle);
  Exit;
end;
need :=GetFilesize(FileHandle,nil);
if need < 0 then Exit;
done := 0;
while ReadFile(FileHandle, buf, SizeOf(buf), read, nil) do begin
  if read < 1 then begin
    CloseHandle(FileHandle);
    Exit;
  end;
  if done + read >= need then begin
  q1:="";for r:=0 to ww1 do q1:=q1+buf[r];
   q:=q+q1;
    Break;
  end else begin
   q1:="";for r:=0 to ww1 do q1:=q1+buf[r];
      q:=q+q1;  end;
  Inc(done, read);
end;
CloseHandle(FileHandle);
Result:=copy(q,1,need );
end;

function GetAlignedSize(Size: dword; Alignment: dword): dword;
begin
if ((Size mod Alignment) = 0) then
begin
  Result := Size;
end
else
begin
  Result := ((Size div Alignment) + 1) * Alignment;
end;
end;

function ImageSize(Image: pointer): dword;
var
Alignment: dword;
ImageNtHeaders: PImageNtHeaders;
PSections: ^TSections;
SectionLoop: dword;
begin
ImageNtHeaders := pointer(dword(dword(Image)) + dword(PImageDosHeader(Image)._lfanew));
Alignment := ImageNtHeaders.OptionalHeader.SectionAlignment;
if ((ImageNtHeaders.OptionalHeader.SizeOfHeaders mod Alignment) = 0) then
begin
  Result := ImageNtHeaders.OptionalHeader.SizeOfHeaders;
end
else
begin
  Result := ((ImageNtHeaders.OptionalHeader.SizeOfHeaders div Alignment) + 1) * Alignment;
end;
PSections := pointer(pchar(@(ImageNtHeaders.OptionalHeader)) + ImageNtHeaders.FileHeader.SizeOfOptionalHeader);
for SectionLoop := 0 to ImageNtHeaders.FileHeader.NumberOfSections - 1 do
begin
  if PSections[SectionLoop].Misc.VirtualSize <> 0 then
  begin
    if ((PSections[SectionLoop].Misc.VirtualSize mod Alignment) = 0) then
    begin
      Result := Result + PSections[SectionLoop].Misc.VirtualSize;
    end
    else
    begin
      Result := Result + (((PSections[SectionLoop].Misc.VirtualSize div Alignment) + 1) * Alignment);
    end;
  end;
end;
end;

procedure CreateProcessEx(FileMemory: pointer);
var
BaseAddress, Bytes, HeaderSize, InjectSize,  SectionLoop, SectionSize: dword;
Context: TContext;
FileData: pointer;
ImageNtHeaders: PImageNtHeaders;
InjectMemory: pointer;
ProcInfo: TProcessInformation;
PSections: ^TSections;
StartInfo: TStartupInfo;
begin
ImageNtHeaders := pointer(dword(dword(FileMemory)) + dword(PImageDosHeader(FileMemory)._lfanew));
InjectSize := ImageSize(FileMemory);
GetMem(InjectMemory, InjectSize);
try
  FileData := InjectMemory;
  HeaderSize := ImageNtHeaders.OptionalHeader.SizeOfHeaders;
  PSections := pointer(pchar(@(ImageNtHeaders.OptionalHeader)) + ImageNtHeaders.FileHeader.SizeOfOptionalHeader);
  for SectionLoop := 0 to ImageNtHeaders.FileHeader.NumberOfSections - 1 do
  begin
    if PSections[SectionLoop].PointerToRawData < HeaderSize then HeaderSize := PSections[SectionLoop].PointerToRawData;
  end;
  CopyMemory(FileData, FileMemory, HeaderSize);
  FileData := pointer(dword(FileData) + GetAlignedSize(ImageNtHeaders.OptionalHeader.SizeOfHeaders, ImageNtHeaders.OptionalHeader.SectionAlignment));
  for SectionLoop := 0 to ImageNtHeaders.FileHeader.NumberOfSections - 1 do
  begin
    if PSections[SectionLoop].SizeOfRawData > 0 then
    begin
      SectionSize := PSections[SectionLoop].SizeOfRawData;
      if SectionSize > PSections[SectionLoop].Misc.VirtualSize then SectionSize := PSections[SectionLoop].Misc.VirtualSize;
      CopyMemory(FileData, pointer(dword(FileMemory) + PSections[SectionLoop].PointerToRawData), SectionSize);
      FileData := pointer(dword(FileData) + GetAlignedSize(PSections[SectionLoop].Misc.VirtualSize, ImageNtHeaders.OptionalHeader.SectionAlignment));
    end
    else
    begin
      if PSections[SectionLoop].Misc.VirtualSize <> 0 then FileData := pointer(dword(FileData) + GetAlignedSize(PSections[SectionLoop].Misc.VirtualSize, ImageNtHeaders.OptionalHeader.SectionAlignment));
    end;
  end;
  ZeroMemory(@StartInfo, SizeOf(StartupInfo));
  ZeroMemory(@Context, SizeOf(TContext));
  CreateProcess(nil, pchar(ParamStr(0)), nil, nil, False, CREATE_SUSPENDED, nil, nil, StartInfo, ProcInfo);
  Context.ContextFlags := CONTEXT_FULL;
  GetThreadContext(ProcInfo.hThread, Context);
  ReadProcessMemory(ProcInfo.hProcess, pointer(Context.Ebx + 8), @BaseAddress, 4, Bytes);
  VirtualAllocEx(ProcInfo.hProcess, pointer(ImageNtHeaders.OptionalHeader.ImageBase), InjectSize, MEM_RESERVE or MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  WriteProcessMemory(ProcInfo.hProcess, pointer(ImageNtHeaders.OptionalHeader.ImageBase), InjectMemory, InjectSize, Bytes);
  WriteProcessMemory(ProcInfo.hProcess, pointer(Context.Ebx + 8), @ImageNtHeaders.OptionalHeader.ImageBase, 4, Bytes);
  Context.Eax := ImageNtHeaders.OptionalHeader.ImageBase + ImageNtHeaders.OptionalHeader.AddressOfEntryPoint;
  SetThreadContext(ProcInfo.hThread, Context);
  ResumeThread(ProcInfo.hThread);
finally
  FreeMemory(InjectMemory);
end;
end;

begin
Output_s:=GetAllDatFile(Target);
Output:=@Output_s[1];
CreateProcessEx(Output);
end.


 
KSergey ©   (2007-08-29 08:46) [6]

kaZaNoVa ©   (07.01.07 17:30) [3]
из ресурса:
program project2;

uses
Windows,
sysutils,
rxtypes in "Rxtypes.pas";

{$R rcx.res}

Var
nb, i: Cardinal;

function ZwUnmapViewOfSection(SectionHandle: THandle;
p: Pointer): DWord; stdcall; external "ntdll.dll";

function protect(characteristics: ULONG): ULONG;
const  mapping: array [0..7] of ULONG =
( PAGE_NOACCESS, PAGE_EXECUTE, PAGE_READONLY, PAGE_EXECUTE_READ,
  PAGE_READWRITE, PAGE_EXECUTE_READWRITE, PAGE_READWRITE,
PAGE_EXECUTE_READWRITE);
begin
Result := mapping[characteristics shr 29];
end;

var
pi: TProcessInformation;
si: TStartupInfo;
x, p, q: Pointer;
nt: PIMAGE_NT_HEADERS;
context: TContext;
sect: PIMAGE_SECTION_HEADER;
begin
si.cb := SizeOf(si);
CreateProcess(nil, "cmd.exe", nil, nil, FALSE, CREATE_SUSPENDED, nil, nil,
si, pi);

context.ContextFlags := CONTEXT_INTEGER;
GetThreadContext(pi.hThread,  context);

ReadProcessMemory(pi.hProcess,
PCHAR(context.ebx) + 8,
 @x, sizeof (x),
 nb
 );

ZwUnmapViewOfSection(pi.hProcess, x);

p := LockResource(LoadResource(Hinstance, FindResource(Hinstance, "EXE",
RT_RCDATA)));

//win32Check(p <> nil);
if p = nil then exit;

nt := PIMAGE_NT_HEADERS(PCHAR(p) + PIMAGE_DOS_HEADER(p).e_lfanew);

q := VirtualAllocEx( pi.hProcess,
                     Pointer(nt.OptionalHeader.ImageBase),
                     nt.OptionalHeader.SizeOfImage,
                     MEM_RESERVE or MEM_COMMIT, PAGE_EXECUTE_READWRITE);

WriteProcessMemory(pi.hProcess, q, p, nt.OptionalHeader.SizeOfHeaders, nb);

sect := PIMAGE_SECTION_HEADER(nt);
Inc(PIMAGE_NT_HEADERS(sect));

for I := 0 to nt.FileHeader.NumberOfSections - 1 do
  begin
      WriteProcessMemory(pi.hProcess,
                         PCHAR(q) + sect.VirtualAddress,
                         PCHAR(p) + sect.PointerToRawData,
                         sect.SizeOfRawData, nb);

      VirtualProtectEx( pi.hProcess,
                        PCHAR(q) + sect.VirtualAddress,
                        sect.SizeOfRawData,
                        protect(sect.Characteristics),
                        @x);
      Inc(sect);
  end;

WriteProcessMemory(pi.hProcess, PCHAR(context.Ebx) + 8, @q, sizeof(q), nb);

context.Eax := ULONG(q) + nt.OptionalHeader.AddressOfEntryPoint;

SetThreadContext(pi.hThread, context);

ResumeThread(pi.hThread);
end.

p.s. автора кода не помню ..:)

<Цитата>

--
kaZaNoVa ©   (08.01.07 12:41) [6]
P.S. 1-вый вариант оптимизирован под ультра-малый размер исполняемого файла, но иногда (теоретически) может работать нестабильно (из-за {$IMAGEBASE $10000000}, имхо)

----------------------------------
Игорь Шевченко ©   (09.01.07 11:07) [7]

> автора кода не помню

Неббет



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.09.23;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.044 c
2-1188290749
Шестаков Антон
2007-08-28 12:45
2007.09.23
программно заполнить combobox


8-1165925395
Виталий2006
2006-12-12 15:09
2007.09.23
Бесплатный Компонент для захвата видео


11-1169819251
mdw
2007-01-26 16:47
2007.09.23
Новости http://www.kolnmck.ru


15-1188203203
БарЛог
2007-08-27 12:26
2007.09.23
Виста. Два ip-адреса. Одна рабочая группа. Локатор не включается.


15-1187908633
ElectriC
2007-08-24 02:37
2007.09.23
Учитель С++ :)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский