· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› секция импорта под XP

<< . 1 . 2 . 3 . 4 . 5 . >>

Посл.отвђт Сообщенiе


Дата: Май 30, 2004 21:03:14

>>> Реально ли вырезать MZ-header целиком, и как-нить укоротить PE?
>> Насколько мне известно, полностью нельзя.

> Можно только в фасме сделать так:
> format PE GUI 5.0 at $10000 on 'null.stub'
> где "null.stub" — это файл, размером 0 байт.
> Вот.
stub - это dos-заглушка.
а разговор шел о заголовке. драйвера могут грузиться без ms-dos заголовка, но не win32-файлы. транслятор тут не причем. такова природа загрузчика


Дата: Май 30, 2004 21:52:36

для интересу можете посмотреть
Xp 97byte и 157byte проги на
board.anticrack.de


Дата: Май 31, 2004 01:13:11

замечания по статье "зарядка для ума: самый маленький РЕ"

> (ждем новый линкер)
уже есть ms link. позволяет создавать самые маленькие PE из всех других линкеров, которые к тому же еще и работают ;)


> Размер опционального заголовка, его (заголовок) можно сократить ;)
нельзя. выкинуть все ненужное с DATA_DIRECTORY можно, но вот системный загрузчик закладывается на ее полный размер и если не принять дополнительных предосторожностей будут кранты.

> Запихиваем несколько переменных прямиком в остатки dos stub
хотя old-exe заголовок вместе со всеми своими причиндалами и проецируется в память,
транслятор адресов загрузчика в w2ksp3 (другие не проверял) не может транслировать его адреса, т.к. работает только с таблицей секций, так что пихать в него служебные структуры
это смерти подобно. теоретически это возможно, но здесь "приживаются" далеко не все из
них, а только те, чей адрес загрузчику неинтересен.

> Таким образом, нам нужен ассемблер, который умеет делать бинарники
пародия на "линкер", собирающий obj в PE пишется с пол-пинка,
расписывать структуры файла вручную дольше. уже при создании двух-трех
файлов монтаж "линкера" себя вполне оправдывает

> Во-первых, в GPA_proc используется блок данных PEB для поиска базы kernel32.dll,
> указатель на который находится в регистре fs по смещение 0x30...
не надежно. в любой момент может измениться. лучше исходит из того, что дефлотный
обработчик SEH, который можно вытащить из fs:[0], смотрит в KERNEL32.DLL,
после чего останется лишь найти его базовый адрес, который должен быть кратен
64 КБ содержать MZ-PE заголовки. кода чуть-чуть больше, зато на 100% надежно.


> Если все сходиться, то переходим к массиву AddressOfNameOrdinals,
> с помощью которого ищем индекс массива AddressOfFunctions,
> в котором и находиться смещение функции относительно kernel'a.
при разбора импорта системных dll можно обойтись и без таблицы
ординалов, т.к. индекс в таблице имен всегда совпадает с индексом
в таблице адресов


> Значение полей этого заголовка не важно, ибо они не обрабатываются,
> если обнулены, а если не обнулены, то обрабатываются только жизненно важные поля.
загрузчик w2k проверят лишь "MZ" и извлекает указатель на PE, остальные поля его
вообще не интересуют, но другие загрузчики могут вести себя иначе, дотошно
проверяя все поля в соответствии со спецификацией

> Начнем с того, что тут есть очередной magic, неизвестно кому он нужен, правда
раньше это был тип процессора, сейчас правда процессоры иных типов
уже не используются и magic должен соответствовать I386. забавно, но сначала ms
ввела еще и 486, 586 но теперь она им отказала в поддержке.

> Несомненно важное поле SizeOfCode, которое определяет сколько будет выделено
> памяти для секции кода при загрузки приложения
а ты проверял? это поле вообще игнорируется и смысла никакого не имеет,
кроме того все линкеры его заполняют по разному. существуют две стратегии:
одна предписывает вычислять размер кода как сумму размеров всех секций,
имеющий атрибут "секция кода", независимо от наличия остальных атрибутов,
а другая стратегия говорит, что секция кода, это секция _только_ с атрибутом кода,
т.е. секция с атрибутами код + данные кодовой секций уже не считается.
как нетрудно сообразить это было сделано на тот случай, чтобы одни и те же секции
не были подсчитаны дважды - как код и как данные. причем, если у нас есть всего
одна "комбинированная" секция (код+данные) некоторые линкеры дезореентируются
и ставят sizeofcode и baseofcode в ноль, что саксь. хотя, как уже говорилось, системному
загрузчику на эти поля начхать.

> AddressOfEntryPoint я определял экспериментальным путем, ища свой код в отладчике...
это RVA адрес: если твой код в заголовке, то он равен сырому смещению точки входа
в файл, если же он в секции, то он равен va + (raw_ep - raw_off), где va - виртуальный адрес
начала секции, raw_ep смещение точки входа в файле, а raw_off - виртуальный адрес секции
в файле. кстати говоря, если направить точку входа прямо в ядро, такой файл будет
нормально исполнен и его можно будет еще сократить ;)

> FileAlignment очень капризно воспринимается многими загрузчиками... Установим в
> минимальное значение 512 байт, да и этого не соблюдем... Если ХР позволяет, то все ОК ;)
> ImageSize должен быть выровнен, но нам в принципе на него наплевать :)
в XP (и вообще в NT) минимальное значение равно 2, хотя меньше 20h я бы использовать
не стал. это частично описано в спецификации на PE и основано на том факте, что в NT
один и тот же загрузчик обслуживает как драйвера (а драйвера в NT это PE-файлы) и
аплеушные приложения. кстати, говоря, ms link такие файлы умеет формировать - для
этого нужно ему указать ключ /DRIVER
к "невыровненному" файлу предъявляются следующие требования: FileAlign == SecAlign
и виртуальные адреса всех секций равны физическим (вообще-то на самом деле правило
не настолько жестко, но подробно описывать стратегию загрузчика лениво, тем более,
что это уже описано в моей статье "внедрение в pe - путь воина", которая скоро выйдет
в сусадмине), причем если размер последний секции меньше imagesize, то винда уходит
в голубой экран смерти (во всяком случае w2ksp3), это-то с прикладного уровня!!!
да! в 9x невыровненные файлы не работают ;(

> Такой фокус не прокатит если вы делаете библиотеки, так как вам понадобиться как минимум
> таблица экспорта
если сделать файлу bind, экспорт не понадобиться. читайте описание на ms editbin


Дата: Май 31, 2004 01:13:56

> для интересу можете посмотреть
> Xp 97byte и 157byte проги на
> board.anticrack.de
если бы они еще и работали ;)


Дата: Май 31, 2004 10:28:24

