|
#1
|
|||
|
|||
Вопрос по защите
Под раздачей курсовых работ взял себе антивирусную программу. Но просто сканировать файлы и сверять их по сигнатурам не интересно, поэтому я решил сделать секюрити систем. Отсюда я имею множество вопросов, на которые уже неделю ищу вразумительные ответы. И так, начну
1) Каким образом можно перехватить запускаемую пользователем программу и проанализировать ее, т.е. посадить ее в коробочку и посмотреть куда она пытается ссылаться и что пытается сделать. 2) Возможно ли просканировать оперативную память 3) Возможно ли перехватывать входящий интернет-траффик И самое главное, можно ли это все делать не используя каких-либо дыр в ОС? P.S. Я прошу изложения каких-либо алгоритмов (готовые решения для меня не так важны) как это можно реализовать, и по возможности изложения, в какую сторону копать. Сейчас я "сканирую" WinAPI в поисках чего-нибудь полезного. |
#2
|
||||
|
||||
1) Например, драйвер с перехватом API функции CreateProcess.
2) Да, можно. Все антивирусы это регулярно делают. Можно, например, влезать в память других процессов. Одно из направлений копания - ReadProcessMemory. Может понадобиться. 3) Можно. Как - не знаю. jmp $ ; Happy End! The Cake Is A Lie. |
#3
|
|||
|
|||
Немножко разобрался с инжектом, при помощи модуля advApiHook.
Создал DLL, которая при инжектировании пишет какое-нибудь сообщение. Однако возник вопрос, у меня получается внедрить свою DLL только в свой созданный процесс через CreateProcess (в этом случае мне выпадает мое сообщение из DLL-ки). Т.е. если я напрямую пытаюсь инжектировать свою библиотеку в какой-то процесс, то InjectDLL() возвращает TRUE, т.е. библиотека была внедрена, но при этом никаких действий (сообщение) не происходит. |
#4
|
|||
|
|||
Вставлю и свои 5 копеек:
3) http://rouse.drkb.ru/network.php там нижу есть пример сниффера - перехват входящих/исходящих пакетов 2)Приходит в голову только ReadProcessMemory 1)Есть функция PsSetCreateProcessNotifyRoutine которая позволяет выставить свою функцию, которая будет реагировать на запуск процесса. Но тут нужен свой драйвер. Насчет юзермода не знаю |
#5
|
||||
|
||||
|
#6
|
|||
|
|||
Спасибо всем, с этим, я думаю, проблем не возникнет.
Но вот сейчас я застрял на injectDll() Как я уже говорил, если процесс создан не мной (если его создал не я через CreateProcess), то DLL как бы подгружается (функция injectDll возвращает TRUE), но ничего не делает, будто бы и не подгружалась. В DLL прописано выводить сообщение при подгрузке и отгрузке, а также в основании. Вот небольшой пример, как я пытаюсь инжектировать DLL: - - - - - - - - - - Рабочий пример (с CreateProcess из примеров модуля): Код:
var StartInfo: TStartupInfo; ProcInfo: TProcessInformation; ZeroMemory(@StartInfo, SizeOf(TStartupInfo)); StartInfo.cb := SizeOf(TStartupInfo); CreateProcess(nil, 'notepad.exe', nil, nil, False, 0,nil, nil, StartInfo, ProcInfo); InjectDll(ProcInfo.hProcess, 'dll_name.dll'); Такая конструкция работает и при запуске notepad.exe я получаю все сообщения, прописанные в DLL. Но вот беда, мне абсолютно бесполезно создавать собственный процесс и в него внедрять свои же DLL. Хотелось бы внедрить библиотеку в чужой процесс. - - - - - - - Теперь то, как я пытаюсь вбить библиотеку в уже запущенный процесс. Код:
var processId:Dword; processHandle:THandle; // Пускай жертвой будет тот же самый notepad, только уже запущенный processId := GetProcessId('notepad.exe'); processHandle := OpenProcess(PROCESS_ALL_ACCESS,false,processId); if (InjectDll(processHandle ,'moja_dll.dll')) then ShowMessage('Как бы инжект') else ShowMessage('Ошибка при инжектировании'); Этот код как бы работает, но не до конца. Мне пишет, что библиотека инжектирована, но при этом не запускаются сообщения из самой библиотеки, будто она не инжектировалась. Собственно, прошу помощи, где косяк |
#7
|
||||
|
||||
Думаю, надо получать дебаг-привилегии прежде, чем вводить ДЛЛ-ку. Была такая тема.
Вполне возможно, код инжекта один и тот же. И, разумеется, программа должна работать от имени администратора. У меня сие творение работало со сторонней программой примерно так: Код:
if not EnableDebugPrivilege then begin MessageBox(0,'Не получены привилегии дебаг',0,0); exit; end; Handle:=FindWindow(nil,'SinaProg 1.4.5.8'); if Handle = 0 then begin MessageBox(0,'Не найдено окно SinaProg',0,0); exit; end; if not InjectDll(Handle,'SPAddDll.dll') then begin MessageBox(0,'Не удалось внедрить DLL',0,0); exit; end; jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 21.02.2012 в 21:50. |
#8
|
|||
|
|||
Получил привелегии, но сообщение при атаче библиотеке так и не получил, не могу понять почему. Вроде инжект прошел успешно и права получены. Быть может библиотека изначально должна быть в процессе, чтобы из нее что-то сработало.
Собсвенно сама библиотека: Код:
library httpHook; uses SysUtils, Classes, Windows, Messages, Variants, Graphics, Controls, Forms, WinSock, WinSock2, Dialogs, advApiHook in 'advapihook.pas', NativeAPI in 'nativeapi.pas'; {$R *.res} procedure DLLEntryPoint(dwReason: DWord); begin case dwReason of DLL_PROCESS_ATTACH: begin ShowMessage('DLL attached to process'); end; DLL_PROCESS_DETACH: begin ShowMessage('DLL detached'); end; end; end; begin DllProc := @DLLEntryPoint; DLLEntryPoint(DLL_PROCESS_ATTACH); ShowMessage(' Hooked :) '); end. И "Внедряльщик": Код:
var processId:Dword; processHandle:THandle; begin processId := GetProcessId('opera.exe'); processHandle := OpenProcess(PROCESS_ALL_ACCESS,False,processId); if (EnableDebugPrivilege) then ShowMessage('Получены DEBUG привелегии') else ShowMessage('DEBUG привелегии не получены'); if ( InjectDll(processHandle,'dlls\httpHook.dll') ) then ShowMessage('InjectDLL() сработал') else ShowMessage('InjectDLL() не сработал для PID '+IntToStr(processId)); end; При исполнении пишет, что привелегии получил и длл вставил, но сама ДЛЛ ничего об этом видимо не знает, ибо сообщений от нее никаких не поступает. Хотя если сделать все то же, но через CreateProcess - т.е. создать процесс самим и внего внедрить эту самую DLL, то она начинает выполняться. |
#9
|
|||
|
|||
Облазил Инет и в каком-то закаулке наткнулся на обсуждение некого Дж. Ритхера и его книженции. Его там очень хорошо расхваливали, и как я сам убедился - заслуженно. Скачал я его книгу и по рассмотренному примеру мне удалось сделать инжект. Теперь все прекрасно работает, осталось только помудрить с ANSI и UTF версиями вызовов
Вот результат: Код:
Var libAddr:PChar; // Путь к внедряемой DLL-ке (необходим полный путь) libSize:Integer; // Размер нашей строки libAddr processId:Dword; // Идентификатор процесса processHandle:THandle; // Описатель (Хэндл) процесса stringMemoryBlock:Pointer; // Указатель на выделенную память aThreadAdress:Pointer; // Адрес LoadLibraryA (ANSI) threadHandle:THandle; // Хэндл созданного потока // Подгружаемая библиотека (прописаны мои пути) libAddr := 'D:\KURSOVAJA\WM\dlls\httpHook.dll'; libSize := Length(libAddr)*SizeOf(Pchar); // Получаем идентификатор процесса (ломаем Оперу) processId := GetProcessId('opera.exe'); // Получаем хэндл процесса processHandle := OpenProcess(PROCESS_ALL_ACCESS or PROCESS_VM_WRITE,True,processId); // Выделяем блок памяти в чужом адресном пространстве stringMemoryBlock := VirtualAllocEx(processHandle,nil,libSize,MEM_COMMIT,PAGE_READWRITE); if (stringMemoryBlock <> nil) then ShowMessage('Блок памяти выделен'); // Копируем строку в адресное пространство процесса if (WriteProcessMemory(processHandle,stringMemoryBlock,libAddr,libSize,writtenProc) <> FALSE) then ShowMessage('Блок памяти записан'); // Получаем адрес LoadLibraryA в kernel32 aThreadAdress := GetProcAddress(GetModuleHandle('kernel32'),'LoadLibraryA'); if (aThreadAdress <> nil) then ShowMessage('Адрес LoadLibraryA получен'); // Создаем удаленный поток threadHandle := CreateRemoteThread(processHandle,nil,0,aThreadAdress,stringMemoryBlock,0,threadId); if (threadHandle <> 0) then ShowMessage('Поток создан'); |