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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запуск программы из памяти (array of byte) 
:(
    Опции темы
lollollollol
Дата 12.5.2013, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Есть идея запускать приложение прямо в памяти. Т.е. получаю array of byte(массив - ехе файл), который нужно выполнить без сохранения на диск.

Находил такие темы:
http://www.delphisources.ru/forum/showthread.php?t=13425
http://www.programmersforum.ru/newthread.p...wthread&f=4
http://hpc.name/thread/31283/p1.html

Но это всё не то. 


В идеале запустить ехе файл как отдельный поток на исполнение, или может быть заменить в памяти мой процесс нужным, помогиТЕ хотябы с теорией, ну или чуть-чуть практики, если не сложно:)

Это сообщение отредактировал(а) lollollollol - 12.5.2013, 21:26
PM MAIL   Вверх
MetalFan
Дата 12.5.2013, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



Цитата(lollollollol @  12.5.2013,  18:52 Найти цитируемый пост)
помоги

что-то не понял... это была молитва чтоли?



--------------------
There are always someone smarter than you...
PM MAIL   Вверх
lollollollol
Дата 12.5.2013, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Это была опечатка/недопечатка
PM MAIL   Вверх
Poseidon
Дата 12.5.2013, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



Цитата(lollollollol @  12.5.2013,  18:52 Найти цитируемый пост)
Т.е. получаю array of byte(массив - ехе файл)
А каким образом получаешь? С диска считываешь? smile



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
lollollollol
Дата 13.5.2013, 06:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Со своего сервера скачиваю шифрованый файл. Расшифровываю xor алгоритмом. Своего рода защита от реверса

А если вместо exe сделать dll, не проще ли будет?

Это сообщение отредактировал(а) lollollollol - 13.5.2013, 06:25
PM MAIL   Вверх
Чучмек
Дата 13.5.2013, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

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



Все это изврат.
Запускаешь любой процесс в приостановленном режиме, и далее путем препарирования гланд через задний проход, меняешь его потроха на свои.
Код

type
  TBuff=record
    p:pointer;
    sz:cardinal;
  end;
  PIMAGE_NT_HEADERS=^IMAGE_NT_HEADERS;
  PIMAGE_DOS_HEADER=^IMAGE_DOS_HEADER;

function ZwUnmapViewOfSection(pi:THANDLE;var x:pointer):DWord;stdcall; external 'ntdll.dll' name 'ZwUnmapViewOfSection';

function FieldOffset(const Struc; const Field): Cardinal;
begin
  Result := Cardinal(@Field) - Cardinal(@Struc);
end;

function  IMAGE_FIRST_SECTION (NtHeader: PIMAGE_NT_HEADERS): PIMAGESECTIONHEADER;
begin 
  Result := PIMAGESECTIONHEADER(Cardinal(NtHeader) +
  FieldOffset(NtHeader^, NtHeader^.OptionalHeader) +
  NtHeader^.FileHeader.SizeOfOptionalHeader);
end;

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 RunMemAs(buff:TBuff;exe:string):boolean;
var
  si:TStartupInfo;
  pi:TProcessInformation;
  ctx:tcontext;
  x,p,q:Pointer;
  sz:dword;
  pnt:PIMAGE_NT_HEADERS;
  sect:PIMAGESECTIONHEADER;
  i:integer;
begin
  result:=false;
  if buff.p=nil then exit;
  fillchar(si,sizeof(si),0);
  si.cb:=sizeof(si);
  if not CreateProcess(0, PChar(exe), 0, 0,FALSE,CREATE_SUSPENDED, 0, 0, si, pi) then exit;
  ctx.ContextFlags:=CONTEXT_INTEGER;
  GetThreadContext(pi.hThread,ctx);
  ReadProcessMemory(pi.hProcess, PAnsiChar(ctx.Ebx)+8,@x,sizeof(x),sz);
  ZwUnmapViewOfSection(pi.hProcess, x);
  p:=buff.p;
  pnt:=PIMAGE_NT_HEADERS(PAnsiChar(p)+ PIMAGE_DOS_HEADER(p)^._lfanew);
  q:=VirtualAllocEx(pi.hProcess,
                    pointer(pnt^.OptionalHeader.ImageBase),
                    pnt^.OptionalHeader.SizeOfImage,
                    MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);

  WriteProcessMemory(pi.hProcess, q, p, pnt^.OptionalHeader.SizeOfHeaders,sz);
  sect:=IMAGE_FIRST_SECTION(pnt);
  for i := 0 to pnt^.FileHeader.NumberOfSections-1 do
  begin
    WriteProcessMemory(pi.hProcess,
                       PAnsiChar(q) + sect.VirtualAddress,
                       PAnsiChar(p) + sect.PointerToRawData,
                       sect.SizeOfRawData, sz);
    VirtualProtectEx(pi.hProcess, PAnsiChar(q) + sect.VirtualAddress,
                     sect.Misc.VirtualSize,
                     protect(sect.Characteristics),sz);
    Inc(sect);
  end;
  WriteProcessMemory(pi.hProcess,
                     PAnsiChar(ctx.Ebx) + 8, @q,
                     sizeof(q),sz);
  ctx.Eax:=integer(q)+ pnt^.OptionalHeader.AddressOfEntryPoint;
  SetThreadContext(pi.hThread, ctx);
  ResumeThread(pi.hThread);
  CloseHandle(pi.hProcess);
  CloseHandle(pi.hThread);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  h:cardinal;
  buff:TBuff;
