Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> загрузить exe файл в память и запустить его оттуда 
:(
    Опции темы
denks
Дата 3.6.2006, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 16.4.2006

Репутация: нет
Всего: нет



Здравствуйте. Вот задался таким вопросом. Как загрузить файл в память и потом запустить его из памяти ? Допустим есть на диске файл 1.exe. Как можно загрузить его образ в память и запустить ?
Или можно рассмотреть вариант, когда файл находится в рерурсах другого exe, а не на диске.
Подскажите пожалуйста. Заранее спасибо. 
PM MAIL   Вверх
RA
Дата 4.6.2006, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 7
Всего: 115





Код

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)));

 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.
 
PM   Вверх
denks
Дата 4.6.2006, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 16.4.2006

Репутация: нет
Всего: нет



Скомпилировал в ресурс программу выводящую сообщение с помощью brcc32.exe. Исходный код который вы привели скомпилировался без проблем. Но при запуске полученного файла, ничего не происходит, а процесс cmd.exe просто висит в памяти. Подскажите,пожалуйста, в чём проблема. Заранее спасибо. 
PM MAIL   Вверх
Alexeis
Дата 14.6.2006, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



denks, На самом деле название программы сохранится поскольку в системе она уже зарегистрирована как cmd.exe, а программа у вас не запустилась вероятно из-за того, что вы либо забыли прикрепить ресурс либо название ресурса отличается от "EXE", попробуйте вообще для начала не грузить из ресурса, а загрузите из файла. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
denks
Дата 14.6.2006, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 16.4.2006

Репутация: нет
Всего: нет



Уже разобрался. Всем большое спасибо. 
PM MAIL   Вверх
denks
Дата 4.7.2006, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 16.4.2006

Репутация: нет
Всего: нет



Тема на форуме уже неоднократно поднималась. Но я всё же хотел спросить. Пример который привели работает. Но он ,я считаю, не подходит для нормального паковщика или протектора файлов. Из-за того что, например, Kaspersky Internet Security 6.0 обнаружает эту программа как вирус по причине WriteProcessMemory. Я нашёл некоторую информацию по данной теме. http://www.codeproject.com/useritems/LoadExeIntoAssembly.asp
Там прилагается пример. Помогите пожалуйста перевести пример на delphi. Я думаю разбор этой темы будет полезен многим. Спасибо. 
PM MAIL   Вверх
dumb
Дата 5.7.2006, 04:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



а зачем "нормальному паковщику или протектору" запускать exe в памяти?!  smile 
PM MAIL   Вверх
Alexeis
Дата 5.7.2006, 06:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



dumb, как зачем! чтобы сэкономить время. Распоковку быстрее производить в память, а не на диск, с последующим запуском, кроме того, если програма была сохранена на диск, то ее можно оттуда востановить, что крайне не желательно, особенно для AsProtect, который не тлько пакует но и защищает код програмы! 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Alexeis
Дата 5.7.2006, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



denks, перевести весь пример - очень долго можно только главную процедуру, а вот ее я не могу найти smile

Добавлено @ 17:37 
код нашел smile 
Код

        static void Main(string[] args)
        {
            if (args.Length > 0)
            {
                string filePath = args[0];
                if (File.Exists(filePath))
                {
                    // read the bytes from the application exe file
                    FileStream fs = new FileStream(filePath, FileMode.Open);
                    BinaryReader br = new BinaryReader(fs);
                    byte[] bin = br.ReadBytes(Convert.ToInt32(fs.Length));
                    fs.Close();
                    br.Close();

                    // load the bytes into Assembly
                    Assembly a = Assembly.Load(bin);
                    // search for the Entry Point
                    MethodInfo method = a.EntryPoint;
                    if (method != null)
                    {
                        // create an istance of the Startup form Main method
                        object o = a.CreateInstance(method.Name);
                        // invoke the application starting point
                        method.Invoke(o, null);
                    }
                }

Но здесь работают функции платформы .NET
Код

Assembly.Load(bin);

и т.д.
 
Это мало интересно, вобще это можно будет перевести только на Delphi .NET, а это уже в другой раздел... 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
denks
Дата 5.7.2006, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 16.4.2006

Репутация: нет
Всего: нет



Возможно я привёл неудачную ссылку. Ну а кто-нибудь может что-нибудь подсказать или посоветовать по данной теме ? 
PM MAIL   Вверх
Alexeis
Дата 6.7.2006, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



denks, просмотрел google и yandex - единственная идея это изучить исходники UPX, которые бесплатно предоставляются на сайте программы. Все остальное только теория ничего реального. 
ASPack - делался кстати на базе вируса - удивительно как Каспер на него не ругается smile . Очень похоже на то что чисто документированых средств не достаточно. А недокументированые функции могут и исчезнуть при установке очереного сервис пака или новой версии винды.

p.s. На изучение UPX уйдет много времени, так что быстрых результатов не ждите. 

Вот еще ссылки на тему протектора
http://www.codeproject.com/cpp/peprotector1.asp
http://www.codeproject.com/system/inject2exe.asp
http://www.codeproject.com/useritems/inject2it.asp
http://www.codeproject.com/tools/opensrcprot_part2.asp  

Это сообщение отредактировал(а) alexeis1 - 6.7.2006, 13:44


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
dumb
Дата 6.7.2006, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



все вышеперечисленные протекторы и упаковщики не запускают никаких "exe в памяти". код распаковщика является частью уже запущенного процесса получающий управление при старте. все, что нужно ему сделать - распаковать код/данные и передать управление на OEP (original entry point).

направление выбрано правильное - изучать мат.часть (upx src итд) smile 
PM MAIL   Вверх
Alexeis
Дата 7.7.2006, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



Цитата(dumb @  6.7.2006,  16:18 Найти цитируемый пост)
все вышеперечисленные протекторы и упаковщики не запускают никаких "exe в памяти". код распаковщика является частью уже запущенного процесса получающий управление при старте. все, что нужно ему сделать - распаковать код/данные и передать управление на OEP

Но перед передачей управлния можно создать копию своего приложения и передать ему все параметры. Т.о. "упаковщик" запустит сам себя и в результате получится что как будто произошел запуск из памяти, при этом, конечно, вторая копия будет иметь уже другие дескрипторы, что с одной стороны может создать проблемы, с другой стороны если это использовать для целей защиты програмы от дебагера - то очень удачный вариант.
  Наверное следует уточнить цели такого запуска из памяти smile  


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
denks
Дата 7.7.2006, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 16.4.2006

Репутация: нет
Всего: нет



В целях написания пакера/криптора исполняемых файлов.  
PM MAIL   Вверх
Alexeis
Дата 7.7.2006, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



denks, тогда существование обоих exe одновременно совсем  не нужно. Значит ссылочки в  самый раз smile  


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1007 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.