157byte работает на чистом XP.


Дата: Май 31, 2004 16:40:19

Замечания к замечаниям по статье "зарядка для ума: самый маленький РЕ"


> (ждем новый линкер)
уже есть ms link. позволяет создавать самые маленькие PE из всех других линкеров,
которые к тому же еще и работают ;)

да, я тоже люблю ml =)


> Размер опционального заголовка, его (заголовок) можно сократить ;)
нельзя. выкинуть все ненужное с DATA_DIRECTORY можно, но вот системный загрузчик закладывается на ее полный размер и если не принять дополнительных предосторожностей будут кранты.

а) о каком загрузчике ты говоришь??? К тому же если есть поле, то есть потенциальная возможность того что оно поддерживается;
б) DATA_DIRECTORY относится к опциональному заголовку ;)
IMAGE_OPTIONAL_HEADER32 STRUCT
  Magic                         WORD       ?
...
  NumberOfRvaAndSizes           DWORD      ?
  DataDirectory                 IMAGE_DATA_DIRECTORY IMAGE_NUMBEROF_DIRECTORY_ENTRIES dup(<>)
IMAGE_OPTIONAL_HEADER32 ENDS


> Запихиваем несколько переменных прямиком в остатки dos stub
хотя old-exe заголовок вместе со всеми своими причиндалами и проецируется в память,
транслятор адресов загрузчика в w2ksp3 (другие не проверял) не может транслировать его адреса, т.к. работает только с таблицей секций, так что пихать в него служебные структуры это смерти подобно. теоретически это возможно, но здесь "приживаются" далеко не все из
них, а только те, чей адрес загрузчику неинтересен.

У меня же работает ;) Ты говоришь о w2ksp3, а я о ХР. Вначале статьи было сказано, что все под ХР.

> Во-первых, в GPA_proc используется блок данных PEB для поиска базы kernel32.dll,
> указатель на который находится в регистре fs по смещение 0x30...
не надежно. в любой момент может измениться.

мы сами пишем прогу, поэтому знаем когда че в ней изменится. Изменить/затереть стандартный сех обработчик тоже возможно.

лучше исходит из того, что дефлотный
обработчик SEH, который можно вытащить из fs:[0], смотрит в KERNEL32.DLL,
после чего останется лишь найти его базовый адрес, который должен быть кратен
64 КБ содержать MZ-PE заголовки. кода чуть-чуть больше, зато на 100% надежно.

Я в курсах как это делается, но это не более надежно, чем то, что я предложил. К тому же по-короче и по-быстрее ;) А если говорить о том, что прога должна работать только на ХР - самый лучший вариант.

> Значение полей этого заголовка не важно, ибо они не обрабатываются,
> если обнулены, а если не обнулены, то обрабатываются только жизненно важные поля.
загрузчик w2k проверят лишь "MZ" и извлекает указатель на PE, остальные поля его
вообще не интересуют, но другие загрузчики могут вести себя иначе, дотошно
проверяя все поля в соответствии со спецификацией

Я все ручками тестил и у меня часто ничего не работало даже из-за неправильного стаба

> Начнем с того, что тут есть очередной magic, неизвестно кому он нужен, правда
раньше это был тип процессора, сейчас правда процессоры иных типов
уже не используются и magic должен соответствовать I386. забавно, но сначала ms
ввела еще и 486, 586 но теперь она им отказала в поддержке.

хм... а как бы влияло это поле на работу проги если бы оно работало =)

> AddressOfEntryPoint я определял экспериментальным путем, ища свой код в отладчике...
это RVA адрес: если твой код в заголовке, то он равен сырому смещению точки входа
в файл, если же он в секции, то он равен va + (raw_ep - raw_off), где va - виртуальный адрес
начала секции, raw_ep смещение точки входа в файле, а raw_off - виртуальный адрес секции
в файле. кстати говоря, если направить точку входа прямо в ядро, такой файл будет
нормально исполнен и его можно будет еще сократить ;)

что ты имеешь в виду под ядром? kernel32? и куда же его можно там направить, чтоб еще и работало? 8)

> FileAlignment очень капризно воспринимается многими загрузчиками... Установим в
> минимальное значение 512 байт, да и этого не соблюдем... Если ХР позволяет, то все ОК ;)
> ImageSize должен быть выровнен, но нам в принципе на него наплевать :)
в XP (и вообще в NT) минимальное значение равно 2, хотя меньше 20h я бы использовать
не стал. это частично описано в спецификации на PE и основано на том факте, что в NT
один и тот же загрузчик обслуживает как драйвера (а драйвера в NT это PE-файлы) и
аплеушные приложения. кстати, говоря, ms link такие файлы умеет формировать - для
этого нужно ему указать ключ /DRIVER
к "невыровненному" файлу предъявляются следующие требования: FileAlign == SecAlign
и виртуальные адреса всех секций равны физическим (вообще-то на самом деле правило
не настолько жестко, но подробно описывать стратегию загрузчика лениво, тем более,
что это уже описано в моей статье "внедрение в pe - путь воина", которая скоро выйдет
в сусадмине),
причем если размер последний секции меньше imagesize, то винда уходит
в голубой экран смерти (во всяком случае w2ksp3), это-то с прикладного уровня!!!
да! в 9x невыровненные файлы не работают ;(

интересно! жду статью.


Дата: Май 31, 2004 17:14:29

> а) о каком загрузчике ты говоришь???
о системном. том самом который этот файл и загружает.

> есть поле, то есть потенциальная возможность того что оно поддерживается;
"...потеницально мы миллионеры, а практически у над дома две бл$ли ;)" посмотри на ulink - там уйма "обвязочного" кода, обеспечивающего поддержку "кастрированной" DATA_DIRECTORY. а теперь посмотрим в системный загрузчик и покажи мне где он проверяет размер DATA_DIRECTORY перед обращением к ней ;) и обрати внимание, что ms и багланд всегда юзают полную DATA_DIRECTORY, даже если ее целиком не используют и отнюдь не потому, что дураки там все.

> б) DATA_DIRECTORY относится к опциональному
заголовку ;)
ну и кто ж спорит ;) а ты не пробовал создавать файлы, где размер опционального заголовка не совпадает с заявленным концом DATA_DIRECTORY? попробуй. а потом посмотри код загрузчика и грязно выматерись ;)

> У меня же работает ;)
да, трудно научиться создавать файлы, запускающиеся больше, чем на одной машине...
в порядке незлобного бурчания, граничающего с наездом, хочу порекомендовать прежде, чем писать такие вещи, протестировать файл на нескольких осях и поковырять загрузчик на предмет его лояльности ;)

