ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Как написать билдер на Vc++ |

04.10.2007, 17:54
|
|
Познающий
Регистрация: 09.07.2007
Сообщений: 42
Провел на форуме: 88752
Репутация:
72
|
|
Как написать билдер на 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
|
|
|

04.10.2007, 18:05
|
|
Постоянный
Регистрация: 29.04.2007
Сообщений: 496
Провел на форуме: 2715445
Репутация:
588
|
|
Всё зависит от билда и задай я сообщение в 5 симоволов в фале MessageBox мы бы больше 5-и в билдере и не записали, нет ну записали конечно же но файл бы просто не запустился.
хез, ну почему же так категорично? А что нам мешает помеять адресс строки на новый и вхреначить большую строку там? =)
|
|
|

04.10.2007, 19:53
|
|
Banned
Регистрация: 18.05.2005
Сообщений: 1,981
Провел на форуме: 1941233
Репутация:
2726
|
|
Аптунгдуксимтонмандак. Помоему пошла какая-то волна...
Наплыв. Раньше это был Пинч, как собрать пинч, как протроянить юзера, как прислать пинч, как склеить exe и jpg, а теперь это - как написать билдер, как искать в файле символ "_", как сделать билдер троя, который его из ресурсов распаковывает... Хотя понятно... Кто-то написал такую статью, все сразу прошарились что так можно (гггг) и решили написать такие же свои статьи. Осторожнее! Это может повлечь отупение!!!
Епт, помоему и дибилу понятно будет что если в бинарнике есть строка "myhost.ru", то можно вместо нее записать другую строку прямо в бинарник, и ему будет казаться что там была именно такая, новая.
Вообщем-то всё, опять я описал все статьи одним предложением.
СКОЛЬКО МОЖНО???
-Извлекает из секции ресурсов файл в память
-Из памяти записывает в обозначенный файл
-Открывает файл на запись
-Устанавливает указатель по определённому адресу где хранится нужный нам параметр
ага, потом опять читает в память, сохраняет в ресурсы, опять читает в память, записывает на диск и опять читает? НАХУЙ? Нельзя в памяти все что нужно заменить и создать уже готовый файл? Или автор ещё не научился работать с памятью и тп?
Зачем хранить все в ресурсах? Чтоб проще было потом в блокноте поменять кому-нибудь? Или по вышеуказаной причине приходится юзать ресурсы?
Нахер получать адрес MessageBox динамически? Это антиотладка типа? Или просто показать что вместо таблицы импорта круче будет написать длинный код?
Открываем в WinHex файл который мы только что получили. Ищем 1_____________________________,
ГЕНИАЛЬНО. Аналог способа из статьи кузьмича, который рассказывает что надо искать символ "_" в файле. Не проще ли сделать ф-ию getPhysicalAddress(), которая будет сразу возвращать смещение в файле заданой переменной?
Создаём новый проект MFC Application.
Ага, .net кросплатформенный application ещё создаем. Какой МФЦ? НАХ?
#define MESSAGE "1_____________________________" //Сообщение MessageBox
#define TITLE "2_____________________________" //Заголовок MessageBox
Какой ДЕФАЙН?) Ну заменится твой дефайн на строку. Прям до компиляции. И будет во всех местах, где как-либо используется MESSAGE заменяться на "строка". А надо хотя бы заранее выделить место -
CHAR MESSAGE[] = "1___________...";
ну это конечно просто АААААААААААД
ЭТО РАЗРЫВАЕТ МНЕ МОЗГ
Последний раз редактировалось KEZ; 04.10.2007 в 20:06..
|
|
|

04.10.2007, 20:05
|
|
Banned
Регистрация: 11.08.2006
Сообщений: 1,522
Провел на форуме: 5128756
Репутация:
2032
|
|
нахрен ресурсы? можно просто работать с массивом, в которому будет бинарник в hex
KEZ у меня описание получилось короче =)
|
|
|

04.10.2007, 20:09
|
|
Banned
Регистрация: 18.05.2005
Сообщений: 1,981
Провел на форуме: 1941233
Репутация:
2726
|
|
простейшие операции с файлами+простейшие операции с памятью
ещё короче
ну не знаю, опишите там настоящий билдер, от слова "BUILD", т.е. "СТРОИТЬ, СОБИРАТЬ"
который будет хотя бы как-нибудь там хранить модули в сжатом виде у себя и из модулей собирать бинарник в памяти, с рендомизацией кода хоть какой-нибудь
опишите метод чтоб строки генерились рендомным кодом как-нибудь, или шифровались ну что-то хотя бы чтобы не "БЕРЕМ ФАЙЛ РАСПАКУЕМ И ЗАПИШЕМ ПО АДРЕСУ 123 СТРОКУ helo world"
Очень часто спрашивают на форумах вопрос: "Как
написать именно билдер а не конфигуратор?". Если у тебя есть этот же вопрос то читай статью.
О да, и ещё чаще пишут вот такие вот статьи. Если на форумах задают вопрос "как включить компьютер" - это не значит что надо писать сотню статей, где рассказывать как нажать кнопку включения, в виде развернутой поэмы на 10 странц с описанием "сначала сделайте чайку, левой пяткой упритесь в шкаф, правой ногой нажмите кнопку включения"
Последний раз редактировалось KEZ; 04.10.2007 в 20:15..
|
|
|

04.10.2007, 20:12
|
|
Постоянный
Регистрация: 12.12.2006
Сообщений: 906
Провел на форуме: 4205500
Репутация:
930
|
|
боян
Кто переплюнет?
|
|
|

04.10.2007, 20:13
|
|
Banned
Регистрация: 18.05.2005
Сообщений: 1,981
Провел на форуме: 1941233
Репутация:
2726
|
|
бая
|
|
|

04.10.2007, 20:29
|
|
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме: 5339610
Репутация:
4360
|
|
4nob1oz, где берешь такую траву?
тема бред
кез подробно разъяснил почему и я не могу с ним несогласиться..
|
|
|

04.10.2007, 20:41
|
|
Познающий
Регистрация: 09.07.2007
Сообщений: 42
Провел на форуме: 88752
Репутация:
72
|
|
Всем кто ответил, парни вам респект  Я думаю после этих постов в вас станет дерьма на капельку меньше. Я написал на сколько знаю и расписал на столько на сколько считаю нужным. Щас ради интереса ваши статьи почитаю.
Тут один КЕЗ написал что ктото говорит написал подобную статью и все начали писать. Жду линков хотя ты не всё равно не ответишь конечно же на этот пост и не найдёшь ланков на подобные статьи.
To Great: хеллы тру  а вот мог бы и минус не ставить, хотя мне пофиг плюс или минус Без обид чувак но чтото ты заговнился последнее время 
Последний раз редактировалось 4nob1oz; 04.10.2007 в 20:51..
|
|
|

04.10.2007, 20:48
|
|
Постоянный
Регистрация: 27.08.2006
Сообщений: 367
Провел на форуме: 2009677
Репутация:
472
|
|
Простите, а где там билдер? Помойму это конфигуратор хранящий файл в ресурсах. Или же это все грибы виноваты?
|
|
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|