Перейти к содержанию
Опубликовано
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 адресс его мы записали выше
}

Прототип основан на стандартной функции

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. Записать все эти данные в процесс

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

 

Пример:

http://prntscr.com/kaxtdk

http://prntscr.com/kaxtw3

 

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

 

http://prntscr.com/kaxufy

 

Скачать исходник ShellCode

 

Надеюсь у вас получится)

Рекомендуемые сообщения

Опубликовано
comment_864

Отмечу этот день,в календаре :burumburum:

-25.07.18 - Честер создал тему. :applause:

Продажи:


Здравствуйте!Я являюсь официальным посредником по данным читам:
1.[AltezaHack] – [Point Blank]
2.[AimNester] – [Point Blank,Warface]
3.[GlobalHack] – [CS:GO]
4.[sMARTHACK] – [CS:GO]
5.[AimJunkies] – [CS:GO,Warface,PUBG,S.T.A.L.K.E.R.GTA V и многое другое]

6.[FanHack] - [PUBG]
7.[FanHack] - [CS:GO]
8.[FanHack] - [APEX]

В России,Украине и других странах “СНГ”
У меня лучшие цены в России,Украине и остальных странах!

Мой профиль в ВК: Сергей Иванов (vk.com)
Моя группа в ВК: Буст чего то там (vk.com)
Логин Skype: doni-dakk
Отзывы покупателей: https://vk.com/topic-145854178_35682231
Telegramm:@Sedine



Покупая товары у меня,вы получаете:
* Тех.поддержку.
* Быструю активацию ключа.
* Решение ваших проблем.
* Так же,тех.поддержка с сайта.


Особенности товаров:
1.Не банят.
2.Большой функционал.
3.Поддержка.
4.Полность на Русском языке.(часть из них)

При покупке,вам гарантирована активация,скрин,о том что ваши деньги дошли по меня.

Звонки,я не принимаю!Даже не пытайтесь!

 

  • 1 год спустя...
Опубликовано
comment_1947

 

Привет люди!

 

Для тех кто не знает или не умеет делать шелл код. Хочу продемонстрировать небольшой пример!

Данные пример будет вызывать функцию 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 адресс его мы записали выше
}

Прототип основан на стандартной функции

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. Записать все эти данные в процесс

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

 

Пример:

http://prntscr.com/kaxtdk

http://prntscr.com/kaxtw3

 

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

 

http://prntscr.com/kaxufy

 

Скачать исходник ShellCode

 

Надеюсь у вас получится)

 

Есть возможность исходник перезалить? :smutili:

  • 2 недели спустя...
Опубликовано
  • Автор
comment_1959

Есть возможность исходник перезалить? :smutili:

Тут описан весь исходник. Самого исхода не осталось

 

#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;
}
Гость
Эта тема закрыта для публикации ответов.