1. Java / Говнокод #15612

    +65

    1. 1
    grade : 100 >= "A" >= 90 > "B" >= 80 > "C" >= 70 > "D" >= 60 > "E" >= 0;

    Кто-нибудь догадается, что сие может значить? :)

    Запостил: parzh, 28 Марта 2014

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

    • Сие значит следующее: "bad operand types for binary operator '>='"
      Ответить
      • Классный ник.
        А вообще, сие - конечно же плод моего воображения. И это сие призвано, чтобы было проще записать систему оценивания американского типа (ABCDE).
        Естественно, сие не работает.
        Ответить
        • > Классный ник.
          А еще у него блатной id :)
          Ответить
          • Борманд, не подскажете, как осуществить поиск сигнатуры в бинарном файле? Сигнатура представляет собой последовательность байтов(4). Пытаюсь в цикле читать с помощью CreateFile/ReadFile/SetFilePointer, проверяя флаг No_error, но указатель почему-то сразу смещается на конец файла. Обязательно ли юзать CreateFileMapping?
            Ответить
            • > Обязательно ли юзать CreateFileMapping?
              CreateFileMapping юзать можно для удобства - чтобы работать с файлом как с массивом в памяти, и не париться с read'ами. Тебе решать.

              > Указатель почему-то сразу смещается на конец файла
              Х.б.з. Не должен. Проверяй код ;)
              Ответить
              • > > Указатель почему-то сразу смещается на конец файла
                такое обычно происходит при открытии файла с append
                Ответить
                • не, я открываю с флагами open_existing. Видимо, проблема в том, как я читаю файл - уже решил с помощью CreateFileMapping. Теперь я просто инкрементирую указатель и читаю файл по битам. Но теперь возникла новая проблема: как считать сразу несколько байтов, и поместить их в переменную? Как вот такой набор байтов (к примеру) : $00,$2e,$8d поместить в 1 переменную, скажем, в массив, чтобы его можно было использовать как сигнатуру? Пытался использовать pbytearray, ни к чему не привело.

                  Никто мне не обязан помогать, я понимаю это, но если у кого-то возникнет желание поделиться опытом, я с радостью приму это. Скажу лишь в свое оправдание, что пишу не вредоносную прогу.
                  Ответить
                  • В делфе нет какой-нибудь функции, которая ищет pchar в pchar? Если есть - тупо вызови ее на замапанном файле.

                    P.S. Хотя тут могут быть проблемы с завершающим нулем. Походу я поторопился.
                    Ответить
                    • т.е. byte можно приводить к pchar?
                      Ответить
                      • Все-таки не стоит, оно же null terminated :( Минусуй тот коммент, я затупил.
                        Ответить
                        • Спасибо. А как же мне прочитать несколько байт из файла, и при этом не вылезти за пределы?
                          Вот, что я сейчас имею(далеко не айс):
                          var
                            nfile,hfilemapping:thandle;
                            nsize:cardinal;
                            p:pointer;
                            pb:pbyte;
                            i:integer;
                            ba:array[0..3] of byte;
                            mem:pointer;
                            read:cardinal;
                            signature:array[0..3] of byte;
                          begin
                          
                            signature[0]:=$4D;
                            signature[1]:=$5A;
                            signature[2]:=$50;
                            signature[3]:=$00;
                          
                          
                          
                            nfile:=CreateFile(pchar(paramstr(0)),generic_read,file_share_read,nil,open_existing, 0,0);
                            if nfile=invalid_handle_value then exit;
                            SetFilePointer(nfile,0,nil,file_begin);
                            nsize:=getfilesize(nfile,nil);
                          
                            hFileMapping:=CreateFileMapping(nFile, nil, PAGE_READonly, 0, 0, 'Iirmapping!');
                            if hFileMapping=0 then exit;
                            p:=MapViewOfFile(hFileMapping,FILE_MAP_READ,0,0,0);
                          
                            pb:=pbyte(p);
                          
                          
                          
                            for i:=0 to nsize-5 do
                            begin
                              ba[0]:= pb^;
                              inc(pb);
                              ba[1]:= pb^;
                              inc(pb);
                              ba[2]:= pb^;
                              inc(pb);
                              ba[3]:=pb^;
                          
                              if comparemem(@signature,@ba,3) then
                              messagebox(0,'',pchar(inttostr(i)),0);
                              Inc(pb);
                            end;
                          
                           // UnMapViewOfFile(p);
                          //  closehandle(nfile);
                          //  closehandle(hFileMapping);
                          
                            end;
                          Ответить
                          • Ну ты можешь comparemem гонять прямо на замапаном куске, не копируя байты. Или не получится?
                            Ответить
                            • Блядь,что за мудоебизмом вы страдаете. На сишке уже бы 100 раз написали.
                              Ответить
                              • Хм.
                                Кстати, я давно уже заметил, что сишный код мне вроде бы понятен (в отличие от c++ и js). Единственное, что плохо - обилие всяких wsprintf,strcat,cout.
                                Ответить
                                • cout из крестов.
                                  Ответить
                                • За это мне микроконтроллеры нравятся. Особенно более-менее убогие. Сишный код без крестов и свои велосипеды вместо всех этих wsprintf.
                                  Ответить
                                  • > Сишный код без крестов и свои велосипеды вместо всех этих wsprintf.
                                    Ну тогда еще не подключай *.h с описаниями портов и регистров ;)
                                    Ответить
                                    • Одно дело регистры, другое - убогая сишная библиотека с именами функций на которые нельзя смотреть без кровавых слез, неочевидными параметрами и переполнениями буфера на каждом шагу.
                                      Ответить
                                  • Царь?
                                    Ответить
                            • Получится, получится! ;)
                              Признаться честно, я так делал, но меня мучали сомнения. Теперь я уверен, что не лажа.
                              Ответить
            • >поиск сигнатуры
              /0? Сигнатура обычно расположена по известному оффсету.
              Ответить
              • Это так. Но я хочу искать нужную последовательность байтов по всему файлу.
                Ответить
                • Тогда ты используешь ее не по назначению.
                  Ответить
                  • Что именно я использую не по назначению?
                    Ответить
              • > Сигнатура обычно расположена по известному оффсету.
                Который, тем не менее, вполне может плавать по файлу и вычисляться в зависимости от каких-то полей в заголовке экзешника (если это файловый вирус).

                Ну хотя в тех же троянах, которые тупо копируют свой файл, оффсет меняться не будет. Их можно вообще по sha-* или md5 ловить.
                Ответить
              • Во всяких .rar сигнатура может быть где угодно (что делает rarjpeg возможным).
                Ответить
                • В .rar сигнатура только в начале файла. А вот в самораспаковывающихся архивах - после распаковщика, поэтому архиваторы ищут ее по всему файлу, что и позволяет делать раржпеги.
                  Ответить
                  • copy /b file1.jpg+file2.rar result.jpg
                    Сохрани как *rar,сын мой и открой в архиваторе: О, ЭТО РАБОТАЕТ!!!

                    Теперь переименуй и открой в паинте. ~Профит~
                    Ответить
                    • К чему?
                      Ответить
                      • Ну, я хотел сказать, что архиватор ищет 2 сигнатуры: начало архива и его конец, и работает только с блоком данных между ними. Архив можно в гекс-редакторе поместить в середину любого файла, архиватор один хуй его оттуда выцарапает.
                        Ответить
        • > Естественно, сие не работает.
          Но это может быть комментарием.
          Или надо выбирать менее строгий язык, скажем, C.
          Ответить
          • 1.c:2:17: warning: comparison between pointer and integer [enabled by default]
                 grade : 100 >= "A" >= 90 > "B" >= 80 > "C" >= 70 > "D" >= 60 > "E" >= 0;
                             ^
            1.c:2:17: warning: comparison with string literal results in unspecified behavior [-Waddress]
            1.c:2:17: warning: comparisons like ‘X<=Y<=Z’ do not have their mathematical meaning [-Wparentheses]
            Но собрало ;)
            Ответить

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