Сейчас на форуме: cppasm, asfa, vsv1 (+6 невидимых)

 eXeL@B —› Вопросы новичков —› Можно-ли изменить имя модуля (dll), уже загруженного в память?
Посл.ответ Сообщение

Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 10 июля 2016 14:00 · Поправил: Kuzya69
· Личное сообщение · #1

Я хочу проделать такое.
Программа, которую я ломаю, при запуске, загружает кучу dll. При чем по заданным параметрам, она сначала ищет эти dll в текущей директории, а потом в системной. Это мне на руку. Я делаю одноименную dll в текущей директории. Когда моя dll загрузится, то в ее Main Module, я изменяю код программы-жертвы, а потом загружаю в программу оригинальную dll из системной директории.
Выгружать мне свою dll нельзя, она еще мне понадобится после.
Получаем в памяти две dll с одним именем. Ну не совсем с одним, система об этом позаботится, при чем моя dll будет иметь имя как у оригинала, а оригинальная dll получает слегка измененое имя.
Так вот, я хочу поменять имена в памяти местами.
Как это можно проделать, чтобы устранить бардак ?
Или не заморачиваться? Хоть имя в памяти у оригинальной dll и изменено, но ее API-функции все равно будут работать?



Ранг: 12.2 (новичок), 11thx
Активность: 0.020
Статус: Участник

Создано: 10 июля 2016 14:08 · Поправил: srm60171
· Личное сообщение · #2

Информация о загруженных модулях хранится в PEB. Там можно хоть изменить имя, хоть скрыть модуль совсем.
Скорее всего не относится к вопросу: Однако часть информации еще остается в VAD дереве (ядерная структура памяти процесса). Нужно снять маппинг со страницы фейкового модуля.

| Сообщение посчитали полезным: Kuzya69

Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 10 июля 2016 14:51
· Личное сообщение · #3

А я смогу, находясь в модуле, поменять имя этого модуля. Или придется сначала выйти из него?



Ранг: 281.8 (наставник), 272thx
Активность: 0.250.01
Статус: Участник
Destroyer of protectors

Создано: 10 июля 2016 15:01
· Личное сообщение · #4

Kuzya69
берёшь оригинальную дллку, смотришь экспортируемые функи, создаёшь фейковую длл с этими же функами, из которых вызываешь оригинальные. в итоге прога будет вызывать функции из твоей библиотеки, а твоя из оригинальной. получится что-то типа прокси.



Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 10 июля 2016 15:39
· Личное сообщение · #5

EXPORTS
Function1 = RealDLL.Function1

итд

ничего выгружать не придется. Свой код выполнишь с dllmain.




Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 10 июля 2016 16:18
· Личное сообщение · #6

угу. а если их там сотня и все обмангленые?
без крайней необходимости вроде перехвата функций - способ бессмысленно сложный
лодырь с CreateRemoteThread (hProcess, [pLoadLibraryA], "my.dll") - и не нужно мучиться с подменами



Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 10 июля 2016 16:49
· Личное сообщение · #7

Да, перечислять все API-шки неохота.
Да и в некоторых dll их действительно не 10-20.
К тому-же я еще не вычислил dll, загрузка которой будет мне нужна. Т.е. будет сразу после распакованного кода, который буду патчить первым.
Лоадер тоже делать не буду.
Попробую докумекать, как по выходу из загрузки моей dll (которая загрузит оригинальную), подменить ImageBase моей dll, на ImageBase оригинальной dll в регистре eax. Может и прокатит, а нет, то пойду изучать PEB.



Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

Создано: 10 июля 2016 18:03
· Личное сообщение · #8

Kuzya69 пишет:
Да, перечислять все API-шки неохота.
Да и в некоторых dll их действительно не 10-20.

да хоть 10к. напиши утиль которая это сделает за тебя и выдаст сурс.



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

Создано: 10 июля 2016 18:55 · Поправил: dosprog
· Личное сообщение · #9

SReg пишет:
да хоть 10к. напиши утиль которая это сделает за тебя и выдаст сурс.

Это паршивый способ, ведущий к глюкам - имеется в виду "обёрточная" DLL.
Кроме функций длл'и ещё бывает (и довольно часто) экспортируют указатели на данные.

Срабатывает такое далеко не всегда, способ категорически не универсальный.





