eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
обновлён 2 декабря!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Русский / Russian English / Английский

Сейчас на форуме: bartolomeo (+4 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

 eXeL@B —› Вопросы новичков —› Функция недоступна из нового сегмента кода
Посл.ответ Сообщение

Ранг: 1.0 (гость)
Статус: Участник

Создано: 29 октября 2017 06:09 New!
Цитата · Личное сообщение · #1

Есть dll. В dll из kernel32.dll импортирована функция GetModuleHandleW (да в общем любая). Пусть условно адрес ее импорта 0x12345678. В оригинальной секции кода полно вызовов типа call GetModuleHandleW c опкодом FF1578563412. В приложении, использующем dll, все работает. Добавляем с помощью PE Tools или чего подобного еще секцию кода. Красиво выводим какую-нибудь функцию dll относительными джампами в новую секцию кода. В новой секции кода требуется вызвать GetModuleHandleW. Пишем FF1578563412. Сохраняем, запускаем, программа падает с ошибкой "Инструкция по адресу [там, где в новой секции call GetModuleHandleW] обратилась к памяти по адресу [адрес импорта функции GetModuleHandleW]. Память не может быть прочитана." Я чего-то не знаю, но я не знаю, чего. Памажите хто чем может...

Ранг: 299.1 (наставник)
Статус: Модератор
CrackLab

Создано: 29 октября 2017 06:24 New!
Цитата · Личное сообщение · #2

parabaytov пишет:
Я чего-то не знаю, но я не знаю, чего.

см. PE Format->Base Relocation Table

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


Ранг: 134.3 (ветеран)
Статус: Участник

Создано: 29 октября 2017 06:48 · Поправил: VOLKOFF New!
Цитата · Личное сообщение · #3

parabaytov, для просветления ставим БП на вызов и смотрим как оно работает, курим формат PE.

P.S.
parabaytov пишет:
Пишем FF1578563412

Для простоты жизни считаем и пишем непосредственно адрес GetModuleHandleW в KERNEL32 вместо "прыжка".
Надеюсь и аргумент функции вы запушить не забыли (LPCWSTR module юникодный в данном случае)

Code:
  1. 00401017        .  68 00000000          PUSH 0                                  ; /ModuleName = NULL
  2. 0040101C        .  E8 XXXXXXXX          CALL <GetModuleHandleW>             ; \KERNEL32.GetModuleHandleW


Можно также свой аналог нахождения через PEB LDR_DATA_TABLE_ENTRY дописать (если говорим о GetModuleHandle) и вообще обойтись без вызова оригинала, но это уже на любителя.

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



Ранг: 316.3 (мудрец)
Статус: Участник

Создано: 29 октября 2017 17:05 · Поправил: difexacaw New!
Цитата · Личное сообщение · #4

parabaytov

> Я чего-то не знаю, но я не знаю, чего.

Необходимо выяснить причину ошибки, те отладить загрузчик. Запускайте на XP и найдите место где падает, затем откройте сурки w2k и найдите место в исходном коде. Там будут комменты со всеми подробностями.

Если не охота лезть в отладчик(не годится такое), то запустите загрузочный логгер(showsnaps) и посмотрите отчёт. Там будет описана проблема.

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


Ранг: 70.9 (постоянный)
Статус: Участник

Создано: 29 октября 2017 19:13 New!
Цитата · Личное сообщение · #5

difexacaw
Толсто, но в нужную сторону..

Ранг: 409.4 (мудрец)
Статус: Участник

Создано: 29 октября 2017 21:37 · Поправил: dosprog New!
Цитата · Личное сообщение · #6

parabaytov пишет:
В новой секции кода требуется вызвать GetModuleHandleW

Используй вызов "трамплина" в оригинальном коде.

Это будет не <call dword ptr [address]>, а <call address>.

Лучше к таким вопросам добавлять "скелет" задачи в виде набора файлов проекта,
к тому же при подготовке такого "скелета" ответ может прийти и сам.

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



Ранг: 316.3 (мудрец)
Статус: Участник

Создано: 31 октября 2017 18:11 · Поправил: difexacaw New!
Цитата · Личное сообщение · #7

dosprog

Тс не нашёл суть проблемы сам, не прошёл логическую цепочку, вы ему дали готовое решение. А это частное решение и оно не является знанием, оно для тс бесполезно. Посему назад к #4. Без общего метода будет бесконечный поток вопросов. Не следует отвечать на такие вопросы прямо.

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


Ранг: 1.0 (гость)
Статус: Участник

Создано: 1 ноября 2017 04:58 New!
Цитата · Личное сообщение · #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. Можете не отвечать, пока еще не упало. Но вдруг вы знаете, что все будет очень плохо, и вам станет меня жалко, и вы решите меня предупредить? Может тогда кто-то тоже получит "спасибо" к посту и не будет дуться.


Ранг: 334.1 (мудрец)
Статус: Участник
born to be evil

Создано: 1 ноября 2017 11:01 · Поправил: ajax New!
Цитата · Личное сообщение · #9

parabaytov
если VSize больше, чем c добавленными релоками, то нафига?

Ранг: 299.1 (наставник)
Статус: Модератор
CrackLab

Создано: 1 ноября 2017 11:14 New!
Цитата · Личное сообщение · #10

parabaytov
попробуй просто добавить релок на свой адрес(а) RelocEditor

{ Атач доступен только для участников форума } - Reloc.rar


Ранг: 316.3 (мудрец)
Статус: Участник

Создано: 1 ноября 2017 20:41 · Поправил: difexacaw New!
Цитата · Личное сообщение · #11

parabaytov

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

> Кто-нибудь знает, следует ли увеличивать и Virtual Size секции .reloc ...

Опять возвращаемся к тому что я говорил, тупо бессмысленный вопрос, очередная проблема. Но вы выполните свою работу.

win2k\private\ntos\rtl\ldrreloc.c

Ответы на все вопросы, текущие и вероятные. В старшей версии системы механизм изменён не существенно, посему этого достаточно. Невозможно описать каждую проверку загрузчика в данном обсуждении.

Ждём следующий вопрос.

Ранг: 1.0 (гость)
Статус: Участник

Создано: 1 ноября 2017 22:13 New!
Цитата · Личное сообщение · #12

SReg
Я уже как бы давно пальцами в CFF Explorer на основании asm кода своей врезки позаносил все в блок Relocation Table. Там буквально меньше 20 байт. Если только этот посторонний тул делает что-то с размерами секции, но мало ли что делает постороний тул. Спасибо за совет.

difexacaw
За пару минут я OllyDbg не освою до уровня "запустить весь этот зоопарк, найти тред плагина, узнать, в какое окно смотреть и что с этим всем делать". А вот прочитать раздел 7.2 в http://www.ntcore.com/files/inject2exe.htm и адаптировать имеющийся файл запросто. Следующий вопрос если и будет, то по OllyDbg и отдельным топиком. А этот считаю исчерпанным.
 eXeL@B —› Вопросы новичков —› Функция недоступна из нового сегмента кода

Оригинальный DVD-ROM: eXeL@B DVD !

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS