![]() |
eXeL@B —› Вопросы новичков —› Вопрос по релокам |
Посл.ответ | Сообщение |
|
Создано: 15 июля 2007 16:28 · Личное сообщение · #1 В dllке после секции релоков много нулей. Добавляю в dll'ку 2 релока в секцию релоков там где нули в конце. Меняю соответственно размер директории релоков в pe editore, все работает отлично. Но стоит только добавить еще один релок (третий) туда же где нули как возникает глюк. При загрузке файла в olly когда там загружается эта dll пишется "Bad or unknown format of 32 bit executable...", но при этом все продолжает загружаться и третий релок правильно исправляется (но при этом релоки почему-то не подчеркиваются!). Нулей еще дофига, следущая секция начинается через много байтов. Что это за странный глюк? 2 релока - все ок 3 релока - глюк? ![]() |
|
Создано: 15 июля 2007 18:28 · Поправил: Bitfry · Личное сообщение · #2 Написал я тут какой-то бред ![]() Размер директории должен быть равен размеру суммы полей SizeOfBlock (то есть общему размеру блоков). Если ты добавляешь блок, то делай это так: Dword на RVA, dword на SizeOfBlock, и тут пошли релоки word,word,word... Но не забывай исправлять SizeOfBlock и размер директории. Сейчас пойду править свою доку по релокам. ----- Всем привет, я вернулся ![]() |
|
Создано: 15 июля 2007 19:21 · Личное сообщение · #3 Прикрепляю то что успел написать (далеко не окончательный вариант). Эта дока пишется для редактора релоков, но его релиз всё откладывается и откладывается. ![]() ----- Всем привет, я вернулся ![]() |
|
Создано: 18 июля 2007 07:34 · Личное сообщение · #4 Так это я вроде и так все понял. Если я косячу с размером директории, или sizeofblock то Dll'ка даже не грузиться в память, а в моем случае она загружается все вроде работает, все ролоки релокятся но при этом Olly орет "Bad or unknown format of 32 bit executable...", не подчеркивает релоки и еще не работает сохранение (copy to executable). У меня всего было 3 добавленых релока, каждый по отдельности вида XXXX XXXX 0AXX XXXX XX3X и возникал этот баг. Потом я попробовал склеить 2 из трех релоков и сделал XXXX XXXX 0СXX XXXX XX3X XX3X и баг пропал. Сейчас добавил еще 2 релока и снова баг появился... Может релоки надо добавлять в каком-то особом порядке или еще чего? Может есть какая прога для автоматического добавления релоков? ![]() |
|
Создано: 18 июля 2007 08:20 · Личное сообщение · #5 |
|
Создано: 18 июля 2007 11:11 · Личное сообщение · #6 |
|
Создано: 18 июля 2007 11:39 · Поправил: Bitfry · Личное сообщение · #7 sliderZ, ты не вкурил мою доку. Что ты пытался сделать, создать блок для каждого релока отдельно - это не есть верно (в твоём случае). Почему? Потому что, во-первых каждый блок должен быть кратен 1000h, во-вторых для этих релоков уже есть блоки, а повторы приводят к глюкам. В твоём случае нужно найти подходящее место в уже существующих блоках (31000,3А000,3В000). Соответственно нужно сдвинуть ниже всё что после и перебить размер изменяемых блоков. Мой редактор всё это будет делать, но только не сегодня ![]() А пока смотри как это выглядит в PE-explorer'e. ----- Всем привет, я вернулся ![]() |
|
Создано: 18 июля 2007 14:23 · Личное сообщение · #8 Попробовал так и сделать, добавил первый релок, который по 3A68E + 2, в блок 3A000. Причем поместил его (9036) строго по порядку возрастания. Оставшиеся релоки передвинул на 2 байта, увеличил размер этого блока и размер директории на 2 байта. Пробовал удалить .udd файл в olly, все равно лезет "Bad or unknown format of 32 bit executable". Такое чувство что любая попытка прикоснуться к релокам приводит к этому глюку, ничего не понимаю. ![]() |
|
Создано: 11 августа 2007 15:52 · Личное сообщение · #9 Разобралсо наконец еп-та. Размер каждого блока должен быть кратен 4, именно поэтому в конце блоков у которых размер не кратен 4 добавляютсо абсолютные релоки 0000 чтобы стало кратно. Поэтому когда я добавлял один релок то возникал глюк, а когда 2 тогда работало. У тебя в доке про это не написано Bitfry. При этом чтобы блок был кратен 0x1000 вроде бы не обязательно, добавлял свои блоки на любые адреса, глюков вроде не заметил, главно чтобы размер блока делился на 4. ![]() |
|
Создано: 12 августа 2007 09:20 · Личное сообщение · #10 sliderZ пишет: Размер каждого блока должен быть кратен 4, именно поэтому в конце блоков у которых размер не кратен 4 добавляютсо абсолютные релоки 0000 чтобы стало кратно. Поэтому когда я добавлял один релок то возникал глюк, а когда 2 тогда работало. У тебя в доке про это не написано Bitfry. Спасибо. А у меня даже наоборот написано, типа это не важно. Когда писал – экспериментировал и, вроде бы, работало. Как освобожусь, буду разбираться. ----- Всем привет, я вернулся ![]() |
|
Создано: 17 августа 2007 17:02 · Личное сообщение · #11 Эксперименты показали, что система ведёт себя по-разному. Если dll прописана в импорте, то, например, размер директории не обязательно должен совпадать с суммой размеров блоков, а если загружать её через LoadLibrary, то при несовпадении размеров возникнет критический глюк. Это просто пример, есть и другие приколы. Прикрепляю сюда примерчик из MASM32. CALLDLL.EXE - грузит либу через LoadLibrary, LOADDLL.EXE – завёт через импорт. Но во всех случаях у меня TSTDLL.DLL прекрасно грузится (и даже Оля не ругается) несмотря на то, что я подправил размер блока и директории до 1Eh (никак не кратно 4). Так что, возможно проблему ты решил чем-то другим? ![]() ----- Всем привет, я вернулся ![]() |
|
Создано: 18 августа 2007 12:02 · Личное сообщение · #12 |
|
Создано: 20 августа 2007 20:12 · Личное сообщение · #13 |
![]() |
eXeL@B —› Вопросы новичков —› Вопрос по релокам |