> Ты говоришь о w2ksp3, а я о ХР. Вначале статьи было сказано, что все под ХР.
законный прием! я тоже под час злоупотребляю им, когда лень тестить всю осевую линейку. типа конфинигурацяия под которой это работает - оговорена, а большего вам и не обещали. однако, это не честно по отношению к читателю. я вот сильно сомневаюсь насколько полезны файлы FileAlignment == 20h, о которых кстати говоря пока известно далеко не всем, т.к. они работают только под NT-based системами, хотя доля рынка, занимаемая ими неуклонно растет, а 9x вымирает. а вот лично меня коробит, когда простешая утилита, чуть-чуть сложнее hello, world! занимает по меньшей мере 4-16 кил... но вырубать выравнивание это означает отсекать многих пользователей, что не есть хорошо ;( а уж закладываться на одну-единственную XP, это... хотя для разных там compo вполне сойдет, т.к. на них такие извращения как раз и демонстриуются ;)

> мы сами пишем прогу, поэтому знаем когда че в ней
> изменится. Изменить/затереть стандартный сех обработчик тоже возможно.
PEB вы тоже сами заполняете? ;)
а он в любой момент может претерпеть изменение.
если на то пошло - можно сделать файлу bind, выкинув весь импорт нафиг - это будет предельно компактное решение, которое только может быть (хоть и работающее не везде), или заюзать native-API - все равно этот файл под 9x работать не будет, так чего уж там останавливаться на пол-пути...

> Изменить/затереть стандартный сех обработчик тоже возможно.
ничего подобного! он всегда смотрим в KERNEL.DLL, это даже слегка документировано, и он не может быть изменен, т.к. это естественный его интерфейс.

> Я в курсах как это делается, но это не более надежно, чем то, что я предложил.
если ms изменит SEH то рухнет 100% программ, созданных компиляторами MS VC/borland во всяком случае те, что используют RTL, а на это ms никогда не пойдет.
PEB же она уже меняла. и не раз. ну ладно, хрен с ними, с исключениями. давайте искать импорт полностью вручную, спускаясь по 64 кб от половины адресного пространства вниз.

> хм... а как бы влияло это поле на работу проги если бы оно работало =)
если прога хочет 486, а ее запускают на 386, ей отказывают в загрузке.

> что ты имеешь в виду под ядром? kernel32?
> и куда же его можно там направить, чтоб еще и работало?
можно и в KERNEL32, но там мало постоянных мест - и будет работать только на одной машине, а начиная с 0x80000000 есть много более или мене постоянных структур, которые можно заюзать, хотя это и буде крутым извратом. еще можно передавать управление на библиотеки типа MFC фиксированных версий (младшие версии уже давно не обновляются, но поставляются с осью по дефлоту, так что закладываться на них все-таки можно)

>интересно! жду статью.
это хорошо, что интересно!
а статья выйдет в июне


Дата: Май 31, 2004 17:52:13

посмотри на ulink - там уйма "обвязочного" кода, обеспечивающего поддержку "кастрированной" DATA_DIRECTORY. а теперь посмотрим в системный загрузчик и покажи мне где он проверяет размер DATA_DIRECTORY перед обращением к ней ;) и обрати внимание, что ms и багланд всегда юзают полную DATA_DIRECTORY, даже если ее целиком не используют и отнюдь не потому, что дураки там все

че-та я не понял, о каком "обвязочном" коде ты говоришь?
насколько я помню, у него там урезанная DATA_DIRECTORY, но системный загрузчик спокойно грузит такой файл.
а то, что что-то там падает при работе с таким файлом, это уже проблемы разработчика, который не предусмотрел такую ситуацию.
я когда писАл свой РЕ-вьюер, наступил как раз на эти самые грабли, и именно с ulink.exe :)

з.ы. где вообще можно скачать новую версию юнилинка?
я к нему на фтп лезу, а меня пароль спрашивают


Дата: Май 31, 2004 20:10:38

> че-та я не понял, о каком "обвязочном" коде ты говоришь?
исходников ulink'а у меня нет, а дизассемблерные листинги - громоздки. если что - обращайся непосредственно к самому Харону.

> насколько я помню, у него там урезанная DATA_DIRECTORY,
я не говорил, что кастрировать DATA_DIR нельзя, я лишь говорил, что при этом необходимо принять комплекс мер предостарожности

> но системный загрузчик спокойно грузит такой файл.
грузит. но системный загрузчик при обращении к DATA_DIR не провеяет ее границ, а импортирование функций всегда начинается с BOUND_IMPORT'a (во всяком случае в NT/98/W2K) и загрузчик рассчитывает увидеть в соотв. месте либо нули (BOUND'а нет), либо валидный поинтер, в противном случае ждите сюрпризов. в XP этот баг, возможно, исправлен. по слухам там исправлено много багов в загрузчике... но XP еще не настолько распростанена, чтобы отсекать все более ранние версии...

> а то, что что-то там падает при работе с таким файлом,
> это уже проблемы разработчика, который не предусмотрел
> такую ситуацию.
какого разработчика? разроботчика оси? разработчика данного файла? падает ведь не "что-то", падает данный файл при загрузчике в NT/W2K.

> я когда писАл свой РЕ-вьюер, наступил как раз на эти
> самые грабли, и именно с ulink.exe :)
там у него еще в IAT мусор ;)
а импорт берется руками ;))
причем, берется очень быстро, мудро и элегантно!

> з.ы. где вообще можно скачать новую версию юнилинка?
> я к нему на фтп лезу, а меня пароль спрашивают
лезешь, наверное, FAR'ом? ;)
ты не обидешься, если я попрошу тебя почитать любой фак по работе с ftp? :-)
имя юзера - anonymous (аноним в смысле), а пароль your_name@mail.ru, нормальные FTP-клиенты его сами подставляют, например, ReGet, т.к. это типичная организация входа на сервер, вроде сам сервер об этом и пишет, если ты не anonymous, но не знаешь пароля.

последнняя версия вроде бы 23.01 лежит на ftp. там же лежит doswin32 - эмулятор виндузы, работающий под dos и целиком помещающая на одну дискету вместе с far'ом - все wine и рядом не лежали. раньше он входил в ulink, но теперь это отдельный проект.
там же шикарный русификатор для 9x, рекомендую!


Дата: Май 31, 2004 20:49:34


> а) о каком загрузчике ты говоришь???
о системном. том самом который этот файл и загружает.

я о том под какую ось ;) Мы щазз с тобой как китаец с киргизом спорим что лучше ;) я говорю об ХР.

> есть поле, то есть потенциальная возможность того что оно поддерживается;
"...потеницально мы миллионеры, а практически у над дома две бл$ли ;)"

знаю этот анекдот :)

