Pull to refresh

Comments 75

Путь *nix: нагуглить за пару минут нужную либу, за 20 секунд найти пакет с ней, за 15 секунд поставить, пользоваться.
Путь Windows: дизассемблировать ntdll и вызвать из неё недокументированную функцию по указателю, полученному через GetProcAddress
UFO just landed and posted this here
Под Winwows её надо либо искать под нужную версию студии, либо часа три самому компилировать.
UFO just landed and posted this here
О том, что библиотека компилится под определённую версию сишного рантайма, привязанную к версии компилятора, вы забыли? А гонять между кодом, использующим две разные рантайм-библиотеки, память, выделенную через malloc, мягко говоря опасно.
Ай, да ладно. Суть стать ведь не в том, чтобы эту функцию юзать, а о реверс-инжиниринге, об IDA и HexRays, о строении системных библиотек и т.д. К чему тут комментарий о том что под юниксом Вы такую либу за 2 минуты нагуглите и поставите. Может и правда так, ну а если завтра придется протокол какой-нибудь или закрытую железку расковыривать? Специалист уровня автора статьи сделает это быстро, а любители линукса покричат-покричат о том, что всё должно быть открыто и вообще это какие-то неправильные пчёлы и завалят проект.
Специалист уровня автора статьи
Пока что он показал непонимание того, что может случиться если смешать два рантайма в одной софтине.
а любители линукса покричат-покричат
Не надо, пожалуйста, обобщать свои представления о красноглазых крикунах на действительность. Эти самые любители линукса постоянно сталкиваются с необходимостью реверс-инжиниринга очередной проприетарщины, будь то закрытые драйвера для железа с закрытыми же спецификациями, или же приснопамятные библиотеки форточек в случае с Wine. И уж поверьте, в анализе незащищённого от ломальщиков кода с помощью инструментов уровня IDA нет абсолютно ничего сложного и выдающегося, с этой задачей может справиться даже школьник.
Чего Вы на автора напали, я не пойму? Тема — интересная, статья написана легко и понятно. Вам на Хабре интереснее читать «Ой, новый айфон!» и «Я дико негодую!»?

Вам — «ничего сложного и выдающегося», а, я уверен, для половины Хабра это новая информация.
Дык я не из-за статьи напал, статья хорошая, полезная и получила свой законный плюс. Я «напал» (и то, скорее не напал, а отстаиваю сказанное) вот из-за этого комментария в котором игнорируется факт неполной совместимости кода, генерируемого различными версиями Visual C++.
Ну комментарий глючный, конечно. :)
Посыпаю голову пеплом. «Специалист»-то, оказывается, с автором статьи ничего общего не имеет. ksajxai, если вы это читаете, извините за резкое высказывание, незаслуженно написанное в ваш адрес.
UFO just landed and posted this here
Linux-библиотеки компайлятся сразу под все версии рантайма
Все библиотеки собраны под одну и ту же libc, ABI которой не меняется весьма и весьма длительное время. Помимо этого, в системе libc может быть только одна (нет, вы, конечно, можете извернуться и сделать наоборот, но непреднамеренно выстрелить себе в ногу тут не дадут). Так что подобных проблем с двумя загруженными рантаймами не может быть в принципе.
UFO just landed and posted this here
У прикладных библиотек имеется такое свойство как непостоянность API от версии к версии. Чего нельзя сказать о libc, которая на всех одна, а потому к ней предъявляются особые требования.
А вот когда меняется libc, а тебе надо запустить старый и уникальный программный пакет на новом дистрибутиве, сохраняя при этом возможность запускать другие программы, вот тогда и начинается веселье.
chroot с отдельным набором библиотек спасёт отца русской демократии.
UFO just landed and posted this here
Зависимости от двух разных версий прикладной библиотеки, используемой внутри двух других либ не смогут нарушить работу кода, чего нельзя сказать о рантайме. У меня такое впечатление, что вы пишете на каких-нибудь явах/питонах/дотнетах и плохо понимаете механизмы работы кода уровнем ниже.
Вы про multilib что-нибудь слышали, например?
$ ll /lib*/libc-*
-rwxr-xr-x. 1 root root 1951736 Aug 5 19:52 /lib64/libc-2.14.so
-rwxr-xr-x. 1 root root 1858256 Aug 5 20:14 /lib/libc-2.14.so
А теперь расскажите, как будете грузить код под разные архитектуры в одно адресное пространство а после этого одновременно использовать. Мне правда очень интересно.
Никак не буду. Это вообще ответ на
в системе libc может быть только одна
Исходя из Вашей логики, dll входящие в поставку Windows собраны под определенную версию «сишного рантайма» и привязаны к определенному компилятору. Следую дальше, этой же логике, мы не можем использовать эти dll из программ собранных на компиляторе отличном от компилятора, который был использован при сборке исходных dll. Но это не верно, мы можем, почему?
dll-ки, предоставляющие реализацию Windows API выделяют память через kernel32!GlobalAlloc и это задокументированное поведение. Память полученную от таких функций вы не можете освобождать через free, только через вызов kernel32!GlobalFree. Однако используемый в большинстве переносимых библиотек malloc реализован в CRT, которое может выделять память как из общей кучи через этот GlobalAlloc, так и из своей кучи, созданной через HeapCreate, и используемой для мелких объектов. Или же вообще использовать свой механизм управления памятью. В итоге если у нас два разных рантайма, а библиотека возвращает вам память, выделенную через malloc, то вы эту память просто напросто не сможете освободить.

