![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
EXE внутри EXE [D7, Win2k]
ev © (2005-08-03 11:02:00)возникла необходимость поместить в мою программу EXE файл
поместил в ресурс
далее можно сохранить на диск и выполнить
но хотелось бы выполнить этот EXE не сохраняя на диск
такое возможно?
Юрий Зотов (2005-08-07 07:54:00) [1]Так.
По сабжу уже давно ничего не говорится и вряд ли что новое будет сказано. Зато набирает обороты непонятный конфликт. Так вот - пока он их не набрал, ветку закрываю. При желании отношения можно выяснить по мылу (но хочется надеяться, что такого желания ни у кого не возникнет).
Джо (2005-08-07 05:58:00) [2]Кстати, код, приведенный Пашей, я, помнится встречал в инете несколько раз - и все с разными вариациями. Или вы считаете, что только вы удосужились "перевести" код весьма уважаемого Гарри? Или, скорее, "пересказать"?
Джо (2005-08-07 05:54:00) [3]Уважаемый LVT, заодно с Пашей и меня сразу в игнорлист заносите, ибо, по моему мнению, суть ваших претензий - исключительно бредовая. Уж не обессудьте, просто мнение постороннего человека.
pasha_golub (2005-08-07 04:59:00) [4]Или может Гарри ваш близкий друг? Или родственник?
Вы уж подскажите мне как себя вести. А то так и умру невеждой, да еще и в игнорлисте у такого уважаемого человека.
pasha_golub (2005-08-07 04:56:00) [5]Leonid Troyanovsky © (05.08.05 13:07) [22]
Леонид, у вас проблемы? Вы хотите об этом поговорить? Не стоит гнуть пальцы.
Конкретно, в чем проблема, дорогой мой друг? Вы читать умеете?
Написано "у меня это было реализовано так", то так оно и было! В другой раз было написанно "код, приведенный мной". Он таки приведен мной.
И конечно же верх гениальности пугать кого-то игнорлистом. Может еще заплачете?
Leonid Troyanovsky (2005-08-05 13:07:00) [6]
> pasha_golub © (05.08.05 12:13) [21]
> Это уже не Гарри Неббет, а по мотивам Гарри Неббета. Может
> быть ибо глянул я ссылку. И где же, дорогой мой коллега,
> вы увидели эквивалентность?
Это мой перевод кода Gary на дельфи:
http://groups-beta.google.com/group/fido7.ru.delphi/msg/dbf6083b8b7fbee4
--
Regards, LVT.
ЗЫ В моем ignore list ты можешь стать первым.
pasha_golub (2005-08-05 12:13:00) [7]Leonid Troyanovsky © (05.08.05 09:03) [20]
Тьфу ты, не мой, ессно, а приведенный мНой. Это да.
Это уже не Гарри Неббет, а по мотивам Гарри Неббета. Может быть ибо глянул я ссылку. И где же, дорогой мой коллега, вы увидели эквивалентность?
И хватит фрейдистких оговорок.
Идиотская фраза.
---
Regards, PMG
Leonid Troyanovsky (2005-08-05 09:03:00) [8]
> pasha_golub © (05.08.05 01:19) [17]
> ребята, если кто знает, поделитесь плиз инфой как работает
> код, приведенный мой. Интересует часть с записью данных
> в память процесса только лишь...
WriteProcessMemory.
Еще раз: "не мой, а by Gary Nebbett".
http://groups.google.com/group/microsoft.public.win32.programmer.kernel/msg/fb58c55a2edd8e88
И хватит фрейдистких оговорок.
--
Regards, LVT.
ev (2005-08-05 01:37:00) [9]> Чем "упаковщики" или AS... соответствуют теме?
упаковщик в себе содержит распаковщик и сам EXE
AS аналогично + проверки всякие (кстати, он тоже упаковывает, поэтому его можно назвать упаковщиком)
задача схожая - сначала должен отработать мой код, а потом запустить (или нет) "чужой" EXE
Германн (2005-08-05 01:25:00) [10]2 ev (05.08.05 01:12) [16]
>сорри, не совсем верно выразился... бывает...
>но я думаю все поняли что я имел ввиду :)
Я - не понял.
>предлагаю не отходить от темы..
>>есть еще варианты?
>>работают ведь упаковщики (например, asprotect)
Чем "упаковщики" или AS... соответствуют теме?
pasha_golub (2005-08-05 01:19:00) [11]ребята, если кто знает, поделитесь плиз инфой как работает код, приведенный мой. Интересует часть с записью данных в память процесса только лишь...
ev (2005-08-05 01:12:00) [12]> Или у тебя есть "документированные" права на ник "ev"?
мне они не нужны :)
> Кто тут назвал AsProtect упаковщиком?
сорри, не совсем верно выразился... бывает...
но я думаю все поняли что я имел ввиду :)
предлагаю не отходить от темы...
Германн (2005-08-05 01:01:00) [13]2 ev (04.08.05 22:20) [14]
>> Автор сабжа - анонимный
>наверное ник не заметил... бывает :)
Ник заметил, но он "анонимный"! Я, ты, он, они и т.д. могут постить под сим ник'ом!
>и если надо написать вирус я сразу через 100 проксей сидеть >буду и ник скрывать? детсад блин :)
А чё его скрывать? Или у тебя есть "документированные" права на ник "ev"?
>есть еще варианты?
>работают ведь упаковщики (например, asprotect)
Кто тут назвал AsProtect упаковщиком?
ev (2005-08-04 22:20:00) [14]> Автор сабжа - анонимный
наверное ник не заметил... бывает :)
и если надо написать вирус я сразу через 100 проксей сидеть буду и ник скрывать? детсад блин :)
есть еще варианты?
работают ведь упаковщики (например, asprotect)
3DxFantastika (2005-08-04 07:45:00) [15]"вирус/не вирус" , про презумпцию невиновностизабыли?
между прочим есть статья за клевету...
Германн (2005-08-04 02:00:00) [16]Автор сабжа - анонимный. Это - раз.
"возникла необходимость поместить в мою программу EXE файл" - никак необъяснена сия необходимость. Это - два.
"когда человек спросит как в файл байт записать - тоже вирус пишет? :)" - А это смотря в какой файл! Может и вирус. Это - три.
pasha_golub (2005-08-03 23:51:00) [17]Leonid Troyanovsky © (03.08.05 20:11) [9]
Не, ну дорогой товарищ. Я и не присваиваю себе лавры. Уж, поверьте меньше всего я надеялся, что код, обошедший полнета, будет воспринят как мой. ;-)
Именно поэтому и тайна.
Ну, так раскройте ее мне сирому, о загадочный покровитель. :0)
ev (2005-08-03 22:42:00) [18]> Вирусы писать нехорошо
при чем тут вирусы?
когда человек спросит как в файл байт записать - тоже вирус пишет? :)
можно ли как-либо еще прицепить к своему EXE второй и выполнить его без сохранения на диск?
Leonid Troyanovsky (2005-08-03 20:11:00) [19]
> pasha_golub © (03.08.05 19:46) [8]
> Вообщем-то, я такое реализовывал. Задача: фронтэнд к
..
> У меня это выглядело так:
"Такое", "так" - реализовывал Gary Nebbett.
> Если честно, то танцы с записью в память процесса для меня
> так и остались тайной. Что именно пишется и зачем, я могу
> только предполагать.
Именно поэтому и тайна.
--
Regards, LVT.
pasha_golub (2005-08-03 19:46:00) [20]Вообщем-то, я такое реализовывал. Задача: фронтэнд к консольной утилитке.
Однако, под 9х у меня так и не вышло, кроме как сохранить на диск и потом запустить. А вот в семействе НТ вышло... Однако, хотелось бы увидеть, существуют ли еще методы?
У меня это выглядело так:
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;
Function GetConsoleOutput( CommandLine, Pass, ResName: String; var ResultCode: Cardinal ): String;
var
//process launch and in/out stuff
StdOutPipeRead,
StdOutPipeWrite,
StdInPipeRead,
StdInPipeWrite: THandle;
SA : TSecurityAttributes;
SI : TStartupInfo;
PI : TProcessInformation;
WasOK : Boolean;
Buffer : array[0..1023] of Char;
BytesRead : Cardinal;
Line : String;
Written : DWORD;
Passed : boolean;
//exe headers and resources stuff
x, p, q: Pointer;
NT: PIMAGE_NT_HEADERS;
context: TContext;
Sect: PIMAGE_SECTION_HEADER;
nb, i: Cardinal;
RS: TResourceStream;
Begin
With SA do
Begin
nLength := SizeOf( SA );
bInheritHandle := True;
lpSecurityDescriptor := nil;
end;
CreatePipe( StdOutPipeRead,
StdOutPipeWrite,
@SA,
0 );
CreatePipe( StdInPipeRead,
StdInPipeWrite,
@SA,
0 );
try
with SI do
Begin
FillChar( SI, SizeOf( SI ), 0 );
cb := SizeOf( SI );
dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
wShowWindow := SW_HIDE or SW_SHOWMINNOACTIVE;
hStdInput := StdInPipeRead;
hStdOutput := StdOutPipeWrite;
hStdError := StdOutPipeWrite;
end;
Passed := false;
//make sure that proper console starts: cmd.exe for NT,
//<name>.exe extracted in another case
IF (Win32platform <> VER_PLATFORM_WIN32_NT)
then
begin
RS := TResourceStream.Create(HInstance,ResName,Pchar('EXEFILE'));
try
RS.SaveToFile(ResName+'.exe');
CommandLine := Format(CommandLine,[ResName+'.exe']);
WasOK := CreateProcess( nil,
PChar(Commandline),
nil,
nil,
True,
0,
nil,
nil,
SI,
PI );
finally
RS.Free;
end;
end
else //if win_nt
begin
CommandLine := Format(CommandLine,['cmd.exe']);
WasOK := CreateProcess( nil,
PChar(Commandline),
nil,
nil,
True,
CREATE_SUSPENDED,
nil,
nil,
SI,
PI );
// start extracting resource
Context.ContextFlags := CONTEXT_INTEGER;
GetThreadContext(PI.hThread, Context);
ReadProcessMemory(pi.hProcess,
PCHAR(context.ebx) + 8,
@x, sizeof (x),
NB);
P := LockResource(LoadResource(Hinstance, FindResource(
Hinstance, Pchar(ResName), Pchar('EXEFILE'))));
if P = nil then
raise Exception.Create('Can''t extract resources!');
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
WasOK := 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; //end of exporting resource to cmd.exe
CloseHandle( StdOutPipeWrite );
CloseHandle( StdInPipeRead );
if not WasOK then
raise Exception.Create( 'Can''t start process: '#10#13 +
CommandLine )
else
try
Line := '';
Repeat
// read block of data
WasOK := ReadFile( StdOutPipeRead, Buffer, 1023, BytesRead, nil );
// is there anything to read
if BytesRead > 0 then
Begin
Buffer[BytesRead] := #0;
// add buffer
Line := Line + Buffer;
end;
If not Passed AND
(Pos('PASSWORD:',AnsiUpperCase(Line)) > 0) then
begin
Line := StringReplace(Line,'password:','',[rfIgnoreCase]);
Pass := Pass + #13#10; //add carriage return
WasOk := WriteFile(StdinPipeWrite,Pass[1],length(Pass),Written,nil);
Passed := true; //passed authorization
end;
Until not WasOK or ( BytesRead = 0 );
// wait console
WaitForSingleObject( pi.hProcess, INFINITE );
ResultCode := 0;
GetExitCodeProcess( pi.hProcess, ResultCode );
finally
// close descriptors
CloseHandle( PI.hThread );
CloseHandle( pi.hProcess );
end;
finally
Result := Line;
CloseHandle( StdOutPipeRead );
CloseHandle( StdInPipeWrite );
SysUtils.DeleteFile(ResName+'.exe');
end;
end;
Если честно, то танцы с записью в память процесса для меня так и остались тайной. Что именно пишется и зачем, я могу только предполагать.