посмотри на ulink - там уйма "обвязочного" кода, обеспечивающего поддержку "кастрированной" DATA_DIRECTORY. а теперь посмотрим в системный загрузчик и покажи мне где он проверяет размер DATA_DIRECTORY перед обращением к ней ;) и обрати внимание, что ms и багланд всегда юзают полную DATA_DIRECTORY, даже если ее целиком не используют и отнюдь не потому, что дураки там все.

никто и не говорит, что там дураки ;) но если есть возможность кастрировать DATA_DIRECTORY - я это делаю ;) Я жжж кастрировал - и все работало.

> б) DATA_DIRECTORY относится к опциональному
заголовку ;)
ну и кто ж спорит ;) а ты не пробовал создавать файлы, где размер опционального заголовка не совпадает с заявленным концом DATA_DIRECTORY? попробуй. а потом посмотри код загрузчика и грязно выматерись ;)

Что такое "заявленный конец DATA_DIRECTORY"? Если со стандартным концом (полный DATA_DIRECTORY), то пробовал ;) именно в статье и пробовал =)

> У меня же работает ;)
да, трудно научиться создавать файлы, запускающиеся больше, чем на одной машине...
в порядке незлобного бурчания, граничающего с наездом, хочу порекомендовать прежде, чем писать такие вещи, протестировать файл на нескольких осях и поковырять загрузчик на предмет его лояльности ;)

расслабься. это просто разговор. незачем превращать это в базар с наездами ;) и не надо меня учить. приглядись к статье. там в начале сказано, что она не несет никакой практической ценности. Это просто развлекаловка для меня. Не более.

> Ты говоришь о w2ksp3, а я о ХР. Вначале статьи было сказано, что все под ХР.
законный прием! я тоже под час злоупотребляю им, когда лень тестить всю осевую линейку.

у меня просто не было такой цели ;) а так я попробовал "на всякий пожарный" почти всю линейку ;)

типа конфинигурацяия под которой это работает - оговорена, а большего вам и не обещали. однако, это не честно по отношению к читателю.

читателю наплевать на этот Кб, который мы съэкономим ;) - ему нужно, чтобы в нем разжегся азарт, интерес к проблеме. Подумай сам - кому серьезно нужен этот Кб??? В наш-то век многогигабайтных винтов ;) Это просто интересная тема. Я не обещал серьезной статьи. Если бы у меня было достаточно времени и желания (а это главное) - я бы подумал и о серьезной статье. Только у меня нет ни того ни другого ;) Не буду я тратить свое время на никому не нужную работу ;) Я делал это чтобы развлечься - и я достиг своей цели ;) Посмотри на комментарии. По-моему я заинтересовал читателя. И хоть в итоге получилось мягко говоря не очень (признаю, мало я поработал над оптимизацией, очень мало) - я добился своего. Я получил удовольствие от написания и по-моему развлек других, подкинув им задачку. Be easy ;)

я вот сильно сомневаюсь насколько полезны файлы FileAlignment == 20h, о которых кстати говоря пока известно далеко не всем, т.к. они работают только под NT-based системами, хотя доля рынка, занимаемая ими неуклонно растет, а 9x вымирает. а вот лично меня коробит, когда простешая утилита, чуть-чуть сложнее hello, world! занимает по меньшей мере 4-16 кил... но вырубать выравнивание это означает отсекать многих пользователей, что не есть хорошо ;( а уж закладываться на одну-единственную XP, это... хотя для разных там compo вполне сойдет, т.к. на них такие извращения как раз и демонстриуются ;)

А че такое compo? Я тоже хочу поизвращаться :)

> мы сами пишем прогу, поэтому знаем когда че в ней
> изменится. Изменить/затереть стандартный сех обработчик тоже возможно.
PEB вы тоже сами заполняете? ;)
а он в любой момент может претерпеть изменение.

как это в любой момент??? Кто его может изменить? зачем кому-то изменять список? если мы загружаем модуль - он добавляется в конец списка, если выгружаем, удаляется оттуда. Начало списка не изменяется. Или я не прав?

если на то пошло - можно сделать файлу bind, выкинув весь импорт нафиг - это будет предельно компактное решение, которое только может быть (хоть и работающее не везде), или заюзать native-API - все равно этот файл под 9x работать не будет, так чего уж там останавливаться на пол-пути...

А причем тут NA? В смысле системными вызовами пользоваться? sysenter бла бла бла... Как это в ntdll выглядит ;) Неплохая мысль, она мне вроде приходила в голову, но я благополучно про нее забыл =) Прям как в линухе будет - int 0x80 =)

> Изменить/затереть стандартный сех обработчик тоже возможно.
ничего подобного! он всегда смотрим в KERNEL.DLL, это даже слегка документировано, и он не может быть изменен, т.к. это естественный его интерфейс.
...
    _SEH  struct
     	 m_pSEH		dd	0
     	 m_pExcFunction	dd	0
    _SEH ends        
...
	assume fs: nothing
          mov eax, fs:[0]
          assume eax: PTR _SEH
	.while ([eax].m_pSEH!=-1)
		mov eax, [eax].m_pSEH
	.endw       
	xor ebx, ebx
;	mov [ebx].m_pExcFunction, 0
	mov dword ptr [ebx], ebx
exit: 	invoke ExitProcess, 0

Если раскомментировать строчку - стандартный обработчик не будет вызван - прога просто завершится ;)

> Я в курсах как это делается, но это не более надежно, чем то, что я предложил.
если ms изменит SEH то рухнет 100% программ, созданных компиляторами MS VC/borland во всяком случае те, что используют RTL, а на это ms никогда не пойдет.
PEB же она уже меняла. и не раз. ну ладно, хрен с ними, с исключениями. давайте искать импорт полностью вручную, спускаясь по 64 кб от половины адресного пространства вниз.

брррр... кто говорит о том, что мс изменит SEH? я говорю о том, что любой, кто имеет к нам доступ может так же свободно изменить SEH, как и список модулей из PEB'a

> хм... а как бы влияло это поле на работу проги если бы оно работало =)
если прога хочет 486, а ее запускают на 386, ей отказывают в загрузке.

не фига себе платформенная зависимость =) я понимаю почему мс от этого отказалась... Таких прог-то наверно и нет в природе :)

> что ты имеешь в виду под ядром? kernel32?
> и куда же его можно там направить, чтоб еще и работало?
можно и в KERNEL32, но там мало постоянных мест - и будет работать только на одной машине, а начиная с 0x80000000 есть много более или мене постоянных структур, которые можно заюзать, хотя это и буде крутым извратом. еще можно передавать управление на библиотеки типа MFC фиксированных версий (младшие версии уже давно не обновляются, но поставляются с осью по дефлоту, так что закладываться на них все-таки можно)

