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

    +142

    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
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    94. 94
    95. 95
    96. 96
    97. 97
    98. 98
    99. 99
    main()
       {
       j=atol("776677"); c=0;
      gb=65500;  /*гран буф не>65500!*/
      gp=gb+65500;
       c=PA();
       vm = v_mod(0x0f00)&0x00ff;
       if((vm!=2) && (vm!=3) && (vm!=7))   v_mod(3);
       if(vm==7) v_m=MK_FP(0xB000,0); /* присвоить адр в-памяти */
       else   v_m=MK_FP(0xB800,0);
       if(c==0) {printf("Самопроверка программы неудачна."); dely(9);}
       gek=calloc(1000,sizeof(int));
       bufa=farcalloc(4000,sizeof(long));
       bfk=calloc(4000,sizeof(int));
       ok=calloc(800,sizeof(char));
       st=calloc(10,sizeof(char));
       bufv=calloc(4000,sizeof(char));
     if((gek==NULL)||(bufa==NULL)||(bfk==NULL)||(ok==NULL)||(st==NULL)||(bufv==NULL))
    	  {
      printf(" Неудачное выделение памяти для основных буферов.\n");
      printf(" Программа не выполняется.");
    	 dely(9); exit(1);   }
       for(x=0;x<4000;x++) {bufa[x]=0L;bfk[x]=0; /*занул буф адресов и кодов */
       if(x<10) st[x]=0x00; /*буф для выв чисел на экр*/
       if(x<26) urov[x]=1;
       if(x<20) {abn[x]=1; aba[x]=2L;}} /*мин адресa абс ном строк и нач загр буф*/
       if(x<128) B0[x]=0;
       ur=vv=avt=in=0; i=N=0; zap=0;x_=1;
       ifm=10;/*10,01,11,12,21 - 1:п/панель записей,0-инф п/панель,12,21-2 базы*/
     /*  vctp(3);*/
       mou(0);   kur(0);
      okn=0; /*сбр инд сохр-х окон*/
      v_mod(0);
       nok1=16;
      SET();   ch=pal[0];
      textbackground(BLACK);
       clrscr();
      okno(0,2,ch,ch);
      window(1,1,80,25);
      okno(16,2,ch,ch);
      nstr(1);
      baz=1;
      nfl="0.cry ";
      F_place("10.cry");
      kzo();
      prx=3; /*нейтраль*/
      for(vm=4000;vm<8000;vm++) v_m[vm]=0; vm=0;
      /*vm-далее кол-во стр загр буф*/
      ppan(0,0);
      form_kod(2);/*чт genko*/
       attr=pal[5];  vdl(a+1,y_,a+36,y_,0,0);    /*сох атр  бывш стр*/
       vctp(0);
      tit();
      if(zap!=0) nstr(2);
      ZA[0]='\0';
      za=strlen(MPR);
      strcat(ZA,MPR);if(za>3) strcat(ZA,"\\");  strcat(ZA,"save.com");
      za=0; if((access(ZA,0)!=-1))  za=1; /*ZA-путь savera*/
      /**************/
      for(;;)
          {
          mou(1);
           ch=get_char(1);
    	if((ch<48)||(ch>57))  /*кроме цифр*/
    	 if((ch!=0xfe)&&(ch>0x20)&&(f_kl==0)) {printf("\7"); ch=0;}
    	mou(2); mus(a); /*ориен мыши*/
    	if((ch==TAB)||(ch==RIGHT)||(ch==LEFT))
    	  tab();/*порядок не менять*/
    	if(ch==15) { ctrl(); tab();}
    	mus(a); mus(101);
    	if(ch==F7)   gl_poisk(0);
    	if(ch==AF7)  gl_poisk(1);
    	if(ch==F1) hlp();
    	if(ch==CTRL) ctrl();
    	if((ch==AF1)&&(Pp==1)) ctrl();
    	if((ch==AF2)&&(Pp==0)) ctrl();
    	if(ch==32) exr(0);
    	if(ch==AF3) exb();
    	if(ch==AF4) exr(1);
    	if(ch==UP)   { cm=0; up(1);}
    	if(ch==DOWN) { cm=0; down(1); }
    	if(ch==PGUP) { cm=0;scroll(0,0);}
    	if(ch==PGDN) { cm=0;scroll(1,0);}
    	if(ch==HOME) { cm=0;scroll(0,4000);}
    	if(ch==END)  { cm=0;scroll(1,4000);}
    	if(ch==F5)   kon(1);
    	if(zap==0) /*ес зп разреш*/
    	{
    	if(ch==INS)  { s=0;
        if((chkm(3)!=0)||(chkm(4)!=0)) {s=1;
     coo(0,0x4E,0xCF,"","Предельная длина файла!",
     "Разрешено только удаление!",""," Выход");}
        if((chkm(1)!=0)||(chkm(2)!=0)) {s=1;
     coo(0,0x4E,0xCF,"","Исчерпана длина буфера!",
     "Сохраните набранную информацию,","после чего можно продолжить.",
     " Выход");}
    	 if(vm==4000)
    {coo(0,0x7f,0x70,"Количество записей в списке достигло 4000.",
    "","В данном случае возможно только удаление",

    Это один знакомый слесарь ЭВМ писал прогу для создания/редактирования/просмотра самопальной древовидной БД, для своих нужд, с тем условием, что работать она должна была чуть ли не на i286, и грузилась не более 2х секунд. Недавно он обратился ко мне с просьбой перенести её под линь, но увидев это я решил что такое жить не должно, поэтому просто писал аналог с нуля, на плюсах, но справедливости ради, замечу что моя прога вышла чуть тормознее:).
    Полный код к сожалению не влез, вот он: http://ideone.com/3sLsa.
    P.S. Авторское форматирование сохранено.

    Запостил: suc-daniil, 23 Августа 2012

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

    • _
      Ответить
    • не виж ничег криминальн , по-мойм абсол нормал код
      Ответить
    • Интересно, что происходит в голове у человека, который таким образом форматирует код?
      Кон цкл.
      Ответить
      • КР. - сестр. тал.
        Ответить
        • просто человек заботится ещё и о скорости компиляции: убирает лишние пробелы и сокращает имена
          Ответить
          • Заодно ещё и код обфусцировал:)
            Ответить
            • Такому обфускатором только и работать.
              Ответить
              • Ещё одно доказательство http://www.insidecpp.ru/art/45/ (Хороший технарь ≠ хороший программист)
                Ответить
    • Так вот кто был прототипом Вонни...
      Ответить
    • Я в его исходниках даже не сразу мог определить где начинается и где кончается какая-нибудь функция
      Ответить
    • if((ch==TAB)||(ch==RIGHT)||(ch==LEFT))
      	  tab();/*порядок не менять*/

      Вот это заинтриговало. Как тут что-то может зависеть от порядка?
      Хотя, по-видимому, это касается последующих строчек вида if(ch == ...). Если ch - глобальная переменная, то процедуры обработки могут ее менять, так что сработает сразу несколько ифов.
      Ответить
      • Это микрооптимизация, действите tab() предполагается делать, если человек нажал TAB или -> или <- НО чаще всего человек будет нажимать именно TAB (потом - "->", потом - "<-") так что вторые 2 условия проверять не прийдется. В общем, чувак очень сильно позаботился о быстродействии :-)
        Ответить
        • Я же писал, он делал прогу так, чтобы на 10000 записях в базе на i286 грузилось не более 2х секунд. Как видно, суровые оптимизации коснулись не только загрузки и обработки...
          Ответить
    • main()
      {
      j=atol("776677");

      Интересный способ инициализации переменных
      Ответить
      • Интересно, чем это вызвано?
        Ответить
      • Кстати нечто подобное есть в .net для типа BigDecimal. Т.к. большие числа нельзя представить обычной константой, приходится парсить из строки.
        Ответить
        • Ну тут программа 16битная...
          Видимо или TurboC не поддерживало суффикс L для лонгов (очень маловероятно), или автор программы об этом просто не знал, потому и поюзал atol("776677") вместо 776677L.
          Ответить
    • Все исходники можно посмотреть?
      Ответить
      • Конечно, нахрена читать чужие комменты
        > Полный код к сожалению не влез, вот он: http://ideone.com/3sLsa
        Ответить
        • Я читал. Я не был уверен что это все.
          Ответить
          • Я понял, о чём ты, ideone.com отрезает низ файла, для того, чтобы увидеть всё - надо нажать copy to clipboard, а потом ctrl+v куда хочешь
            Ответить
          • Судя по внезапному концу на 1658 строке, это и есть не все.
            Ответить
          • Приношу свои извинения.
            Ответить
    • Ежели найдутся такие извращенцы, которые захотят собрать сие чудо, собирать его надо под Borland Turbo C(если я правильно помню) не знаю какой версии, и ещё понадобится <dos.h>, я не в курсе, может он идет в комплекте с Turbo C, в общем хз. Заранее замечу, что код полностью рабочий.
      Ответить
      • некрофилия на уютненьком?
        Ответить
        • А вдруг приспичит? И вообще - прога угарная. Кстати, ты много программ знаешь, которые при запуске проводят самопроверку на заражённость (которая даёт верные результаты в ~80% случаев) и в случае заражения программа немедленно падает выдав соответствующее сообщение?
          Ответить
          • Фаронов для турбопаскаля такую хрень писал.
            Линкуешь модуль, при первом запуске прога запоминает своё состояние, при последующих проверяет.

            Но имело смысл только на однозадачных системах, имхо.
            Ответить
            • Имеет смысл если «слепки состояний» хранятся отдельно в БД и контроль осуществляет
              некий системный механизм.
              Во всех остальных случаях, в чём гарантия что не модифицирована алгоритмика валидации слепка состояния программы?
              Ответить
              • Если злоумышленник намеренно модифицирует механизм контроля - он и с БД справится. Этот способ все-таки от вирусов, которые не подозревают о существовании данной проверки (а таких большинство, если проверка не будет юзаться почти во всем софте).
                Ответить
                • > Если злоумышленник намеренно модифицирует механизм контроля он и с БД справится
                  'контроля' — системные механизмы или 'самоконтроля' — механизм конкретного приложения?
                  Вы имеете ввиду «подделать» какой-нибудь, например, 1024байтный хешкод слепка состояния?
                  Может легче ночью с фомкой прийти?
                  Ответить
                  • > например, 1024байтный хешкод слепка состояния
                    Да вообще-то и 512бит хватит для всех.

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

                    А в остальных 99% случаев от залетного вируса сработает и банальнейшая самопроверка с дохленьким CRC32. Принцип "Неуловимого Джо".

                    P.S. А вообще сейчас эти самопроверки неактуальны. Из последних файловых вирусов вспоминается разве что sality.
                    Ответить
            • Во, нашел это "решение".
              http://pastebin.com/G8pSQEje
              Ответить
              • ChkSum : Word; {Контрольная сумма всех слов файла}

                самое смешное
                Ответить
                • Включая его самого? ;)
                  Ответить
                  • да какая разница-то? это ж просто сумма, без всяких эффектов

                    поясняю: смешно то, что поле есть, но никто его не использует (если я правильно понял, этот велосипед прячет копию своего заголовка в .data)
                    Ответить
                    • > это ж просто сумма, без всяких эффектов
                      Окай, пусть сумма всех слов кроме ChkSum равна 1, подберите значение ChkSum, чтобы сумма всех слов файла, равнялась ему. Problem?

                      > смешно то, что поле есть, но никто его не использует
                      Не смешно. Это стандартный заголовок экзешника. Как говорится 'из песни "бля" не выкинешь'.

                      P.S. Если вы о том, что после "заражения" файла не пофиксили контрольную сумму, то ЕМНИП ноль там вполне допустим (в windows чуть более чем все экзешники с нулями, хотя там и формат другой).
                      Ответить
                      • для двух минуснувших двоечников задача:
                        [i]Петя, Вася и Маша хавали ништяки. Петя захавал 6 ништяков, Вася - 8. Сколько захавала Маша, если известно, что было всего захавано 7 (mod 16) ништяков?
                        Ответить
                        • > для двух минуснувших двоечников
                          > Сколько захавала Маша
                          Очевидно, что 9. Но это совершенно другая история. Я ведь не зря два раза писал про весь файл. Т.е. весь файл, включая само поле с контрольной суммой.

                          Правильная задача на данную тему: дан файл
                          xx 01 01 FF
                          Проставьте вместо xx такой байт, чтобы он равнялся сумме всех байтов этого файла по модулю 256. Не проставите - слив засчитан. Время пошло.
                          Ответить
                          • FEh
                            судя по минусу, время уже вышло, наверное не успею написать почему так ;-)
                            Ответить
                            • 0xFE+0x01+0x01+0xFF = 0xFF mod 0x100
                              0xFF != 0xFE

                              FAIL.
                              Ответить
                              • http://ideone.com/7SWPv
                                Даже если сменить функцию вычисления checksum на xor, то таже картина.
                                crc8 checksum я даже пробовать не буду.

                                (Как бы не в функции дело, а хотелось побитоёбить на Хаскеле)
                                Ответить
                          • Мой гумнответ:
                            http://ideone.com/xxHAE
                            fear l = [i | i <- [0..255], i == (foldl (+) 0 (i:l)) `rem` 256]
                             
                            main = print $ fear [1,1,255]

                            Что-то мне подсказывает, что я где-то накосячил
                            Ответить
                            • Код вроде корректен, по крайней мере он выдал правильный ответ. Но задача не имеет решения ;) Поэтому мне было смешно на фразе "Контрольная сумма всех слов файла" (подразумевается, что в число этих слов входит и сама контролька), я и написал тогда ту фразу:

                              > Включая его самого? ;)

                              К сожалению guest никак не может\не хочет это понять.
                              Ответить
                            • нет, код должен не брутить уравнение, а гуглить этот древний алгоритм
                              Ответить
                              • Я вижу: код вы поняли.
                                Вы далекий человек от функционального программирования? Мне просто интересно, насколько функциональный код понятен далёким людям?
                                Ответить
                                • Паршиво, честно говоря. Вопрос, конечно, был не напрямую ко мне, но я тоже от ФП далёк.
                                  Ответить
                        • > всего захавано 7 (mod 16) ништяков
                          > 7 (mod 16)
                          Что за не популярная нотация? Так выглядит, как будто функция 7 принимает в качестве параметра функцию mod с одним захваченым параметром и одним свободным. (mod 16). При условии, что mod - остаток от деления.
                          Ответить
                          • > Что за не популярная нотация?
                            Самая обычная математическая нотация, когда справа от выражения приписывают (mod N).
                            6 + 8 + x = 7 (mod 16)
                            Ответить
          • Я немного не в теме обсуждения, но как мсье предлагает проверять "заражённость"? И, главное, под какую платформу.
            Ответить
            • Проверка модифицированности собственного бинарника. В принципе должно работать под любой осью, где можно открыть файл ;) Но в данном случае прибито гвоздями к DOS.
              Ответить
              • Ну так это же не выход. Более-менее годный выход начинается только когда читать свою память, искать в ней подозрительные int 3. Ну или блоки проверять на некую "подпись". И то, далеко не панацея.
                Читать что угодно с винта, как бы выразиться помягче. Когда у меня однажды встала задача примерно такой же направленности, я сказал "да ну его" и забил. Это время потраченное впустую, не даст ровным счётом ничего.
                Ответить
                • В те времена вполне хватало:)
                  Ответить
                • > блоки проверять
                  только не блоки, а сегменты/секции. очевидно, что ресурсы хешировать не нужно
                  Ответить
                  • Это уже монопенисуально, как назвать некий блок информации. Само собой, это может быть страница, которая относится к исполняемому коду и помечена как исполняемая. Очевидно, что строки и ресурсы (как и секция данных, стек и ещё кое-что, типа гвард страниц) не будут иметь привязки к сегменту кода и не будут иметь исполнимых пометок страницы и их обрабатывать не надо. Как-то так.
                    Ответить
                    • две большие разницы, что контролируется - целостность исполняемого образа в памяти или на диске
                      теоретически, в памяти получится секурнее
                      Ответить
          • в дос таких полно было, и даже была тулза для "вакцинации" произвольных бинарей и бутсекторов

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

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