Вернуться   D3Scene.Ru Софт портал игр | Хаки | Проги | Статьи > Другое > Информационные технологии > Программирование > С++/C#
Присоединяйся к нам



Ответ
 
Опции темы Опции просмотра
Старый 27.09.2013, 16:29   #1
HOLLY SHIT





 
Аватар для Misery
 
Регистрация: 07.04.2010
Адрес: Виртуальный Разум
Сообщений: 1,309
Монетки D3Scene.Ru: 1
Репутация: 890
Отправить сообщение для Misery с помощью AIM Отправить сообщение для Misery с помощью Yahoo Отправить сообщение для Misery с помощью Skype™
Автор Радость

[C#] ASM инжект.


Приветствую.

В этой теме, мы увидим (научимся), как внедрить и выполнить ASM (шелл-код) с использованием [Ссылки скрыты от гостей.] в среде x86 (не проверял на х64,т.к система у меня х86).

Этот API создается (и выполняется, если правильный флаг установлен), где мы используем шелл код в [Ссылки скрыты от гостей.].

Итак,основная схема:
* Получить дескриптор процесса используя [Ссылки скрыты от гостей.]
* Выделить память для нашего кода использованием [Ссылки скрыты от гостей.]
* Написать наш код используя [Ссылки скрыты от гостей.]
* Создание и выполнение структуры на наш код с использованием [Ссылки скрыты от гостей.]
* Закрыть процесс и поток ручным способом,используя [Ссылки скрыты от гостей.]
Весь код взят с [Ссылки скрыты от гостей.] спасибо им за полезную инфу.
Код:
[DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess, bool bInheritHandle, int dwProcessId);

[DllImport("kernel32.dll")]
public static extern bool CloseHandle(IntPtr hObject);

[DllImport("kernel32.dll")]
public static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out UIntPtr lpNumberOfBytesWritten);

[DllImport("kernel32.dll")]
public static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, AllocationType flAllocationType, MemoryProtection flProtect);

[DllImport("kernel32.dll")]
public static extern IntPtr CreateRemoteThread(IntPtr hProcess, IntPtr lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, out uint lpThreadId);
Код:
[Flags]
public enum ProcessAccessFlags : uint {
	Terminate        = 0x00000001,
	CreateThread     = 0x00000002,
	VMOperation      = 0x00000008,
	VMRead           = 0x00000010,
	VMWrite          = 0x00000020,
	DupHandle        = 0x00000040,
	SetInformation   = 0x00000200,
	QueryInformation = 0x00000400,
	Synchronize      = 0x00100000,
	All              = 0x001F0FFF
}

[Flags]
public enum AllocationType {
	 Commit     = 0x00001000,
	 Reserve    = 0x00002000,
	 Decommit   = 0x00004000,
	 Release    = 0x00008000,
	 Reset      = 0x00080000,
	 TopDown    = 0x00100000,
	 WriteWatch = 0x00200000,
	 Physical   = 0x00400000,
	 LargePages = 0x20000000
}

[Flags]
public enum MemoryProtection {
	 NoAccess                 = 0x0001,
	 ReadOnly                 = 0x0002,
	 ReadWrite                = 0x0004,
	 WriteCopy                = 0x0008,
	 Execute                  = 0x0010,
	 ExecuteRead              = 0x0020,
	 ExecuteReadWrite         = 0x0040,
	 ExecuteWriteCopy         = 0x0080,
	 GuardModifierflag        = 0x0100,
	 NoCacheModifierflag      = 0x0200,
	 WriteCombineModifierflag = 0x0400
}
Вот этим шелл кодом ,мы будем пользоваться, это простой WinExec который Exec calc.exe, получают его здесь.
Вам придется редактировать шелл код, выровнять стек, иметь правильную инструкцию RET и выйти из потока.
Если этого не будет, то приложение будет крашить.
Код:
byte[] asm = new byte[] {
	0x31, 0xD2,                               // XOR   EDX, EDX
	0x52,                                     // PUSH  EDX
	0x68, 0x63, 0x61, 0x6C, 0x63,             // PUSH  'calc'
	0x89, 0xE6,                               // MOV   ESI, ESP
	0x52,                                     // PUSH  EDX
	0x56,                                     // PUSH  ESI
	0x64, 0x8B, 0x72, 0x30,                   // MOV   ESI, DWORD PTR FS:[EDX+30]
	0x8B, 0x76, 0x0C,                         // MOV   ESI, DWORD PTR DS:[ESI+C]
	0x8B, 0x76, 0x0C,                         // MOV   ESI, DWORD PTR DS:[ESI+C]
	0xAD,                                     // LODS  DWORD PTR DS:[ESI]
	0x8B, 0x30,                               // MOV   ESI, DWORD PTR DS:[EAX]
	0x8B, 0x7E, 0x18,                         // MOV   EDI, DWORD PTR DS:[ESI+18]
	0x8B, 0x5F, 0x3C,                         // MOV   EBX, DWORD PTR DS:[EDI+3C]
	0x8B, 0x5C, 0x1F, 0x78,                   // MOV   EBX, DWORD PTR DS:[EDI+EBX+78]
	0x8B, 0x74, 0x1F, 0x20,                   // MOV   ESI, DWORD PTR DS:[EDI+EBX+20]
	0x01, 0xFE,                               // ADD   ESI, EDI
	0x8B, 0x4C, 0x1F, 0x24,                   // MOV   ECX, DWORD PTR DS:[EDI+EBX+24]
	0x01, 0xF9,                               // ADD   ECX, EDI
	//                                           label1:
	0x0F, 0xB7, 0x2C, 0x51,                   // MOVZX EBP, WORD PTR DS:[ECX+EDX*2]
	0x42,                                     // INC   EDX
	0xAD,                                     // LODS  DWORD PTR DS:[ESI]
	0x81, 0x3C, 0x07, 0x57, 0x69, 0x6E, 0x45, // CMP   DWORD PTR DS:[EDI+EAX], 'WinE'
	0x75, 0xF1,                               // JNZ   SHORT label1
	0x8B, 0x74, 0x1F, 0x1C,                   // MOV   ESI, DWORD PTR DS:[EDI+EBX+1C]
	0x01, 0xFE,                               // ADD   ESI, EDI
	0x03, 0x3C, 0xAE,                         // ADD   EDI, DWORD PTR DS:[ESI+EBP*4]
	0xFF, 0xD7,                               // CALL  EDI
	0x58,                                     // POP   EAX (stack alignment)
	0x58,                                     // POP   EAX (stack alignment)
	0xC3                                      // RET
};
Я покажу шаг за шагом использование кода, я использую готовый код,который был у меня в библиотеке.
Код:
int    iProcessId = 1337;
IntPtr hHandle    = OpenProcess(ProcessAccessFlags.All, false, iProcessId);

