Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Авторские статьи (https://forum.antichat.xyz/forumdisplay.php?f=31)
-   -   Как написать билдер на Vc++ (https://forum.antichat.xyz/showthread.php?t=50498)

4nob1oz 04.10.2007 17:54

Как написать билдер на Vc++
 
/--------------------------------/
/Как написать билдер на VC++/
/--------------------------------/

Очень часто спрашивают на форумах вопрос: "Как написать именно билдер а не конфигуратор?". Если у тебя есть этот же вопрос то читай статью.

Немного теории
----------------------

Главное очень часто народ путает понятия конфигуратор и билдер, а для некоторых это вообще одно и тоже.

Рассмотрю на примере.

Конфигуратор:

Вот есть есть например сокс бот. Вы зашли в папку с ботом и там 2 файла например socks.dat и build.exe. В readme написано запустить build.exe и настроить бота как вам нужно. Как же это происходит? Очень просто. В build.exe мы задаём параметры и потом делаем сокс бота, после этого у нас в папке появляется сконфигурированный нами bot.exe.

Что делает build.exe:

-Открывает файл socks.dat(это уже исполняемый файл просто ему поменяли расширение вручную на dat)
-Читает его содержимое в буфер
-Ищет в буфере определённые строки и заменяет их на введённые нами
-Создаёт навый файл для записи с расширением exe
-Записывает туда из буфера уже сконфигурированного нами бота

Билдер:

Теперь. У вас есть сокс бот. Вы зашли в папку с сокс ботом и там один builder.exe. Вы его запускаете и вводите нужные вам параметры,затем в папке после сборки появляется из неоткуда в папке с билдером уже готовый файл bot.exe который можно пользовать в своих целях. Как это получилось если нету фалйа который можно изменить так как изложено в примере выше? Этому то и посвещена статья.

От теории к практике
----------------------------

Билдер работает почти так же как и конфигуратор но бот лежит не в папке а в самом билдере в расурсах. У PE файла есть несколько секций, а это секция кода, секция данных, секция ресурсов и т.д. Вот как раз билдер то и хранит в секции ресурсов бота.

Алгоритм сборки бота такой:

-Извлекает из секции ресурсов файл в память
-Из памяти записывает в обозначенный файл
-Открывает файл на запись
-Устанавливает указатель по определённому адресу где хранится нужный нам параметр
-Заменяет его и если нужно ещё чтото заменить то ставит указатель на другой параметр и тоже заменяет его
-Проверяет успешно ли создан файл на диске

На первый взгляд страшно это всё звучит, секция ресурсов и всякие указатели. Дальше я всё подробно и просто опишу, приведу исходники, напишу MessageBox билдер и вы увидите что ничего сложного нет а это даже проще чем написать конфигуратор =)

Процесс написания MessageBox билдера
----------------------------------------------

Для того чтобы написать MessageBox билдер нам нужен WinHex,файл который вызывает MessageBox,ну и VC++

Сначала пишем файл с MessageBox который будем помещать в ресурсы билдера.
Создаём новый win32 проект в VC++ и вставляем туда код:

Код:

#include <windows.h> //Здесь подключаем нужные нам заголовочные файлы

#pragma optimize( "gsy", on )
#pragma comment( linker, "/ENTRY:WinMain" )
#pragma comment( linker, "/MERGE:.rdata=.data" )
#pragma comment( linker, "/MERGE:.text=.data" )
#pragma comment( linker, "/SECTION:.text,EWR" )
#pragma comment( linker, "/SUBSYSTEM:WINDOWS" )
#pragma comment( linker, "/INCREMENTAL:NO" )

#define MESSAGE "1_____________________________" //Сообщение MessageBox
#define TITLE  "2_____________________________" //Заголовок MessageBox

typedef int (WINAPI* MB) (HWND,LPCTSTR,LPCTSTR,UINT);

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
        MB fMessageBox; //Обозначаем переменную
        HMODULE user32_dll = LoadLibraryA("user32.dll");//Подгружаем библиотеку
   
        if (user32_dll)
        {
                fMessageBox = (MB)GetProcAddress(user32_dll,"MessageBoxA");//Получаем адрес функции MessageBox и присваиваем переменной fMessageBox
        }
       
        fMessageBox(0, MESSAGE, TITLE, MB_OK|MB_SETFOREGROUND);//Вызываем MessageBox

        FreeLibrary(user32_dll);//Освобождаем библиотеку

        return 0;
}

Я вызывал MessageBox получая адрес функции. MESSAGE и TITLE сожержат максимум 30 символов и в билдере мы сможем вводить от 1 до 30 символов.

