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

 eXeL@B —› Вопросы новичков —› Вопрос(Наверное ламерский) по Dll
Посл.ответ Сообщение

Ранг: 0.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 01 апреля 2007 17:57
· Личное сообщение · #1

Всем привет!
Есть одна Dll библиотека которую я исследую(LibraryLoader.dll). Она загружает Library.dll
Есть фрагмент кода

10001182 |. 68 80A10010 PUSH LibraryLoa.1000A180 ; ASCII "Library.dll"
....some code.....
...

10001195 |. FFD6 CALL ESI ;

В CALL ESI загружается библиотека Library.dll. Соответственно перед CALL ESI; через PUSH передается
полный путь к Library.dll. Этот путь фиксированный, мне нужно было его поменять,чтоб Library.dll
загружалась из папки в которой находится exe программа вызывающая ее. Ну я и поменял
в HIEW PUSH перед CALL ESI
на первую стоку(10001182 |. 68 80A10010 PUSH LibraryLoa.1000A180 ; ASCII "Library.dll")
Все работает если LoadLibrary.dll загружается по Base=10000000, а если она загружается
например по Base=00330000 то ничего не работает.Olly выдает следующее:

10001182 |. 68 80A13300 PUSH LibraryLoa.0033A180 ; ASCII "Library.dll"
....some code.....
...

10001182 |. 68 80A10010 PUSH 1000A180
10001195 |. FFD6 CALL ESI ;

Так вопрос: почему все обращения к участку памяти заменяются кроме моего патча,как это исправить?
Заранее спасибо.



Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 01 апреля 2007 18:44
· Личное сообщение · #2

Ты лучше строку переправь (если она статична), чем аргумент.
А если уж правишь PUSH, то учитывай, что в таблице релоков есть ячейка, которая указывает, что это смещение зависит от базы модуля и нуждается в исправлении при загрузке образа не по ImageBase.
Читай про релоки (они же фиксапы).

ЗЫ Всё, завтра сяду дописывать редактор релоков!

-----
Всем привет, я вернулся




Ранг: 0.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 01 апреля 2007 19:15
· Личное сообщение · #3

Строка нестатична. Разбираюсь с релоками.
Как раз первая строчка подчернута Olly - значит релок?
10001182 |. 68 80A13300 PUSH LibraryLoa.0033A180 ; ASCII "Library.dll"



Ранг: 0.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 01 апреля 2007 20:03
· Личное сообщение · #4

Можете все-таки объяснить про таблицу релоков- общее назначение понятно, в Olly есть такая
таблица(секция .reloc), так где(как) искать соответствие между адресом и смещением???



Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 02 апреля 2007 00:10
· Личное сообщение · #5

F1, твоя новая строка где размещается? Если в той же dll в секции данных, то не трогай ты таблицу релоков!
В ней это смещение уже пробито. Значит, этот dowrd будет изменяться на расхождения от ImageBase (от таблицы расхождение не зависит, оно высчитывается загрузчиком).
Просто нужно учитывать, когда править будешь этот момент.

Уже в который раз повторяю.
Изучаем PE-формат по следующим документам:
- PE.TXT. Написал Bernd Luevelsmeyer (лучшая дока)
- Здесь в разделе статей две части "Об упаковщиках в последний раз"
- На openRCE.org есть графическое представление внутренностей PE-файла (кажись "PE Format graph.pdf" называется)
- Исходники загрузчика PE-файлов на С++ (линуксовщикам респект): stanson.chat.ru/yaw_ru.html
- Статья на RSDN, название: "Загрузчик PE-файлов". www.rsdn.ru/?article/baseserv/peloader.xml
- И на (для тех у кого) худой конец от MS дебильная дока PECOFF.pdf

Вот цитата из PE.TXT:
...
The relocation directory is a sequence of chunks. Each chunk contains
the relocation information for 4 KB of the image. A chunk starts with a
'IMAGE_BASE_RELOCATION' struct. It consists of 32 bits 'VirtualAddress'
and 32 bits 'SizeOfBlock'. It is followed by the chunk's actual
relocation data, being 16 bits each.
The 'VirtualAddress' is the base RVA that the relocations of this chunk
need to be applied to; the 'SizeOfBlock' is the size of the entire chunk
in bytes.
The number of trailing relocations is
('SizeOfBlock'-sizeof(IMAGE_BASE_RELOCATION))/2
The relocation information ends when you encounter a
IMAGE_BASE_RELOCATION struct with a 'VirtualAddress' of 0.

Each 16-bit-relocation information consists of the actual relocation
position in the lower 12 bits and a relocation type in the high 4 bits.
To get the relocation RVA, you need to add the IMAGE_BASE_RELOCATION's
'VirtualAddress' to the 12-bit-position. The type is one of:
IMAGE_REL_BASED_ABSOLUTE (0)
This is a no-op; it is used to align the chunk to a 32-bits-
border.
...
То есть если просто необходимо сделать это смещение абсолютным (не перемещаемым), то находишь в нужном блоке нужное слово (word) и вместо тройки вбиваешь в него ноль. Всё.

-----
Всем привет, я вернулся




Ранг: 0.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 02 апреля 2007 16:17
· Личное сообщение · #6

>F1, твоя новая строка где размещается? Если в той же dll в секции данных, то не трогай ты таблицу >релоков!
>В ней это смещение уже пробито. Значит, этот dowrd будет изменяться на расхождения от ImageBase
>(от таблицы расхождение не зависит, оно высчитывается загрузчиком).

Да, строка "Library.dll" находится в LoadLibrary.dll в секции данных.

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



Ранг: 77.1 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 07 апреля 2007 05:21
· Личное сообщение · #7

Bitfry пишет:
ЗЫ Всё, завтра сяду дописывать редактор релоков!

А готового редактора нет в природе? Руками напрягает искать




Ранг: 353.0 (мудрец)
Активность: 0.370
Статус: Участник
resreveR

Создано: 07 апреля 2007 08:15
· Личное сообщение · #8

только relox

-----
Тут не могла быть ваша реклама



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


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