я наверно тормоз... Ну передадим мы управление в кудa-нить 8) и че? Исполнится это ["куда-нить"], а что дальше? Че-то не верится что можно передать управление в ядро... Ты проверял? Работает только из-под админа?

>интересно! жду статью.
это хорошо, что интересно!
а статья выйдет в июне

уже почти июнь =)


Дата: Июн 1, 2004 17:30:23

> Мы щазз с тобой как китаец с киргизом спорим что лучше ;) я говорю об ХР.
XP не юзал, там загрузчик еще более другой ;)

> но если есть возможность кастрировать DATA_DIRECTORY - я это делаю ;)
попытаюсь объяснить еще раз. возможности кастрировать DATA_DIR нет, ну или почти нет. наличие поля длины DATA_DIR и размера опционального заголовка (в спецификации!) еще не означает, что реально существующие загрузчики это поле вообще говоря учитывают. мы сейчас же не сферических коней в вакууме обсуждаем, верно?
BOUND обязан быть, т.к. загрузчик некоторых осей считает, что он есть всегда, интерпретируя соотв. поля как указатели.

> Я жжж кастрировал - и все работало.
"работало" на одной конкретно взятой ос, и возможно на одном конкретном содежимом файла. в общем случае бить DATA_DIR не желательно. а у Харона BOUND есть ;)

> Что такое "заявленный конец DATA_DIRECTORY"?
"тайна веков" (с) Пелевин.
что-то среднее между NumberOfRvaAndSizes и SizeOfOptionalHeader, эти поля нуждаются в синхронизации, которую мало кто проверяет.

> расслабься. это просто разговор. незачем превращать это в базар с наездами ;)
Уже и поворчать нельзя ;)

> читателю наплевать на этот Кб, который мы съэкономим ;)
> ему нужно, чтобы в нем разжегся азарт, интерес к проблеме
проблема в комбинировании секций и выкидывании RTL. чтобы создать предельно компактный файл, который только можно создать компилятором, попробуй переменуй main в my_main, а потом линкеру укажи My_main в качестве точки входа. файл сразу похудет кил на 50, а то и больше. тоже самое относится к DLL.
а еще есть комбинирование секций, которые так же сокращает размер файла, хотя и создает некоторые проблемы.
или множественное проецирование - кода одина часть файла проецируется более чем на один участок памяти (правда, обратное невозможно).
хитрые оверлени, размещенные в середине, техника разблокирования исполнеяемых файлов для внесения в них изменений (ну например, хранении конфигурации как это было в dos), да много чего можно сделать с линкером!
тот же Bind, о котором я уже упоминал или форвардинг функций, или обход "расщепления" страниц совместо используемых dll, модифицируемых перемещаемыми элементами?
а предельно компакнтный файл - это com/bin, вызывающий функции native API ну или на худой конец win32.

> Подумай сам - кому серьезно нужен этот Кб???
вот и я говорю. кому нужен 1 кб. а вот уменьшить размер 1 мб файла на полметра уже акутально ;)

> я добился своего. Я получил удовольствие от написания и по-моему развлек других, подкинув им задачку.
побольше бы таких статей, поменьше бы пинали винды ;)

> А че такое compo? Я тоже хочу поизвращаться :)
ну вроде ж намечается очередное, краем уха слышал, правда уже не помню где... там вроде конкус на самое компактное интро.

> как это в любой момент??? Кто его может изменить?
парни из ms. PEB это сугубо внутренняя структура. и она _уже_ менялась неоднократно...

> Кто его может изменить? зачем кому-то изменять список?
да он запросто в следующей оси может оказаться по другим смещениям или вообще будет исключен ;)

> если мы загружаем модуль - он добавляется в конец списка, если выгружаем, удаляется оттуда.
> Начало списка не изменяется. Или я не прав?
а ты задумайся - зачем NT этот список? он сейчас сохранен только по историческим соображениям, чтобы ось могла быстро выяснить, какими dll владеет процесс, но похоже, что он отмирает. поставь точки останова на него и посмотри когда, кто и при каких обстоятельствах его использует. будешь приятно удивлен ;)

> Если раскомментировать строчку - стандартный обработчик не будет вызван - прога просто завершится ;)
посмотри куда указывает fs:[0] в момент вызова программы

> я говорю о том, что любой, кто имеет к нам доступ может
> так же свободно изменить SEH, как и список модулей из PEB'a
"изменит" не в смысле "модифицирует в памяти", а ms пересмотрит формат данных. SEH - надежен, а вот на PEB в долговременной переспективе никакой здравомыслящих программист не рискует закладываться.

> Таких прог-то наверно и нет в природе :)
раньше были. я вперые NT устаналивал именно на 486, а пара моих товарищей и вовсе не 386, потому что других машин тогда просто не было. а теперь смотри, если в какой-то ветке программы встретится пневая инстукция, программа даст дуба, при этом все данные окажутся несохранены, а этого нормальная ось доступать не должна. вот и было введено поле требований минимального ЦП.

> Че-то не верится что можно передать управление в ядро... Ты проверял? Работает только из-под админа?
работает без прав админа, но с CPL3. обычно этим грешат черви, которые подменяются адрес возврата на инстукцию JMP ESP, которую можно легко найти в ядре...

> уже почти июнь =)
ждите сусадмина. скоро выйдет


Дата: Июн 1, 2004 18:49:29 · Поправил: R4DX


> Мы щазз с тобой как китаец с киргизом спорим что лучше ;) я говорю об ХР.
XP не юзал, там загрузчик еще более другой ;)

я люблю хр =) по-моему лучшая ось из линейки... правда я w2003 server ни разу не видел, но из того, что видел - мне больше всего понравилось 8)

> но если есть возможность кастрировать DATA_DIRECTORY - я это делаю ;)
попытаюсь объяснить еще раз. возможности кастрировать DATA_DIR нет, ну или почти нет. наличие поля длины DATA_DIR и размера опционального заголовка (в спецификации!) еще не означает, что реально существующие загрузчики это поле вообще говоря учитывают. мы сейчас же не сферических коней в вакууме обсуждаем, верно?
BOUND обязан быть, т.к. загрузчик некоторых осей считает, что он есть всегда, интерпретируя соотв. поля как указатели.

опять "некоторых осей"... я жжж про хр говорю =) там загрузчик учитывает это поле, чем я и пользуюсь... конечно, в общем случае ты прав. я не спорю - это очевидно, что это поле обрабатывается не всеми загрузчиками, но хр-то это поле юзает ;)

> Что такое "заявленный конец DATA_DIRECTORY"?
"тайна веков" (с) Пелевин.
что-то среднее между NumberOfRvaAndSizes и SizeOfOptionalHeader, эти поля нуждаются в синхронизации, которую мало кто проверяет.

