Подпишитесь на наш Telegram-канал, чтобы всегда быть в курсе важных обновлений! Перейти

Гайд Пишем свой ShellCode для новичков

  • Автор темы Автор темы KegA
  • Дата начала Дата начала
FanHack Team
Пользователь
Пользователь
Статус
Оффлайн
Регистрация
26 Сен 2017
Сообщения
73
Реакции
51
Для тех кто не знает или не умеет делать шелл код. Хочу продемонстрировать небольшой пример!
Данные пример будет вызывать функцию MessageBoxA в любом процессе​

1. Начнем с создание и настройки проекта под шелл код.
- Жмем создать проект и выбираем Win32
Пожалуйста, авторизуйтесь для просмотра ссылки.

- Ставим галочку на Пустой проект и отключаем SDL
Пожалуйста, авторизуйтесь для просмотра ссылки.

- Создаем файл C++
Пожалуйста, авторизуйтесь для просмотра ссылки.

- Дальше заходим в свойства проекта
Пожалуйста, авторизуйтесь для просмотра ссылки.

- Прописываем точку входа EntryPoint (Определит от куда будет начинаться наша программа и уберет лишнии зависимости)
Пожалуйста, авторизуйтесь для просмотра ссылки.


2. Напишем нашу точку входа (EntryPoint - название то которое мы прописали в настройках. Этот тот же WinMain только указан вручную)
Код:
Expand Collapse Copy
int EntryPoint(HINSTANCE hLk, HINSTANCE AS, LPSTR Lin, int Sho)
{

return 1;
}

3. Для вызова функции нам нужна структура в ней будут храниться данные
Код:
Expand Collapse Copy
struct Shell_Mess// Наша струткура которая будет хранить данные для исполтзование их в шелл коде
{
char Name1[100];// MessageBoxA(0, Name1, Name2, TypeMS); Так это выглядит в реале
char Name2[100];
UINT TypeMS;
DWORD AdressFunc;// Тут храниться адресс функции MessageBoxA В процессе которого мы будем инжектить шелл
};

4. Напишем сам шеллкод или функция которая будет выполняться в процессе
Код:
Expand Collapse Copy
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 адресс его мы записали выше
}

Прототип основан на стандартной функции
Код:
Expand Collapse Copy
int WINAPI MessageBoxA(
_In_opt_ HWND hWnd,
_In_opt_ LPCSTR lpText,
_In_opt_ LPCSTR lpCaption,
_In_ UINT uType);

5. Напишем функцию которая будет создавать и заполнять нашу структуру с данными в процесс
Код:
Expand Collapse Copy
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)
Код:
Expand Collapse Copy
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;
}

Общий принцип:
  1. Описать функцию без лишних вызовов.
  2. Описать структуру с данными которые нам нужно передать нашей функции.
  3. Записать все эти данные в процесс
Открываем процесс в который мы будем инжектить код -> Выделяем в нем память под все данные(Структуру, Функцию) -> Записываем структуру и функцию в выделенное место -> Создаем поток на нашу функцию и передаем в параметрах потока адресс нашей структуры.

Пример:
Пожалуйста, авторизуйтесь для просмотра ссылки.

Пожалуйста, авторизуйтесь для просмотра ссылки.


Выполняется только наш код который мы записали. Без инжекта длл и прочего
Пожалуйста, авторизуйтесь для просмотра ссылки.


Данный пример работает под х32 чтобы работало и для х64 кода нужно в структуре поменять адресс MessageBox с DWORD на DWORD64 (DWORD AdressFunc;) и компилировать в х64

Код:
Expand Collapse Copy
#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;
}
 
А зачем оно надо. Это даже не ShellCode, а обычное writememory.
 
Последнее редактирование:
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
C++:
Expand Collapse Copy
#define WIN32_LEAN_AND_MEAN
#include <windows.h>

extern "C" __declspec(dllexport)
DWORD WINAPI MessageBoxThread(LPVOID lpParam) {
  MessageBox(NULL, "Hello world!", "Hello World!", NULL);
  return 0;
}

extern "C" __declspec(dllexport)
BOOL APIENTRY DllMain(HMODULE hModule,
                      DWORD ul_reason_for_call,
                      LPVOID lpReserved) {
  switch (ul_reason_for_call) {
    case DLL_PROCESS_ATTACH:
      CreateThread(NULL, NULL, MessageBoxThread, NULL, NULL, NULL);
      break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
      break;
  }
  return TRUE;
}
 
C++:
Expand Collapse Copy
#define WIN32_LEAN_AND_MEAN
#include <windows.h>

extern "C" __declspec(dllexport)
DWORD WINAPI MessageBoxThread(LPVOID lpParam) {
  MessageBox(NULL, "Hello world!", "Hello World!", NULL);
  return 0;
}

extern "C" __declspec(dllexport)
BOOL APIENTRY DllMain(HMODULE hModule,
                      DWORD ul_reason_for_call,
                      LPVOID lpReserved) {
  switch (ul_reason_for_call) {
    case DLL_PROCESS_ATTACH:
      CreateThread(NULL, NULL, MessageBoxThread, NULL, NULL, NULL);
      break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
      break;
  }
  return TRUE;
}
че за хуевый код
 
Почитайте про шеллкод и внимательно изучи код что описан был
Такой желкод хоть в драйвер можно внедрить из юзер мода
и он будет работать

А то что код про МессаджБокс это пример

Это dll. делает тоже самое, что рассказывается в гайде, только проще.
А это так не о чем
 
ну или просто пастим свою хуйню сюда и собираем

заебали вы писать гайды стенами текста, когда и так все очевидно и кучу раз обсосано
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
ну или просто пастим свою хуйню сюда и собираем
Пожалуйста, авторизуйтесь для просмотра ссылки.

заебали вы писать гайды стенами текста, когда и так все очевидно и кучу раз обсосано
ну можно воспользоваться анпакером вместо того что бы самому распаковывать, но нужно понимать как это работает , а так с остальным согласен , вроде даже у артинга статьи видел про это
 
Вот на сам почитай, что такое шелл код:
Пожалуйста, авторизуйтесь для просмотра ссылки.

Я понимаю, обычный инжект тоже можно назвать шелл кодом.
 
Последнее редактирование:
Вот на сам почитай, что такое шелл код:
Пожалуйста, авторизуйтесь для просмотра ссылки.

Я понимаю, обычный инжект тоже можно назвать шелл кодом.
Это то же самое.
Только я генерирую шел код из функции а там вручную прописана функция

Да мой касяк походу плохо объяснил. Некоторые не понимают.

Пожалуйста, авторизуйтесь для просмотра ссылки.

Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Последнее редактирование:
Назад
Сверху Снизу