Собственно, сабж. При модификации не удалось обойтись без команд, использующих абсолютную адресацию. Пока работает, но это dll, вдруг загрузится не по рекомендед адресу.
в смысле? я так и не понял, че ты хотел сказать. какие команды? где? что они делают? зачем править релоки???
Хмм, возможно я как новичок чего-то не допонимаю. Как я понимаю, DLL может быть отображена в адресном пространстве процесса не обязательно по тому адресу, который подразумевался при компиляции этой DLL. Соответственно, адреса переходов или адреса обращений к данным, росполодженным по фиксированным адресам, изменятся. В большинстве случаев это не существенно, если в команде используется адресация с указанием приращения относительно адреса следующей команды. Но если в команде используется абсолютный адрес (подразумевающий, что код размещен по строго определенному адресу), то при размещении DLL в другом месте адресного пространства процесса этот адрес буде туказывать уже не туда, и соответственно должен быть откорректирован. И как я понял из туториала izceliona про PE, где то в заголовке PE-файла есть некая таблица, говорящая, в каких местах кода расположены такие абсолютные адреса, подлежащие модификации при размещении DLL в другом месте адресного пространства процесса. При исправлении некой DLL я добавил команду обращения к ячейке в сегменте данных с использованием абсолютного адреса (раньше на этом месте были только nop). И как понимаю, операнд этой команды должен быть при необходимости исправлен, а значит, байты операнда должны быть указаны вышеуказанной таблице. Или я что-то неправильно понимаю?
конкретно вот Код (Text): .text:100C1F53 push ebx [53] .text:100C1F54 mov ebx, ctrlMoveTick [8B 1D F8 FF 0C 10] .text:100C1F5A add ebx, 200 [81 C3 C8 00 00 00] Здесь в команде указан абсолютный адрес переменной ctrlMoveTick [100CFFF8], а значит байты с 100С1А56 по 100С1A59 должны быть при необходимости исправлены при перемещении, то есть как-то указаны в relocation table.
Dmitry_Milk лучше напиши базонезависимый код. вместо mov ebx, ctrlMoveTick ввставь call label label: pop eax mov ebx,[eax - offset label + offset ctrlMoveTick]
Если очень хочется править - берешь и правишь. В чем проблема? IMAGE_OPTIONAL_HEADER:ataDirectory[IMAGE_ENTRY_BASE_RELOCATION].VirtualAddress укажет на эту таблицу.
asd, спасибо, так и сделаю Это в чем? Я правлю Идой, у меня там пункт меню Patch, мне удобно, поскольку сразу пишу асм-инструкции и могу использовать сразу символьные имена и смещения полей структур. А указанную вами конструкцию где использовать? в скриптах Иды?
Dmitry_Milk например так Код (Text): BOOL PELdrProcessingRelocations(__in LPVOID VirtualImageBase, __in DWORD RelocationsRVA, __in DWORD BaseDelta) //Processing the relocations if needed { __try//just to be sure { PIMAGE_BASE_RELOCATION NextRelocBlock = (PIMAGE_BASE_RELOCATION)((DWORD)VirtualImageBase + RelocationsRVA); while(NextRelocBlock->VirtualAddress) { DWORD RelocsNumber = (NextRelocBlock->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) >> 1; PRELOCATION_ENTRY RelocEntries = (PRELOCATION_ENTRY)((DWORD)NextRelocBlock + sizeof(IMAGE_BASE_RELOCATION)); for(DWORD i = 0; i < RelocsNumber; i++) if(RelocEntries[i].Type==IMAGE_REL_BASED_HIGHLOW) *(LPDWORD)((DWORD)VirtualImageBase/*base*/ + NextRelocBlock->VirtualAddress/*page*/ + (DWORD)RelocEntries[i].Offset)/*offset*/ += BaseDelta; NextRelocBlock = (PIMAGE_BASE_RELOCATION)((DWORD)NextRelocBlock + NextRelocBlock->SizeOfBlock); } } __except(EXCEPTION_EXECUTE_HANDLER) { return FALSE; } return TRUE; } //пример вызова //------------------------------------------ //applying relocations if needed PELdrValidate(VirtualImageBase, &DosH, &NTH, &SecH); if(NSImageBase)//standart or non-stadart ImageBase { DWORD BaseDelta = (DWORD)VirtualImageBase - NTH->OptionalHeader.ImageBase; if(NTH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress) PELdrProcessingRelocations(VirtualImageBase, NTH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress, BaseDelta); else { //------------------------------------------ //release allocated space PELdrReleaseSpace(VirtualImageBase, NTH->OptionalHeader.SizeOfImage); //------------------------------------------ return CANT_FIXUP_RELOCS; } } //------------------------------------------ Да и вообще совет, чтобы в этом дерьме разобраться и не задавать глупых вопросов - напиши какую-нибудь прогу по работе с ПЕ - даже ПЕ браузер сойдет. Просто чтобы разобраться со структурами.
UTeX, не, вы привели уже применение релоков при загрузке при измененной базе. Я же всего лишь спрашиваю про добавление или удаление релоков, когда я вношу изменения в экзешник или длл. Понятно, что все это можно сделать либо руками, либо написав прогу. А я спрашивал про уже готовые утилиты. Что-нибудь типа PETools или PEiD, но чтоб не только показывали релоки, но и позволяли добавлять или удалять. А еще лучше, чтоб какой-нибудь IDC или плагин для IDA, который бы изменял релоки в альтернативном имидже в Иде, когда я что-то патчу в альтернативном имидже в Иде, чтоб сразу потом создавать DIF-файл, учитывающий отличия от оригинала как в секциях с кодом, данными, импортом/экспортом, так и в секции с релоками. Сегодня я уже разобрался с PE-структурами и в общем то уже получилось изменить прямо в Иде секцию импорта, добавив в нее новую функцию. Но с релоками сложнее - почему то Ида не показывает мне ту часть имиджа, на которую должна попасть секция с релоками.
Great писал: так чем править-то? не руками же в Hiew побайтно? И не писать же собственную программу, как предлагает UTeX - я так думаю, что я не первый на свете человек, которому при патчинге понадобилось еще поправить и релоки - неужели каждый столкнувшийся с этой задачей пишет свою собственную прогу для этих целей?
Все, вопрос отпал. Поправил руками в Heiw, благо .reloc секция последняя и могу элементарно исправлять ее длину при необходимости. Действительно все просто. Если знать. Только на "знать" (в том числе и на "знать" то, что инструментов готовых нет) ушло дня полтора. А на исправление - минут 15. Обидно
Почему обидно? Зато теперь знать будешь. Это же единовременно уходит, а потом уже с полученными знаниями гораздо проще