Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 18.02.2012, 19:30
PRStudio PRStudio вне форума
Прохожий
 
Регистрация: 18.02.2012
Сообщения: 13
Репутация: 143
По умолчанию Вопрос по защите

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

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

2) Возможно ли просканировать оперативную память

3) Возможно ли перехватывать входящий интернет-траффик

И самое главное, можно ли это все делать не используя каких-либо дыр в ОС?

P.S. Я прошу изложения каких-либо алгоритмов (готовые решения для меня не так важны) как это можно реализовать, и по возможности изложения, в какую сторону копать.

Сейчас я "сканирую" WinAPI в поисках чего-нибудь полезного.
Ответить с цитированием
  #2  
Старый 18.02.2012, 20:09
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

1) Например, драйвер с перехватом API функции CreateProcess.
2) Да, можно. Все антивирусы это регулярно делают. Можно, например, влезать в память других процессов. Одно из направлений копания - ReadProcessMemory. Может понадобиться.
3) Можно. Как - не знаю.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #3  
Старый 21.02.2012, 13:42
PRStudio PRStudio вне форума
Прохожий
 
Регистрация: 18.02.2012
Сообщения: 13
Репутация: 143
По умолчанию

Немножко разобрался с инжектом, при помощи модуля advApiHook.

Создал DLL, которая при инжектировании пишет какое-нибудь сообщение.

Однако возник вопрос, у меня получается внедрить свою DLL только в свой созданный процесс через CreateProcess (в этом случае мне выпадает мое сообщение из DLL-ки). Т.е. если я напрямую пытаюсь инжектировать свою библиотеку в какой-то процесс, то InjectDLL() возвращает TRUE, т.е. библиотека была внедрена, но при этом никаких действий (сообщение) не происходит.
Ответить с цитированием
  #4  
Старый 21.02.2012, 14:56
ChinYan ChinYan вне форума
Тыкаю клавиши
 
Регистрация: 13.07.2009
Сообщения: 804
Версия Delphi:
Репутация: 48633
По умолчанию

Вставлю и свои 5 копеек:
3) http://rouse.drkb.ru/network.php там нижу есть пример сниффера - перехват входящих/исходящих пакетов

2)Приходит в голову только ReadProcessMemory

1)Есть функция PsSetCreateProcessNotifyRoutine которая позволяет выставить свою функцию, которая будет реагировать на запуск процесса. Но тут нужен свой драйвер. Насчет юзермода не знаю
Ответить с цитированием
  #5  
Старый 21.02.2012, 15:04
Аватар для Admin
Admin Admin вне форума
Администратор
 
Регистрация: 03.10.2005
Адрес: Россия, Москва
Сообщения: 1,532
Версия Delphi: Delphi 7
Репутация: выкл
По умолчанию

http://www.delphisources.ru/pages/so...antivirus.html
Ответить с цитированием
  #6  
Старый 21.02.2012, 20:25
PRStudio PRStudio вне форума
Прохожий
 
Регистрация: 18.02.2012
Сообщения: 13
Репутация: 143
По умолчанию

Спасибо всем, с этим, я думаю, проблем не возникнет.

Но вот сейчас я застрял на 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  
Старый 21.02.2012, 21:43
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Думаю, надо получать дебаг-привилегии прежде, чем вводить ДЛЛ-ку. Была такая тема.
Вполне возможно, код инжекта один и тот же.
И, разумеется, программа должна работать от имени администратора. У меня сие творение работало со сторонней программой примерно так:
Код:
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  
Старый 22.02.2012, 02:16
PRStudio PRStudio вне форума
Прохожий
 
Регистрация: 18.02.2012
Сообщения: 13
Репутация: 143
По умолчанию

Получил привелегии, но сообщение при атаче библиотеке так и не получил, не могу понять почему. Вроде инжект прошел успешно и права получены. Быть может библиотека изначально должна быть в процессе, чтобы из нее что-то сработало.

Собсвенно сама библиотека:
Код:
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  
Старый 23.02.2012, 17:34
PRStudio PRStudio вне форума
Прохожий
 
Регистрация: 18.02.2012
Сообщения: 13
Репутация: 143
По умолчанию

Облазил Инет и в каком-то закаулке наткнулся на обсуждение некого Дж. Ритхера и его книженции. Его там очень хорошо расхваливали, и как я сам убедился - заслуженно. Скачал я его книгу и по рассмотренному примеру мне удалось сделать инжект. Теперь все прекрасно работает, осталось только помудрить с 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('Поток создан');
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:58.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter