1. Assembler / Говнокод #11319

    +146

    1. 1
    huiX5uiPH5;;P5;@@5HH4XPPDXDPhuiX5fiTГ

    Было запощено в 11315, но, мне кажется, что этот ГК заслуживает отдельного топика.

    Когда-то давно пытался на ассемблере включить видеорежим 320x200x256 (13h) и порисовать. Но XP сменив режим потеряла управление. Помог только ребут. В тот день, матерясь на MS, я и решил написать эту строчку так, чтобы ее можно было вводить с помощью обычного блокнота на любой машине...

    Системные требования: Windows XP
    Текст набирается в кодировке CP1251. Файл должен иметь расширение COM.

    Запостил: bormand, 29 Июня 2012

    Комментарии (51) RSS

    • Аналог однострочника на Перле?
      И да, повторяющееся "hui" символизирует.
      Ответить
      • > Аналог однострочника на Перле?
        Да нет, довольно безобидный код. Перезагрузка помогает.

        > И да, повторяющееся "hui" символизирует.
        Ну надо было выбрать 2 произвольных байта, чтобы занулить регистр ax. Но так как первый байт push выглядит как h, остальные буквы пришли сами собой...
        Ответить
        • Теперь я знаю, что занулить ax в начале выполнения com-файла можно инструкцией pop ax, потому что DOS заботливо кладёт в стек два нулевых байта.
          Ответить
          • А мне моя версия зануления больше нравится.
            Ответить
            • Главное, запоминается просто: huiX5ui

              Забавно было бы сделать компилятор с какого-нибудь несложного ЯП в опкоды из диапазона ascii.
              Ответить
    • > Текст набирается в кодировке CP1251
      Как неуклюже! Есть же debug для этого

      наркоманская каптча как бы одобряет использование winword для ввода опкодов
      Ответить
      • Да согласен, через debug можно было бы тупо сассемблировать mov ax, 13h; int 10h да сохраниться. Но это слишком просто ;)
        Ответить
    • XP SP3, не работает из-под админа.
      Ответить
    • Апну код как заслуживающий внимания.

      С таким методом написания не нужно искать текстовое представление восьмеричной системы счисления. Код сразу готов к употреблению.

      В копилку: com2txt.
      Ответить
    • Полез искать, кто на ГК писал сразу в машинных кодах и... обнаружил код Борманда.
      Ответить
      • Не самый удачный код, не всё в ascii. Почему-то я тогда додумался только до передачи управления через ret (буква Г в конце).
        Ответить
        • Научись лучше писать на чистом ascii чтобы не было старше 127 и младше 32. Будет во-первых везде работать, во-вторых можно по самым древним сетям слать. Напишешь в таком духе змейку -- выкладывай
          Ответить
          • Дык вроде есть уже com2txt про который писал выше инканус.
            Ответить
          • З.Ы. Ну и навскидку там достаточно написать небольшой декодер base64 и генерить его кодом как в этом топике или в eicar'е. А дальше тупо payload в base64.
            Ответить
            • com2txt так и сделан: небольшой декодер base64 (не уверен, что именно base64; там может быть другой алфавит) плюс payload.
              Ответить
              • ах...
                http://lurkmore.to/Ююк
                Ответить
                • Сама программа UUDECODE для DOS была закодирована чем-то типа com2txt, так что сам декодер можно было безопасно передавать по древним сетям как текстовый файл.
                  Ответить
                  • Может быть, я не помню, а может быть и не знаю.

                    Но старый SMTP, и (кажется UUCP) и местами FIDO и многие другие сети пропускали нормально только 7-bit текст.

                    Буква Н в Фидо же. "Белосежка и семь гомов, я улетаю прямо в ебеса" итд
                    Ответить
                    • Фидо портил только заглавную русскую Н, потому что этот байт для чего-то использовался в сети (типа эскейпа).

                      Про чудовищную книгу о чудовищах закодированный декодер:
                      http://web.archive.org/web/20060104134716/www.kiarchive.ru/pub/msdos/convert/bin2text/uudecode.txt
                      Ответить
                      • Фрагмент UUDECODE.COM:

                        .COM.B&F=
                        %00%@@PZ-rm-rm-L#P_R^N15RX-qn-qnP-@!PY-!p-!`-!0P]=
                        X-b!P_WR^!5GG!5GG!5GG!5GG!5_RX-`K5pPP^15GG15GG15GG15GG-~!5Z#P^15Q_t#u!
                        COMT_is_copyright_Alex_Pruss.
                        RX3FcEE<Zt+=
                        t"-AA
                        Good-dayR^!5P^15Gu'Hi,Howdy??BJtKM
                        MPOAHAHFNIOHDGALMDJLAOOCCPOKFHJDLIHPPFHFMKMDBCEHFDMCCCCHHPMDAEDHDP
                        KIAOMKMCCCANMNANANANMNANANKKMKMCCCANMNANANANMNANANKKMKMCCCANMNANAN
                        ANMNANANKKLOLMILPPMENMBCHFOLJDCAJLACAADPEKPFPPHOLIPMOFLCOMBEBNJOPL
                        AABADPFKILAABAAFDDAMLIINLIIMLIANLIAPLIIPLIIODMZ
                        S&$ig(Apuu0000000490<


                        Дальше идёт payload в кодировке UUE.
                        Ответить
                      • >>kiae.su
                        верните мой 1997-й...

                        >> Сохраните как UUDECODE.DOC и прочтите
                        ахахаха
                        Ответить
                        • У курчатовского института был хороший ftp-сервер с софтом. Исчез примерно в то время, когда появились Одноклассники, Вконтакте и прочее говно.
                          Ответить
                          • Там были зеркала всяких разных юниксов, и почти каждая статья на citforum.ru (про Интернет, про html, pop, ftp, smtp, unix (обычно это был FreeBSD))) всегда имела ссылку на kiae

                            Даже сейчас можно вбить в гугл "kiae.su site:citforum.ru" и умилиться
                            From ftpmail@doc.ic.ac.uk Thu Mar 16 02:03 EET 1995
                            	Received: from puffin.doc.ic.ac.uk by apollo.polyn.kiae.su with SMTP
                            		(1.38.193.4/16.2) id AA02419; Thu, 16 Mar 1995 02:02:56 +0200
                            	Return-Path: <ftpmail@doc.ic.ac.uk>
                            	Received: from doc.ic.ac.uk by puffin.doc.ic.ac.uk
                            	        id <14782-0@puffin.doc.ic.ac.uk>; Wed, 15 Mar 1995        19:22:26 +0000
                            	To: paul@apollo.polyn.kiae.su
                            	Subject: <FTP EMAIL> response
                            	Date: Wed, 15 Mar 1995 19:22:26 +0000
                            	From: Email-FTP Gateway Account <ftpmail@doc.ic.ac.uk>
                            	Message-Id: <"puffin.doc.790:15.02.95.19.22.34"@doc.ic.ac.uk>
                            	Status: RO
                            	<FTP EMAIL> response


                            Это про шлюз в FTP из почты:)
                            Ответить
                            • Теперь сам КИАЭ под угрозой. Хотят урезать часть территории и на месте ядерных реакторов построить илитные жилые комплексы. Только Сёме не говорите, а то тут появится тысяча комментариев на тему политики.
                              Ответить
                              • ЕМНИП курчатовцы как раз пилили ДЕМОС (порт бзди) еще в 80х, и так познакомились с этими вашими интернетами, и потом сделали "юзер группу юниксоидов" и провайдер релком который первым установил дайлап связь с Хельсинки, так что они первые юниксоиды были и первые интернетчики на Руси

                                Ща погуглил: да, верно помню. Ache там работал еще....
                                Ответить
            • com2txt так и сделан: небольшой декодер base64 (не уверен, что именно base64; там может быть другой алфавит) плюс payload.
              Ответить
            • А вот чем сжимали UUDECODE.COM:

              ftp://ftp.sac.sk/pub/sac/utilfile/comt010d.zip

              Ссылка живая, в архиве есть даже исходники.
              Ответить
              • P.S. Два алгоритма сжатия.
                -1 сжимает во что-то типа WCT (в payload заглавные латинские буквы)
                -3 сжимает во что-то типа base64 или UUE (в payload разные ASCII-символы).
                Ответить
    • Где здесь Assembler, bormand?
      Я вижу какой-то "hui"
      Ответить
      • Ребята, давайте поможем Борманду:
        push 6975h    ; 'hui' ;
        pop ax        ; 'X'   ; ax = 6975h
        xor ax, 6975h ; '5ui' ; ax = 0
        push ax       ; 'P'   ; в стеке 00, 00
        dec ax        ; 'H'   ; ax = -1
        xor ax, 3B3Bh ; '5;;' ; ax = 0C4C4h
        push ax       ; 'P'   ; в стеке SP->C4 C4 00 00
        xor ax, 403Bh ; '5;@' ; ax = 84FFh
        inc ax        ; '@'   ; ax = 8500h
        xor ax, 4848h ; '5HH' ; ax = 0CD48h
        xor al, 58h   ; '4X'  ; ax = 0CD10h
        push ax       ; 'P'   ; в стеке SP->10 CD C4 C4 00 00
        push ax       ; 'P'   ; в стеке SP->10 CD 10 CD C4 C4 00 00
        inc SP        ; 'D'   ; выталкиваем из стека 1 байт
                              ; инструкцией pop это сделать нельзя,
                              ; потому что pop вытолкнет минимум 2 байта
                              ; в стеке SP->CD 10 CD C4 C4 00 00
        pop ax        ; 'X'   ; ax = 10CDh, в стеке SP->CD C4 C4 00 00
        inc SP        ; 'D'   ; выталкиваем из стека 1 байт
                              ; в стеке SP->C4 C4 00 00
        push ax       ; 'P'   ; в стеке SP->CD 10 C4 C4 00 00
        push 6975h    ; 'hui' ; 
        pop ax        ; 'X'   ; ax = 6975h
        xor ax, 6966h ; '5fi' ; ax = 0013h
        push sp       ; 'T'   ; 
        retn          ; 'Г' (в кодировке 1251, т. е. в виндовой)
                              ; push sp + retn эквивалентно jmp near word ptr [sp]
                              ; переходим к выполнению подпрограммы CD 10 C4 C4 00 00


        Дизассемблируем подпрограмму:
        int 10h       ; CD 10 ; поскольку сейчас ax = 13h, включаем видеорежим 13h
        les sp, ax    ; C4 C4 ; invalid opcode, потому что LES ожидает ссылки на память


        Вероятно, Борманд хотел, чтобы подпрограмма завершалась кодом C3 (retn), но получилось C4, поэтому программа падает.
        Ответить
        • Кстати, про invalid opcode. NTVDM отслеживает это исключение и какой-то из несуществующих опкодов использует для вызова функций своего API. Кажется, именно C4 C4. Следующие два байта за неправильным опкодом NTVDM интерпретирует как номер вызываемой функции.
          Ответить
          • Всё-таки Борманд нас троллит. Дёрнул какую-то функцию API NTVDM, а нам говорит, что виновато переключение видеорежима.

            В чистом ДОС или в других эмуляторах (не NTVDM) программа просто свалится с исключением Invalid Opcode.
            Ответить
          • >> отслеживает это исключение и какой-то из несуществующих опкодов использует для вызова функций своего AP
            ух ты, быстро работает наверное.

            Как можно получить инвалида опкода в программе под ntvdm?
            Надо специально скопелировать real time программу под ntvdm? типа ты знаешь что ее будут запускать под windows, но пишшеь специльно под дос? серьезно? это надо что с собой сделать?
            Ответить
            • Серьёзно. Этот invalid opcode (C4 C4) не использовался нигде, кроме каких-то специальных микрософтовских утилит, предназначенных конкретно для ntvdm.

              А в виртуальной дос-машине Windows 95/98/Me были дополнительные функции DOS, которые предоставляли доступ к длинным именам файлов (их предоставлял vfat.vxd) или ко всякой фигне типа изменения заголовка окна консоли.

              А в OS/2 тоже были какие-то дополнительные функции для досовских программ, запущенных в окне...

              А в борландовских паскалях и сях была эмуляция опкодов 8087, если математический сопроцессор отсутствовал: там был вызов какого-то прерывания, которое подглядывало на следующие два байта в коде за инструкцией INT (чтобы не засорять регистры).
              Ответить
              • Вот теперь когда я подумал про vxdшку для fat32 я понял что в этом нет ничево удивительного

                Эмуляцию ФПУ я помню, там была опция такая у копелятора. В те далекие времена яне думал как она работает, просто знал что у мну есть FPU и всё

                ps:
                >или ко всякой фигне типа изменения заголовка окна консоли.
                так ansi.sys же и ESC последовательнсоте, не?
                Ответить
                • О чём вы пиздите?
                  Ответить
                • Тихо, гусары, не ржать:
                  https://www.google.com/search?q=c4+c4+ntvdm

                  Я наткнулся на эту фигню, когда пытался дизассемблировать com-файлы из System32 какой-то Windows NT (уже не помню, какой).

                  За пределами стандартных утилит Windows NT такой опкод нигде не встречается.
                  Ответить
                  • >>com-файлы из System32
                    16битные файлы лежали в папке system32, и это логично потому что у меня сейчас там лежат 64битные файлы, а 32х битные лежат в wow64
                    Ответить
                    • Соль лежит в банке из-под кофе, на которой наклейка «Сахар».
                      Ответить
                      • Винда один сплошной костыль. И PC костыль. И x86 костыль. Между нами девочками и SUS/Posix тоже костыль. буэээ
                        Ответить
                • >> так ansi.sys же и ESC последовательнсоте, не?

                  Как досовский ansi.sys изменит заголовок окна, если у него нет доступа к WinAPI? Вот единственный шлюз был через доп. функции DOS с большими номерами. А до ansi.vxd тогда не додумались.
                  Ответить
                  • ну когда обычное console appl работает в винде то винда запускает conhost (в былые времена это был код прямо в csrss) которое рисует окошко

                    что мешало ntvdm рожать такие же окошки и потом:

                    1) приложение -> NTVDM (пишет в stdout посредством DOS int. \033...)
                    2) NTVDM -> ядру (через native API) "поменяй мну зоголовко"

                    зы: ansi.sys тут не причем конечно, потому что строго говоря заголовков в обычные мониторы пока не завезли)

                    но все равно можно было так сделать
                    Ответить
                    • Можно было. Но ansi.sys — это прыщеговно *nix-way, а не windows-way.

                      В MS умудрились даже на протяжении нескольких лет одновременно поддерживать ветки NT и не-NT, в которых всё сделано по-разному, и только потом отказались от не-NT.
                      Ответить
                      • >>*nix-way, а не windows-way.
                        его вроде включали когда-то чтобы упростить портирование прыщеговна видимо, но потом отказались и теперь опять у нас только ConsoleAPI.

                        А ветки долго поддерживали: NT 3.51 вышел лет за 10 до полного перехода всего на Win2k/WinXP.
                        И даже там поддерживают до сих пор НЕ юникодные функции чтобы работали win9x аппы.

                        Обычно Pituh этомакрос который резолвится в PituhA если не установлен UNICODE и в PituhW если установлен

                        Очевидно что PituhW есть во всех WinNT
                        Ответить
                • Вспомнил ещё один извращённый API. Внутри VXD в Windows 3.x и 95/98/Me сисколлы выглядели как int 20h (да, номер вектора случайно совпал с тем, который завершает досовскую программу), за которым следовали четыре байта (номер сисколла и какой-то параметр). Т. е. диспетчер сисколлов подглядывал в вызывающий код, чтобы получить номерок, и делал инкремент адреса возврата, чтобы при возврате пропустить байтики, не являющиеся кодом.

                  Получается такая же схема, как у c4 c4 в ntvdm и как у борландовского эмулятора FPU.
                  Ответить
    • В копилку ненормального программирования: нашёл на одном форуме куайн в виде COM-файла:

      VZNNXPH555750K4PP5DM3D01D0X5AC3D21D2XP55 9550K4
      Ответить
      • Чёртов пробел!

        VZNNXPH555750K4PP5DM3D01D0X5AC3D21D2XP559550K4
        Ответить

    Добавить комментарий