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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Hinstance чужой dll для TResourceStream.Create, Загрузить hex данные из ресурса сторонне 
:(
    Опции темы
Kostyaxp
  Дата 28.10.2012, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Привествую всех заглянувших в ветку, и прошу помощи по возможности в решении следующего вопроса.

Задача такова: В системе другим (не моим) процессом загружена dll. Имя этой dll известно, имя процесса ее загрузившего тоже. 

Необходимо из ресурса этой dll загрузить hex данные в свое приложение. Имя ресурса (RCDATA) в dll тоже известно.

Есть код (пример):
Код

  Rs := TResourceStream.Create(HInstance, 'TXT', RT_RCDATA);
  Memo1.Lines.LoadFromStream(Rs);
  FreeAndNil(Rs);


Вопрос в том, как получить HInstance этой dll (загруженной чужим процессом) не загружая ее в свое приложение, чтобы передать ее HInstance, как параметр для TResourceStream.Create?


Это сообщение отредактировал(а) Kostyaxp - 28.10.2012, 16:39
PM MAIL   Вверх
Illusion Dolphin
Дата 28.10.2012, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Не понимаю полностью проблему. Если известно имя длл, то грузим её как данные (LoadLibraryEx, LOAD_LIBRARY_AS_DATAFILE) и читаем что хотим - чем это не устраивает? 


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
Чучмек
Дата 28.10.2012, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

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



HInstance это адрес по которому загружена  длл.


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
MetalFan
Дата 28.10.2012, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



Цитата(Illusion Dolphin @  28.10.2012,  20:44 Найти цитируемый пост)
то грузим её

Но автор хочет
Цитата(Kostyaxp @  28.10.2012,  16:38 Найти цитируемый пост)
не загружая ее в свое приложение


Почему поставлено такое ограничение, что нельзя библиотеку "загрузить" в свое АП и сделать с ней то, что надо?




--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Illusion Dolphin
Дата 29.10.2012, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

Но автор хочет

99% что этого автор не хочет, а пытается сделать. Задача имхо совсем в другом, но он забыл об этом рассказать. 

Но в лоб как это сделать - делается dll inject, код которого делает GetModuleHandle(Имя этой dll) и операции с ресурсами, по завершению через межпроцессорное взаимодействие передаёт днные в программу автора. 

Чтобы получить список dll у процесса можно сделать вот так (© stackoverflow):

Цитата

type
  TEnumModulesCallback = function (Module: HMODULE; Data: Pointer = nil): Boolean;

function EnumModulesPS(PID: Cardinal; Callback: TEnumModulesCallback; Data: Pointer = nil): Boolean;
var
  ProcessHandle: THandle;
  SizeNeeded: Cardinal;
  P, ModuleHandle: PHModule;
  I: Integer;
begin
  Result := False;

  ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, PID);
  if ProcessHandle = 0 then
    RaiseLastOSError;
  try
    SizeNeeded := 0;
    EnumProcessModules(ProcessHandle, nil, 0, SizeNeeded);
    if SizeNeeded = 0 then
      Exit;

    P := AllocMem(SizeNeeded);
    try
      if EnumProcessModules(ProcessHandle, P, SizeNeeded, SizeNeeded) then
      begin
        ModuleHandle := P;
        for I := 0 to SizeNeeded div SizeOf(DWORD) - 1 do
        begin
          if Callback(ModuleHandle^, Data) then
            Exit;
          Inc(ModuleHandle);
        end;

        Result := True;
      end;
    finally
      FreeMem(P);
    end;
  finally
    CloseHandle(ProcessHandle);
  end;
end;


Получите список dll и их ModuleHandle - то же, что и HInstance для win32. Дальше GetModuleFileNameEx и если совпало - получите искомое HInstance.
Теперь самое интересное - это не поможет получить ресурсы, т.к. полученный HInstance  это виртуальный адрес в адресном пространстве того exe, а не нашего. FindResource не будет работать. Считать данные можно кое-как через ReadProcessMemory и операции с форматом PE файла, но это уже как-то сложно.  


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
bems
Дата 30.10.2012, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

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



Цитата(Чучмек @  28.10.2012,  20:56 Найти цитируемый пост)
HInstance это адрес по которому загружена  длл. 

младшие биты могут отличаться (используются как флаги)


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Kostyaxp
Дата 1.11.2012, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем спасибо за ответы.

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

Ограничение изначально было из-за того, что путь до dll не известен (хотелось в другом процессе отловить), а само содержимое ее ресурсов может при этом меняться.

Код такой получился:
Код

var
//dllname путь к нашей dll-ке
dllname : widestring;
//handle dll-ки
dllhandle : thandle;
begin
dllhandle := LoadLibraryEx(pwidechar(dllname),0,LOAD_LIBRARY_AS_DATAFILE);


Хотел поставить "плюсеги", но постов не хватает. smile 

Это сообщение отредактировал(а) Kostyaxp - 1.11.2012, 18:58
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.1265 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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