Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Список используемых dll, Чужого приложения 
:(
    Опции темы
Gnusss
  Дата 22.5.2005, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 19.1.2005

Репутация: нет
Всего: нет



Привет всем!

Как можно узнать список используемых(загруженных) dll чужого приложения(например Explorer)?
Как узнать список своих написано в DRKB а как чужого чето не нашел smile

Заранее спасибо за ответ.
PM MAIL   Вверх
Medved
Дата 23.5.2005, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: нет
Всего: 154



Программно, или вообще?


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Gnusss
Дата 23.5.2005, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 19.1.2005

Репутация: нет
Всего: нет



Ну желательно программно.
PM MAIL   Вверх
<Spawn>
Дата 23.5.2005, 04:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 1
Всего: 64



Gnusss Если тебе известнен способ получения списка DLL-ок, то остается лишь попасть в нужное АП. Для этого, к примеру, можешь написать хук на WH_GETMESSAGE. После подгрузки твоей DLL в нужное АП, останется лишь вызвать функцию получения списка DLL-ок и вернуть его твему приложению smile


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
RA
Дата 23.5.2005, 07:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 7
Всего: 115



Код

USES TLHelp32, PsApi
.............

 function LoadedModulesList(const List: TStrings; ProcessID: DWORD; HandlesOnly: Boolean; IsWinNT: Boolean): Boolean;

  // this function don't work under Win9x
  procedure AddToList(ProcessHandle: THandle; Module: HMODULE);
  var
    FileName: array [0..MAX_PATH] of Char;
    ModuleInfo: TModuleInfo;
  begin
    {$IFDEF FPC}
    if GetModuleInformation(ProcessHandle, Module, ModuleInfo, SizeOf(ModuleInfo)) then
    {$ELSE}
    if GetModuleInformation(ProcessHandle, Module, @ModuleInfo, SizeOf(ModuleInfo)) then
    {$ENDIF FPC}
    begin
      if HandlesOnly then
        List.AddObject('', Pointer(ModuleInfo.lpBaseOfDll))
      else
      if GetModuleFileNameEx(ProcessHandle, Module, Filename, SizeOf(Filename)) > 0 then
        List.AddObject(FileName, Pointer(ModuleInfo.lpBaseOfDll));
    end;
  end;

  // this function don't work under Win9x, because it call AddToList
  function EnumModulesVQ(ProcessHandle: THandle): Boolean;
  var
    MemInfo: TMemoryBasicInformation;
    Base: PChar;
    LastAllocBase: Pointer;
    Res: DWORD;
  begin
    Base := nil;
    LastAllocBase := nil;
    FillChar(MemInfo, SizeOf(MemInfo), #0);
    Res := VirtualQueryEx(ProcessHandle, Base, MemInfo, SizeOf(MemInfo));
    Result := (Res = SizeOf(MemInfo));
    while Res = SizeOf(MemInfo) do
    begin
      if MemInfo.AllocationBase <> LastAllocBase then
      begin
        {$IFDEF FPC}
        if MemInfo._Type = MEM_IMAGE then
        {$ELSE}
        if MemInfo.Type_9 = MEM_IMAGE then
        {$ENDIF FPC}
          AddToList(ProcessHandle, HMODULE(MemInfo.AllocationBase));
        LastAllocBase := MemInfo.AllocationBase;
      end;
      Inc(Base, MemInfo.RegionSize);
      Res := VirtualQueryEx(ProcessHandle, Base, MemInfo, SizeOf(MemInfo));
    end;
  end;

  // this function don't work under Win9x, because it call AddToList
  function EnumModulesPS: Boolean;
  var
    ProcessHandle: THandle;
    Needed: DWORD;
    Modules: array of THandle;
    I, Cnt: Integer;
  begin
    Result := False;
    ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, ProcessID);
    if ProcessHandle <> 0 then
    try
      Result := EnumProcessModules(ProcessHandle, nil, 0, Needed);
      if Result then
      begin
        Cnt := Needed div SizeOf(HMODULE);
        SetLength(Modules, Cnt);
        if EnumProcessModules(ProcessHandle, @Modules[0], Needed, Needed) then
          for I := 0 to Cnt - 1 do
            AddToList(ProcessHandle, Modules[I]);
      end
      else
        Result := EnumModulesVQ(ProcessHandle);
    finally
      CloseHandle(ProcessHandle);
    end;
  end;

  // under WinNT this function always return False
  function EnumModulesTH: Boolean;
  var
    SnapProcHandle: THandle;
    Module: TModuleEntry32;
    Next: Boolean;
  begin
    SnapProcHandle := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessID);
    // INVALID_HANDLE_VALUE, if the function failed,
    // 0 for WinNT (bad design in TLHelp32.pas)
    Result := (SnapProcHandle <> INVALID_HANDLE_VALUE) and (SnapProcHandle <> 0);
    if Result then
    try
      FillChar(Module, SizeOf(Module), #0);
      Module.dwSize := SizeOf(Module);
      Next := Module32First(SnapProcHandle, Module);
      while Next do
      begin
        if HandlesOnly then
          List.AddObject('', Pointer(Module.hModule))
        else
          List.AddObject(Module.szExePath, Pointer(Module.hModule));
        Next := Module32Next(SnapProcHandle, Module);
      end;
    finally
      CloseHandle(SnapProcHandle);
    end;
  end;

begin
  List.BeginUpdate;
  try
    if IsWinNT then
      Result := EnumModulesPS
    else
      Result := EnumModulesTH;
  finally
    List.EndUpdate;
  end;
end;

PM   Вверх
Rouse_
Дата 23.5.2005, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



А вот мой вариант. ;)

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, TlHelp32;