ясно =)

> расслабься. это просто разговор. незачем превращать это в базар с наездами ;)
Уже и поворчать нельзя ;)

:)

> читателю наплевать на этот Кб, который мы съэкономим ;)
> ему нужно, чтобы в нем разжегся азарт, интерес к проблеме
проблема в комбинировании секций и выкидывании RTL. чтобы создать предельно компактный файл, который только можно создать компилятором, попробуй переменуй main в my_main, а потом линкеру укажи My_main в качестве точки входа. файл сразу похудет кил на 50, а то и больше. тоже самое относится к DLL.

ну вот опять =) я жжж про ассемблер, а ты про vc судя по всему... к тому же выкинув эти самые 50 кило ты потеряешь многие возможности, предоставляемые компилятором... А по-моему, лучше уж в таком случае использовать ассемблер. Тогда и размер будет минимальный - 1 Кб и Сшные ф-ии можно заюзать просто импортировав <уж не помню какую :)> dll'ку из поставки vc и машинную оптимизацию можно будет использовать без извратов и перепалок с сшным компилятором... ну хотя все это звучит довольно субъективно (кто что лучше знает)... я бы сказал - это дело вкуса.

а еще есть комбинирование секций, которые так же сокращает размер файла, хотя и создает некоторые проблемы.


или множественное проецирование - кода одина часть файла проецируется более чем на один участок памяти (правда, обратное невозможно).

уххх ты... а это как? 8)

хитрые оверлени, размещенные в середине, техника разблокирования исполнеяемых файлов для внесения в них изменений (ну например, хранении конфигурации как это было в dos), да много чего можно сделать с линкером!
тот же Bind, о котором я уже упоминал или форвардинг функций, или обход "расщепления" страниц совместо используемых dll, модифицируемых перемещаемыми элементами?
а предельно компакнтный файл - это com/bin, вызывающий функции native API ну или на худой конец win32.

насчет com ты конечно загнул =) все com'ы обслуживает ntvdm и он есесно не даст вызывать Native API ;) Хотя... тоже широкое поле для изврата... в последнем номере 29а была статья Ratter'a о ntvdm ;)+Chemiker нашел пару интересных фишек ;)

> Подумай сам - кому серьезно нужен этот Кб???
вот и я говорю. кому нужен 1 кб. а вот уменьшить размер 1 мб файла на полметра уже акутально ;)

нуууу... честно говоря, я думаю, что и полметра невпечатлят неискушенного (а их 90% сети) юзера ;) Я имею в виду, если ты напечатаешь статью и распространишь ее по сети - мало программеров будут пользоваться этой техникой... и не только из вражденной лени, а потому что еще и юзеру это не так уж и надо... а если взять условия рынка, когда есть 2 программы одинаковые (А и Б) по возможностям и разные по размерам (А>Б) - неизвестно еще, что юзер выберет... зависит от ситуации... диалапщик конечно закатает ту, что поменьше, а вот чел в выделенкой еще подумает... программа с чуть большим размером выглядит "по-солидней" бла бла бла (типа скупой платит дважды ;))... так что неизвестно еще... да, это не говоря про то, что полметра в любом солидном приложении ничего не значат.

> А че такое compo? Я тоже хочу поизвращаться :)
ну вроде ж намечается очередное, краем уха слышал, правда уже не помню где... там вроде конкус на самое компактное интро.

ааа... типа конкурс демок? ;) щаззз на гугле поищу...

> как это в любой момент??? Кто его может изменить?
парни из ms. PEB это сугубо внутренняя структура. и она _уже_ менялась неоднократно...

ааа... ты про "от версии к версии"... опять же я про хр =)

> если мы загружаем модуль - он добавляется в конец списка, если выгружаем, удаляется оттуда.
> Начало списка не изменяется. Или я не прав?
а ты задумайся - зачем NT этот список? он сейчас сохранен только по историческим соображениям, чтобы ось могла быстро выяснить, какими dll владеет процесс, но похоже, что он отмирает. поставь точки останова на него и посмотри когда, кто и при каких обстоятельствах его использует. будешь приятно удивлен ;)

я и не спорю, что он может быть удален мс ;)

> я говорю о том, что любой, кто имеет к нам доступ может
> так же свободно изменить SEH, как и список модулей из PEB'a
"изменит" не в смысле "модифицирует в памяти", а ms пересмотрит формат данных. SEH - надежен, а вот на PEB в долговременной переспективе никакой здравомыслящих программист не рискует закладываться.

я и не надеюсь, что это будет работать на других осях... это уже сейчас не работает :), дык почему бы не воспользоваться ситуацией и PEB'ом если я и так делаю все очень платформозависимым ;)

> Таких прог-то наверно и нет в природе :)
раньше были. я вперые NT устаналивал именно на 486, а пара моих товарищей и вовсе не 386, потому что других машин тогда просто не было. а теперь смотри, если в какой-то ветке программы встретится пневая инстукция, программа даст дуба, при этом все данные окажутся несохранены, а этого нормальная ось доступать не должна. вот и было введено поле требований минимального ЦП.

круто... только забота ли это оси? спорный вопрос... cpuid может юзаться из 3го кольца - значит и прикладной программист ее поюзать может...

> Че-то не верится что можно передать управление в ядро... Ты проверял? Работает только из-под админа?
работает без прав админа, но с CPL3. обычно этим грешат черви, которые подменяются адрес возврата на инстукцию JMP ESP, которую можно легко найти в ядре...

блин, хочу попробовать... у тебя нет какого-нить сорса? если есть скинь пожалуйста на e_f_i_m@ rambler.ru

> уже почти июнь =)
ждите сусадмина. скоро выйдет

жду с нетерпением =) а где его заказать можно?


Дата: Июн 1, 2004 19:49:22

> я люблю хр =) по-моему лучшая ось из линейки...
вкусы бывают разные... у меня XP вызывает стойкое отвращение, побуждающее на переход в лагерь unix-based систем.
хотя... тендеция монстроузности проникла даже на спектурум. 128/258 кб современным кодерам мало, уже хотят, чтобы как минимум был установлен 1 мб. кошмар!

