Коварный и ужасный sndrec32.exe

    Sound RecorderВ этом топике вы найдете немного ностальгии, каплю гнева и килограмм реверс-инжиниринга. Посвящается тем, кто знаком с программой «Звукозапись» не понаслышке :)

    Когда небо было голубее, Солнце светило ярче, а Интернет был таким недоступным… Короче, в далеком детстве мне почему-то полюбилась стандартная программа «Звукозапись» из Windows 98. Не глядя на минимальную функциональность, я даже умудрялся делать в ней простейшие «ремиксы» ей же записанных мелодий из игр.

    Шли годы. Железо становилось мощнее, а ОС функциональнее. Но «Звукозапись» не менялась. Даже в Windows XP она оставалась такой же, как и тогда. Пришло время обновить железо. 3 гигабайта оперативной памяти — раньше и мечтать о таком не приходилось. Этого уж точно должно хватить всем! Так и было, пока дело не дошло до той самой «Звукозаписи». После попытки записать небольшой звук программа невозмутимо возразила, что ей недостаточно оперативной памяти.

    Not enough memory available to complete this operation. Quit one or more applications to increase available memory, and then try again.

    Что конечно же возмутило меня. Закрыл все программы, попробовал перезагрузиться — не помогло. Страшная мысль о проблеме в программе закралась в голову, и мои опасения оправдались: Microsoft заявляет, что при наличии более 2 гигабайт оперативной памяти программа сообщает о её недостаче, и это особенность архитектуры приложения. Причем не предлагается никакого адекватного способа решения проблемы, кроме уменьшения объема физически доступной памяти. Как говорится, пользуйтесь тем что есть.



    Вопреки просьбе «Звукозаписи» завершить ненужные приложения, я постарался занять побольше свободной оперативной памяти. Как ни странно, как только отметка свободной памяти упала ниже двух гигабайт, ошибка исчезла.

    Очевидно, что в коде проверки количества свободной памяти разработчик объявил переменную:
    int AvailableMemory;
    Из-за чего число свободных байт рассматривается как знаковое число. При объеме свободной памяти больше двух гигабайт, первый бит устанавливается в единицу, поэтому число выглядит как отрицательное. Для исправления ошибки достаточно было бы написать:
    unsigned int AvailableMemory;
    Но Microsoft этого не делает, вероятно, для стимуляции перехода на Windows Vista или 7 (шутка), где «Звукозапись», увы, уже совсем другая программа.


    Так что попробуем решить проблему самостоятельно.

    Отказ от ответственности


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

    Инструментарий

    • IDA Pro — для дизассемблирования и исследования приложения
    • Flat Assembler — для генерации необходимых машинных кодов
    • Hexplorer — для внесения изменений в готовый исполняемый файл
    • Resource Hacker — для изучения ресурсов
    Более подробно с данными программами можно ознакомиться в предыдущей статье по теме реверс-инжиниринга «Расширение функциональности готовых программ».

    Исследование


    Для определения количества свободных байт в оперативной памяти используется устаревшая функция GlobalMemoryStatus — именно её мы видим в таблице импорта «Звукозаписи». Поскольку эта функция используется в нескольких местах, более точно определить искомый участок кода нам поможет номер строки в ресурсах, выводимой при ошибке — это строка номер 6Eh.

    Забавный факт — функция GlobalMemoryStatus в целях совместимости возвращает не более 2Гб свободной оперативной памяти независимо от того, сколько у вас свободно на самом деле. То есть старший бит числа свободных байт в любом случае не должен быть установлен в единицу, и число не должно интерпретироваться как отрицательное. Для того, чтобы найти проблему, нужно уяснить, что бывают различные типы условных переходов — для знаковых и беззнаковых данных.


    Рассмотрим первое условие. Как видно, результат работы функции GlobalMemoryStatus сравнивается со значением, эквивалентным 1Мб. И не глядя на использование знакозависимой команды перехода JGE, данный код в свете ограничения результата GlobalMemoryStatus всегда работает верно. Проблема всплывает при проверке второго условия. Программа вычисляет сумму уже занятой записанным звуком памяти и свободной памяти (что установит старший бит числа), и сравнивает полученное число с количеством необходимых для выделения байт. Естественно, команда перехода для знаковых данных JLE сработает некорректно, и для корректной работы её необходимо заменить командой JBE (для беззнаковых данных). То есть наша задача сводится к замене одной команды.

    Патчинг


    Физическое смещение интересующей нас команды: 6BD5h. Машинный код JLE — 7Eh. Чтобы получить машинный код команды JBE скомпилируем в Flat Assembler следующий код:
    use32
    jbe fake
    fake:
    Получим файл, в котором первым байтом будет код нужной команды — 76h. Осталось дело за малым — внести необходимые изменения в исполняемый файл. Для этого воспользуемся HEX редактором.

    Результат


    sndrec32.zip (119Кб) — оригинальная и исправленная версии программы из английской Windows XP SP3.

    Зачем это было нужно


    Just for fun. Не стоит искать здесь никаких рационалистических побуждений. Существует масса других очень достойных и более удобных программ для записи и редактирования аудио. Просто сама возможность запустить и поработать в «той самой программе» греет душу :)

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 98

      +29
      К слову, рекомендую небольшой и бесплатный аудиоредактор Wavosaur.

      При объеме всего 500Кб. он имеет поддержку основных форматов, VST плагинов и т.д. А главное — не требует установки, так что его можно носить с собой на флэшке.
        +32
        а я тихонько порекомендую Audacity — свободный аудиоредактор, который при желании поддерживает VST и ASIO.
          0
          От автора статьи:

          Не стоит искать здесь никаких рационалистических побуждений. Существует масса других очень достойных и более удобных программ для записи и редактирования аудио. Просто сама возможность запустить и поработать в «той самой программе» греет душу :)
            +28
            Возможно, вы не обратили на это внимание, но вы отвечаете автору статьи.
              –1
              Обратил, я его словами к нему же и обращаюсь.
            –3
            а мне wavelab нравится.
            • UFO just landed and posted this here
                0
                :) Я когда-то освоила вейфлаб. И поэтому для меня он самый любимый и удобный)
                Про легкость и быстроту говорить не буду, wavosaur действитльно без особых заморочек.
                  +1
                  теперь поглядите на стоимость программы, что вы освоили. :)
                    0
                    я в курсе :)
              –1
              Вы вообще поняли о чем статья?:)
                0
                К слову, рекомендую небольшой платный аудиоредактор Pro Tools.
                +9
                Порадовали душу. Спасибо :-)
                  –7
                  Зачем ассемблер и Hexplorer, когда есть hiew?
                  Пробелы-с в хакинге у вас, батенька :)
                    +3
                    Отчего же проблемы? Если задачу получилось реализовать этим инструментарием, то это же хорошо)
                      +8
                      Использовать компилятор для замены перехода — это все равно что грачевать на самосвале.
                      Я уже не говорю о том, что в hiew вся процедура от начала и до конца заняла бы примерно 15 нажатий клавиш, смотрю, народ и так не понял, о чем вообще разговор :)
                      +5
                      У каждого свой инструментарий. Я, например, не перевариваю hiew, не в обиду sen будет сказано. Автор выбрал не самый легкий путь, я тоже так считаю, но это не повод выстебывать :) на хабре и так мало RE/DRE, пусть растет.
                        +1
                        Согласен, скорее всего здесь было бы удобнее использовать Hiew. В данном случае я, похоже, стрелял из пушки по воробьям. В случае с заменой какого-нибудь достаточно большого участка машинного кода (как например в статье о модификации программ) связка FASM + Hexplorer была бы более актуальной.
                      +18
                      Microsoft заявляет, что при наличии более 2 гигабайт оперативной памяти программа сообщает о её недостаче, и это особенность архитектуры приложения.

                      Микрософт твердо следует заповеди: опиши ошибку в своей программе как особенность :)

                      Попробую предположить, о чем думал разработчик, когда писал код.
                      — «Количество свободной памяти… 2 байта. Нет, этого уже мало. 4 байта будет в самый раз. Значит int. Это же аж 2147483647 байт памяти!, куда стлько, гы-гы». (И далее в зачатках отвергнутая мысль об использовании беззнакового, как абсурдная :)
                        +1
                        Скорее всего, он думал на английском или хинди, а знаковое использовал из-за операции вычисления, описанной автором статьи, возможно при вычислениях программист, например, не заводил новую переменную, а вычислял разность в этой же.

                        Причин может быть масса, не обязательно такие «лобовые».
                          +5
                          «Well… Available memory… 2 bytes. No, it's too little. 4 bytes will be enough. Oh, fuck! It's 2147483647 bytes of memory!, for what so much, lol»
                            +2
                            «Ту хум хау»
                            • UFO just landed and posted this here
                            +8
                            640K will be enough =)
                            Вечно у них так, в микрософт =)
                              +1
                              ну по логике количество памяти не может быть отрицательным, зачем вобще под него знаковую переменную отводить?
                                0
                                См. выше — человек сэкономил 4 байта памяти на повторном использовании какой-то переменной, премию небось получил :))
                                +2
                                Лично я при разработке на си всегда объявляю беззнаковым все что можно) Точнее все что не будет принимать отрицательные значения.
                                  +1
                                  Точно, при первом использовании переменной надо головой подумать, какие она значения может принимать и соответственно установить тип и размер. А не делать «на всякий пожарный» :)
                                  +1
                                  Микрософт твердо следует заповеди: опиши ошибку в своей программе как особенность :)
                                  i40.tinypic.com/jpyi2x.gif
                                  +8
                                  автор, вы молодец.
                                  именно for fun!
                                    +4
                                    Чтобы получить машинный код команды JBE скомпилируем в Flat Assembler следующий код
                                    Ну зачем? Запускаем debug.exe из Windows (правда в Windows 7 его уже нет), пишем: «a», «Enter», «jbe 100», Enter, Enter, «d», Enter.

                                    Смотрим команду: 76 FE, код и смещение перехода.

                                    Жмём «q», Enter
                                      +1
                                      простите, а почему нет? только что проверил, у меня debug.exe есть (Win7 Максимальная)
                                      0
                                      Забавно, но фасм все-таки удобней. Опять же 32/64 бита. BTW, не связано с сабжом, но все же — как можно более или менее удобно сконвертить binary (точней hex) представление флоата в собственно сам флоат. Я пока пользуюсь этим онлайн конвертером, но может есть что-то более удобное?
                                      –12
                                      Всегда завидовал таким людям как автор. У вас наверное очень много свободного времени.
                                        0
                                        В ночь перед выходными можно и побаловаться немного ;)
                                        0
                                        отличная работа!
                                          –23
                                          а вы в курсе что лицензия IDA стоит $540? Что как бы делает нерентабельным использование легальных копий IDA для подобных хобби (у вас она конечно легальная?)
                                            +7
                                            Да ладно вы. Скорее всего это триал, или подаренная версия ;)
                                              –2
                                              — Гиви, у тебя диплом наверное купленный?
                                              — Абижаишь дарагой. Падарили!

                                              но я почему-то не верю
                                                +3
                                                Зато когда автор начнёт коммерческий проект, и ему понадобится отладчик, то с большой вероятностью он купит IDA. Тем самым производитель сэкономит на рекламе и получит лояльного пользователя, бесплатно рекламирующего его товар ;)
                                              +8
                                              1) Как уже сказали — IDA для x86 есть в демо режиме. Описанные в статье действия делаются в ней не менее эффективно, чем в полной.

                                              2) Поскольку указанные действия именно хобби, не предназначены для зарабатывания денег и не являются коммерческим использованием программы — автор чист перед законом и судом. Или вы из тех, кто считает, что private non-commercial use — тоже повод, чтобы посадить человека? :-)
                                                +12
                                                >> а вы в курсе что лицензия IDA стоит $540?
                                                Вообще, сообщение не по теме топика, но разрешите доложить о свободной версии IDA Pro.
                                                  –15
                                                  Вы исходите из презумции невиновности. Я (учитывая пост-советскую действительность) в данном случае исхожу из презумции виновности. Вот и ТС не спешит показать нам скриншот окна «About» в которой было бы видно какую он на самом деле версию использует.

                                                  Как-то не верю я howto-шкам в которых рассказывается как всего за 3 минуты с помощью Adobe Photoshop можно быстро менять размер фоток чтобы положить вконтакте. Не будет человек сознательно отстегрувший столько денег разменивать столь ценный инструмент на подобное «хобби».
                                                    +6
                                                    Да какая разница какая у автора копия.
                                                      +17
                                                      Исходя из вашей презумпции верните мне $100 (а я пока придумаю за что...)
                                                        –7
                                                        я думаю вы зря потратите время придумывая за что. Все программы устанавливаемые на Debian командой «apt-get» или «make install» бесплатные. Кстати, почему $100 возвращать именно вам, а не например производителю программ или государству (в виде штрафа)?
                                                          0
                                                          Ну тогда верните за зря потраченное время. Вы же в любом случае виновны! ;)
                                                        +1
                                                        Попробуйте следовать мировой юридической практике и исходить из презумпции невиновности :)
                                                          0
                                                          ГК РФ кстати основана на презумпции виновности…
                                                          +4
                                                          Я вам искренне желаю никогда не узнать на собственном опыте, каково это, когда исходят из презумпции виновности. И не какие-нибудь комментаторы, а гос. структуры, имеющие полномочия на несколько лет лишить вас возможности когда вздумается созерцать небо над головой.
                                                          +4
                                                          В IDA Pro Free нет графического режима просмотра кода (тот, что на скриншоте — прямоугольнички со стрелочками).
                                                          Хотя кого это волнует.
                                                          +1
                                                          А к чему вы это? Ну не IDA, так OllyDbg можно взять, делов то. Это не менее достойный инструмент который способен удовлетворить большинство потребностей. Впрочем, на любимое хобби, которое есть отдушина в жизни, как правило людям не жалко вообще никаких денег.
                                                          +2
                                                          а кто нибудь помнит микс, сделанный с помощью sndrec'ордеров и стандартны виндовых звуков?
                                                          интересно было бы посмотреть-послушать снова
                                                          0
                                                          ОГРОМНОЕ человеческое спасибо!!!
                                                            –4
                                                            «640 килобайт должно хватить всем».
                                                            Раньше было еще веселее :)
                                                              +3
                                                              А убрать ограничение на длину записи у вас мысли не было?
                                                                0
                                                                Возможно, это будет еще один повод поковыряться в этой программе каким-нибудь тихим вечером ;)
                                                                +1
                                                                Во-первых не из Windows 98, а из Windows 95.
                                                                Во-вторых вы бы еще Hyperterminal взяли.
                                                                В третьих, всякий раз, когда MS сделает какое-то комплектное приложение хорошо работающим, сразу же найдется кто-нибудь, кто захочет повопить по этому поводу, что его шареварный супер-мега-дупер SoundRecorder64PRO выпихивают с рынка, «пользуясь монопольным положением», нате вам иск на стотышпицот мильонов.
                                                                  –3
                                                                  Это Sound Recoder то хорошо работающее приложение? Я помню, как звук им писал. По окончании 3-х минутной записи он завис и не сохранил ее.
                                                                    +4
                                                                    Когда отвечаете — не торопитесь, прочтите внимательнее то, на что вы отвечаете, попробуйте понять смысл прочитанного.
                                                                    +1
                                                                    Судя по Wikipedia, он практически не менялся с Windows 3.11. Просто у меня первая версия, которой я пользовался, была под Windows 98.
                                                                      +1
                                                                      В 3.11 был другой. А вот в 95 был вот имено этот.
                                                                    +3
                                                                    помню когда у меня появился комьютер с виндовс 95 (году в 97), я был еще неопытным мальцом и не знал что такое CD-grabber. В то время мне очень нравилась Nana — Remember the Time. И мне так хотлось что бы она была у меня на компьютере, что я приставил микрофон к колонке, запустил эту песню и записывал через эту самую Звукозапись с микрофона. Дело осложнялось тем, что лимит одноразовой записи был почему-то то ли минута, то ли полторы. По этому надо было во время и быстро нажать кнопку паузы и опять на кнопку запись. «Качественно» записать удалось раза с 5, а то и с 10. Эх… были же времена :)
                                                                      +3
                                                                      Да, времена были просто супер :) Я для того, чтобы избежать ограничения в 60 секунд, предварительно записывал звук нужной длины (тишину), а потом поверх уже записывал то что было нужно.
                                                                      Я думаю у многих найдется несколько забавных историй, связанных с этой программой. Очень интересно почитать.
                                                                      +1
                                                                      Ссылка «Расширение функциональности готовых программ» 404. Поправьте пожалуйста. Или это страницу прибили?
                                                                      –1
                                                                      клевая статья :)
                                                                        +1
                                                                        Я помню это программка записывала максимум 1 минуту звука. Приходилось замедлять при записи, получалось раза в 3 длинее.
                                                                          +3
                                                                          комбо:
                                                                          1) записываем 10-30 секунд звука
                                                                          2) Ctrl+C
                                                                          3) Ctrl+V много раз, до нужной продолжительности (в win7 не работает)
                                                                          4) Перематываем в начало и записываем
                                                                          +4
                                                                          Вот интересное положение: нужно исправить всего одну строку, а ошибка как существовала долгие годы, так никто её и не починит. Я понимаю что «тестирование», «цена изменений», но ведь ситуация смешна и абсурдна в некотором разрезе. Диктат модели разработки.

                                                                          P.S. На самом деле просто исходники потеряли :)
                                                                            +4
                                                                            Да-да, одну строку, в исходниках, которые никто не получит (тем более что их потеряли). А так один байт! Неужели сложно патчик с каким-нибудь апдейтом выкатить было?
                                                                            P.S. Хотя если подробнее посчитать — ошибка лишь в одном бите ;)
                                                                              0
                                                                              JLE и JBE различаются не одним битом, если не ошибаюсь.
                                                                              Это «классические» JE и JNE отличаются одним битом. Биткряк, ностальджи, романтика )
                                                                                0
                                                                                jle — 7Eh — 01111110b
                                                                                jbe — 76h — 01110110b
                                                                                Удивительное рядом :)
                                                                            +1
                                                                            да, новая звукозапись бредовая. У старой функционала в разы больше. Плюс новая еще и сохраняет звук иногда так что его их же wmp не открывает )
                                                                              +1
                                                                              Кстати, чтобы быть совсем точным. В Windows 7 программа Звукозапись запускается через SoundRecorder.exe. Поэтому можно считать, что уже другая программа, а не sndrec32.exe.
                                                                                +1
                                                                                Все описаные манипуляции легко и просто сделать в бесплатном отладчике OllyDbg www.ollydbg.de. Все-таки запускать IDA чтобы исправить один джамп это из пушки по воробьям.
                                                                                  +1
                                                                                  Фишка в том, что заранее неизвестно, воробей там или дракон из параллельной вселенной :) ИМХО, лучше сразу разобраться и использовать очень мощные инструменты даже для не самых сложных задач (притом, неизвестно заранее, будет ли задача сложной). Хотя да, OllyDbg тоже очень мощный инструмент в правильных руках, но это уже дело вкуса :)
                                                                                    0
                                                                                    При исследовании программы сразу в IDA Pro для достижения одной цели можно совершенно случайно найти интересный код, который даст толчок для новых идей, которые можно реализовать «по ходу дела».
                                                                                    Например, когда снимал проверку наличия CD в Age of Empires II, наткнулся на код создания главного меню (где кнопки были расположены не совсем логично). По ходу дела изменил порядок кнопок.
                                                                                    +1
                                                                                    респект автору! ассемблер, дизассемблер, ностальгия.
                                                                                      +1
                                                                                      Статья интересная, спасибо!
                                                                                      Хотелось бы узнать, почему MS отказался от такой программы как sndrec32 в пользу того убожества, которое есть в vista/7. Ну серьезно, там даже кнопки Play нету!
                                                                                        +1
                                                                                        обожаю такие вещи) в смысле потрашения прог на асм)) круто
                                                                                          +2
                                                                                          Хорошо что молодежь интересуется такими вещами а не наркотой и бухлом :) Вы молодец!
                                                                                            0
                                                                                            Для исправления ошибки достаточно было бы написать:

                                                                                            unsigned int AvailableMemory;

                                                                                            Спешу разочаровать автора, что этого в общем случае этого недостаточно. При работе программы на Win7-x64 с доступной памятью в 4 гига, вы получите абсолютно такую же ошибку какая и была (почему — попробуйте догадаться сами :))).
                                                                                              0
                                                                                              Похоже, вы невнимательно читали статью. Там написано, что функция GlobalMemoryStatus, которая используется для получения количества свободной оперативной памяти, никогда не возвращает значение больше 2³¹. То есть будь у вас свободно хоть 10 гигабайт, функция сообщит, что свободно всего 2 гигабайта. Проблема возникает лишь после того, как программа к возвращаемому числу свободной памяти добавляет размер текущего буфера, из-за чего и возникает ошибка.
                                                                                              0
                                                                                              Добавил описанную проблему и ссылку на эту статью в Community bug tracker.
                                                                                                0
                                                                                                Искренне благодарен вам за выкладывание исправленной программы. Как раз нужна была для довольно странной но задачи — заставить винду проигрывать другой звук при загрузке.

                                                                                                Only users with full accounts can post comments. Log in, please.