- Прописываем точку входа EntryPoint(Определит от куда будет начинаться наша программа и уберет лишнии зависимости) http://prntscr.com/kaxibw
2. Напишем нашу точку входа (EntryPoint - название то которое мы прописали в настройках. Этот тот же WinMain только указан вручную)
int EntryPoint(HINSTANCE hLk, HINSTANCE AS, LPSTR Lin, int Sho)
{
return 1;
}
3. Для вызова функции на нужна структура в ней будут храниться данные
struct Shell_Mess// Наша струткура которая будет хранить данные для исполтзование их в шелл коде
{
char Name1[100];// MessageBoxA(0, Name1, Name2, TypeMS); Так это выглядит в реале
char Name2[100];
UINT TypeMS;
DWORD AdressFunc;// Тут храниться адресс функции MessageBoxA В процессе которого мы будем инжектить шелл
};
4. Напишем сам шеллкод или функция которая будет выполняться в процессе
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 адресс его мы записали выше
}
5. Напишем функцию которая будет создавать и заполнять нашу структуру с данными в процесс
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;// Возвращаем адресс где находится наша структура. В удаленном процессе
}
6. Запускаем наш ShellCode)
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;
}
Общий принцип:
Описать функцию без лишних вызовов.
Описать структуру с данными которые нам нужно передать нашей функции.
Записать все эти данные в процесс
Открываем процесс в который мы будем инжектить код -> Выделяем в нем память под все данные(Структуру, Функцию) -> Записываем структуру и функцию в выделенное место -> Создаем поток на нашу функцию и передаем в параметрах потока адресс нашей структуры.
comment_863Привет люди!
Для тех кто не знает или не умеет делать шелл код. Хочу продемонстрировать небольшой пример!
Данные пример будет вызывать функцию MessageBoxA в любом процессе
1. Начнем с создание и настройки проекта под шелл код.
- Жмем создать проект и выбираем Win32 http://prntscr.com/kaxg2j
- Ставим галочку на Пустой проект и отключаем SDL http://prntscr.com/kaxgg6
- Создаем файл C++ http://prntscr.com/kaxgxo
- Дальше заходим в свойства проекта http://prntscr.com/kaxi2k
- Прописываем точку входа EntryPoint (Определит от куда будет начинаться наша программа и уберет лишнии зависимости) http://prntscr.com/kaxibw
2. Напишем нашу точку входа (EntryPoint - название то которое мы прописали в настройках. Этот тот же WinMain только указан вручную)
int EntryPoint(HINSTANCE hLk, HINSTANCE AS, LPSTR Lin, int Sho) { return 1; }3. Для вызова функции на нужна структура в ней будут храниться данные
struct Shell_Mess// Наша струткура которая будет хранить данные для исполтзование их в шелл коде { char Name1[100];// MessageBoxA(0, Name1, Name2, TypeMS); Так это выглядит в реале char Name2[100]; UINT TypeMS; DWORD AdressFunc;// Тут храниться адресс функции MessageBoxA В процессе которого мы будем инжектить шелл };4. Напишем сам шеллкод или функция которая будет выполняться в процессе
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 адресс его мы записали выше }Прототип основан на стандартной функции
5. Напишем функцию которая будет создавать и заполнять нашу структуру с данными в процесс
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;// Возвращаем адресс где находится наша структура. В удаленном процессе }6. Запускаем наш ShellCode)
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; }Общий принцип:
Открываем процесс в который мы будем инжектить код -> Выделяем в нем память под все данные(Структуру, Функцию) -> Записываем структуру и функцию в выделенное место -> Создаем поток на нашу функцию и передаем в параметрах потока адресс нашей структуры.
Пример:
http://prntscr.com/kaxtdk
http://prntscr.com/kaxtw3
Выполняется только наш код который мы записали. Без инжекта длл и прочего
http://prntscr.com/kaxufy
Скачать исходник ShellCode
Надеюсь у вас получится)