![]() |
eXeL@B —› Вопросы новичков —› Вопрос(Наверное ламерский) по Dll |
Посл.ответ | Сообщение |
|
Создано: 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 ; Так вопрос: почему все обращения к участку памяти заменяются кроме моего патча,как это исправить? Заранее спасибо. ![]() |
|
Создано: 01 апреля 2007 18:44 · Личное сообщение · #2 Ты лучше строку переправь (если она статична), чем аргумент. А если уж правишь PUSH, то учитывай, что в таблице релоков есть ячейка, которая указывает, что это смещение зависит от базы модуля и нуждается в исправлении при загрузке образа не по ImageBase. Читай про релоки (они же фиксапы). ЗЫ Всё, завтра сяду дописывать редактор релоков! ----- Всем привет, я вернулся ![]() |
|
Создано: 01 апреля 2007 19:15 · Личное сообщение · #3 |
|
Создано: 01 апреля 2007 20:03 · Личное сообщение · #4 |
|
Создано: 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) и вместо тройки вбиваешь в него ноль. Всё. ----- Всем привет, я вернулся ![]() |
|
Создано: 02 апреля 2007 16:17 · Личное сообщение · #6 >F1, твоя новая строка где размещается? Если в той же dll в секции данных, то не трогай ты таблицу >релоков! >В ней это смещение уже пробито. Значит, этот dowrd будет изменяться на расхождения от ImageBase >(от таблицы расхождение не зависит, оно высчитывается загрузчиком). Да, строка "Library.dll" находится в LoadLibrary.dll в секции данных. >Просто нужно учитывать, когда править будешь этот момент. Что нужно учитывать??Что делать? ![]() |
|
Создано: 07 апреля 2007 05:21 · Личное сообщение · #7 |
|
Создано: 07 апреля 2007 08:15 · Личное сообщение · #8 |
![]() |
eXeL@B —› Вопросы новичков —› Вопрос(Наверное ламерский) по Dll |