if (hHandle == IntPtr.Zero)
	throw new ApplicationException("Cannot get process handle.");
Здесь мы получили дескриптор процесса, со всем доступом (без дальнейших проблем) и проверили,был ли вызов успешен.
Код:
IntPtr hAlloc = VirtualAllocEx(hHandle, IntPtr.Zero, (uint)asm.Length, AllocationType.Commit, MemoryProtection.ExecuteReadWrite);

if (hAlloc == IntPtr.Zero)
	throw new ApplicationException("Cannot allocate memory.");
Теперь,мы выделяем часть памяти,что бы поставить наш код в RWX (Чтение / Запись / Выполнение).
Код:
UIntPtr bytesWritten = UIntPtr.Zero;

if (!WriteProcessMemory(hHandle, hAlloc, asm, (uint)asm.Length, out bytesWritten))
	throw new ApplicationException("Cannot write process memory.");

if (asm.Length != (int)bytesWritten)
	throw new ApplicationException("Invalid written size.");
Пишем процесс памяти с помощью нашего кода, а затем проверяем, записали ли мы,верное кол-во байт.
Код:
IntPtr hThread   = CreateRemoteThread(hHandle, IntPtr.Zero, 0, hAlloc, IntPtr.Zero, 0, out iThreadId);

if (hThread == IntPtr.Zero)
	throw new ApplicationException("Cannot create and execute remote thread.");
Теперь создали и выполнили операцию с нашим кодом, и calc.exe должен появиться!
Код:
CloseHandle(hThread);
CloseHandle(hHandle);
Закрываемся вручную

Надеюсь информация кому нибудь понадобится и будет полезной
Источник:[Ссылки скрыты от гостей.]
Перевел:Misery
__________________

Последний раз редактировалось Misery; 27.09.2013 в 16:38.
  Ответить с цитированием Наверх
5 пользователя(ей) сказали cпасибо:
Abso! (27.09.2013), Der_SySLIK (27.09.2013), DKzetname (27.09.2013), timofej4 (27.09.2013), Tr1bunal (27.09.2013)
Старый 27.09.2013, 16:35   #2
O kitty



 
Аватар для Der_SySLIK
 
Регистрация: 12.09.2010
Сообщений: 354
Репутация: 521
Отправить сообщение для Der_SySLIK с помощью Skype™
По умолчанию

Информация полезная, хорошо что постарался , дальше работай, повышай скилл)
__________________
Бульбазавр спешит на помощь ^.^

Последний раз редактировалось Der_SySLIK; 27.09.2013 в 16:40.
  Ответить с цитированием Наверх
Старый 27.09.2013, 17:09   #3
Старожил

 
Аватар для DKzetname
 
Регистрация: 19.05.2013
Сообщений: 524
Репутация: 423
Отправить сообщение для DKzetname с помощью ICQ Отправить сообщение для DKzetname с помощью AIM Отправить сообщение для DKzetname с помощью MSN Отправить сообщение для DKzetname с помощью Yahoo Отправить сообщение для DKzetname с помощью Skype™
По умолчанию

жаль что моя голова щас забита "химией",
ничего не понял
но все равно спс
Кликните на для просмотра офф топика
__________________

ZETMAN

Последний раз редактировалось DKzetname; 27.09.2013 в 17:10.
  Ответить с цитированием Наверх
Старый 27.09.2013, 18:18   #4
Матерый

 
Аватар для Tr1bunal
 
Регистрация: 19.12.2012
Адрес: Молдова
Сообщений: 449
Репутация: 357
Отправить сообщение для Tr1bunal с помощью Skype™
По умолчанию

Полезная вещь я думаю, для некоторых
  Ответить с цитированием Наверх
Старый 28.09.2013, 03:05   #5
Группа разработчиков


 
Аватар для Skino
 
Регистрация: 16.01.2009
Сообщений: 566
Репутация: 251
По умолчанию

Цитата:
Сообщение от Tr1bunal Посмотреть сообщение
Полезная вещь
Шарп вообще полезная вещь
  Ответить с цитированием Наверх
Ответ

Метки
Asm, Misery., инжект кода, мануал, перевод, [C#]


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Powered by vBulletin
Copyright © 2017 vBulletin Solutions, Inc.
Перевод: zCarot | Дизайн: G-A | Верстка: OldEr
Текущее время: 11:21. Часовой пояс GMT +4.