> опять "некоторых осей"... я жжж про хр говорю =)
ну не серьезно это привязываться к одной оси!
ты уверен, что установив очередной сервис-пак, ты не лишишь этим свои программы невинности? ;)
ладно, если тебе нужно быстро расчитать плотность поля в ванне с электролитом, тут можно и позвращаться...
знаешь, сколько раз я проклинал себя, когда "изращался" подобным образом, экономя пару байт из любви к искусству? это только сейчас кажется, что вот у тебя есть XP и ты с нее никуда не съедешь, а пройдет несколько дней и ты захочешь установить что-то другое?
впрочем, выбирать политику проектирования и кодирования - тебе, я даже не пытаюсь лезть со своими советами, просто обращаю внимание окружающих на то, что эти приемы далеко не везде работают...
а то как-то один кульный хакер (не буду показывать пальцем), однажды провозгласил, что сокеты это теже самые дескрпиторы и что их можно наследовать. вот с той поры неработчие эксплоиты и поперли. теоритически они должны давать удаленный щелл, практически я никак не могу найти ни одной выни, в которой это работает...

> ну вот опять =) я жжж про ассемблер, а ты про vc судя по всему...
ассемблер это, конечно, хорошо, но если можно создать столь же компактный код и на Си, почему бы им не воспользоваться? здесь ассемблер не дает абсолютно никаких преимуществ. те, кто сравнивают hello, world на ассемблере и на Си, просто не убивают у последнего RTL, если же его убить, результаты будет равны.

> к тому же выкинув эти самые 50 кило ты потеряешь многие возможности, предоставляемые компилятором...
и какие например? в Си завязка на RTL очень слабая. в Си++ без этого не работает RTTI, но я бы не назвал последнюю "многими возможностями компилятора". к тому же RTL нужна преимущество подсистеме ввода-вывода, остальные функции вызывать можно и без нее. ну во всяком случае можно юзать RTL самой системы, даром что ли она с ней идет ;)

> А по-моему, лучше уж в таком случае использовать ассемблер.
ну здрастье! на Си писать быстрее и удобнее, а если еще при этом писать эффективно не перекладывая заботу об оптимизации исключительно на компилятор, то полученный код навряд ли будет можно улучшить по скорости/эффективнсти даже на ~3% ~5%.
ассемблер использовать нужно с умом и не лезть с мотыгой на колхозное поле. но не нужно впадать в другую крайность, обрабатывая дачный участок ворованным трактором беларусь ;)
я горячо люблю ассемблер (хотя сейчас это давным-давно интерпретируемый код ;), но все же... это именно любовь, а не оголтелый фанатизм ;))

> Тогда и размер будет минимальный - 1 Кб
попробуй напиши программу, состоящую более чем из нескольких тысяч строк на асме и тогда ты поймешь, что соперничать с комилятором невероятно трудно (хотя и не невозможно). практически все большие проекты, написанные на асме написаны крайне небрежно и занимают ого-ого.

> Сшные ф-ии можно заюзать просто импортировав <уж не помню какую :)> dll'ку из поставки vc
MSVCRT.DLL наверное ;)

> уххх ты... а это как? 8)
очень просто - несколько секций своим raw offset + raw size ссылаются на один и тот же участок файла и он послушно проецируется куда нужно. например, тебе нужна некоторая стуктура данных и ее копия, тогда ты можешь не дублировать ее на диске, а "разножать" непосредственно в памяти. вполне законный прием.

> машинную оптимизацию можно будет использовать без
> извратов и перепалок с сшным компилятором...
все машинно-оптимизированное лучше выносить в отдельные библиотеки, сводя их объем к миним. а целиком оптимизировать все - понапрасну терять время.

> насчет com ты конечно загнул =) все com'ы обслуживает ntvdm и он есесно не даст вызывать Native API ;)
у com'а нативными будут 2F и 21, через которые можно дотянуться и до нативных функций ядра. читай брауна, он рулез ;)

> дык почему бы не воспользоваться ситуацией и PEB'ом если я и так делаю все очень платформозависимым ;)
не использовать потому, что не нужно ;) тогда уж лучше сделать bind.

> круто... только забота ли это оси? спорный вопрос...
> cpuid может юзаться из 3го кольца - значит и прикладной программист ее поюзать может...
будда тебе в помощь! cpuid появился лишь на пнях, а мы говорим о 386 и 486 машинах!
что забота оси, а что нет - сложный вопрос, но согласись, неплохо иметь в файле поле, описывающее требование к ЦП, коль скоро есть поля, описывающее требования к оси. ведь Функцию GetVersion программа и сама вызвать может, но... видишь ли тут как. программы обычно создаются компилятором и компилятору пихать код проверки ЦП не в радость, он лучше загонит требования к процу в поле, которые линкер перепихнет в целевой файл и которое проверит ось. чем тебе такая схема не нравится?

> блин, хочу попробовать... у тебя нет какого-нить сорса?
да какой там сорец? просто прыгаешь и все. естественно, на ту страницу на которую у тебя есть права доступа. сущестует несколько способов их заполучить. если интересно могу описать, но по-моему их все и так знают...

> жду с нетерпением =) а где его заказать можно?
прямо и не знаю. на сайт статью они вряд ли выложат.
остается поискать журнал по киоскам...


Дата: Июн 2, 2004 14:19:18


> опять "некоторых осей"... я жжж про хр говорю =)
ну не серьезно это привязываться к одной оси!
ты уверен, что установив очередной сервис-пак, ты не лишишь этим свои программы невинности? ;)
ладно, если тебе нужно быстро расчитать плотность поля в ванне с электролитом, тут можно и позвращаться...
знаешь, сколько раз я проклинал себя, когда "изращался" подобным образом, экономя пару байт из любви к искусству? это только сейчас кажется, что вот у тебя есть XP и ты с нее никуда не съедешь, а пройдет несколько дней и ты захочешь установить что-то другое?

я тебя очень хорошо понимаю, но я не собираюсь делать какие-то важные программы с помощью моего метода :] Я вообще дальше mboxa ничего и не делал... мне до этих 500 б... я жж говорил. Это просто была интересная тема вот и все. А если не будет этого самого "из любви к искусству" разве интересно будет программировать? жить? :)

впрочем, выбирать политику проектирования и кодирования - тебе, я даже не пытаюсь лезть со своими советами, просто обращаю внимание окружающих на то, что эти приемы далеко не везде работают...

я сам обратил на это внимание в начале статьи ;)

> А по-моему, лучше уж в таком случае использовать ассемблер.
ну здрастье! на Си писать быстрее и удобнее, а если еще при этом писать эффективно не перекладывая заботу об оптимизации исключительно на компилятор, то полученный код навряд ли будет можно улучшить по скорости/эффективнсти даже на ~3% ~5%.
ассемблер использовать нужно с умом и не лезть с мотыгой на колхозное поле. но не нужно впадать в другую крайность, обрабатывая дачный участок ворованным трактором беларусь ;)
я горячо люблю ассемблер (хотя сейчас это давным-давно интерпретируемый код ;), но все же... это именно любовь, а не оголтелый фанатизм ;))

