Неск. вопросов по кодингу билдера для ...

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by winsock, 24 Oct 2010.

  1. winsock

    winsock New Member

    Joined:
    15 Aug 2010
    Messages:
    57
    Likes Received:
    2
    Reputations:
    0
    Хочу написать билдер для ..... программы которая выводит мэседж бокс... : )

    Что бы написать именно билдер мне нужен компилятор, лучшем решением наверно будет взять за основу какой нибудь опен соурс проект. Не подскажете какой ? (под С с классами.)

    Где/как хранить код ?


    Может кто-нибудь скинет готовый код ?Возможно наглость , но в коде билдера нечего интересного нету впринцепи, разные фичи типо рандомизации кода можете оставить при себе.
     
  2. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    937
    Likes Received:
    162
    Reputations:
    27
    Нет, нет, плохая идея.
    Для написания билдера не нужен компилятор. Если билдер будет компилировать код, - есть возможность посмотреть полный код самого билда.

    Прочитай это:
    По сути тоже самое, только на Delphi. Но принципиальных отличий в самой технологии быть не должно.
     
  3. winsock

    winsock New Member

    Joined:
    15 Aug 2010
    Messages:
    57
    Likes Received:
    2
    Reputations:
    0
    Ну это скорее конфигуратор. А если допустим нужно часть проги отрезать(отключить некоторые функции)? например для уменьшения размера исполняемого файла... ?

    Что код посмотреть можно будет понимаю, поэтому и спрашиваю как его спрятать ...
     
  4. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Самый банальный алгоритм работы билдера.
    1) пишется прога, по возможности данные связанные с конфигурацией делаются в ситиле
    Делфи:
    server:string = "site.com"+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0;
    Си/С++
    char server[] = "site.com\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";

    т.е. сразу инициализируем переменную, но таким образом чтобы был еще запас памяти под измене0ние данных.
    2) смотришь через любой HEX редактор оффсеты на эти переменные.
    3) закидываешь в ресурсы скомпиленный файл.

    Когда надо делать билд, то
    1) Делаешь простую прогу с формой для ввода данных о конфиге
    2) Когда билдишь, то извлекаешь из ресурсов свой файлик
    3) по оффсетам которые ты уже знаешь, вписываешь конфигурационные данные
    главное проверить длину вписываемых данных и размера памяти под них.

    Вот и всё.
    НУ конечно если требуется какая то обработка данных, то можно перед записью ей произвести (допустим шифрование)

    В инете когдато выкладывал исходники бидера пинча, там всё это были реализовано. (На делфи)
     
  5. A_n_d_r_e_i

    A_n_d_r_e_i Active Member

    Joined:
    2 Sep 2009
    Messages:
    175
    Likes Received:
    250
    Reputations:
    27
    а если создавать в бинарном режиме файлик и в него потом код программно заранее подготовленный(и поправленый через интерфейс билдера) запихивать? или глупо?
     
  6. Vlad&slav

    Vlad&slav Member

    Joined:
    1 Jan 2009
    Messages:
    207
    Likes Received:
    41
    Reputations:
    9
    http://darkoff.ru/2010/06/создание-билдера-на-delphi/
     
  7. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 winsock То что ты назвал это уже честь другое.
    В таком случае есть маленькая фишка, но довольно сложно выполняется.
    В проге:
    Каждую используемую функцию помечаешь как экспортируемую. В этоге получается какбы своеобразный exe файл но с таблицей экспорта.
    Перед выполнение каждой функции ты проверяешь первые 4 байта функции.

    В билдере ты на основе виртуальных адресов вычисляешь физические адерса каждой функции.
    Когда тебе надо отключать модули, то затираешь первые 4 байта функций (котоыре юзает этот модуль). т.е. забиваешь нулями.
    Затем сносишь наглухо таблици экспорта чтобы не светилась, а далее пакуешь файл
    через любой пакет чтобы размер стал меньше.

    Вот так вот и отключаешь определенные модули. т.е. при инициализации каждого модуля, ты просто проверяешь первые 4 байта функции этого модуля.
    типа
    if (*(DWORD*)&Modul1_proc) // если не нули то сделаем инит модуля.
    {
    Modul1_proc(******);
    }

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

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

    т.е. выходит ты сам создаешь код главного файла (он очень небольшой)
    и там ты просто можешь не впихивать определенные функции.
    А когда компилишь и если компилятор видит что нет ссылки на функции модуля, то он не вкомпиливает их. (если конечно не отключена удаление неиспользуемых данных)
     
  8. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 Vlad&slav судя по коду в статье человек этот вообще не знает что такое копирование областей памяти, он по сути говорят сделал огромное кол-во беспалезный действий.
    да и если патчить файл с винта, то проще отобразить его в память через файлмаппинг и сразу в оперативе загнуть всё что нужно, да и попутно потом можно просчитать crc (если это допустим драйвер)
     
  9. _nic

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

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Ещё в ресурсах можно хранить структуру с настройками.