Авторские статьи Как написать билдер на Vc++

Discussion in 'Статьи' started by 4nob1oz, 4 Oct 2007.

  1. 4nob1oz

    4nob1oz Elder - Старейшина

    Joined:
    9 Jul 2007
    Messages:
    32
    Likes Received:
    22
    Reputations:
    0
    /--------------------------------/
    /Как написать билдер на 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++ и вставляем туда код:

    Code:
    #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, теперь вставляем код:

    Code:
            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
     
    1 person likes this.
  2. Hellsp@wn

    Hellsp@wn Elder - Старейшина

    Joined:
    29 Apr 2007
    Messages:
    413
    Likes Received:
    153
    Reputations:
    48
    хез, ну почему же так категорично? А что нам мешает помеять адресс строки на новый и вхреначить большую строку там? =)
     
    1 person likes this.
  3. KEZ

    KEZ Ненасытный школьник

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

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

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

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

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

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

    ну это конечно просто АААААААААААД
    ЭТО РАЗРЫВАЕТ МНЕ МОЗГ
     
    #3 KEZ, 4 Oct 2007
    Last edited: 4 Oct 2007
    3 people like this.
  4. Piflit

    Piflit Banned

    Joined:
    11 Aug 2006
    Messages:
    1,296
    Likes Received:
    585
    Reputations:
    31
    нахрен ресурсы? можно просто работать с массивом, в которому будет бинарник в hex
    KEZ у меня описание получилось короче =)
     
  5. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,650
    Likes Received:
    754
    Reputations:
    397
    простейшие операции с файлами+простейшие операции с памятью

    ещё короче

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

    О да, и ещё чаще пишут вот такие вот статьи. Если на форумах задают вопрос "как включить компьютер" - это не значит что надо писать сотню статей, где рассказывать как нажать кнопку включения, в виде развернутой поэмы на 10 странц с описанием "сначала сделайте чайку, левой пяткой упритесь в шкаф, правой ногой нажмите кнопку включения"
     
    #5 KEZ, 4 Oct 2007
    Last edited: 4 Oct 2007
  6. Fata1ex

    Fata1ex Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    753
    Likes Received:
    300
    Reputations:
    38
    боян


    Кто переплюнет?
     
  7. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,650
    Likes Received:
    754
    Reputations:
    397
    бая
     
    2 people like this.
  8. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,043
    Likes Received:
    1,117
    Reputations:
    1,139
    4nob1oz, где берешь такую траву?
    тема бред

    кез подробно разъяснил почему и я не могу с ним несогласиться..
     
    3 people like this.
  9. 4nob1oz

    4nob1oz Elder - Старейшина

    Joined:
    9 Jul 2007
    Messages:
    32
    Likes Received:
    22
    Reputations:
    0
    Всем кто ответил, парни вам респект :) Я думаю после этих постов в вас станет дерьма на капельку меньше. Я написал на сколько знаю и расписал на столько на сколько считаю нужным. Щас ради интереса ваши статьи почитаю.

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

    To Great: хеллы тру ;) а вот мог бы и минус не ставить, хотя мне пофиг плюс или минус Без обид чувак но чтото ты заговнился последнее время :(
     
    #9 4nob1oz, 4 Oct 2007
    Last edited: 4 Oct 2007
  10. Ni0x

    Ni0x Elder - Старейшина

    Joined:
    27 Aug 2006
    Messages:
    344
    Likes Received:
    157
    Reputations:
    37
    Простите, а где там билдер? Помойму это конфигуратор хранящий файл в ресурсах. Или же это все грибы виноваты?
     
    1 person likes this.
  11. Talisman

    Talisman Elder - Старейшина

    Joined:
    22 Apr 2006
    Messages:
    405
    Likes Received:
    152
    Reputations:
    80
    *****! билдер - собирает код применяя антиотладку и крипт от сигнатур. где твоя хрень это делает? почему у пинча билдер, а не конфигуратор? разница понятна?
     
  12. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,043
    Likes Received:
    1,117
    Reputations:
    1,139
    1) Линки на подобные статьи - посмотри темы, созданныек кузьмичем, если его топик не стерли еще

    2) Твоего мнения я кажется не спрашивал. Кез достаточно хорошо аргументировал то, что статья бредовая. Если у тебя есть возражения - в студию.
    Если нет, то будь добр, не флеймь в своей же теме. и без тебя флуда хватает.
     
  13. Ni0x

    Ni0x Elder - Старейшина

    Joined:
    27 Aug 2006
    Messages:
    344
    Likes Received:
    157
    Reputations:
    37
    Это вы прочитали в книге Михаила Фленова "Билдер глазами хакера" или "____ правят миром" от Кузьмича ?
     
    1 person likes this.
  14. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,650
    Likes Received:
    754
    Reputations:
    397
    Ссылки, которые кез так и не отпишет никогда
    http://forum.antichat.ru/thread49909-%E1%E8%EB%E4%E5%F0.html
    http://forum.antichat.ru/thread44012-%E1%E8%EB%E4%E5%F0.html
    http://forum.antichat.ru/thread44023-%E1%E8%EB%E4%E5%F0.html