я тоже не фанатик, но как-то я с С не очень дружу... Тобишь у меня есть пару книжек, синтаксис я разбираю, сам могу че-нить простое написать, но... че-то не то :)... дело привычки, наверное...

> Тогда и размер будет минимальный - 1 Кб
попробуй напиши программу, состоящую более чем из нескольких тысяч строк на асме и тогда ты поймешь, что соперничать с комилятором невероятно трудно (хотя и не невозможно). практически все большие проекты, написанные на асме написаны крайне небрежно и занимают ого-ого.

если я напишу несколько тысяч строк кода мне незачем будут эти самые 500б :) А насчет больших проэктов на асме... посмотри хотя бы fasm ;)

> Сшные ф-ии можно заюзать просто импортировав <уж не помню какую :)> dll'ку из поставки vc
MSVCRT.DLL наверное ;)

угу ;)

> уххх ты... а это как? 8)
очень просто - несколько секций своим raw offset + raw size ссылаются на один и тот же участок файла и он послушно проецируется куда нужно. например, тебе нужна некоторая стуктура данных и ее копия, тогда ты можешь не дублировать ее на диске, а "разножать" непосредственно в памяти. вполне законный прием.

а выравнивание секции+ее описание не "окупит" эту самую "экономию"? Хотя конечно зависит от размера структуры... IMHO useless, но красиво :)

> машинную оптимизацию можно будет использовать без
> извратов и перепалок с сшным компилятором...
все машинно-оптимизированное лучше выносить в отдельные библиотеки, сводя их объем к миним. а целиком оптимизировать все - понапрасну терять время.

в больших проэктах да, я и сам так делаю, но в мелких легче и выгодней асм юзать... ;)

> насчет com ты конечно загнул =) все com'ы обслуживает ntvdm и он есесно не даст вызывать Native API ;)
у com'а нативными будут 2F и 21, через которые можно дотянуться и до нативных функций ядра. читай брауна, он рулез ;)

как дотянутся? 8) Где его можно почитать? С удовольствием почитаю :)

> дык почему бы не воспользоваться ситуацией и PEB'ом если
я и так делаю все очень платформозависимым ;)
не использовать потому, что не нужно ;) тогда уж лучше сделать bind.

ну да, ты прав - мой косяк :) А еще можно не искать адреса ф-ий, а забивать их вручную ;)

> круто... только забота ли это оси? спорный вопрос...
> cpuid может юзаться из 3го кольца - значит и прикладной программист ее поюзать может...
будда тебе в помощь! cpuid появился лишь на пнях, а мы говорим о 386 и 486 машинах!

уууппсс :) это я глупость сморозил :)

что забота оси, а что нет - сложный вопрос, но согласись, неплохо иметь в файле поле, описывающее требование к ЦП, коль скоро есть поля, описывающее требования к оси. ведь Функцию GetVersion программа и сама вызвать может, но... видишь ли тут как. программы обычно создаются компилятором и компилятору пихать код проверки ЦП не в радость, он лучше загонит требования к процу в поле, которые линкер перепихнет в целевой файл и которое проверит ось. чем тебе такая схема не нравится?

не нравится тем, что зависящих от проца ехешников ничтожно мало. Такие проги могут и сами потрудится и проверить версию проца ;) (почти уверен, что 99% из них так и делают не смотря на присутствие поля в заголовке :))

> блин, хочу попробовать... у тебя нет какого-нить сорса?
да какой там сорец? просто прыгаешь и все. естественно, на ту страницу на которую у тебя есть права доступа. сущестует несколько способов их заполучить. если интересно могу описать, но по-моему их все и так знают...

под нт? я не знаю, опиши пожалуйста :) давай на мыло раз все знают ;)
мой pgp (если ты такой же параноик, как я ;)):
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: 2.6

mQDPA0BoVmsAAAEGALzFWzj8pU+h7iXEq0tf3qhDYkBUlZ3xGA2gmuMkJpK/rc/r
9DWQgPkzXSS+9yw+s5+OVNE9SWHvJra1J/erxEU7j32rWoFoo7fIyE8d47NBWBaO
qmRiJJLGH3fuu3gfkVAKjc5aEwdTDlNLayFQKdFpzQ/P+cQOrR6LJpdM37ZVlXpO
aTlUorDZtCTdMgLBnsQo4i+DM6z7KaeKEd16+6g6swR3uK61rsny2SNBeDAwC3Jd
mxmyVqOcUOve+k4qKQARAQABtBlSNERYIDxFX0ZfSV9NQHJhbWJsZXIucnU+iQDV
AwUQQGhWa5xQ6976TiopAQG7BAYAh3Ln7NTcyU07gMOdgU+/MdeI+MzS1NTC5ixv
+DRbaRvAqMjmb10UhYRZ3zq1eyhdXp6RRrb0j/IfiMPj/paDd3g5LhJgzURXJ1N1
7vNpTYxx6PCnJ7JVfaTSRYvrt5LlpfaJE067YhhR0jdQiDddnY6wlQ0ODNM+s/j4
uClmNDtx16TIulHdfTXINgcLm5OLFLCz3e8rVSTfL/3nisLYZ3AcVsxVXjlWfbzc
mHMQ8fOnfSouCR+LoD0OZ1e4gyxR
=4TPI
-----END PGP PUBLIC KEY BLOCK-----



> жду с нетерпением =) а где его заказать можно?
прямо и не знаю. на сайт статью они вряд ли выложат.
остается поискать журнал по киоскам...

ок, обязательно поищу... Как еще раз полностью журнал называется?


Дата: Июн 2, 2004 16:28:57

Оффтопик конечно, но...

на Си писать быстрее и удобнее, а если еще при этом писать эффективно не перекладывая заботу об оптимизации исключительно на компилятор, то полученный код навряд ли будет можно улучшить по скорости/эффективнсти даже на ~3% ~5%.

Ну дело-то не всегда в оптимизации по скорости или размеру. Я и на С смогу написать и на делфи и даже на васике (sigh :)), но образ мышления уже не позволяет :)

ассемблер использовать нужно с умом и не лезть с мотыгой на колхозное поле.

Я вот сейчас с такой мотыгой и на колхозном поле :) - и ничего - управляюсь :))

я горячо люблю ассемблер (хотя сейчас это давным-давно интерпретируемый код ;), но все же... это именно любовь, а не оголтелый фанатизм ;))

Надеюсь, что тех, у кого к асму _просто_ оголтелый фанатизм, не подкрепленный ни опытом, ни знаниями на этом форуме нет

cpuid появился лишь на пнях, а мы говорим о 386 и 486 машинах!

Если быть точным на некоторых 486 (последних) он уже был.

<< . 1 . 2 . 3 . 4 . 5 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.177