Вторник, 27.06.2017, 18:44 Приветствую вас Гость | Группа "Гости" 


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: xXxSh@dowxXx, Anton93, Волк-1024 
delfcode » Delphi » Вопросы по Delphi » Определение выгруженных ДЛЛ у процесса
Определение выгруженных ДЛЛ у процесса
BigNikДата: Воскресенье, 24.04.2011, 14:04 | Сообщение # 1
Новичок
Зарегистрирован: 24.04.2011
Группа: Пользователи
Сообщений: 2
Статус: Offline
Короче задача такая:
1. Перебрать все системные процессы. Это можно сделать так:
Code

procedure CreateWinNTProcessList(List: TstringList);      
var      
    PIDArray: array [0..1023] of DWORD;      
    cb: DWORD;      
    I: Integer;      
    ProcCount: Integer;      
    hMod: HMODULE;      
    hProcess: THandle;      
    ModuleName: array [0..300] of Char;      
begin      
    if List = nil then Exit;      
    EnumProcesses(@PIDArray, SizeOf(PIDArray), cb);      
    ProcCount := cb div SizeOf(DWORD);      
    for I := 0 to ProcCount - 1 do      
    begin      
      hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or      
        PROCESS_VM_READ,      
        False,      
        PIDArray[I]);      
      if (hProcess <> 0) then      
      begin      
        EnumProcessModules(hProcess, @hMod, SizeOf(hMod), cb);      
        GetModuleFilenameEx(hProcess, hMod, ModuleName, SizeOf(ModuleName));      
        List.Add(ModuleName);      
        CloseHandle(hProcess);      
      end;      
    end;      
end;

2. Перебрать с первого по последний процесс и посмотреть, у какого какие длл-ки запущены.
Вот функция для определения всех выгруженных длл !!!В СИСТЕМЕ!!!:

Code

unit ModuleProcs;      
     
interface      
     
uses Windows, Classes;      
     
type      
    TModuleArray = array[0..400] of HMODULE;      
    TModuleOption = (moRemovePath, moIncludeHandle);      
    TModuleOptions = set of TModuleOption;      
     
function GetLoadedDLLList(sl: TStrings;      
    Options: TModuleOptions = [moRemovePath]): Boolean;      
     
implementation      
     
uses SysUtils;      
     
function GetLoadedDLLList(sl: TStrings;      
    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;      
begin      
    Result := False;      
     
    (* Данная функция запускается только для Widnows NT *)      
    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;      
      FillChar(ma, SizeOF(TModuleArray), 0);      
      if EnumModType(EnumProc)(GetCurrentProcess, 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      
      FreeLibrary(psapilib);      
    end;      
end;      
     
end.

3.Посмотреть, если у какого-то приложения запущена dll с именем DLLName, то узнать имя этого процесса (имя exe) и убить этот процесс.
Функция для убивания процесса по имени exe:

Code

uses      
    Tlhelp32, Windows, SysUtils;      
     
function KillTask(ExeFileName: string): integer;      
const      
    PROCESS_TERMINATE=$0001;      
var      
    ContinueLoop: BOOL;      
    FSnapshotHandle: THandle;      
    FProcessEntry32: TProcessEntry32;      
begin      
    result := 0;      
     
    FSnapshotHandle := CreateToolhelp32Snapshot      
                       (TH32CS_SNAPPROCESS, 0);      
    FProcessEntry32.dwSize := Sizeof(FProcessEntry32);      
    ContinueLoop := Process32First(FSnapshotHandle,      
                     FProcessEntry32);      
     
    while integer(ContinueLoop) <> 0 do      
    begin      
      if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =      
           UpperCase(ExeFileName))      
       or (UpperCase(FProcessEntry32.szExeFile) =      
           UpperCase(ExeFileName))) then      
        Result := Integer(TerminateProcess(OpenProcess(      
                          PROCESS_TERMINATE, BOOL(0),      
                          FProcessEntry32.th32ProcessID), 0));      
      ContinueLoop := Process32Next(FSnapshotHandle,      
                     FProcessEntry32);      
    end;      
     
    CloseHandle(FSnapshotHandle);      
end;

Мне надо переделать функцию GetLoadedDLLList так, чтобы она могла находить длл только у 1го процесса, а не у всей системы!
В итоге вызов функции должен быть примерно таким - GetLoadedDLLList (Process : THandle; sl : TStrings);
Помогите пожалуйста переделать функцию а то я уже заколебался! cry
P.S. с апи работаю недолго поэтому и прошу помощи.


Сообщение отредактировал BigNik - Воскресенье, 24.04.2011, 14:05
 
dolphinДата: Вторник, 26.04.2011, 11:20 | Сообщение # 2
Администратор
Сообщений: 902
Статус: Offline
unit ModuleProcs отображает только библиотеки данного риложения

Система: Windows 10 x64, Windows XP
Среды программирования: Delphi 7, Delphi 10 Seattle

Я не профессионал, я всего лишь любитель
Я не вредитель, я всего лишь теоретик
 
BigNikДата: Вторник, 26.04.2011, 22:49 | Сообщение # 3
Новичок
Зарегистрирован: 24.04.2011
Группа: Пользователи
Сообщений: 2
Статус: Offline
Quote (dolphin)
unit ModuleProcs отображает только библиотеки данного риложения

Но моё приложение не использует библиотеки UnlockerHook.dll, GameModule.dll и многие другие, а они выводятся... поэтому модуль выводит все длл, используемые в системе... (у меня Вин 7 если что) Но как переделать чтоб этот юнит выводил длл только одного процесса?
 
delfcode » Delphi » Вопросы по Delphi » Определение выгруженных ДЛЛ у процесса
Страница 1 из 11
Поиск:

delfcode.ru © 2008 - 2017 Хостинг от uCoz