FanHack Team
-
Автор темы
- #1
Для тех кто не знает или не умеет делать шелл код. Хочу продемонстрировать небольшой пример!
Данные пример будет вызывать функцию MessageBoxA в любом процессе
Данные пример будет вызывать функцию MessageBoxA в любом процессе
1. Начнем с создание и настройки проекта под шелл код.
- Жмем создать проект и выбираем Win32
Пожалуйста, авторизуйтесь для просмотра ссылки.
- Ставим галочку на Пустой проект и отключаем SDL
Пожалуйста, авторизуйтесь для просмотра ссылки.
- Создаем файл C++
Пожалуйста, авторизуйтесь для просмотра ссылки.
- Дальше заходим в свойства проекта
Пожалуйста, авторизуйтесь для просмотра ссылки.
- Прописываем точку входа EntryPoint (Определит от куда будет начинаться наша программа и уберет лишнии зависимости)
Пожалуйста, авторизуйтесь для просмотра ссылки.
2. Напишем нашу точку входа (EntryPoint - название то которое мы прописали в настройках. Этот тот же WinMain только указан вручную)
Код:
int EntryPoint(HINSTANCE hLk, HINSTANCE AS, LPSTR Lin, int Sho)
{
return 1;
}
Код:
struct Shell_Mess// Наша струткура которая будет хранить данные для исполтзование их в шелл коде
{
char Name1[100];// MessageBoxA(0, Name1, Name2, TypeMS); Так это выглядит в реале
char Name2[100];
UINT TypeMS;
DWORD AdressFunc;// Тут храниться адресс функции MessageBoxA В процессе которого мы будем инжектить шелл
};
Код:
void ShellRun(Shell_Mess* Str)// Это будет наш шелл код. Эта функция и будет выполняться в чужом процессе
{
typedef int (WINAPI* MessageBoxS)(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);// Прототип функции которую на нужно вызвать в процессе. Про прототипы смотрите в гугле)
MessageBoxS MesBox = (MessageBoxS)Str->AdressFunc;// Записываем адресс функции из структуры в прототп чтобы можно было его использовать как обучную функцию
MesBox(0, Str->Name1, Str->Name2, Str->TypeMS);// вызов функции MessageBox адресс его мы записали выше
}
Код:
int WINAPI MessageBoxA(
_In_opt_ HWND hWnd,
_In_opt_ LPCSTR lpText,
_In_opt_ LPCSTR lpCaption,
_In_ UINT uType);
Код:
LPVOID GenShellStruct(HANDLE hProc, char* Name1, char* Name2, UINT Ty, DWORD AdressCall)// Функция создает и заполняет нашу структуру в процессе. Описал отдельно чтоб видно было
{
Shell_Mess* Shell = (Shell_Mess*)VirtualAllocEx(hProc, 0, sizeof(Shell_Mess), MEM_COMMIT, PAGE_EXECUTE_READWRITE);// выделаем память для нашей структуры в процессе
WriteProcessMemory(hProc, Shell->Name1, Name1, strlen(Name1), 0);//записываем данные структуры в выделеную нами память (Заполняем структуру в процессе)
WriteProcessMemory(hProc, Shell->Name2, Name2, strlen(Name2), 0);//Записываем все что нам нужно. Что используется в функции ShellRun
WriteProcessMemory(hProc, &Shell->TypeMS, &Ty, sizeof(UINT), 0);
WriteProcessMemory(hProc, &Shell->AdressFunc, &AdressCall, sizeof(DWORD), 0);
return Shell;// Возвращаем адресс где находится наша структура. В удаленном процессе
}
Код:
int EntryPoint(HINSTANCE hLk, HINSTANCE AS, LPSTR Lin, int Sho)
{
HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, 8768);// Открываем процесс с полным доступом. Чтобы мы могли записать в память и создать поток на выполнение
LPVOID ShellStr = GenShellStruct(hProc, "ShellCode", "MS_CHESTER", MB_OK, (DWORD)MessageBoxA);// Создаем структуру в процессе и возвращаем адресс где находится структура
LPVOID AdShellRun = VirtualAllocEx(hProc, 0, 0x100, MEM_COMMIT, PAGE_EXECUTE_READWRITE);// Выделяем память в процессе для нашей функции ShellRun.
WriteProcessMemory(hProc, AdShellRun, ShellRun, 0x100, 0);// Записываем функцию ShellRun в память где вы выделили для нее место
CreateRemoteThread(hProc, 0, 0, (LPTHREAD_START_ROUTINE)AdShellRun, ShellStr, 0, 0);// создаем поток в процессе. AdShellRun - Адресс функции ShellRun в удаленном процессе. ShellStr - Адресс структуры в удаленном процессе;
// Все)
MessageBoxA(0, "Ready", 0, MB_OK);
return 1;
}
- Описать функцию без лишних вызовов.
- Описать структуру с данными которые нам нужно передать нашей функции.
- Записать все эти данные в процесс
Пример:
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Выполняется только наш код который мы записали. Без инжекта длл и прочего
Пожалуйста, авторизуйтесь для просмотра ссылки.
Данный пример работает под х32 чтобы работало и для х64 кода нужно в структуре поменять адресс MessageBox с DWORD на DWORD64 (DWORD AdressFunc;) и компилировать в х64
Код:
#include <windows.h>
struct Shell_Mess// Наша струткура которая будет хранить данные для исполтзование их в шелл коде
{
char Name1[100];// MessageBoxA(0, Name1, Name2, TypeMS); Так это выглядит в реале
char Name2[100];
UINT TypeMS;
DWORD AdressFunc;// Тут храниться адресс функции MessageBoxA В процессе которого мы будем инжектить шелл
};
void ShellRun(Shell_Mess* Str)// Это будет наш шелл код. Эта функция и будет выполняться в чужом процессе
{
typedef int (WINAPI* MessageBoxS)(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);// Прототип функции которую на нужно вызвать в процессе. Про прототипы смотрите в гугле)
MessageBoxS MesBox = (MessageBoxS)Str->AdressFunc;// Записываем адресс функции из структуры в прототп чтобы можно было его использовать как обучную функцию
MesBox(0, Str->Name1, Str->Name2, Str->TypeMS);// вызов функции MessageBox адресс его мы записали выше
}
LPVOID GenShellStruct(HANDLE hProc, char* Name1, char* Name2, UINT Ty, DWORD AdressCall)// Функция создает и заполняет нашу структуру в процессе. Описал отдельно чтоб видно было
{
Shell_Mess* Shell = (Shell_Mess*)VirtualAllocEx(hProc, 0, sizeof(Shell_Mess), MEM_COMMIT, PAGE_EXECUTE_READWRITE);// выделаем память для нашей структуры в процессе
WriteProcessMemory(hProc, Shell->Name1, Name1, strlen(Name1), 0);//записываем данные структуры в выделеную нами память (Заполняем структуру в процессе)
WriteProcessMemory(hProc, Shell->Name2, Name2, strlen(Name2), 0);//Записываем все что нам нужно. Что используется в функции ShellRun
WriteProcessMemory(hProc, &Shell->TypeMS, &Ty, sizeof(UINT), 0);
WriteProcessMemory(hProc, &Shell->AdressFunc, &AdressCall, sizeof(DWORD), 0);
return Shell;// Возвращаем адресс где находится наша структура. В удаленном процессе
}
int EntryPoint(HINSTANCE hLk, HINSTANCE AS, LPSTR Lin, int Sho)
{
HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, 11340);// Открываем процесс с полным доступом. Чтобы мы могли записать в память и создать поток на выполнение
LPVOID ShellStr = GenShellStruct(hProc, "ShellCode", "MS_CHESTER", MB_OK, (DWORD)MessageBoxA);// Создаем структуру в процессе и возвращаем адресс где находится структура
LPVOID AdShellRun = VirtualAllocEx(hProc, 0, 0x100, MEM_COMMIT, PAGE_EXECUTE_READWRITE);// Выделяем память в процессе для нашей функции ShellRun.
WriteProcessMemory(hProc, AdShellRun, ShellRun, 0x100, 0);// Записываем функцию ShellRun в память где вы выделили для нее место
CreateRemoteThread(hProc, 0, 0, (LPTHREAD_START_ROUTINE)AdShellRun, ShellStr, 0, 0);// создаем поток в процессе. AdShellRun - Адресс функции ShellRun в удаленном процессе. ShellStr - Адресс структуры в удаленном процессе;
// Все)
MessageBoxA(0, "Ready", 0, MB_OK);
return 1;
}