eXeL@B —› Вопросы новичков —› Функция недоступна из нового сегмента кода |
Посл.ответ | Сообщение |
|
Создано: 29 октября 2017 06:09 · Личное сообщение · #1 Есть dll. В dll из kernel32.dll импортирована функция GetModuleHandleW (да в общем любая). Пусть условно адрес ее импорта 0x12345678. В оригинальной секции кода полно вызовов типа call GetModuleHandleW c опкодом FF1578563412. В приложении, использующем dll, все работает. Добавляем с помощью PE Tools или чего подобного еще секцию кода. Красиво выводим какую-нибудь функцию dll относительными джампами в новую секцию кода. В новой секции кода требуется вызвать GetModuleHandleW. Пишем FF1578563412. Сохраняем, запускаем, программа падает с ошибкой "Инструкция по адресу [там, где в новой секции call GetModuleHandleW] обратилась к памяти по адресу [адрес импорта функции GetModuleHandleW]. Память не может быть прочитана." Я чего-то не знаю, но я не знаю, чего. Памажите хто чем может... |
|
Создано: 29 октября 2017 06:24 · Личное сообщение · #2 parabaytov пишет: Я чего-то не знаю, но я не знаю, чего. см. PE Format->Base Relocation Table | Сообщение посчитали полезным: parabaytov |
|
Создано: 29 октября 2017 06:48 · Поправил: VOLKOFF · Личное сообщение · #3 parabaytov, для просветления ставим БП на вызов и смотрим как оно работает, курим формат PE. P.S. parabaytov пишет: Пишем FF1578563412 Для простоты жизни считаем и пишем непосредственно адрес GetModuleHandleW в KERNEL32 вместо "прыжка". Надеюсь и аргумент функции вы запушить не забыли (LPCWSTR module юникодный в данном случае) Code:
Можно также свой аналог нахождения через PEB LDR_DATA_TABLE_ENTRY дописать (если говорим о GetModuleHandle) и вообще обойтись без вызова оригинала, но это уже на любителя. | Сообщение посчитали полезным: parabaytov |
|
Создано: 29 октября 2017 17:05 · Поправил: difexacaw · Личное сообщение · #4 parabaytov > Я чего-то не знаю, но я не знаю, чего. Необходимо выяснить причину ошибки, те отладить загрузчик. Запускайте на XP и найдите место где падает, затем откройте сурки w2k и найдите место в исходном коде. Там будут комменты со всеми подробностями. Если не охота лезть в отладчик(не годится такое), то запустите загрузочный логгер(showsnaps) и посмотрите отчёт. Там будет описана проблема. ----- vx | Сообщение посчитали полезным: sefkrd |
|
Создано: 29 октября 2017 19:13 · Личное сообщение · #5 |
|
Создано: 29 октября 2017 21:37 · Поправил: dosprog · Личное сообщение · #6 parabaytov пишет: В новой секции кода требуется вызвать GetModuleHandleW Используй вызов "трамплина" в оригинальном коде. Это будет не <call dword ptr [address]>, а <call address>. Лучше к таким вопросам добавлять "скелет" задачи в виде набора файлов проекта, к тому же при подготовке такого "скелета" ответ может прийти и сам. | Сообщение посчитали полезным: parabaytov |
|
Создано: 31 октября 2017 18:11 · Поправил: difexacaw · Личное сообщение · #7 dosprog Тс не нашёл суть проблемы сам, не прошёл логическую цепочку, вы ему дали готовое решение. А это частное решение и оно не является знанием, оно для тс бесполезно. Посему назад к #4. Без общего метода будет бесконечный поток вопросов. Не следует отвечать на такие вопросы прямо. ----- vx | Сообщение посчитали полезным: Grin |
|
Создано: 01 ноября 2017 04:58 · Личное сообщение · #8 difexacaw Почему бы не начать с того, что было до Большого Взрыва? Дойдем и до дебаггера, когда возникнет острая необходимость. Мне вам экзамены все равно не сдавать. А по данному конкретному вопросу хватило бы первого ответа, данного SReg. Попутно выяснилось, что в дизассемблере инструкции push ABCD1234 после внесения смещений "запушиваемых" значений в Base Relocation Table начинают красиво отображаться как push offset loc_ABDC1234, как и положено обращениям к данным в dll. Кто-нибудь знает, следует ли увеличивать и Virtual Size секции .reloc на размер добавленного в Base Relocation Table блока? Relocation Directory Size в Optional Header подправил, но он на треть меньше и Virtual Size, и Raw Size секции .reloc. Можете не отвечать, пока еще не упало. Но вдруг вы знаете, что все будет очень плохо, и вам станет меня жалко, и вы решите меня предупредить? Может тогда кто-то тоже получит "спасибо" к посту и не будет дуться. |
|
Создано: 01 ноября 2017 11:01 · Поправил: ajax · Личное сообщение · #9 |
|
Создано: 01 ноября 2017 11:14 · Личное сообщение · #10 parabaytov попробуй просто добавить релок на свой адрес(а) RelocEditor c0ba_01.11.2017_EXELAB.rU.tgz - Reloc.rar |
|
Создано: 01 ноября 2017 20:41 · Поправил: difexacaw · Личное сообщение · #11 parabaytov Если бы вы думали правильно, и действовали рекомендациям, вы бы решили свои задачи за минуты. Но увы, главное цель, а не путь. > Кто-нибудь знает, следует ли увеличивать и Virtual Size секции .reloc ... Опять возвращаемся к тому что я говорил, тупо бессмысленный вопрос, очередная проблема. Но вы выполните свою работу. win2k\private\ntos\rtl\ldrreloc.c Ответы на все вопросы, текущие и вероятные. В старшей версии системы механизм изменён не существенно, посему этого достаточно. Невозможно описать каждую проверку загрузчика в данном обсуждении. Ждём следующий вопрос. ----- vx |
|
Создано: 01 ноября 2017 22:13 · Личное сообщение · #12 SReg Я уже как бы давно пальцами в CFF Explorer на основании asm кода своей врезки позаносил все в блок Relocation Table. Там буквально меньше 20 байт. Если только этот посторонний тул делает что-то с размерами секции, но мало ли что делает постороний тул. Спасибо за совет. difexacaw За пару минут я OllyDbg не освою до уровня "запустить весь этот зоопарк, найти тред плагина, узнать, в какое окно смотреть и что с этим всем делать". А вот прочитать раздел 7.2 в http://www.ntcore.com/files/inject2exe.htm и адаптировать имеющийся файл запросто. Следующий вопрос если и будет, то по OllyDbg и отдельным топиком. А этот считаю исчерпанным. |
eXeL@B —› Вопросы новичков —› Функция недоступна из нового сегмента кода |