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

    −1

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    //"вирус" в стиле кулхацкеров
    #include <stdlib.h>
    int main() {
    int i = 1;
    while( i == 1)  {
    	system("start calc");
    }
    return 0;
    }

    Запостил: pozhiloy, 22 Апреля 2019

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

    • шутки за трисита
      ржали всем девятым бэ
      Ответить
      • триста? АБСТРАГИРУЙСЯ ОТ СУЕТЫ ДОСТИГНУВ С КОСМОСОМ ЕДИНСТВА, О КАК! (шутки за 150 ващет)
        Ответить
    • Какой анскилл )))
      Ответить
    • Оптимизировал. Заодно программа кроссплатформенной стала:
      #include <stdlib.h>
      void main(int argc, char** argv) {
          system(*argv);
      }

      P.S. Кобенатор неподвижной программы.
      Ответить
    • В С++20 завезли корутины
      Ответить
    • var
      i:DWORD;
      begin
      for I:=0 to MaxInt do
      MessageBox(I, nil,nil,0);
      end.

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

        все хендлы закрываются после закрывания программы
        Ответить
        • Попробуй. Просто попробуй.

          Тут дело даже не в хэндлах, а в смене владельца окна. Код перебирает хэндлы и вызывает MessageBox для окон всех уровней и типов. Таким образом, диалог становится дочерним окном <randomwindow> и не закрывается, даже после звершения вызвавшего приложения.
          Ответить
          • я ебанулся чтоли делфи ставить


            или это обычный MessageBox из win32?
            Ответить
            • Да.
              Ответить
              • ну и схуя бы вешать?
                Ответить
                • Окно диалога по умолчанию имеет флаг WS_EX_TOPMOST.
                  Возможно, при аварийном завершении проги происходит какой-то сбой в счётчике Z-порядков, если он есть.

                  Ответить
                  • перелогин не помогает?
                    Ответить
                    • Помогает.
                      Ответить
                      • а ты знаешь как можно засрать все программы использовав все GDI хендлы?
                        Ответить
                        • Функции GIDP весьма опасны и могут стать причиной утечек памяти. Хлебнул в свое время немало горюшка, когда вручную оскинивал делфийские контролы, вроде ListView.
                          Я больше скажу: была весьма опасная функция - ScaleWindowEx, способная ронять комп в синьку из-за внутренней ошибки DivisionByZero. Баг воспроизводился путём вызова функции с аргументами MinInt и -1
                          Ответить
                          • ScaleWindowExtEx

                            Самое ужасное, что деление происходит в ядре системы.

                            Исправили в 2013-м году.
                            Ответить
                            • Очевидно что в ядре, иначе с чего бы там синева расплескалась?

                              Впрочем, GDI это не совсем ядро. У него там своя пришлепка на уровне executive, но поверх ядра. НЕ помню уже
                              Ответить
            • Переведи на "С".
              Ответить
              • #include <windows.h>
                #include <limits.h>
                void main()
                {
                  HANDLE hwnd;
                  for (hwnd=0; hwnd < INT_MAX; ++hwnd)
                  MessageBoxA(hwnd, 0,0,0);
                }
                Ответить
                • Перевёл на «Питон»:

                  #!/usr/bin/python
                  
                  import ctypes
                  
                  user32 = ctypes.windll.LoadLibrary('user32.dll')
                  
                  for hwnd in range(0, sys.maxsize):
                      user32.MessageBoxA(hwnd, 0, 0, 0)
                  Ответить
                  • Переведи на "PHP".
                    Ответить
                    • Я не знаю, есть ли для «PHP» готовое расширение, умеющее дёргать функции из произвольных DLL. Для COM-объектов готовое расширение есть.

                      Можно попробовать дёрнуть через rundll32.exe:
                      <?php
                      
                      for($hwnd = 0; $hwnd <= PHP_INT_MAX; ++$hwnd) {
                          system("rundll32.exe user32.dll,MessageBoxA $hwnd,0,0,0");
                      }
                      Ответить
                      • rundll32.exe user32.dll,MessageBoxA 0,0,0,0 показывает окошко с абракадаброй, начинающейся с букв «MZ». Похоже, что нолик интерпретируется как смещение от начала образа экзешника в памяти.

                        Кстати, нафига «Windows» грузит экзешники вместе с досовской частью, которая не нужна?
                        Ответить
                        • Нолик это указатель на нультерминировную аскишную строку, но мне казалось что первые Н байт во всех осях не имеют записи в таблице страниц ровно чтобы ловить указатели нануль. Или это только в яблах так?

                          Иными словами почему не случился пиздец при разыменовывании ноля?
                          или это вовсе не ноль, а rundll32 как-то иначе его интерпретирует?
                          Ответить
                          • Если вызвать напрямую, то «MZ» не будет. Это rundll32 химичит.
                            Ответить
                            • Ты посмотри на сигнатуру функции, которую ожидает rundll...
                              Ответить
                              • Я не могу найти по ней документацию. Вероятно, проще будет её дизассемблировать.

                                Оказывается, она в dll первым параметром передаёт указатель на строку, состоящую изо всех своих параметров, начиная со второго. А в остальные параметры функции пихает нули или что-то типа того. Какой багор )))
                                Ответить
                                • Исходники были в сети совсем недавно. Поищи.
                                  Знаю, потому, что сам смотрел. Даже не зная с++, уже с первых строк становится ясно, какое это ужасное нагромождение хаков.
                                  Ответить
                                  • Я не думаю что оно на плюсах написано, скорее на няшной
                                    Ответить
                                  • Нашёл. Вот так rundll32 вызывает функцию:
                                    g_lpfnCommand(g_hwndStub, hInstance, pchCmdLine, nCmdShow)

                                    где
                                    g_lpfnCommand = (RUNDLLPROC)GetProcAddress(g_hModule, lpstrFunctionName);
                                    
                                    g_hwndStub = CreateWindowEx(WS_EX_TOOLWINDOW,
                                                                        g_szAppName, c_szNULL, WS_OVERLAPPED, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, NULL, NULL, hInst, NULL);

                                    • hInstance –— дескриптор экземпляра rundll32;
                                    • pchCmdLine –— указатель на разобранную строку, передаваемую rundll32;
                                    • nCmdShow is a flag that says whether the main application window will be minimized, maximized, or shown normally.

                                    Таким образом, с помощью rundll32 нельзя вызвать функцию с произвольным количеством параметров. Она всегда передаёт ровно четыре параметра: дескриптор экземпляра самого rundll32, дескриптор вспомогательного окна («песочницы»), указатель на переданную пользователем строку, флажок минимизации/максимизации окна rundll32.
                                    Ответить
                                    • Теперь попытаемся понять, почему у меня окно вывело Марка Збыковского.

                                      int MessageBox(
                                        HWND    hWnd,
                                        LPCTSTR lpText,
                                        LPCTSTR lpCaption,
                                        UINT    uType
                                      );


                                      В hWnd передалось g_hwndStub –— дескриптор временного окна, открытого rundll32.

                                      В lpText передалось... hInstance. По документации это чёрный ящик, но в текущих реализациях «Windows» это тупо указатель на образ экзешника в памяти, отсюда и «MZ» в окошке.

                                      В lpCaption передаётся строка, собранная из параметров кокококомандной строки.

                                      В uType передаётся nCmdShow.
                                      Ответить
                                      • Этот ланчер годится только для дерганья ограниченного количества функций из системных библиотек, которые писались специально для него и по сути является плохо замаскированным костылем. Универсальное решение (чтобы любую функцию можно было вызвать) придется пейсать самим. Один из вариантов - перед каждым параметром командной строки в кавычках идет его тип:

                                        rundll32 somedll, "MessageBoxA", "int", 0, "str", "майкрософт-говно", "str", "", "int", 0



                                        Ответить
                                        • Я уже понял. Оказывается, в shell32.dll есть несколько функций-переходников, предназначенных для вызова функций из некоторых других DLL:
                                          RUNDLL32 shell32.dll,Control_RunDLL access.cpl,,4

                                          Костыль для костыля.
                                          Ответить
                                • А сигнатуры нету в символах разве?
                                  Ответить
                        • Потому что отбрасывать эти 60 байт (или сколько там?) - бесполезная боль на ровном месте. Только мапать сложнее будет.
                          Ответить
                          • зачем мапать если можно фапать?

                            Как звали этого чувака который отлил себя в граните выдумав MZ?
                            Майкл какой-то там, да?
                            Ответить
                          • Сотня байт –— это если ты прикрепляешь заглушку, выводящую «This program cannot run in DOS mode». А ведь можно прикрепить полноценный экзешник на полмегабайта.
                            Ответить
                            • конечно можно. Это будет Fat Binary: он работает и под дос и под windows.
                              Ответить
                      • Какой анскилл )))
                        Ответить
                  • Прикол в том, что дважды либа не грузится, если она уже в памяти. А user 32 грузят множество прог.

                    user32 = ctypes.windll.LoadLibrary('user32.dll') - это обязательно?
                    обязательно. на loadlibrary стоит счётчик. /fxd
                    Ответить
                    • Да, нам нужно получить экземпляр объекта, который умеет дёргать функции из 'user32.dll'.

                      Питон –— это же не Delphi и не Си, чтобы можно было напрямую использовать таблицу импорта.
                      Ответить
                      • на самом деле таболица импорта там есть
                        например
                        "import foo"
                        Ответить
                  • шебанг очень важен для виндопроги
                    Ответить
                    • На двойке не важен, а вот тройке нужен. Прыщемудачье не осилило сделать отдельное расширение для тройки.
                      Ответить
                      • и как у тебя шебанг не винде работает? хорошо?

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

                          >юниксоидам срать вообще на расширения
                          И хуле ж вы на винду претесь? Пишите под свои прыщи.
                          Ответить
                          • >И хуле ж вы на винду претесь? Пишите под свои прыщи.
                            я не пер питон на винду, мамаклянусь да
                            Ответить
                        • > юниксоидам срать вообще на расширения
                          Питушанский подход. С расширением сразу понятно, что за файл, достаточно посмотреть метаданные в каталоге.
                          Без расширения метаданные хранятся с данными, всегда нужно прочитать один кусок файла.
                          Ответить
                          • Смотря для чего. Конечно, jpg или txt я хочу видеть сразу.
                            Но для исполняемых файлов это не важно:
                            Я написал программу
                            /bin/pitux
                            Все на нее завязались

                            Я взял, и переписал её на JavaScript, и написал в шебанге #!/bin/node
                            и для клиегнтов ничего не изменилось
                            Ответить
                            • В таких случаях нужны алиасы, регистрация в реестре или файлы ярлыков. Чтоб программа хранилась где-то в своём каталоге в системе/у пользователя/рядом с каталогом с предыдущей версией, а команда шелла/ярлык преобразовывались в вызов нужной питушни.
                              Ответить
                          • Для сравнения: в классической «MacOS» файлы назывались вилками (“forks”). Они состояли из двух частей: из данных (то, что мы называем файлом) и ресурсов (а это метаданные, описывающие, что это за файл). Проблема была в том, что при копировании из эппловской файловой системы в другую ресурсы отклеивались.
                            Ответить
                • Программа-кукушка. Подкладывает свои окна другим программам.
                  Ответить
          • Винда не проверяет, из какого приложения была вызвана функция MessageBox? Т. е. не проверяет, владеем ли мы hwnd, и открывает окно, являющееся модальным для чужого приложения?
            Ответить
            • Да в общем-то тебе никто не мешает управлять чужими окнами. Вроде только окна "повышенных" приложений трогать нельзя.
              Ответить
        • Проверь
          Ответить

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