1. Си / Говнокод #25296

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    void decode_chunk(const char* s, uint8_t* out)
    {
        __m128i a = _mm_loadu_si128((const __m128i*)s);
    
        __m128i u = _mm_and_si128(a, _mm_set1_epi8(0x74));
        u = _mm_add_epi8(u, _mm_set1_epi8(0x04));
        u = _mm_srli_epi32(u, 0x03);
        u = _mm_and_si128(u, _mm_set1_epi8(0x0F));
        u = _mm_shuffle_epi8(_mm_set_epi32(0xB9B9B9B9, 0xBFBFBFBF, 0x04041013, 0x00000000), u);
        a = _mm_add_epi8(a, u);
    
        __m128i m1 = _mm_set1_epi32(0xFF00FF00);
        __m128i m2 = _mm_set1_epi32(0xFFFF0000);
        a = _mm_shuffle_epi8(a, _mm_set_epi32(0x00010203, 0x04050607, 0x08090A0B, 0x0C0D0E0F));
        a = _mm_or_si128(_mm_srli_epi32(_mm_and_si128(m1, a), 2), _mm_andnot_si128(m1, a));
        a = _mm_or_si128(_mm_srli_epi32(_mm_and_si128(m2, a), 4), _mm_andnot_si128(m2, a));
        a = _mm_shuffle_epi8(a, _mm_set_epi32(0x80808080, 0x00010204, 0x05060809, 0x0A0C0D0E));
    
        _mm_storeu_si128((__m128i*)out, a);
    }

    Байтоёбский парсинг base64 (16 символов → 12 байт).

    По мотивам http://govnokod.ru/12822#comment173404

    Запостил: bormand, 09 Января 2019

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

    • ideone, к сожалению, не может в SSE3 :(
      Ответить
    • Я двинусь, если продолжу разбирать всякие _mm_shuffle_epi8 вручную. Надо изобрести кокококонпелятор из этих инструкций в человекочитаемый код.
      Ответить
      • В человекочитаемый код на J. Как раз векторная хуита.
        Ответить
        • И главное, что как в случае с кодом с SSE-интринсинками (правильно хоть написал это страшное слово?), так и в случае кода на "J" можно не бояться утечки исходников: всё равно никто ничего не поймёт. Даже сам автор спустя несколько недель.
          Ответить
          • показать все, что скрытоvanished
            Ответить
            • У этих инструкций ещё более ёбнутые мнемоники чем названия соответствующих им интринсиков... Там можно ктулху призвать этими vpunpckiddqd.
              Ответить
              • показать все, что скрытоvanished
                Ответить
                • В принципе, в гцц есть attribute vector_size. Но он как-то совсем непредсказуемо работает. То высрет портянку из анролльной копипасты то одну инструкцию. Хотя код почти одинаковый и если что-нибудь переставить иногда в правильные инструкции превращается...
                  Ответить
                  • "coffeasm
                    Что-то мне подсказывать, что кофе надо было пить ни до, ни после, а вместо.
                    Сечёшь, пидар?
                    Ответить
              • > можно ктулху призвать
                Я только за.
                Ответить
          • > никто ничего не поймёт
            Не надо рассуждать о читаемости кода на языке, которого не знаешь.
            Ответить
        • Я только за, может быть, я тогда бы понял хоть что нибудь...
          Ответить
    • Вчера ты сувал пидарасам рыболовные крючки в жпа, а тебе бы свой вынуть.
      Ебанавт.
      Ответить
      • Как он его вынет? Он же там с какими-то зазубринками. Пусть будет как пирсниг.
        Ответить
    • раскажите мне тупому как процессор знает есть у него SSE или нет. и что будет прогай когда он это г-но запустит?
      Ответить
      • Старые процы не знают про SSE. На них сработает прерывание invalid opcode и ось убьёт прогу. Это работает для любой другой неизвестной инструкции, не только для SSE.
        Ответить
        • Если я помню, что на x86 номер этого исключения 6, то я нормальный?
          Ответить
          • показать все, что скрытоvanished
            Ответить
            • Для него ещё был отдельный однобайтовый опкод CC (да, как муха) вместо двухбайтового CD 03.

              Чорт! Проговорился.
              Ответить
            • hex
              0 —– позовут при лелении на ноль
              3 –— беркпонт
              5 —– принт скрин/бонд
              9 —– что-то связанное с клавиатурой (помоему, зовётся при ножатии клавешы)
              10 –— видио хуйня
              13 —– раьота с письками
              16 –— получить код ножатой клавешы(ah = 0)/узнать, ножата ли клавеша и т.п.
              20 —– выдох из программы
              21(22,23,...? я ими не пользовался, но помоему есть) —– функции дос
              29 –— вывести символ в al на ыкран
              33 —– мыш (ax=0,1,2,3 —– инициалищация, показать, скрыть, получить сосояние)
              40 —– сиськи оли в КолибриОС(?)
              80 –— лунтикс

              Насколько я ёбнутый?
              Ответить
              • показать все, что скрытоvanished
                Ответить
              • Наглухо.

                0, 3, 5 –— энто исключения (тут вроде понятно, почему).

                9 наглухо привязано к IRQ1 –— это прерывание (к IRQ0...IRQ7 привязаны соответственно INT 8... INT 0F). IRQ с большими номерами засунуты в какую-то жопу (что-то типа INT 70h, уже точно не помню).

                То, что выше 0Fh –— это программные прерывания.

                Кстати, функция ah=0 у INT 16h не работала с клавишами F11, F12 и прочими, которых нет на IBM XT. Для полноценной работы с клавиатурой нужно было звать ah=10h.

                Сейчас ещё что-нибудь вспомню...
                INT 31h –— DPMI. Это чтобы выделять память из программ зощищённого режима.

                INT 28h —– фоновое прерывание для кооперативной многозадачности.

                INT 15h –— функции PS/2, которые позже были задействованы в рахит-тинктуре ATX.
                Ответить
                • > в какую-то жопу
                  Куда ремапнешь там и будут.
                  Ответить
                • показать все, что скрытоvanished
                  Ответить
                  • Точно! Его напрямую нельзя было использовать именно по этой причине.

                    На текущий момент ты здесь самый ебанутый.
                    Ответить
                    • показать все, что скрытоvanished
                      Ответить
                      • Интересно, закончится ли эта питушня?

                        В библиотеках можно всё замазать константами, в JS - и вовсе в клиентский код не допускать чисел:
                        var ERROR = {FILE_NOT_FOUND: {}}; // старые версии
                        const ERROR = {FILE_NOT_FOUND: Symbol('file not found')}; // ES2016+


                        ASCII-коды наверно останутся как последняя питушня, которую скорее всего так просто от программиста не скроешь. Как минимум, на клавиатуре через Alt набирать придётся.

                        А придумают ли что-то новое для задротов, чтобы числа запоминали?
                        Ответить
                • Выделил память тебе за щеку. Проверь.
                  Ответить
      • "Процессор" ничего не знает, он просто исполняет инструкции и течёт. Именно поэтому я за "процессор".
        Ответить
      • показать все, что скрытоvanished
        Ответить
        • В микрокод?
          Ответить
          • Кстати, а можно ли писать программы в микрокоде? Не люблю много уровней обструкции, чувствую себя каким-то BblcoKoypoBHeBblM_nemyxoM.
            Ответить
            • Маловероятно.

              Сделай свой проц с микрокодом и пиши на нём. Хотя, если ты можешь делать проц, то нафиг тебе микрокод? Лишняя абстракция.
              Ответить
              • Меня интересуют широко распространённые рахитектуры, типа x86. Интересно, если бы можно было, были ли бы какие-нибудь возможности которых не было бы для простой программы, или просто бы получилось непереносимое говно?
                Ответить
                • Была статья, где микрокод древнего АМД реверсили (К6 кажется), когда ещё не было всех этих подписей и шифрований. Добудь себе такой да поиграйся.

                  Но мне кажется, что ничего принципиально нового там не запилить. Разве что какую-то более эффективную инструкцию удастся сложить из кусков других.
                  Ответить
                  • Нашёл про K8:
                    https://securiteam.com/securityreviews/5FP0M1PDFO/

                    > ничего принципиально нового там не запилить
                    Ну почему? Вот, например, установка хука на ассемблерную инструкцию из "JavaScript":
                    https://hsto.org/r/w390/webt/gx/af/w9/gxafw9lfzweuvhrirvuwf_qfbu0.png
                    (Лол, это реально работало? Какой багор))))
                    Ответить
                    • Нет, я напиздел, это только вызов хука.
                      Картинка отсюда: https://m.habr.com/ru/post/427757/

                      А источник:
                      Philipp Koppe. Reverse Engineering x86 Processor Microcode // Proceedings of the 26th USENIX Security Symposium. 2017. pp. 1163-1180.

                      Надо бы читнуть.

                      ЗЫ. что значт "use asm"?
                      Ответить
                      • Заманчива реализация интерпретатора шитого кода в мокрокоде. Только вот эти все подписи мешают. Заебли со своей безопасностью. Вот в "DOS" на 8086 не было никакой безопасности. Именно поэтому я за "DOS".
                        Ответить
                        • > шитого кода
                          Сделай себе проц, который напрямую исполняет шитый код. Вроде ничего сложного, если под FPGA.
                          Ответить
                      • > что значт "use asm"?
                        Какое-то говно, накостыленное поверх js.
                        Ответить
                    • >> Поэтому Intel и AMD стали строить свои процессоры с применением технологии микрокодов. Intel – начиная с Pentium Pro (P6), выпущенного в 1995 году. AMD – начиная с K7, выпущенного в 1999 году.

                      Значит, я не ошибся. В «K6» никакого микрокода нет, именно поэтому я за «K6».
                      Ответить
                  • В те времена, когда для P6 (Pentium Pro и Pentium II) уже выходили обновления мокрокода, владельцы AMD K6 про мокрокод ничего не слышали.

                    На AMD первые обновлялки появились позже. Для K7?
                    Ответить
            • показать все, что скрытоvanished
              Ответить
              • Ещё там очень мало места под патч для микрокода. А сам микрокод намертво зашит в проц.
                Ответить
              • > API для заливки там не документированное
                Вполне документированное, проверь. Все операционки его юзают.

                А вот формат самого блоба - да, не документирован.
                Ответить
    • https://govnokod.ru/26076
      Ответить
    • Последний раз bormand говнокодил 9 Января 2019. Больше года прошло.
      Ответить
      • HanoMuHal0LLLuu_nemyx
        Ответить
      • Он даже не программист
        Ответить
        • Он даже не является членом ополчения!
          Ответить
          • Дальше вы не программист пока не получите бумаги.
            Ответить
        • А кто? Админ?
          Ответить
          • Стой, чужеземец. Я - Лотар. Программист короля ... *Как я могу получить программы, как у тебя?* ... Что-о? Я сочту это оскорблением. Ты даже не являешься переменной окружения. Ты даже ... Не программист ... ты не методист. Даже ... *атеист* ... Не программист ... Не программист ... Ты не программист ... Даже ... *онанист* ... Не программист! *Хорошо, объясни мне, как я могу стать программистом этого сервера?* Программистом может считаться тот, кто суппортит постоянный продакшн. Сюда стали пускать отбросы общества, вроде тебя. Невероятно! Такого не случалось уже долгие века! Наш менеджер, лорд Хаген, велел мне объяснять новоприбывшим новые законы. *Где я могу найти лорда Хагена? Этому серверу угрожают XSS-ы* Ха-ха-хаха-ха ... XSS-ы? Ты даже сам в это не веришь! Это не может быть правдой! В это трудно поверить. Если я еще хоть раз услышу, что ты рассказываешь людям об XSS-ах, у тебя будут проблемы! Тебе всё ясно? В Хоринисе ты можешь чувствовать себя в безопас... *Но я должен увидиться с лордом Хагеном* Ты вообще слушаешь меня? *Я пришёл, чтобы изучить путь линукса!* Я предупреждаю тебя! Не программист ... ты не методист. Даже ... Лорд Андре ... Не программист ... Не программист ... Ты не программист ... Даже ... Лорд Хаген ... Не программист! *Как мне зайти на сервер под рутом?* Достаёт тяжелую клавиатуру
            Ответить

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