Форум: "Основная";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];
ВнизEXE внутри EXE Найти похожие ветки
← →
ev (2005-08-03 11:02) [0]возникла необходимость поместить в мою программу EXE файл
поместил в ресурс
далее можно сохранить на диск и выполнить
но хотелось бы выполнить этот EXE не сохраняя на диск
такое возможно?
← →
Digitman © (2005-08-03 12:07) [1]
> хотелось бы выполнить
в контексте того же (текущего) процесса - да, но с рядом ограничений
в контексте отдельно стартуемого процесса - только теоретически, ибо документированных способов для этого нет.
← →
ev (2005-08-03 13:00) [2]> в контексте того же (текущего) процесса - да, но
> с рядом ограничений
как?
← →
Digitman © (2005-08-03 13:14) [3]уж точно - не парой строк кода
← →
Defunct © (2005-08-03 13:17) [4]> ev
Вирусы писать нехорошо
← →
Dust © (2005-08-03 14:01) [5]а если это не вирус, а самописный инсталятор например...
← →
Gydvin © (2005-08-03 14:17) [6]Dust © (03.08.05 14:01) [5]
а если это не вирус, а самописный инсталятор например...
тогда это причем
ev (03.08.05 11:02) [0];
помещай в ресурс
← →
Digitman © (2005-08-03 14:23) [7]
> Dust © (03.08.05 14:01) [5]
> а если это не вирус, а самописный инсталятор например
а зачем "самописному инсталлятору" заниматься этим сомнительным по необходимости делом ?
← →
pasha_golub © (2005-08-03 19:46) [8]Вообщем-то, я такое реализовывал. Задача: фронтэнд к консольной утилитке.
Однако, под 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;
Если честно, то танцы с записью в память процесса для меня так и остались тайной. Что именно пишется и зачем, я могу только предполагать.
← →
Leonid Troyanovsky © (2005-08-03 20:11) [9]
> pasha_golub © (03.08.05 19:46) [8]
> Вообщем-то, я такое реализовывал. Задача: фронтэнд к
..
> У меня это выглядело так:
"Такое", "так" - реализовывал Gary Nebbett.
> Если честно, то танцы с записью в память процесса для меня
> так и остались тайной. Что именно пишется и зачем, я могу
> только предполагать.
Именно поэтому и тайна.
--
Regards, LVT.
← →
ev (2005-08-03 22:42) [10]> Вирусы писать нехорошо
при чем тут вирусы?
когда человек спросит как в файл байт записать - тоже вирус пишет? :)
можно ли как-либо еще прицепить к своему EXE второй и выполнить его без сохранения на диск?
← →
pasha_golub © (2005-08-03 23:51) [11]Leonid Troyanovsky © (03.08.05 20:11) [9]
Не, ну дорогой товарищ. Я и не присваиваю себе лавры. Уж, поверьте меньше всего я надеялся, что код, обошедший полнета, будет воспринят как мой. ;-)
Именно поэтому и тайна.
Ну, так раскройте ее мне сирому, о загадочный покровитель. :0)
← →
Германн © (2005-08-04 02:00) [12]Автор сабжа - анонимный. Это - раз.
"возникла необходимость поместить в мою программу EXE файл" - никак необъяснена сия необходимость. Это - два.
"когда человек спросит как в файл байт записать - тоже вирус пишет? :)" - А это смотря в какой файл! Может и вирус. Это - три.
← →
3DxFantastika © (2005-08-04 07:45) [13]"вирус/не вирус" , про презумпцию невиновности забыли?
между прочим есть статья за клевету ...
← →
ev (2005-08-04 22:20) [14]> Автор сабжа - анонимный
наверное ник не заметил... бывает :)
и если надо написать вирус я сразу через 100 проксей сидеть буду и ник скрывать? детсад блин :)
есть еще варианты?
работают ведь упаковщики (например, asprotect)
← →
Германн © (2005-08-05 01:01) [15]2 ev (04.08.05 22:20) [14]
>> Автор сабжа - анонимный
>наверное ник не заметил... бывает :)
Ник заметил, но он "анонимный"! Я, ты, он, они и т.д. могут постить под сим ник"ом!
>и если надо написать вирус я сразу через 100 проксей сидеть >буду и ник скрывать? детсад блин :)
А чё его скрывать? Или у тебя есть "документированные" права на ник "ev"?
>есть еще варианты?
>работают ведь упаковщики (например, asprotect)
Кто тут назвал AsProtect упаковщиком?
← →
ev (2005-08-05 01:12) [16]> Или у тебя есть "документированные" права на ник "ev"?
мне они не нужны :)
> Кто тут назвал AsProtect упаковщиком?
сорри, не совсем верно выразился... бывает...
но я думаю все поняли что я имел ввиду :)
предлагаю не отходить от темы...
← →
pasha_golub © (2005-08-05 01:19) [17]ребята, если кто знает, поделитесь плиз инфой как работает код, приведенный мой. Интересует часть с записью данных в память процесса только лишь...
← →
Германн © (2005-08-05 01:25) [18]2 ev (05.08.05 01:12) [16]
>сорри, не совсем верно выразился... бывает...
>но я думаю все поняли что я имел ввиду :)
Я - не понял.
>предлагаю не отходить от темы..
>>есть еще варианты?
>>работают ведь упаковщики (например, asprotect)
Чем "упаковщики" или AS... соответствуют теме?
← →
ev (2005-08-05 01:37) [19]> Чем "упаковщики" или AS... соответствуют теме?
упаковщик в себе содержит распаковщик и сам EXE
AS аналогично + проверки всякие (кстати, он тоже упаковывает, поэтому его можно назвать упаковщиком)
задача схожая - сначала должен отработать мой код, а потом запустить (или нет) "чужой" EXE
← →
Leonid Troyanovsky © (2005-08-05 09:03) [20]
> 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.
← →
pasha_golub © (2005-08-05 12:13) [21]Leonid Troyanovsky © (05.08.05 09:03) [20]
Тьфу ты, не мой, ессно, а приведенный мНой. Это да.
Это уже не Гарри Неббет, а по мотивам Гарри Неббета. Может быть ибо глянул я ссылку. И где же, дорогой мой коллега, вы увидели эквивалентность?
И хватит фрейдистких оговорок.
Идиотская фраза.
---
Regards, PMG
← →
Leonid Troyanovsky © (2005-08-05 13:07) [22]
> 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-07 04:56) [23]Leonid Troyanovsky © (05.08.05 13:07) [22]
Леонид, у вас проблемы? Вы хотите об этом поговорить? Не стоит гнуть пальцы.
Конкретно, в чем проблема, дорогой мой друг? Вы читать умеете?
Написано "у меня это было реализовано так", то так оно и было! В другой раз было написанно "код, приведенный мной". Он таки приведен мной.
И конечно же верх гениальности пугать кого-то игнорлистом. Может еще заплачете?
← →
pasha_golub © (2005-08-07 04:59) [24]Или может Гарри ваш близкий друг? Или родственник?
Вы уж подскажите мне как себя вести. А то так и умру невеждой, да еще и в игнорлисте у такого уважаемого человека.
← →
Джо © (2005-08-07 05:54) [25]Уважаемый LVT, заодно с Пашей и меня сразу в игнорлист заносите, ибо, по моему мнению, суть ваших претензий - исключительно бредовая. Уж не обессудьте, просто мнение постороннего человека.
← →
Джо © (2005-08-07 05:58) [26]Кстати, код, приведенный Пашей, я, помнится встречал в инете несколько раз - и все с разными вариациями. Или вы считаете, что только вы удосужились "перевести" код весьма уважаемого Гарри? Или, скорее, "пересказать"?
← →
Юрий Зотов © (2005-08-07 07:54) [27]Так.
По сабжу уже давно ничего не говорится и вряд ли что новое будет сказано. Зато набирает обороты непонятный конфликт. Так вот - пока он их не набрал, ветку закрываю. При желании отношения можно выяснить по мылу (но хочется надеяться, что такого желания ни у кого не возникнет).
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.036 c