Теперь нужно изменить пару опций в проекте.

Отключаю манифест: Project Property->Linking->Manifest File->Generating Manifest->NO
Далее выбираю: Project Property->General Configuration->Character Set->Use Multi-byte Character Set это ставлю чтобы не писать (LPCTSTR)"test" а просто "test" в функции
Рантайм библиотеки:Project Property->Configuration properties->c/c++->code generation->runtime library->MT

Теперь можно скомпилировать из запустить. Если чтото не запускается или не компилируется ищи ошибку у себя.

Открываем в WinHex файл который мы только что получили. Ищем 1_____________________________, это текст нашего сообщения. Можно заменить это сообщения используя WinHex и поиграться с приложением, но нам нужен адрес, а точнее смещение от начала файла.Колонка смещений или offset расположена слева, там написано чтото вроде 0x0000200 и т.д. Ставим курсор точно на 1 и смотрим смещение(offset).Для того чтобы не отсчитывать числа от начала чтроки да ещё и не переводить в hex смотрите смещение по текущему положению курсора,оно нааписано внизу =) Запешите значение. У меня оно равно 24C, а для записи в исходник 0x000024C, затем
ищем 2_____________________________, ставим курсор на 2 и записываем смещение. У меня оно равно 26C, а для записи в исходник 0x000026C. Теперь когда известны смещения и всё что нам нужно *** создания билдера есть то можно приступить к сборке.

Создаём новый проект MFC Application. Открываем Solution Explorer и ищем там Resource Files. Нажимаем правой кнопкой на файл с расширением .rc и выбираем View code. Для того чтобы добавить файл в ресурсы то нам нужно добавить его туда прописав в файле ресурсов.

Синтаксис такой:

имя_ресурса тип "файл"

Так как у нас не иконка какаято и не картинка для которых есть определённые типы, а exe файл то мы обозначаем тип ресурсов как RCDATA

File RCDATA "file.exe"

Берём наш exe файл с MessageBox,переименовываем в file.exe и кидаем в папку с проектом где лежат исходники.Теперь заходим в Solutin Explorer и нажимаем правой кнопкой на файле .rc затем Compile. После компилируем проект и наш файл должен добавиться в ресурсы билдера и быть уже в нём. Проверить это можно поискав просто строки 2_____ или 1_____ если есть то значит exe добавлен.

Открываем ещё раз Solutin Explorer и нажимаем правой кнопкой на файл с расширением .rc, выбираем open with, затем выбираем Resource Editor и кидаем на форму 2-а EditBox, 2-а label и одну кнопку. После нам нужно создать обработчик события нажатия кнопки по которому будет извлекаться из ресурсов файл и делаться билд.

Нажимаем правой кнопкой на button который лежит на форме и выбираем Add Event Handler...

Далее выбираем BN_CLICKED и нажимаем OK, теперь вставляем код:

