Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.01.2014, 16:44   #1
fucil
Форумчанин
 
Регистрация: 24.02.2010
Сообщений: 148
Вопрос Отследить инжект dll в процесс ???

Суть такова, нужно сделать программу отслеживающая инжет в определенный процесс !
Например: Есть процесс, допустим calc.exe, инжектю в него либу (dll).
Вопрос: Как отследить что в calc заинжектили чужеродную dll, или как получить, полный список загруженных dll.
Пробовал получать список загруженных dll в процесс (в нашем случае calc.exe), результатов не дало, так как показывает неполный список dll (не показало загруженную мной dll), для получения загруженных в calc.exe библиотек, использовал psapi.dll (хотя загрузку psapi.dll показало).

Для проверки загружена или нет dll, использовал ProcessExplorer
Ниже код с помощью которого я получаю список загруженных dll.

Код:
function GetLoadedDLLList(sl: TStrings; ProcessId:Cardinal; Options: TModuleOptions = [moRemovePath]): Boolean;
type
  EnumModType = function (hProcess: Longint; lphModule: TModuleArray;
  cb: DWord; var lpcbNeeded: Longint): Boolean; stdcall;
var
  psapilib: HModule;
  EnumProc: Pointer;
  ma: TModuleArray;
  I: Longint;
  FileName: array[0..MAX_PATH] of Char;
  S: string;
  ph:THandle;
begin
  Result := False;

  if Win32Platform <> VER_PLATFORM_WIN32_NT then
    Exit;

  psapilib := LoadLibrary('psapi.dll');
  if psapilib = 0 then
    Exit;
  try
    EnumProc := GetProcAddress(psapilib, 'EnumProcessModules');
    if not Assigned(EnumProc) then Exit;
    sl.Clear;

    ph := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false,ProcessId);
    try

    FillChar(ma, SizeOF(TModuleArray), 0);
    if EnumModType(EnumProc)(ph, ma, 400, I) then
    begin
      for I := 0 to 400 do
        if ma[i] <> 0 then
        begin
          FillChar(FileName, MAX_PATH, 0);
          GetModuleFileName(ma[i], FileName, MAX_PATH);
          if CompareText(ExtractFileExt(FileName), '.dll') = 0 then
          begin
            S := FileName;
            if moRemovePath in Options then
              S := ExtractFileName(S);
            if moIncludeHandle in Options then
              sl.AddObject(S, TObject(ma[i]))
            else
              sl.Add(S);
          end;
        end;
    end;
    Result := True;

    finally
     CloseHandle(ph);
    end;
  finally
    FreeLibrary(psapilib);
  end;
end;
Эксперты подскажите варианты !

Последний раз редактировалось fucil; 25.01.2014 в 19:39.
fucil вне форума Ответить с цитированием
Старый 25.01.2014, 18:06   #2
fucil
Форумчанин
 
Регистрация: 24.02.2010
Сообщений: 148
Вопрос Как вариант ?

Как можно запретить инжект dll мой процесс ?
Для порождения процесса использую следующий код:

Код:
var
 zAppName:array[0..512] of char;
 zCurDir:array[0..255] of char;
 WorkDir:String;
 StartupInfo:TStartupInfo;
 ProcessInfo:TProcessInformation;
begin
 StrPCopy(zAppName,'calc.exe');
 GetDir(0,WorkDir);
 StrPCopy(zCurDir,WorkDir);
 FillChar(StartupInfo,Sizeof(StartupInfo),#0);
 StartupInfo.cb := Sizeof(StartupInfo);
 StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
 StartupInfo.wShowWindow :=SW_normal;
 CreateProcess(nil, zAppName, nil, nil, false, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, zCurDir, StartupInfo, ProcessInfo);

Последний раз редактировалось fucil; 25.01.2014 в 18:09.
fucil вне форума Ответить с цитированием
Старый 25.01.2014, 21:50   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Из user mode вряд ли это не удастся сделать. Драйвер если только...
Человек_Борща вне форума Ответить с цитированием
Старый 25.01.2014, 22:46   #4
fucil
Форумчанин
 
Регистрация: 24.02.2010
Сообщений: 148
Вопрос Есть ещё варианты ?

Может как то можно запретить инжект в процесс ?
или запустить процесс с какой то защитой от инжекта ?
Писать драйвер врятли у меня получится
fucil вне форума Ответить с цитированием
Старый 25.01.2014, 23:55   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Нельзя ни запретить, ни защитить без драйвера. Драйвер до полного запуска процесса может многое видеть и делать, очень многое.
Нужно перехватывать ядерный ZwOpenProcess и проверять, чей PID открывается. Если нужного приложения, то возвращать ошибку.
Нормально выпалить сие можно только из драйвера) т.к. одним хуком ZwOpenProcess защита не делается)

Последний раз редактировалось Человек_Борща; 26.01.2014 в 00:05.
Человек_Борща вне форума Ответить с цитированием
Старый 26.01.2014, 07:12   #6
Dik0n
 
Регистрация: 26.11.2012
Сообщений: 6
По умолчанию

Перехватывай LoadLibrary в процессе который хочешь защитить, большенство внедренцев используют именно ее.

Последний раз редактировалось Dik0n; 26.01.2014 в 07:15.
Dik0n вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Загрузить библиотеку в внешний процесс - только инжект? calypso Win Api 15 27.02.2013 17:37
AppInit_DLLs и инжект в определенный процесс nls Win Api 2 01.02.2013 09:17
Инжект dll в игру artbotva Win Api 10 14.08.2012 11:24
отследить процесс в диспетчере задач L.A.M.E.R. Win Api 3 27.07.2012 00:38
dll в процесс artbotva Общие вопросы Delphi 4 03.06.2012 10:54