1. C++ / Говнокод #27371

    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
    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
    #include <iostream>
    #include <fstream>
    using namespace std;
    //ifstream in("C://Users//Илья//Desktop//calc.exe", ios::binary);
    ifstream in("C://Users//Илья//Desktop//kernel32.dll", ios::binary );
    ofstream out("D:\\hello.txt");
    void printhex(int position, int size) 
    {
        int *A = new int[size];
        int n = 0;
        in.seekg(position);
        for (int i = 0; i < size; i++)
        {
            n = in.get();
            A[i] = n;
        }
        for (int i = (size-1); i >= 0; i--)
        {
            printf("%02X", A[i]);
        }
        cout << endl;
    }
    
    int printdec(int position, int size)
    {
        int* A = new int[size];
        int n = 0;
        int result = 0;
        in.seekg(position);
        for (int i = 0; i < size; i++)
        {
            n = in.get();
            A[i] = n;
        }
        for (int i = (size-1); i >= 0; i--)
        {
            result = result * 16 * 16 + A[i];
        }
        return result;
    }
    
    int main()
    {
        char c;
        int n;
        unsigned int n1 = 0;
        in.seekg(60); //положение байта, содержащего значение смещения;
        n1 = in.get();
        printf("%02X", n1); //вывод смещения;
        cout << endl;
        in.seekg(n1); //положение подписи (PE);
        for (int i = 0; i < 4; i++) 
        {
            c = in.get();
            cout << c; //вывод подписи (PE)
        }
        cout << endl;
        int numb_of_sect = printdec(n1 + 6, 2);
        cout << numb_of_sect << endl;
        printhex(n1 + 24, 2);
        printhex(n1 + 24 + 28, 4);
        printhex(n1 + 24 + 28 + 68, 4);
        int adr = printdec(n1 + 24 + 28 + 68, 4);
        cout << "-----------------" << endl;
        if(adr==0) //проверка наличия таблицы экспортов;
        {
            cout << "The export table is missing." << endl;
        } 
    }

    Запостил: MyLogin1, 22 Апреля 2021

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

    • > int *A = new int[size];

      new есть, delete нет. Утечка памяти
      //
          for (int i = 0; i < size; i++)
          {
              n = in.get();
              A[i] = n;
          }
          for (int i = (size-1); i >= 0; i--)
          {
              printf("%02X", A[i]);
          }

      На-ху-я? Почему нельзя из ifstream вычитывать байтики по размеру int и их принтф-ать? Почему указатели надо выводить именно как int, может лучше взять какой-то другой тип, который бы характеризовал размер указателя на целевой платформе?
      Ответить
      • Короче, выглядит как типичный студентокод.
        Ответить
        • > студентокод

          Угу, в продакшене я просто беру питон, ставлю либу для парсинга PE и теку. Ещё не хватало на няшной или крестах эти структуры ковырять в сотый раз...
          Ответить
          • > парсинга PE
            > парсинга
            жутко бесит эта скриптушиная терминология
            Ответить
    • какой C++03, Ильюха
      Ответить
    • > //Илья//Desktop

      - палево!
      Ответить
    • ios::binary

      какая венда )))

      да-да, шутка за три рубля
      Ответить
    • > D:\\
      > C://
      Это работает нямного ня так.
      Ответить
      • слеш и шифт для ввода, а бэкслеш и бэкшифт - для вывода
        Ответить
      • Да оно и так должно отработать, ядру то пофиг на направление слешей, к ним в основном древние тулы придираются.
        Ответить
        • cmd пофиг на направление слешей, если они — не первый символ в слове. Иначе он может считать его началом опции.

          rem OK
          cd /D D:/MyFiles
          
          rem OK
          cd /D D:///////////////
          
          rem FAIL
          cd /downloads
          
          rem OK, will fail if you use any command with /W switch
          cd /warnings
          Ответить
          • rem Windows 7
            D:\>cd /!
            
            D:\!>cd /
            
            D:\>dir /!
            Недопустимый ключ: "!".
            Ответить
            • В винде по-моему каждая утилита говнокодила свой вариант парсинга опций. Поэтому некоторые просто пропускают не-оции как аргумент, а некоторые жалуются. Поэтому "может". Хотя корректней было написать не cmd, а "стандартные утилиты командной строки". cmd опции не парсит, от просто разбивает строку на аргументы.
              Ответить
              • > разбивает строку на аргументы

                Сомневаюсь... В виндовую точку входа, емнип, целиком строка прилетает. Да и при запуске приложения тоже строка.

                Т.е. разбивает и парсит уже или сишный рантайм или сам программист.

                З.Ы. Насколько помню, в винде даже звёздочки раскрывает не шелл, а сама прога.
                Ответить
                • Хотя некоторые программы, как я понимаю, звездочки раскрывают сами (apt, convert). Не знаю, как это сделано.
                  Ответить
                  • > apt, convert

                    Речь про винду вроде... В линсуке shell и тильды в ${HOME} превращает, и глобинг делает.
                    Ответить
                  • А очень просто, если шелл не находит файлов под указанную тобой маску, он отдаёт проге параметр как есть, со звездой. У меня так rm -rf * в одном скрипте случился. Благо только он сам и суициднулся.

                    З.Ы. Ну либо если ты явно закавычишь, запретив ему раскрывать глобы.
                    Ответить
                    • Ну да, если глобинг провалился, то вместо пустого списка (что было бы логично) баш выдаёт паттерн как есть. Какое удобство )))
                      Ответить
                      • Ага, и нужно включать специальный костыль чтобы for по глобу не делал итерацию со звездой когда файлов не найдёт. Заебись язык, интуитивный.
                        Ответить
                    • А я думал, там это специально. Типа
                      alias apt bash -noglob apt-get
                      или как это правильно делается.

                      Тогда может забавно получиться...
                      $> apt -s install *foobar*
                      Note, installing foobar-dev
                      $> mkdir my_foobar_program
                      $> apt install *foobar*
                      Cannot find package 'my_foobar_program'
                      Ответить
                      • Я думаю никто пакеты по звезде не ставит...

                        З.Ы. Проверила на apt list. Именно так и багует: шелл видит файлы в текущем каталоге, отдаёт их список апту, а апт пытается их искать в репе. Т.е. никакой специальной магии нету, по крайней мере в убунте. С кавычками вокруг паттерна шелл не раскрывает, как и ожидалось.
                        Ответить
                        • возможны джва кейса:
                          • название пакета такое что пальцы себе сломаешь
                          • родственные пакеты

                          ну как бы надо конечно первым делом apt-get install synaptic && exit
                          Ответить
                          • • как там его, то ли пикутэ, толи купитэ, короче, -s найди что-нибудь похожее.
                            Ответить
                            • считается, что в прыщесуппозиториях богатство выбора, но на самом деле когда они как пылесос тащат к себе всё подряд - они сами себя дрючат атакой index pollution

                              была какая-то костыльная инициатива - метапакажи, но вроде ни к чему не привело
                              Ответить
                          • >synaptic
                            sudo apt чтобы мышкой программы ставить.*
                            Ответить
                        • Это вы еще паттрены аптитуда не видали
                          https://www.debian.org/doc/manuals/aptitude/ch02s04s01.en.html
                          Ответить
                      • touch myfoobarshit
                        apt install *foobar*


                        какой багор )))
                        Ответить
          • винда даже не разбивает ничего
            и вообще виндоключи и в целом обработка command tail это не более чем набор разношерстных конвенций
            причем больмень консистентно только в пределах одного компонента например cummand.cum или pk[un]zip enterprise

            алсо
            explorer /select,"!.!"
            Ответить

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