Код:

        HRSRC hRes = 0; //Это переменная
        HGLOBAL hData = 0;
        char *zero = "\0";
        LPVOID pData;
        DWORD szDw,dwSize,Written;
        CString        message,title; //Переменные для сообщения и заголовка
   
        GetDlgItemText(IDC_EDIT1,message); //Получаем из EditBox1 текст и сохраняем в перепенную message
        GetDlgItemText(IDC_EDIT2,title);//Получаем из EditBox2 текст и сохраняем в перепенную title

        if((lstrlen(title)==0 || lstrlen(message)==0)) //Проверка на заполнение EditBox-ов
        {
                AfxMessageBox("Заполните все поля");
                return;
        }

        if((lstrlen(title)>30 || lstrlen(message)>30)) /*Проверка длины введённого сообщения так как мы не можем записать больше 30 символов в сообщение или заголовок во избежании казусов необходимо сделать проверку*/
        {
                AfxMessageBox("Слишком длинная строка. Введите меньше 30 символов");
                return;
        }

        HMODULE hModule=GetModuleHandle(NULL);/*Получаем дескриптор модуля. Так как будем искать в себе то должны передать функции параметр NULL*/
       
        if(hModule==NULL)
        {
      AfxMessageBox("Ошибка определения модуля");
          return;//Обработка ошибки
    }

        hRes = FindResource(hModule, "File", RT_RCDATA); /*Ищем в ресурсах наш файл по имени ресурса. Так как мы не присвоили ему ID то имя ресурса пишем в "". Так как тип был RCDATA то и тут тоже указываем RCDATA.*/
        // Если ресурс не найден, то выходим
        if(hRes == NULL)
        {
                AfxMessageBox("Ресурс не найден");
                return;//Обработка ошибки
        }

        // Получаем размер ресурса для того, чтобы сохранить его в файл
        dwSize = SizeofResource(hModule,hRes);
        // Если не смогли получить размер, то выходим
        if(dwSize == NULL)
        {
                AfxMessageBox("Размер ресурса не получен");
                return;//Обработка ошибки
        }

       
        hData = LoadResource(hModule, hRes);//Пытаемся загрузить ресурс
        // Если не смогли загрузить, то выходим
        if(hData == NULL)
        {
                AfxMessageBox("Не могу загрузить ресурс");
                return;//Обработка ошибки
        }

        pData = LockResource(hData);//Задерфиваем ресурс в памяти
        // Если не удалось зафиксировать ресурс, то выходим
        if(pData == NULL)
        {
                AfxMessageBox("Не могу зафиксировать ресурс в памяти");
                return;//Обработка ошибки
        }


        HANDLE File = CreateFile("file.exe",GENERIC_WRITE,FILE_SHARE_WRITE,0,OPEN_ALWAYS,0,0); /* Создаём файл для записи куда запишем извлечённый ресурс. Так как у нас exe файл то и запишем его в exe*/
        // Если не удалось создать файл, то выходим
        if(File == INVALID_HANDLE_VALUE)
        {
                AfxMessageBox("Не могу создать файл для записи");
                return;//Обработка ошибки
                // Освобождаем исполняемый файл
        }
        // Записываем весь ресурс в файл
        if(WriteFile(File,pData,dwSize,&Written,0)==NULL)
        {
                // Освобождаем исполняемый файл
                FreeLibrary(hModule);
                // Закрываем хендл файла
                CloseHandle(File);
        }

        HANDLE hFile = CreateFile("file.exe",GENERIC_WRITE,FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0); //Открываем уже извлечённый из ресурсов файл который лежит у нас на диске в папке с билдером
       
        if (hFile!=INVALID_HANDLE_VALUE)
        {
                SetFilePointer(hFile,0x000024C,NULL,0); //Ставим указатель в файле на значение которое мы получили когда искали смещение
                WriteFile(hFile,title,lstrlen(title),&szDw,NULL);//Записываем
                WriteFile(hFile,zero,1,&szDw,NULL);/*Так как сообщение может быть меньше 30 а остальные символы нам не нужны то запишем в файл символ конца строки. Теперь у нас будет отображаться только введённый нами текст без лишних символов. Попрбуйте не поставить и посмотрите что получится*/
                SetFilePointer(hFile,0x000026C,NULL,0);//Теперь переходим ко второму найденному ранее смещению
                WriteFile(hFile,message,lstrlen(message),&szDw,NULL); //Записываем
                WriteFile(hFile,zero,1,&szDw,NULL);//Ставим разделитель
                CloseHandle(hFile); //Закрываем дескриптор файла
                AfxMessageBox("Builded OK!"); //Оповещаем что удачно создали файл
        }

Теперь можно компилировать и пользовать MessageBox билдер.

Заключение
------------------

Я думаю теперь общий смсл понятен и теперь вы сможите делать билдеры для любых пинчей и других каких-нибудь лоадеров или ботов. Ведь найдя смещение пожно легко записать в файл всё что нужно. Всё зависит от билда и задай я сообщение в 5 симоволов в фале MessageBox мы бы больше 5-и в билдере и не записали, нет ну записали конечно же но файл бы просто не запустился.

Bulder: http://ifolder.ru/3594356
Source: http://ifolder.ru/3594695
WinHex: http://wasm.ru/baixado.php?mode=tool&id=24


Article by: perdimonokl aka 4nob1oz, TGBR.ORG, 2007

Hellsp@wn 04.10.2007 18:05

Цитата:

Всё зависит от билда и задай я сообщение в 5 симоволов в фале MessageBox мы бы больше 5-и в билдере и не записали, нет ну записали конечно же но файл бы просто не запустился.
хез, ну почему же так категорично? А что нам мешает помеять адресс строки на новый и вхреначить большую строку там? =)

KEZ 04.10.2007 19:53

Аптунгдуксимтонмандак. Помоему пошла какая-то волна...
Наплыв. Раньше это был Пинч, как собрать пинч, как протроянить юзера, как прислать пинч, как склеить exe и jpg, а теперь это - как написать билдер, как искать в файле символ "_", как сделать билдер троя, который его из ресурсов распаковывает... Хотя понятно... Кто-то написал такую статью, все сразу прошарились что так можно (гггг) и решили написать такие же свои статьи. Осторожнее! Это может повлечь отупение!!!
Епт, помоему и дибилу понятно будет что если в бинарнике есть строка "myhost.ru", то можно вместо нее записать другую строку прямо в бинарник, и ему будет казаться что там была именно такая, новая.
Вообщем-то всё, опять я описал все статьи одним предложением.
СКОЛЬКО МОЖНО???