Почитайте для начала документацию по C и Win32 API, а потом уже влезайте в спор.
Ни в коем случае не хочу с Вами спорить, тут не о чем спорить. В Windows cross-boundary memory allocation отлично документирован, и Вы непонятно зачем приплели сюда malloc. А учитывая, что Вы знаете, как нужно делать правильно это еще больше меня поражает. К чему тогда был Ваш комментарий про malloc, когда в Windows принято использовать LocalAlloc\HeapAlloc?
Не надо путать WinAPI и специально заточенные под Windows вещи с прикладными библиотеки для обработки данных на ANSI C, которые обычно и используются для штук наподобие подсчёта CRC32, сжатия данных, etc.
Прикладной библиотеке есть дело до того, посредством чего была выделена память под буффер, с которым ей приходится работать? И, прошу Вас, не надо уводить разговор в сторону. Объясните, зачем Вы привели в комментрии пример с malloc, хотя заранее знали, что это некорректный путь выделения памяти внутри динамической библиотеки. Можно много рассуждать на отвлеченные темы, а можно просто использовать ДОКУМЕНТИРОВАННЫЕ возможности ОС Windows. И не рассказывать фантастических историй о компиляторо-зависимых библиотеках. Они будут таковыми, только при желании программиста, либо же при его низкой квалификации.
Ах да. Вы когда экземпляр класса создаёте, память тоже через LocalAlloc выделяете, да? А ведь по умолчанию реализация new работает через тот самый malloc.
Традиционно люди, не желающие привязываться к рантайму текущей студии меняют в настройках Multithreaded DLL /MD на Multithreaded /MT и не заморачиваются больше, так как с этом случае используется рантайм библиотека mscrt.dll которая не меняется и входит в поставку со времен Win2k.
Не вижу проблемы.
UFO just landed and posted this here
Это вы к чему привели ссылки на способы получения ssl сертификатов?
UFO just landed and posted this here
>не менее крутых программах
Простите, но это г*нопрограммы, если они используют недокументированные возможности системы.
Тогда бОльшая часть системы — г*нопрограммы. Начиная прямо с ipconfig.
Ну не надо путать часть ОС, привязанную к конкретной версии ntdll, и обновляемую вместе с ней же, с внешней софтиной.
Если бы все можно было сделать через публичный api, то вы были бы правы.
Нуу… Возьмём, к примеру, Linux… Всё можно сделать через публичный API вообще без проблем. А то, что в продукции МС так нельзя, так это не значит, что можно использовать недокументированные функции. Их нельзя использовать в любом случае. А значит это кое-что другое. Конкретно: что на Windows невозможно реализовать какие-то штуки. Смиритесь, или же пишите гневные письма в МС — пускай выкатывают стабильный API. Третьего в нормальное проекте не дано. Всякие реверсинжиринги и недокументированные штуки — это очень интересно, но применимо только for fun.
За что минусуем-то?
Ваши принципы хорошие, правильные, но только когда есть выбор платформы. Иногда выбора нет, и пишут под ту платформу, которую хочет заказчик.
Многие вещи, которые делают утилиты sysinternals, иначе не сделаешь. Так что тут плохого?
SysInternals являются подразделением Microsoft и первыми узнают об обновлениях в используемых ими недокументированных функциях, после чего в тот же день выкатят апдейт. Вы сможете обеспечить такое же время реакции на подобные изменения? А если они будут касаться только какого-нибудь обновления Windows Vista, причём касающегося только Home Premium? Или вы регулярно тестируете свой код на всех возможных сборках ОС?
SysInternals основную часть своих утилит сделали еще когда не являлись подразделением Microsoft — это во-первых. Во-вторых, если есть вариант сделать решение, которое заработает сейчас, но, возможно, когда-нибудь в будущем откажет или вот вообще сложить руки и сдаться, потерять проект — я выберу первое. И в-третьих, да, я стараюсь тестировать свой код на всех возможных версиях ОС. Благо, автоматические тесты и виртуальные машины никто не отменял. Ну и очень редко приходится нарываться на отличия, скажем Vista Home Premium от Vista Home Basic.
Я себе уже набил шишек, когда слишком сильно привязал код к потрохам WinCE 5 (там было красивое решение с созданием своего файлового дескриптора со своей таблицей обработчкиков вызовов к нему), а потом начались проблемы на части устройств. Когда софт уже пошёл в коробочных версиях (большая часть которых поставлялась в виде SD-карты, которую надо просто воткнуть в девайс) весьма сложно накатить на них какие-то обновления.
Есть такие программы, которые могут быть написаны только с использованием недокументированных функций. Например, это Native Shell, который может использовать только функции ntdll.dll, поскольку запускается до старта Win32-подсистемы.
Руки оторвать прогерам MS значит, что не сделали нормальных API. Недокументированные функции нельзя использовать никогда, это даже худший быдлокодинг, чем код вообще без отступов.
>> это даже худший быдлокодинг, чем код вообще без отступов.
ещё в строчку можно