type
  TfrmMain = class(TForm)
    tvReport: TTreeView;
    btnRefresh: TButton;
    procedure FormCreate(Sender: TObject);
    procedure btnRefreshClick(Sender: TObject);
  private
    procedure ScanProcess;
    procedure ScanModules(const th32ProcessID: DWORD);
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

{ TForm1 }

procedure TfrmMain.ScanModules(const th32ProcessID: DWORD);
var
  hProcessSnap: HWND;
  Module: TModuleEntry32;
  TreeNode: TTreeNode;
begin
  TreeNode := nil;
  hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, th32ProcessID);
  if hProcessSnap <> INVALID_HANDLE_VALUE then
  try
    Module.dwSize := SizeOf(TModuleEntry32);
    if Module32First(hProcessSnap, Module) then
    repeat
      if TreeNode = nil then
        TreeNode := tvReport.Items.AddChild(nil, Module.szExePath +
          ' [' + IntToStr(Module.hModule) + ']')
      else
        tvReport.Items.AddChild(TreeNode, Module.szExePath +
          ' [' + IntToStr(Module.hModule) + ']');
    until not Module32Next(hProcessSnap, Module);
  finally
    CloseHandle(hProcessSnap);
  end;
end;

procedure TfrmMain.ScanProcess;
var
  hProcessSnap: HWND;
  Entry: TProcessEntry32;
begin
  hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if hProcessSnap <> INVALID_HANDLE_VALUE then
  try
    Entry.dwSize := SizeOf(TProcessEntry32);
    if (Process32First(hProcessSnap, Entry)) then
    repeat
      ScanModules(Entry.th32ProcessID);
    until not Process32Next(hProcessSnap, Entry);
  finally
    CloseHandle(hProcessSnap);
  end;
end;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  ScanProcess;
end;

procedure TfrmMain.btnRefreshClick(Sender: TObject);
begin
  tvReport.Items.Clear;
  ScanProcess;
end;

end.



--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
RA
Дата 24.5.2005, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 7
Всего: 115



Цитата(Rouse_ @ 23.5.2005, 10:29)
А вот мой вариант. ;)


Тоже левый smile
PM   Вверх
Rouse_
Дата 24.5.2005, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



Ну лень мне было цельком на NtQuerySystemInformation переделывать. А по тем процессам которые должны быть видны пользователю (по идеологии MS) мой код выдает все полностью smile
Кстати, почитай Шрайбера, там он очень подробно описывает о нежелательности использования psapi (точнее скажем о ее усеченности и неоптимальности) smile


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
RA
Дата 24.5.2005, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 7
Всего: 115



Rouse_ Мне тоже лень писать было, вот и взял уже имеющийся старый пример с psapi. smile

Цитата
Кстати, почитай Шрайбера, там он очень подробно описывает о нежелательности использования psapi


Вобще-то всегда обходился без Псапей, но ради интереса наверное прочитаю.

ЗЫ: Жара вобще лень что либо делать.

Это сообщение отредактировал(а) RAdmin - 24.5.2005, 17:03
PM   Вверх
Rouse_
Дата 24.5.2005, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



Цитата(RAdmin @ 24.5.2005, 18:01)
Вобще-то всегда обходился без Псапей, но ради интереса наверное прочитаю.

Если есть возможность (куда ложить), то могу целиком скинуть данную книгу на сайт. И не ее одну. Системщикам будут интересны электронные варианты моей коллекции (Авторские редакции и естественно на английском)...


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
RA
Дата 3.6.2005, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 7
Всего: 115



Rouse_ А сколько весит ?
PM   Вверх
RA
Дата 3.6.2005, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 7
Всего: 115



Если каждая книженция в пределах 20MB то есть одно местечко smile
PM   Вверх
  
Закрытая темаСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0795 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.