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

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

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

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

          Тут дело даже не в хэндлах, а в смене владельца окна. Код перебирает хэндлы и вызывает MessageBox для окон всех уровней и типов. Таким образом, диалог становится дочерним окном <randomwindow> и не закрывается, даже после звершения вызвавшего приложения.
          Ответить
          • показать все, что скрытоvanished
            Ответить
            • Да.
              Ответить
            • показать все, что скрытоvanished
              Ответить
              • #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» грузит экзешники вместе с досовской частью, которая не нужна?
                        Ответить
                        • показать все, что скрытоvanished
                          Ответить
                          • Если вызвать напрямую, то «MZ» не будет. Это rundll32 химичит.
                            Ответить
                            • Ты посмотри на сигнатуру функции, которую ожидает rundll...
                              Ответить
                              • Я не могу найти по ней документацию. Вероятно, проще будет её дизассемблировать.

                                Оказывается, она в dll первым параметром передаёт указатель на строку, состоящую изо всех своих параметров, начиная со второго. А в остальные параметры функции пихает нули или что-то типа того. Какой багор )))
                                Ответить
                                • Исходники были в сети совсем недавно. Поищи.
                                  Знаю, потому, что сам смотрел. Даже не зная с++, уже с первых строк становится ясно, какое это ужасное нагромождение хаков.
                                  Ответить
                                  • показать все, что скрытоvanished
                                    Ответить
                                  • Нашёл. Вот так 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

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

                    user32 = ctypes.windll.LoadLibrary('user32.dll') - это обязательно?
                    обязательно. на loadlibrary стоит счётчик. /fxd
                    Ответить
                  • показать все, что скрытоvanished
                    Ответить
                • Программа-кукушка. Подкладывает свои окна другим программам.
                  Ответить
          • Винда не проверяет, из какого приложения была вызвана функция MessageBox? Т. е. не проверяет, владеем ли мы hwnd, и открывает окно, являющееся модальным для чужого приложения?
            Ответить
        • показать все, что скрытоvanished
          Ответить

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