такого недокументированного счастья в любом зрелом продукте хватает, при чем тут микрософт?
Эта часть API из ntdll называется Native API. Win32 API является надстройкой над ним. Native API частично документировано, его, например, можно использовать при разработке драйверов. Некоторая часть документирована не Microsoft, а исследователями-любителями. Согласен, следует точно понимать, что ты делаешь, если уж взялся использовать Native API.
Попробовал вашу утилиту. У меня есть папка windows.old которую я не могу удалить из-под винды (сидя под Администратором), т.к. не хватает прав («запросите права у TrustedInstaller»).
Думал вашей утилитой снести её, но в утилите нет команд для работы с каталогами (возможны только операции с файлами). Пожалуйста, добавьте их.
Загрузитесь с какого-нибудь линуксового LiveCD, местный драйвер ntfs отлично знает, что root-у можно всё.
У меня нет сидирома. Можно сделать бутабл флешку, но штатных средств для этого нет, а использовать какие-то сложные инструкции — лень.
unetbootin? В два клика же, может даже сам нужный образ скачать
Так он же не работает.
Скачиваю, запускаю, указываю на скачанный *.iso убунты 10.10, жму ОК и вываливается ошибка:

«Этому файлу не сопоставлена программа для выполнения этого действия. Установите программу или, если она уже установлена, создайте сопоставление с помощью компонента панели управления „Программы по умолчанию“.»

