Сейчас на форуме: tyns777, cppasm, dutyfree (+7 невидимых)

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

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

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

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



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

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

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

см. PE Format->Base Relocation Table

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

Ранг: 173.8 (ветеран), 208thx
Активность: 0.120.36
Статус: Участник

Создано: 29 октября 2017 06:48 · Поправил: VOLKOFF
· Личное сообщение · #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


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

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

parabaytov

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

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

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

-----
vx


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


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

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

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



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

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

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

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

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

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



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


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

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

dosprog

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

-----
vx


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

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

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




Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

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

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

-----
От многой мудрости много скорби, и умножающий знание умножает печаль




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

Создано: 01 ноября 2017 11:14
· Личное сообщение · #10

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

c0ba_01.11.2017_EXELAB.rU.tgz - Reloc.rar




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

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

parabaytov

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

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

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

win2k\private\ntos\rtl\ldrreloc.c

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

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

-----
vx




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

Создано: 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 —› Вопросы новичков —› Функция недоступна из нового сегмента кода
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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