в общем незнаю что это такое, но у меня вместо секций .CODE .DATA и тд стоит всего две секции: .flat .idata. Причем даже это происходит на тех бинарниках, которые были созданы дома. Что вообще произошло в системе и как поменять все это безобразие на дефолт ?
La_plaza ".flat" название, которое дает fasm кодовой секции. masm называет эту же секцию секцию ".text" а tasm ".code". В общем случае, название секции может быть любым -- основную смысловую нагрузку несет атрибут секции
La_plaza На имена секций ваще забей, кроме как секция ресурсов ".rsrc" остальное системный загрузчик не считает важным ! Более того ты в секцию ресурсов можешь загнать и код и данные и че угодно и это будет валидным файлом для винды!
EvilsInterrupt Я и ресурсы могу впихнуть в единственную секцию и все работает нормально. Можно и вообще все запихать в заголовок, т.е. количество секций равно нулю, а работать будет
Mikl___ и шо?! Присылай мне файлик, а я гляну, на всех ли виндах работать будет! Я вот тута токо сегодня узнал, что при реализации своей GetProcAddress нельзя обратавать форвардинг, точнее виндовая kernel32.GetProcAddress не обрабатывает форвардинг-ф-ции ! Чего сделал ? Занулил размер экспорта, потом написал простенькое приложение загрузил эту длл и ее с аргументом "HeapAlloc", в конечно ожидал что сюдя по строке "ntdll.RtlXXXXX" загрузится эта либа и найдется код переданной ф-ции, а на самом деле увидел строку "ntdll.RtlXXXXX" - это значит. Что сис. загрузчик до вызова GetProcAddress сам смотрит а форвардинг ли ? А если да, то сам распарсивает форвардинг строки и не делегирует это на GetProcAddress, как некоторые об этом думают !
EvilsInterrupt Смотри в Сам себе Iczelion последние странички, начиная с #121 файлы с ресурсами в секции кода, в #73 MessageBox и вывод простого Окна с нулевым количеством секций, но вот про все винды этого в условии не было -- там для WinXP
...чем полностью грохнул механизм форвардинга. Функция считается перенаправленной, если её адрес попадает в секцию экспорта как указано в таблице директорий (от начала таблицы до начала+размер). Так что бочки на GetProcAddress необоснованы
Mikl___ чувак, а читать умеем ? То что ты говоришь я уже давно описал чуваку строками выше: А по поводу нулевого кол-ва секций, скачал архив с #73 и там два файла и хьюев и мой прога и пе-тулз говорят шо в обох по 1 секции есть!
dermatolog У тебя много опыту, к тебе можно прислушаться, но вот я взял kernel32.dll и там есть форвард-функции и занулил таблицу экспорта, далее написал простое приложение: Code (Text): HMODULE hDll = LoadLibraryA(argv[1]); if(hDll) FuncRVA = GetProcAddress(hDll,"HeapAlloc"); FreeLibrary(hDll); Но отработала на ура LoadLibraryA и в FuncRVA был адрес на строку "ntdll.RtlXXXXX". Потому и предполагаю, что системный загрузчик сам смотрит на наличие форвард строк. т.е. предполагаю если и писать обработку форвардинга, то такому алгоритму: 1. если по РВА строки имени нашли адрес ф-ции и он попадает в таблицу экспорта, то все кул, иначе отказываемся от поддержки форвардинга 2. Если все кул, то MyGetProcAddress 3. Если не кул, то формирование еррор-кода и выход из механизма нахождения адреса по имени\ординалу Выделю мысль по п.2. MyGetProcAddress, как оригинальный не шарит никакого форвардинга! потому его надо вызывать, если все кул! Почему я так думаю, потому что если бы GetProcAddress его(форвардниг) понимала бы, то ф-ция вернула бы не указатель на строку, а указатель на саму ф-цию ! Почему надо отказываться ? Потому что в случае если нет размера экспорта, то вернется рва форвард-строки, что не есть код!
EvilsInterrupt Ещё раз: если занулить размер экспорта, то форвардинг грохнется и соответствующие функции dll грохнутся вместе ним. GetProcAddress вместо адреса реальной функции вернёт rva форвард-строки, но и системный загрузчик тоже вместо адреса реальной функции будет подставлять адрес форвард-строки со всеми вытекающими последствиями. Контрольный вопрос: что означает "попадает в таблицу экспорта", если размер таблицы экспорта нулевой?
2EvilsInterrupt Читать, то мы умеем, а вот вы читаете невнимательно, у вас "в секцию ресурсов можешь загнать и код и данные ", то есть в файле как минимум две секции: секция кода и секция ресурсов; у меня "ресурсы могу впихнуть в единственную секцию" подразумевалось -- "в секции кода и код и данные и ресурсы", а это не одно и то же. Файлы в архиве #73 требовалось запустить и вот они уже бы и создали ехе с нулевым количеством секций. Если об этом не было сказано прямо, то там прилагались сорцы 2reverser Приаттаченные файлы в Сам себе Iczelion (#73, #78, #79) и Выключалка для компа на 97 байт by Ivan2k2
EvilsInterrupt Отсутствие таблицы экспорта (или нулевой размер директории экспорта) вообще-то никак не влияет на результат LoadLibraryA, т.к. загрузчик вообще никак с экспортом не работает - ему на него просто пофиг ) Результат GetProcAddress у тебя возвращает указатель на форвард строку "ntdll.RtlXXXXX", потому что зануление размера директории экспорта убило весь механизм форвардинга - тебе про это УЖЕ говорил diamond в #10.
La_plaza FASM позволяет давать секциям любые имена, например в аттаче название кодовой секции ".plaza" и ничего, работает нормально