begin
  h:=FileOpen(Application.ExeName,$40);
  buff.sz:=GetFileSize(h,nil);
  GetMem(buff.p,buff.sz);
  FileRead(h,buff.p^,buff.sz);
  RunMemAs(buff,'notepad.exe');
  ....
end;


Добавлено @ 09:22
На XP работает, на 7 не проверял, но думаю тоже будет, если есть доступ на чтение/запись к создаваемому процессу.
100% работоспособности для всех процессов не гарантирую.
  
Цитата(lollollollol @  13.5.2013,  06:23 Найти цитируемый пост)
А если вместо exe сделать dll, не проще ли будет?

теже яйца, только в профиль.

Для твоего случая лучше закодировать(или затереть) часть (секцию кода, например) твоего exe и при запуске (с флагом CREATE_SUSPENDED)  восстанавливать через Read/WriteProcessMemory  

Это сообщение отредактировал(а) Чучмек - 13.5.2013, 09:52


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
lollollollol
Дата 13.5.2013, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

Для твоего случая лучше закодировать(или затереть) часть (секцию кода, например) твоего exe и при запуске (с флагом CREATE_SUSPENDED)  восстанавливать через Read/WriteProcessMemory  

Хорошая идея, спасибо! Вечерком попробую
PM MAIL   Вверх
lollollollol
Дата 13.5.2013, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Чучмек, любые варианты вылетают с ошибкой (винда 7) сразу после запуска ( ResumeThread)

Раз уж речь зашла об извратах, может есть смысл чтобы не замарачиваться сделать так:
То что есть в памяти шифрануть xor ом, сохранить на диск, запустить в остановленном состоянии, в памяти обратно xor ом, и потом уже ResumeThread?

Есть вопрос, начиная с кого момента можно шифровать, чтобы ехе файл вообще запустился как исполняемый? 
PM MAIL   Вверх
northener
Дата 14.5.2013, 00:57 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

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



Цитата(lollollollol @  12.5.2013,  18:52 Найти цитируемый пост)
Есть идея запускать приложение прямо в памяти. Т.е. получаю array of byte(массив - ехе файл), который нужно выполнить без сохранения на диск.


Цитата(lollollollol @  13.5.2013,  06:23 Найти цитируемый пост)
Со своего сервера скачиваю шифрованый файл. Расшифровываю xor алгоритмом. Своего рода защита от реверса

Можно дать совет?
Не страдай ерундой. От реверса (если имеется в виду reverse engeneering) это не спасёт. Обратной разработке глубоко начхать на шифрованный файл. Она работает непосредственно с памятью работающей программы. Так что как только ты расшифровал какой-то код и запустил его на выполнение, так сразу ты всё что нужно дал в полное распоряжение всем, кому интересен твой код.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Чучмек
Дата 14.5.2013, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

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



У меня на 7 работает через-раз. В 90% неудачных запусков обламывается на VirtualAllocEx и в 10% на ZwUnmapViewOfSection.
Будет время, посмотрю как распределяется память. 


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
bems
Дата 18.5.2013, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

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



Цитата(lollollollol @  13.5.2013,  17:55 Найти цитируемый пост)
любые варианты вылетают с ошибкой (винда 7) сразу после запуска
релоки фиксишь? выравнивание секций соблюдаешь? импорты обрабатываешь?


Цитата(Чучмек @  13.5.2013,  09:09 Найти цитируемый пост)
q:=VirtualAllocEx(pi.hProcess,
                    pointer(pnt^.OptionalHeader.ImageBase),

а если там занято?



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Чучмек
Дата 20.5.2013, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

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



Цитата(bems @  18.5.2013,  20:24 Найти цитируемый пост)
а если там занято?

Во-во, там занято. Семерка каждый раз загружает по разным адресам. 


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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

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



и под хр не исключено что будет занято
тут нужно делать все что делает загрузчик, тогда при наличии релоков в образе можно будет грузить по любому адресу


--------------------
Обижено школьников: 8
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.

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


 




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


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

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