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

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

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

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

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

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

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


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 адресс его мы записали выше
}
Прототип основан на стандартной функции
Код:
int WINAPI MessageBoxA(
_In_opt_ HWND hWnd,
_In_opt_ LPCSTR lpText,
_In_opt_ LPCSTR lpCaption,
_In_ UINT uType);
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;
}
Общий принцип:
  1. Описать функцию без лишних вызовов.
  2. Описать структуру с данными которые нам нужно передать нашей функции.
  3. Записать все эти данные в процесс
Открываем процесс в который мы будем инжектить код -> Выделяем в нем память под все данные(Структуру, Функцию) -> Записываем структуру и функцию в выделенное место -> Создаем поток на нашу функцию и передаем в параметрах потока адресс нашей структуры.

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

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


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


Данный пример работает под х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;
}
 
vk.com/ahkcsgocheat
Пользователь
Статус
Оффлайн
Регистрация
21 Апр 2020
Сообщения
380
Реакции[?]
64
Поинты[?]
2K
А зачем оно надо. Это даже не ShellCode, а обычное writememory.
 
Последнее редактирование:
#include <brain>
Забаненный
Статус
Оффлайн
Регистрация
29 Сен 2020
Сообщения
588
Реакции[?]
99
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
C++:
#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;
}
 
Начинающий
Статус
Оффлайн
Регистрация
5 Апр 2019
Сообщения
123
Реакции[?]
12
Поинты[?]
0
C++:
#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;
}
че за хуевый код
 
FanHack Team
Пользователь
Статус
Оффлайн
Регистрация
26 Сен 2017
Сообщения
72
Реакции[?]
51
Поинты[?]
0
Почитайте про шеллкод и внимательно изучи код что описан был
Такой желкод хоть в драйвер можно внедрить из юзер мода
и он будет работать

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

Это dll. делает тоже самое, что рассказывается в гайде, только проще.
А это так не о чем
 
EFI_COMPROMISED_DATA
лучший в мире
Статус
Оффлайн
Регистрация
26 Янв 2018
Сообщения
920
Реакции[?]
1,632
Поинты[?]
85K
ну или просто пастим свою хуйню сюда и собираем

заебали вы писать гайды стенами текста, когда и так все очевидно и кучу раз обсосано
 
Забаненный
Статус
Оффлайн
Регистрация
5 Сен 2020
Сообщения
986
Реакции[?]
275
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
ну или просто пастим свою хуйню сюда и собираем
Пожалуйста, авторизуйтесь для просмотра ссылки.

заебали вы писать гайды стенами текста, когда и так все очевидно и кучу раз обсосано
ну можно воспользоваться анпакером вместо того что бы самому распаковывать, но нужно понимать как это работает , а так с остальным согласен , вроде даже у артинга статьи видел про это
 
vk.com/ahkcsgocheat
Пользователь
Статус
Оффлайн
Регистрация
21 Апр 2020
Сообщения
380
Реакции[?]
64
Поинты[?]
2K
Вот на сам почитай, что такое шелл код:
Пожалуйста, авторизуйтесь для просмотра ссылки.

Я понимаю, обычный инжект тоже можно назвать шелл кодом.
 
Последнее редактирование:
FanHack Team
Пользователь
Статус
Оффлайн
Регистрация
26 Сен 2017
Сообщения
72
Реакции[?]
51
Поинты[?]
0
Вот на сам почитай, что такое шелл код:
Пожалуйста, авторизуйтесь для просмотра ссылки.

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

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

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

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