VB6. Пишем билдер

  1. Добрый вечер дамы и господа! В данной статье я опишу процесс создания билдера на Visual Basic 6.

    Билдер - программа, которая выдаст другую, настроенную по вашему желанию,
    не используя при этом компилятора (пример - Pinch). Работать с такой штукой удобно: расставил галочки, заполнил поля, нажал создать и вот он - готовый троян с нужными нам данными. А как же написать такое самому?
    Принцип прост - сначала напишем программу, которая будет считывать данные из себя же, потом напишем прогу которая эти данные меняет.

    Сначала напишем программу, которая считывает из себя данные, а именно ресурсы.
    Откроем Visual Basic 6, создадим проект, не содержащий форм и прочих рюшечек (лишний вес нам пока ни к чему;)).
    Для этого можно создать обычный проект, удалить оттуда форму и создать новый модуль.

    [​IMG]

    В новый модуль пишем код:

    Код:
    Public Function BYTES_TO_STRING(bBytes() As Byte) As String
    BYTES_TO_STRING = bBytes
    BYTES_TO_STRING = StrConv(BYTES_TO_STRING, vbUnicode)
    End Function
    
    Sub Main()
    MsgBox BYTES_TO_STRING(LoadResData(100, 1))
    End Sub
    Функция LoadResData считывает массив данных из ресурсов, где 100 - идентификационный номер ресурса, а 1 - его тип, функция BYTES_TO_STRING нужна для того, чтобы преобразовать массив данных в строку. Ф-цией MsgBox мы их (данные) покажем. Скомпилируем Проект1.exe

    Теперь напишем сам билдер.
    Создадим новый проект (Стандартный EXE), откроем окошко кода и объявим следующие API:

    Код:
    Private Declare Function BeginUpdateResource Lib "Kernel32" Alias "BeginUpdateResourceA" (ByVal pFileName As String, ByVal bDeleteExistingResources As Long) As Long
    Private Declare Function UpdateResource Lib "Kernel32" Alias "UpdateResourceA" (ByVal hUpdate As Long, ByVal lpType As Long, ByVal lpName As Long, ByVal wLanguage As Long, lpData As Any, ByVal cbData As Long) As Long
    Private Declare Function EndUpdateResource Lib "Kernel32" Alias "EndUpdateResourceA" (ByVal hUpdate As Long, ByVal fDiscard As Long) As Long
    
    Ф-ции BeginUpdateResource, UpdateResource, EndUpdateResource нужны для редактирования ресурсов.

    Дальше добавим наш Проект1.exe к нашему билдеру, запихнув его в ресурсы.
    Нужно добавить в Инструменты редактор ресурсов. Для этого щелкнем в меню Дополнения > Менеджер дополнений > Resource Editor.

    [​IMG]

    Теперь выберем в инструментах Resource Editor. Там нажмем на кнопочку Add Custom Resource (вторая справа) и добавим наш Проект1.exe, обозначив его тип как "SFX" а имя как "EXE". Щелкнем кнопку Save и сохраним файл.

    [​IMG]

    Теперь вернемся к форме нашего билдера. Кинем на нее текстовое поле txtText и кнопку cmdCreate. Получится что-то вроде этого:

    [​IMG]

    Ну и запишем в процедуру Cliсk нашей кнопки следующее:

    Код:
    Private Sub cmdCreate_Click()
    
    Dim bin_data() As Byte, nf As Integer
    
    Open "c:\proga.exe" For Binary Access Write As nf
    bin_data = LoadResData("EXE", "SFX")
    Put nf, , bin_data
    Close nf
    
    Erase bin_data
    
    End Sub
    
    Пояснение: Здесь мы создаем и открываем файл c:\proga.exe для бинарного доступа и записываем туда наш Проект1.exe из ресурсов.
    Да, файл создали но ресурсы нигде не редактировали, щас исправим :)
    Для удобства я добавил следующую функцию:

    Код:
    Private Function SetResource(lpType As Long, lpID As Long, lpData As String, lpFile As String) As Long
    
    Dim pReturn As Long, rPort As Long
    pReturn = BeginUpdateResource(lpFile, False)
    If pReturn <> 0 Then
     rPort = UpdateResource(pReturn, lpType, lpID, 1033, ByVal lpData, Len(lpData))
     EndUpdateResource pReturn, False
     If rPort <> 0 Then SetResource = True
    End If
    
    End Function
    
    Где lpType - тип ресурса, lpID - имя ресурса, lpData - данные и lpFile - путь к редактируемому фалу.

    Ну и допишем теперь в cmdCreate вызов нашей функции для редактирования ресурса:

    Код:
    Call SetResource(1, 100, txtText, "c:\proga.exe")
    Теперь запускаем билдер, заполняем текстовое поле любыми данными и жмем на кнопку.
    После открываем наш полученный билд по пути c:\proga.exe и видим сообщение с нашим текстом:)
    Собственно, всё!:)

    P.S. Ленивые особи могут скачать исходники билда и билдера во вложении.

    (c) chimatii, xaker.name & grabberz.com​
     
    1 человеку нравится это.
  2. не самый лучший вариант создавить билдер методом добовления к стабу файла ресурсов...
    не лучший вариант если содержимое это текст...

    для чтения из файла ресурсов есть несколько функций обращения к нему...
    Код:
     Загрузка текстовых данных
    
    Объект = LoadResString(index)
    
    Index - идентификационный номер строки
    
    Объект - TextBox, Label и все остальное, куда можно грузить текст
    
     
    
    Загрузка графических данных
    
    Объект = LoadResPicture(index,format)
    
    Index - идентификационный номер строки с картинкой
    
    Format - тип загружаемых данных:     VbResBitmap - картинки
    
    VbResCursor - курсоры
    
    VbResIcon - иконки
    
    Объект - PictureBox, Image и все остальное, куда можно грузить графику  
    
    Загружает данные и возвращает байтовый массив
    
    Объект = LoadResData(index, format)
    
    Index - идентификационный номер строки с данными
    
    Format - тип возвращаемых данных в виде байтов:
    
    1     Курсор
    
    2     Графика
    
    3     Иконка
    
    4     Меню
    
    5     Окно диалога
    
    6     Текст
    
    7     Каталог со шрифтами
    
    8     Шрифт
    
    9     Таблица
    
    10    Пользовательские ресурсы
    
    12    Группа курсоров
    
    14    Группа иконок 
     
  3. Не умничай я это все знаю:) ресурс сохраняется не как строка, можешь в рестораторе посмотреть
     
  4. chimati, хочу и умничаю :idea:

    ты хотя бы тестировал ?

    Код:
    b() = Split(a, " ")
    MsgBox b(0)
    MsgBox b(1)
    а почему не все слова ?

    Код:
    For i=0 to UBound(b())
    MsgBox b(i)
    Next
    Добавлено через 3 минуты
    хотябы оформил бы...
     
  5. Увидел вот статью, которую писал больше года назад:crazy:
    Нашел некоторые ошибки, оформил по-людски, обновил.
    Результат в первом посте)
     
  6. бедный lytgeygen получил психологическую травму пустот черепной коробки и ночное недержание от вида б-гмерзкого выньапи (буэээ, смотрите, это же винапи на вб6! запинайте его палкой! негодяй!).
    но я до сих пор пью слабительное, дабы вывести из себя всю хворь твоих неграмотных изрыганий, после случайного посещения твоего блога.

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