И ведь не понятно же, чего они этой ошибкой хотели мне сказать.
Очевидно, проблема в интеграции с проводником. Стоит воспользоваться первым пунктом, а именно установкой выбранного из списка дистрибутива.
Раз программа не выполняет свою основную функцию, то пропадает гарантия, что она выполнит её после скачивания дистрибутива.
Но я всё же решил последовать вашему совету, но оказался прав: на 1-ом шаге качается дистриб, а на 2-ом — вылетает та же ошибка.
Почитайте реадми к unetbootin возможно в вашей системе не хватает какой-то сторонней программы для рабюоты с образами, без котороый unetbootin не работает. возможно её необходимо будет доустановить и все заработает как положено
У них исполняемый файл распространяется без сопроводительного ридми. На сайте у них на главной странице нашёл FAQ ( unetbootin.sourceforge.net/#faq ) + почитал остальные разделы с этой страницы — но там ни слова о моей проблеме и о способах её решения.
Ну и в конце концов — если утилите требуется ещё какая-то утилита, то надо как-то пользователю об этом сообщить, уж если не научились её вызывать без ошибок.
Программы для работы с образами у меня есть, но по умолчанию расширение *.iso у меня в системе обрабатывается через Daemon Tools, но ведь и даже по умолчанию в винде есть средство для записи *.iso образов на диск, и утилита могла бы уж тогда сразу ссылаться на него, а она этого не делает. Вместо этого она выдаёт неинформативную ошибку и не выполняет своё основное предназначение ни 1-ым способом, ни 2-ым (через скачивание дистрибутива, который, кстати, теперь ещё и не известно куда сохранился и сохранился ли вообще), что говорит о качестве этой утилиты, так что справедливость утверждения, что «Unetbootin — говно» — доказана опытным путём.
Опытным путём доказано, что программа отлично выполняет свои функции.
Вами доказано, что в вашей системе что-то отличается, что не встречалось разработчикам. И так как это оупенсорс у вас появился шанс сделать хоть что-то полезное — починить программу для вашего случая. Вы же выбрали полить говном. Удачи в жизни.
Если бы я мог починить — я бы это сделал. Но у них даже ошибки не информативные, то есть всё сделано так, что если что-то не срабатывает — хрен определишь причину. Говнософт есть говнософт. И вам не хворать.
Странно, что я его первым делом не попробовал… Спасибо за наводку — помогло.
Команда del в версии 0.12 вполне удаляет каталоги, только каталог должен быть пустым.
Т.е. если в каталоге сотня файлов и под-каталогов с файлами, то мне надо будет стереть пальцы в кровь, чтобы удалить каталог? :)
Назначте себя владельцем файлов и измените разрешения. В крайнем случае можно взять дистрибутив семёрки или erd commander и закатать его на флешку (хотя бы с помощью Windows 7 USB/DVD Download Tool).
Всё это только в теории. На практике пробовал — не работает. Чтобы дать себе права Владельца, нужно иметь права Администратора, но выполняя изменений прав из-под Администратора — всё равно будешь получать ошибку, что «Надо обладать правами Администратора».
А решение про взять дистрибутив семёрки — тоже не рабочее: я знаю как там через консоль восстановления вызвать командную строку, но она предпочитает соблюдать все политики связанные с правами, и опять-таки, не даст ничего сделать.
Точно не скажу, но через icacls точно можно было назначить себя владельцем и сменить права. А ERD Commander вообще игнорирует ACL, поищите его на торренте.
Icacls не имеет GUI, а консоли я считаю враждебным пользовательским интерфейсом.
ERD Commander — это набор программ, работающих в среде WindowsPE.
А вот Unlocker работает прямо из винды, и как оказывается, удаляет файлы (даже без ребута), игнорируя все политики связанные с правами доступа.
Что-то вы не там нажимали. У меня перепись прав на себя проходит без проблем, вот только смена прав на десятки гигов мелких виндовых файликов слишком утомительное занятие.
Я когда-то в таком стиле прогал на C#, потому что не было интернета и книг с какой-либо документацией по библиотекам. Открывал Reflector и вперёд.

А в недокументированных функциях ничего плохого не вижу. Многие ведь используют софт, который через какое-то время перестанет поддерживаться или вообще работать. Достаточно иметь актуальную информацию о функциях для каждой версии windows, вряд ли разница между версиями будет огромна.
А эти недокументированные функции разе не могут исчезнуть/переименоваться/изменить список параметров после обновления винды в любой момент?
Могут, конечно. Вот, например, MSDN о довольно известной функции NtQuerySystemInformation:

«NtQuerySystemInformation may be altered or unavailable in future versions of Windows. Applications should use the alternate functions listed in this topic».

То есть нам предлагают использовать «нормальные» функции вроде GetSystemInfo, GetProcessHandleCount,
GetProcessMemoryInfo и т.д.
Но NtQuerySystemInformation выдаёт гораздо больше информации, заполняемые ею структуры гораздо больше. Например, сравните SYSTEM_PROCESS_INFORMATION от NtQuerySystemInformation и стандартный PROCESS_INFORMATION, который можно получить стандартными средствами.

Ваш способ:
Соприте IDA…
Нормальный способ:
lmgtfy.com/?q=RtlComputeCrc32&l=1
Я больше скажу: в этих ваших интернетах есть документация на дикое количество недокументированных структур и функций. Ну и WinDbg с командой dt помогает.
Простите, но код в виде картинок на Хабре — это издевательство…
Добавил код в текстовом виде (раньше были скриншоты).
Sign up to leave a comment.

Articles