Сейчас на форуме: jinoweb (+4 невидимых)

 eXeL@B —› Программирование —› Найти сборку из натива
Посл.ответ Сообщение

Ранг: 590.6 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 01 марта 2020 14:43
· Личное сообщение · #1

Если вдруг кто не знает то GetModuleHandle и прочие не видят managed сборки потому что те не грузятся через LoadLibrary.
Есть ли метода чтобы получить базу сборки в памяти по имени?

-----
старый пень





Ранг: 338.5 (мудрец), 349thx
Активность: 2.112.42
Статус: Участник

Создано: 01 марта 2020 14:53
· Личное сообщение · #2

r_e

Что такое сборка" ?

-----
vx




Ранг: 28.5 (посетитель), 8thx
Активность: 0.070.15
Статус: Участник

Создано: 01 марта 2020 15:05
· Личное сообщение · #3

difexacaw очевидно семпл

Добавлено спустя 3 минуты
а база сборки это адрес семпла в памяти




Ранг: 338.5 (мудрец), 349thx
Активность: 2.112.42
Статус: Участник

Создано: 01 марта 2020 15:15
· Личное сообщение · #4

galenkane

Не понятно, что такое "имя сборки в памяти" ?

С памятью может быть связан файл, это если файловая проекция. Что бы его имя получить есть два способа. MemoryMappedFilenameInformation/GetMappedFileName() или отобразить файловую секцию и найти соответствие NtAreMappedFilesTheSame/LdrGetDllHandleByMapping().

-----
vx





Ранг: 568.2 (!), 465thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 01 марта 2020 15:25 · Поправил: ClockMan
· Личное сообщение · #5

r_e пишет:
Если вдруг кто не знает то GetModuleHandle и прочие не видят managed сборки потому что те не грузятся через LoadLibrary.

если сборка грузилась в ручнуя минуя LoadLibrary то её и не будет в таблице загруженных модулей)))
r_e пишет:
Есть ли метода чтобы получить базу сборки в памяти по имени?

если у сборки есть таблица экспорта, то скан памяти + поиск имени в таблице экспорта

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.




Ранг: 590.6 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 01 марта 2020 16:04
· Личное сообщение · #6

Сборка - это managed assembly module.
Скан памяти - не вариант. Во-первых, для нагруженных участков кода слишком тормозной (впрочем, может кеширование и поможет). Во-вторых, маппинг по имени потребует отдельных танцев с бубном для сопоставления образа в памяти с образом на диске.
Судя по интернетам, то официальный способ будет через натив рефлекшн добраться до этой информации.

Добавлено спустя 11 минут
Попутно, может кто пробовал. Можно ли подгрузить сборку через LoadLibrary и будет ли она при этом "закеширована" в том смысле что последующий резолв вернет уже отмапленную, а не загрузит по новой?

-----
старый пень




Ранг: 330.4 (мудрец), 334thx
Активность: 0.160.17
Статус: Участник
ILSpector Team

Создано: 01 марта 2020 23:33
· Личное сообщение · #7

Эту тему уже жевали тут или на тутсях лет 5 назад. Проще самому её загрузить в память по известным координатам. Ищи где-то был загрузчик тут... или гдето не помню. Поиск по : загрузка dll в память без loadlibrary




Ранг: 338.5 (мудрец), 349thx
Активность: 2.112.42
Статус: Участник

Создано: 02 марта 2020 00:35
· Личное сообщение · #8

r_e

> танцев с бубном для сопоставления образа в памяти с образом на диске.

Что то на подобие этого, модуль есть в загрузчике, но его нет и небыло на диске ?



ca11_02.03.2020_EXELAB.rU.tgz - ld.7z

-----
vx





Ранг: 52.0 (постоянный), 146thx
Активность: 0.030.08
Статус: Участник

Создано: 02 марта 2020 01:50 · Поправил: UniSoft
· Личное сообщение · #9

r_e пишет:
Есть ли метода чтобы получить базу сборки в памяти по имени?

Как мне кажется: смысла в такой функции мало.
После загрузки вернее после выполнения DllMain, весь managed код пережевывается в нативный и выплевывается совсем в другую память, никак не связанную с базой сборки.

Я как-то делал прокси dll, патчил сборку в памяти процесса.
ставил хук на _CorValidateImage()
(точнее, сначала хук ставил на LoadLibraryW(), где ожидал загрузку "mscoree.dll" и тут же ставился хук на "_CorValidateImage")
А дальше было все просто.
_CorValidateImage вызывается еще до _CorDllMain, так что можно свободно патчить managed код (он еще не пережеван).
Code:
  1. HRESULT STDAPICALLTYPE DetourCorValidateImage(PVOID *ImageBase, LPCWSTR FileName)
  2. {
  3.          HRESULT hr = fpCorValidateImage(ImageBase, FileName); // вызов оригинальной функции
  4.          if (hr >= 0 && FileName) // STATUS_SUCCESS
  5.          {
  6.                  LPWSTR pname = ExtractFileName(FileName);
  7.                  if (lstrcmpiW(pname, L"КакаяТоДлл.dll") == 0)
  8.                  {
  9.                         //MessageBoxF(L"[_CorValidateImage] %s...", FileName);
  10.                         PatchDll(*ImageBase);
  11.                  }
  12.          }
  13.          return hr;
  14. }
  15.  
  16. LPWSTR WINAPI ExtractFileName(LPCWSTR lpFullPathFileName)
  17. {
  18.          if (lpFullPathFileName)
  19.          {
  20.                  LPCWSTR psz = lpFullPathFileName;
  21.                  while (*psz)
  22.                         if (*psz++ == '\\')
  23.                               lpFullPathFileName = psz;
  24.          }
  25.          return (LPWSTR)lpFullPathFileName;
  26. }


| Сообщение посчитали полезным: Medsft, r_e, Veliant, v00doo

Ранг: 590.6 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 02 марта 2020 10:45
· Личное сообщение · #10

UniSoft пишет:
после выполнения DllMain, весь managed код пережевывается в нативный

Там, вроде как, compile-on-call для каждого метода, а не сразу вся сборка предкомпилится.

-----
старый пень




Ранг: 330.4 (мудрец), 334thx
Активность: 0.160.17
Статус: Участник
ILSpector Team

Создано: 02 марта 2020 17:28
· Личное сообщение · #11

r_e пишет:
Там, вроде как, compile-on-call
щас подтянется dife ) и все нам расскажет по этому поводу, он тестил


 eXeL@B —› Программирование —› Найти сборку из натива
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати