Авторские статьи Builder собственными руками.

Discussion in 'Статьи' started by razzzar, 17 Jan 2008.

  1. razzzar

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

    Joined:
    16 Jun 2007
    Messages:
    92
    Likes Received:
    75
    Reputations:
    5
    [ 0x00 Intro ]

    Builder – это утилита, которая на основе введеных вами параметров генерирует исполняемый файл.

    Возьмем к примеру известный троян под названием Pinch. Для создания собственной копии вы все несомнено пользовались билдерами. Вы вводили адрес своей статы или e-mail’а. После этого программа генерировала сам пинч.

    Многие новички в программировании озадачиваются как же написать свой собственный билдер. В этой статье мы с вами напишем простенький, но работающий экземпляр билдера.

    [ 0x01 Soft ]

    Сначала выясним что нам надо для того, чтобы написать свой билдер.

    • Компилятор языка С/С++. Думаю объяснять зачем он нужен не требуется  Я использую Microsoft Visual Studio 2003 .NET
    • HEX редактор. Он нужен для того, чтобы узнать оффсет данных в файле, которые надо изменить. Я использовал HEX Workshop v5. Взять можна здесь: http://dociyo.nnm.ru/hex_workshop_v5022769.
    • Дампер HEX в тестовый файл в виде массива. Я использовал BIN2TEXT. Можете еще использовать мою разработку Into Hex. Взять их можна соответственно в этих местах: http://rapidshare.com/files/84364989/BIN2TEXT.EXE , http://forum.antichat.ru/showthread.php?p=543234 .

    [ 0x02 Build ]

    Перед тем, как делать билдер, надо собственно взять саму программу, для которой будем делать билдер. Я решил не делать билдер для какого-то уже готового продукта, а сделать этот сам продукт самому.

    Вот его исходник:
    Code:
    #include <windows.h>
    
    int __stdcall WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
    	char szText[256] = "qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq";
    
    	MessageBox(0, szText, "!", 0);
    }
    
    Как ясно из исходного кода, ничего сверхъестественного наша программка делать не будет. Всего лиш покажет диалоговое окно с нашей надписью на нем.

    Посмотрите внимательно на объявление переменной szText. Во-первых она заданой длины ( 256 байт ). Во-вторых ей сразу присваивается значение, состоящие из 255 символов ‘q’, а также 256-ого символа окончания строки ‘\0’. Вы спросите почему мы задали эту строку через цикл или не функцией memcpy? А потому что, тогдабы наша строка инициализировалась в момент выполнения программы, и при отбражении ее в HEX редакторе мы бы нашли только один символ ‘q’, который бы мы передавали в цикле или функции. Как аналог можна было б выполнить функцию strcpy, но эти не рационально, потому как в ее параметре мы передали б все ту же строку, состоящую из 255 символов ‘q’ и одного ‘\0’. То есть мы бы просто-напросто затрачивали лишнии ресурсы на запуск постороней функции.

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

    После написания исходного кода, компилируем его и получаем exe файл, для которго и будем делать билдер.

    [ 0x03 Builder ]

    Теперь поговорим о самом интересном :)

    Изменять как вы уже догадались мы будем ту самую строку, которая выводится в диалогов окне.

    Для начала нам нужно сделать дамп HEX’а нашей программки. Запускаем BIN2TEXT с такими параметрами:

    • bin2text.exe c build.exe

    Примичание. Build.exe – это исполняемый файл, который мы создали в пред. пункте.

    После этого у нас в папке с BIN2TEXT появился файлик build.c. Открываем его и видим внутри уже созданный массив типа unsigned char ( BYTE ), в котором находится каждый байтик нашей программки.

    Далее запускаем HEX Workshop и в нем открываем build.exe. Выбираем пункт меню Edit->Find… ( CTRL+F ). В открывшемся диалоговом окне вводим такие значения:

    • Type: Text String
    • Value: qqqq

    Поток жмем на кнопку OK. Мы видим что программа спозиционировала нас на оффсет, где записана наша строка. В нижней панельке в самой верхей стркое будет написано что-то по типу offset: 17136 [0x000042F0]. Это и будет оффсет нашей строки. Нас интересует его значение в десятичном представлении, то есть 17136.

    После того как мы сделали все предварительные действия, приступаем к написанию самого билдера.

    Покажем билдеру оффсет нашей строки:

    Code:
    #define OFFSET 17136
    
    Скопируем из build.c в наш проект массив данных. В своей программе я переименовал массив из build в data.

    Code:
    unsigned char data[]=
    {
    0x4d,0x5a,0x90,0x00,0x03,0x00,0x00,0x00
    ...
    ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    };
    
    Теперь напишем функцию, которая будет изменять в этом массиве наши данные.

    Code:
    int Replace(char * szReplace)
    {
    	if ( strlen(szReplace) > 256 )
    	{
    		return 0;
    	}
    
    	for ( int k=OFFSET, l=0; l<=(int) strlen(szReplace); k++, l++ )
    	{
    		data[k] = szReplace[l];
    	}
    
    	return 1;
    }
    
    В параметры этой функции мы передаем указатель на строку, которая будет заменять собой строку в билде.

    Потом мы проверяем не выходит ли стркоа за рамки допустимой длины ( ведь в нашей программе макс. строка – это 256 символов ). Если выходит – тогда завершаем функцию, возвращая 0.

    Далее мы делаем цикл, в котором собственно изменяется строка. k – это номер байта в массиве ( начало нашей строки – OFFSET ), l – текущий символ новой строки. С каждым проходом цикла изменяется по одному символу строки на новый. В самом цикле мы указали условие выхода, когда l будет больше длины новой строки. Это надо для того, чтобы скопировать последний символ строки, то есть смвол окончания строки ‘\0’.

    Потом функция возвращает 1, как знак того, что она выполнилась успешно.

    Теперь разберем главную функцию билдера:

    Code:
    int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShow)
    {
    	char szReplace[256];
    	FILE * fFile;
    
    	strncpy(szReplace, lpCmdLine, 256);
    	if ( Replace(szReplace) == 0 )
    	{
    		MessageBox(0, "Error!", "Builder", 0);
    		return 0;
    	}
    
    	fFile = fopen("file.exe", "wb");
    	fwrite(data, sizeof(unsigned char), sizeof(data), fFile);
    	fclose(fFile);
    
    	return 1;
    }
    
    В самом начале мы объявляем строку длиной 256 символов. Далее мы копируем в нее 256 символов из строки параметров нашей программы. Это и будет строка, которая будет заменена в программе.

    Далее мы вызываем ранее написаную нами функцию Replace, в параметр которой мы передаем указатель на нашу строку szReplace. Если функция вернула 0, то сообщаем об ошибке и и завершаем выполнение нашей программы.

    Следующим шагом будет собствено создание самого билда. Мы открываем файл на запись в бинарном режиме ( если он ранее существовал, то будет уничтожен ) и пишем туда наш, уже измененый, массив данных. Потом закрываем файл и завершаем выполнение программы.

    После компиляции, мы можем запускать наш билдер. Допустим так:

    • builder.exe Hello!

    В директории с билдером появится файл file.exe. После запуска которго, мы увидим диалоговое окошко с надписью “Hello!”.

    [ 0x04 Outro ]

    На этом все  Мы написали свой собственный билдер, иэто было не так уж и сложно. Надо лишь уметь работать с HEX редактором, умение работать с массивами и с файлами в языке С/С++.

    Исходные тексты программ, разработаных в данной статье, можна взять здесь: http://rapidshare.com/files/84378956/builder.rar.

    С уважением RaZzZaR.
     
    2 people like this.
  2. Piflit

    Piflit Banned

    Joined:
    11 Aug 2006
    Messages:
    1,249
    Likes Received:
    585
    Reputations:
    31
    конфигуратор =\