- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
//"вирус" в стиле кулхацкеров
#include <stdlib.h>
int main() {
int i = 1;
while( i == 1) {
system("start calc");
}
return 0;
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−1
//"вирус" в стиле кулхацкеров
#include <stdlib.h>
int main() {
int i = 1;
while( i == 1) {
system("start calc");
}
return 0;
}
P.S. Кобенатор неподвижной программы.
i:DWORD;
begin
for I:=0 to MaxInt do
MessageBox(I, nil,nil,0);
end.
Подвешивает систему намертво, она не возвращается даже после завершения программы.
Тут дело даже не в хэндлах, а в смене владельца окна. Код перебирает хэндлы и вызывает MessageBox для окон всех уровней и типов. Таким образом, диалог становится дочерним окном <randomwindow> и не закрывается, даже после звершения вызвавшего приложения.
Возможно, при аварийном завершении проги происходит какой-то сбой в счётчике Z-порядков, если он есть.
Я больше скажу: была весьма опасная функция - ScaleWindowEx, способная ронять комп в синьку из-за внутренней ошибки DivisionByZero. Баг воспроизводился путём вызова функции с аргументами MinInt и -1
Самое ужасное, что деление происходит в ядре системы.
Исправили в 2013-м году.
Можно попробовать дёрнуть через rundll32.exe:
Кстати, нафига «Windows» грузит экзешники вместе с досовской частью, которая не нужна?
Оказывается, она в dll первым параметром передаёт указатель на строку, состоящую изо всех своих параметров, начиная со второго. А в остальные параметры функции пихает нули или что-то типа того. Какой багор )))
Знаю, потому, что сам смотрел. Даже не зная с++, уже с первых строк становится ясно, какое это ужасное нагромождение хаков.
где
• 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.
В hWnd передалось g_hwndStub –— дескриптор временного окна, открытого rundll32.
В lpText передалось... hInstance. По документации это чёрный ящик, но в текущих реализациях «Windows» это тупо указатель на образ экзешника в памяти, отсюда и «MZ» в окошке.
В lpCaption передаётся строка, собранная из параметров кокококомандной строки.
В uType передаётся nCmdShow.
rundll32 somedll, "MessageBoxA", "int", 0, "str", "майкрософт-говно", "str", "", "int", 0
Костыль для костыля.
user32 = ctypes.windll.LoadLibrary('user32.dll') - это обязательно?
обязательно. на loadlibrary стоит счётчик. /fxd
Питон –— это же не Delphi и не Си, чтобы можно было напрямую использовать таблицу импорта.
Питушанский подход. С расширением сразу понятно, что за файл, достаточно посмотреть метаданные в каталоге.
Без расширения метаданные хранятся с данными, всегда нужно прочитать один кусок файла.