Может ли программа импортировать библиотеку, но при этом не иметь в импорте никаких её функций? Скажем, если библиотека не имеет таблицы экспорта.
Код (Text): ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ format PE GUI push 0 0 0 0 call dword [MessageBox] ret ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ user32 db 'user32',0 kernel32 db 'kernel32.dll',0 _MessageBox db 0,0,'MessageBoxA',0 user_table: MessageBox dd RVA _MessageBox dd 0 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ data import dd 0,0,0,RVA user32,RVA user_table dd 0,0,0,RVA kernel32,0 rd 5 end data ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Вообще-то работает.. хотя олька и выпендривается. тогда такой вопрос. можно ли как-то по-другому подгрузить либу к ехе пропатчив его?
Quark если под либой вы имеете в виду dll то добавьте запись о ней в таблицу импорта э либо на еп сделайте переход на код подгружающий вашу dll и обратно
Да. Под словом 'либа' я имею ввиду имено динамическую библиотеку. Этот метод не катит: EntryPoint -> LoadLibrary(); jmp OriginalEntryPoint ; Кстати, если либа присутствует в импорте и при этои не импортируется ни одной функции, пусть даже указатель FirstThunk не занулён, а указывает на пустую таблицу - библиотека всё-равно не подгружается.
Quark 1. Bound/Delay импорт тоже не устраивает? Можно попробовать как вариант. 2. В реестре есть ключ, в котором можно указать обязательные либы при подгрузке процесса. Правда тут твоя либа будет загружаться во все процессы. 3. А почему не устраивает динамическая загрузка через LoadLibrary? Или скажем MapViewOfFile, а далее вручную разместить секции в памяти и выполнить фиксап? Если нужно - могу в аську скинуть код загрузчика. 4. "Пустая таблица" корректна? Если импорт битый - либа не загрузится. Смотря какой патч. Можно тупо добавить в импорт LoadLibrary а потом в ехе добавить код, который подгрузит длл и передаст управление на OriginalEntry ЗЫ: серьезно, поэксперементируй с Баунд-импортом. ЗЗЫ: скинь в пм свою аську. Моя старая где-то посеялась, а вместе с ней и весь контактлист.
"Или скажем MapViewOfFile, а далее вручную разместить секции в памяти и выполнить фиксап?" забавный метод. Так если так поступлю то фактически при просмотре загруженых библеотек, ну например, через толшот - ее небудет видно? Получается ее можно найти только через перебор ф. хендлов и просмотр что это?
wan1786 Да, в таком случае ее не будет видно извне Если ты хочешь, чтобы через тулхелп была видна библиотека, то стоит добавить запись о ней в ПЕБ.
Вобщем поконкретнее сформулирую вопрос: Нужно чтобы моя длл загружалась вместе с ws2_32.dll. Испробовал несколько способов: 1) патчить экспорт. То есть изменить адрес, скажем WSAStartup на адрес своей функции, которая и будет вызывать LoadLibrary - есть проблеммы при загрузке (эту тему я пытался поднять - ответов на неё не нашлось) 2) внедряться в стартап либы и выполнять CreateFile -> CreateFileMapping -> MapViewOfFile. Тут свои проблеммы: не получится закинуть весь код в свободное пространство секции кода; придётся повозиться с таблицами импорта, релоков. Можно, конечно написать либу с базонезависимым кодом, но это некоторый гемор. 3) Обдумываю вариант - добавить запись в таблицу импорта. Эта тема тоже по ходу дела провальная, так как чтобы добавит запись в импорт придётся целиком переместить всю таблицу импорта (иначе не хватит места на ещё одну запись).
71AA25C8 . 80260100 DD 00012680 ; Struct 'IMAGE_IMPORT_DESCRIPTOR' 71AA25CC . FFFFFFFF DD FFFFFFFF 71AA25D0 . FFFFFFFF DD FFFFFFFF 71AA25D4 . 40260100 DD 00012640 71AA25D8 . 00100000 DD 00001000 71AA25DC . D0260100 DD 000126D0 ; Struct 'IMAGE_IMPORT_DESCRIPTOR' 71AA25E0 . FFFFFFFF DD FFFFFFFF 71AA25E4 . FFFFFFFF DD FFFFFFFF 71AA25E8 . 4C260100 DD 0001264C 71AA25EC . 50100000 DD 00001050 71AA25F0 . E0260100 DD 000126E0 ; Struct 'IMAGE_IMPORT_DESCRIPTOR' 71AA25F4 . FFFFFFFF DD FFFFFFFF 71AA25F8 . FFFFFFFF DD FFFFFFFF 71AA25FC . 56260100 DD 00012656 71AA2600 . 60100000 DD 00001060 71AA2604 . 40270100 DD 00012740 ; Struct 'IMAGE_IMPORT_DESCRIPTOR' 71AA2608 . FFFFFFFF DD FFFFFFFF 71AA260C . FFFFFFFF DD FFFFFFFF 71AA2610 . 62260100 DD 00012662 71AA2614 . C0100000 DD 000010C0 71AA2618 . 64270100 DD 00012764 ; Struct 'IMAGE_IMPORT_DESCRIPTOR' 71AA261C . FFFFFFFF DD FFFFFFFF 71AA2620 . FFFFFFFF DD FFFFFFFF 71AA2624 . 70260100 DD 00012670 71AA2628 . E4100000 DD 000010E4 71AA262C . 00000000 DD 00000000 ; Struct 'IMAGE_IMPORT_DESCRIPTOR' 71AA2630 . 00000000 DD 00000000 71AA2634 . 00000000 DD 00000000 71AA2638 . 00000000 DD 00000000 71AA263C . 00000000 DD 00000000 71AA2640 . 6D 73 76 63 72>ASCII "msvcrt.dll",0 71AA264B 00 DB 00 71AA264C . 6E 74 64 6C 6C>ASCII "ntdll.dll",0 71AA2656 . 57 53 32 48 45>ASCII "WS2HELP.dll",0 71AA2662 . 41 44 56 41 50>ASCII "ADVAPI32.dll",0 71AA266F 00 DB 00 71AA2670 . 4B 45 52 4E 45>ASCII "KERNEL32.dll",0
Magnum А перед этим надо прочитать что такое bound/delay импорт, потом подумать прежде чем нести бред.
В идеале лучше внести минимальное количество изменений в файл. Перебирать все таблицы - я не думаю что это удастся. в сравнении с тем, как повела себя система после изменения записи в таблице адресов.
Quark Гы. А что сложного в "тупом" переносе старой таблицы в новое место (новую секцию)+приклеивание дополнительной IMAGE_IMPORT_DESCRIPTOR, добавление заголовка новой секции, корректировка количества секций и RVA/Size новой таблицы импорта? В любом случае никто за тебя это не будет делать )
Сложного... хех.. да вобщем-то ничего . Дело в том, что места в файле может не хватить. Всего 5 стректур + моя + последняя нулевая умножить на 20б каждая = 140б + нужно ещё свой код впихнуть. Не думаю что во всех версиях либы найдётся такой кусок от выравнивания секций.