Ранг: 12.2 (новичок), 11thx
Активность: 0.020
Статус: Участник

Создано: 10 июля 2016 22:22 · Поправил: srm60171
· Личное сообщение · #10

Kuzya69 пишет:
А я смогу, находясь в модуле, поменять имя этого модуля. Или придется сначала выйти из него?

Можно прямо из модуля.

Вот пример на скрытие. Имя поменять можно аналогично, но нужно еще одну структуру нагуглить и дописать.
http://www.unknowncheats.me/forum/c-and-c/81519-unlinking-and-relinking-loaded-dlls-peb.html

Если будешь делать скрытие, то учти что работа с ресурсами изнутри скрываемого модуля отвалится.



Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 11 июля 2016 09:42
· Личное сообщение · #11

Господи да какая разница что там и сколько их. Хоть миллион хоть 100500 дата поинтеров. Тебе надо чтобы ее тебе загрузил лоадер винды. Дальше ты сам сказал что собрался патчить ее в списке и грузить оригинал. На ентри поинте вызовешь LdrEnumerateLoadedModules и в ней (она тебе еще и лок на список поставит бесплатно) найдешь свою длл по известной imagebase, выделишь память под новое имя и переинициализируешь UNICODE_STRING модуля.



Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 23 июля 2016 15:19 · Поправил: Kuzya69
· Личное сообщение · #12

Kuzya69 пишет:
Попробую докумекать, как по выходу из загрузки моей dll (которая загрузит оригинальную), подменить ImageBase моей dll, на ImageBase оригинальной dll в регистре eax. Может и прокатит, а нет, то пойду изучать PEB.


Ну вроде разобрался, как в структуру LDR_Module для нужной dll попадать. Разобрался как работают двусвязные списки. Как исключать модуль из списков.
Теперь загвоздка вот в чем.
Нету полного описания структуры LDR_Module, поэтому не понятно какие поля в структуре надо подменять?
Хочу сделать так:
1) В структуре LDR_Module для моей dll, изменить значение полей (DllBase, EntryPoint, SizeOfImage, FullDllName, BaseDllName, Flags, LoadCount, TlsIndex, TimeDateStamp, EntryPointActivationContext, PatchInformation) на соответствующие значения полей из структуры LDR_Module для оригинальной dll.
2) Изменить три связанных списка (InLoadOrderLinks, InMemoryOrderLinks, InInitializationOrderLinks), так, чтобы структура LDR_Module для оригинальной dll стала скрытой, и не "виделась" в этих списках.

Но появился вопрос. Достаточно-ли этих действий?
Меня смущают поля HashLinks, ForwarderLinks, ServiceTagLinks, StaticLinks. Их надо тоже пересчитывать?
Просто заметил, что в этих полях не для всех dll "сидят адекватные значения"

Ах да, забыл добавить, те действия, что я хочу сделать, я буду выполнять в блоке Main моей dll.



Ранг: 8.0 (гость), 15thx
Активность: 0.010.03
Статус: Участник

Создано: 23 июля 2016 16:49
· Личное сообщение · #13

Вот кое-какие полезные функции по работе с этими структурами, но не новее Windows 7. Делал давно, так что не знаю, что из этого еще работает
Но лучше все же по чистому выгрузить свою DLL, а потом выделить память по ее предыдущему адресу и скопировать туда предварительно сохраненную с того адреса копию. Тогда меньше будет проблем с разными версиями Windows.

b2bd_23.07.2016_EXELAB.rU.tgz - ModuleTricks.7z



Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 23 июля 2016 18:36
· Личное сообщение · #14

Vicshann пишет:
Вот кое-какие полезные функции

Чего-то мой 7zip, с ошибками распаковывает. Можешь переархивировать например в rar или zip ?



Ранг: 8.0 (гость), 15thx
Активность: 0.010.03
Статус: Участник

Создано: 23 июля 2016 19:50
· Личное сообщение · #15

Вот, специально для тех, кто не обновлял архиватор несколько лет

b733_23.07.2016_EXELAB.rU.tgz - ModuleTricks.zip



Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 23 июля 2016 20:05
· Личное сообщение · #16

Vicshann пишет:
кто не обновлял архиватор несколько лет

Спасибо, но уже догадался. Обновил.


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


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