Цитата:

-Извлекает из секции ресурсов файл в память
-Из памяти записывает в обозначенный файл
-Открывает файл на запись
-Устанавливает указатель по определённому адресу где хранится нужный нам параметр
ага, потом опять читает в память, сохраняет в ресурсы, опять читает в память, записывает на диск и опять читает? НАХУЙ? Нельзя в памяти все что нужно заменить и создать уже готовый файл? Или автор ещё не научился работать с памятью и тп?
Зачем хранить все в ресурсах? Чтоб проще было потом в блокноте поменять кому-нибудь? Или по вышеуказаной причине приходится юзать ресурсы?

Нахер получать адрес MessageBox динамически? Это антиотладка типа? Или просто показать что вместо таблицы импорта круче будет написать длинный код?

Цитата:

Открываем в WinHex файл который мы только что получили. Ищем 1_____________________________,
ГЕНИАЛЬНО. Аналог способа из статьи кузьмича, который рассказывает что надо искать символ "_" в файле. Не проще ли сделать ф-ию getPhysicalAddress(), которая будет сразу возвращать смещение в файле заданой переменной?

Цитата:

Создаём новый проект MFC Application.
Ага, .net кросплатформенный application ещё создаем. Какой МФЦ? НАХ?

Цитата:

#define MESSAGE "1_____________________________" //Сообщение MessageBox
#define TITLE "2_____________________________" //Заголовок MessageBox
Какой ДЕФАЙН?) Ну заменится твой дефайн на строку. Прям до компиляции. И будет во всех местах, где как-либо используется MESSAGE заменяться на "строка". А надо хотя бы заранее выделить место -
CHAR MESSAGE[] = "1___________...";

ну это конечно просто АААААААААААД
ЭТО РАЗРЫВАЕТ МНЕ МОЗГ

Piflit 04.10.2007 20:05

нахрен ресурсы? можно просто работать с массивом, в которому будет бинарник в hex
KEZ у меня описание получилось короче =)

KEZ 04.10.2007 20:09

простейшие операции с файлами+простейшие операции с памятью

ещё короче

ну не знаю, опишите там настоящий билдер, от слова "BUILD", т.е. "СТРОИТЬ, СОБИРАТЬ"
который будет хотя бы как-нибудь там хранить модули в сжатом виде у себя и из модулей собирать бинарник в памяти, с рендомизацией кода хоть какой-нибудь
опишите метод чтоб строки генерились рендомным кодом как-нибудь, или шифровались ну что-то хотя бы чтобы не "БЕРЕМ ФАЙЛ РАСПАКУЕМ И ЗАПИШЕМ ПО АДРЕСУ 123 СТРОКУ helo world"

Цитата:

Очень часто спрашивают на форумах вопрос: "Как
написать именно билдер а не конфигуратор?". Если у тебя есть этот же вопрос то читай статью.
О да, и ещё чаще пишут вот такие вот статьи. Если на форумах задают вопрос "как включить компьютер" - это не значит что надо писать сотню статей, где рассказывать как нажать кнопку включения, в виде развернутой поэмы на 10 странц с описанием "сначала сделайте чайку, левой пяткой упритесь в шкаф, правой ногой нажмите кнопку включения"

Fata1ex 04.10.2007 20:12

боян


Кто переплюнет?

KEZ 04.10.2007 20:13

бая

_Great_ 04.10.2007 20:29

4nob1oz, где берешь такую траву?
тема бред

кез подробно разъяснил почему и я не могу с ним несогласиться..

4nob1oz 04.10.2007 20:41

Всем кто ответил, парни вам респект :) Я думаю после этих постов в вас станет дерьма на капельку меньше. Я написал на сколько знаю и расписал на столько на сколько считаю нужным. Щас ради интереса ваши статьи почитаю.

Тут один КЕЗ написал что ктото говорит написал подобную статью и все начали писать. Жду линков хотя ты не всё равно не ответишь конечно же на этот пост и не найдёшь ланков на подобные статьи.

To Great: хеллы тру ;) а вот мог бы и минус не ставить, хотя мне пофиг плюс или минус Без обид чувак но чтото ты заговнился последнее время :(

Ni0x 04.10.2007 20:48

Простите, а где там билдер? Помойму это конфигуратор хранящий файл в ресурсах. Или же это все грибы виноваты?


Время: 12:35