Билдер для .exe-файла

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by blackbox, 29 Jul 2015.

  1. blackbox

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

    Joined:
    31 Dec 2011
    Messages:
    362
    Likes Received:
    62
    Reputations:
    11
    Никогда подобным не занимался, поэтому появился вопрос. Я так понимаю, что суть в том заменить по данному адресу группу байт. Но у меня приложение использует unicode, я winhex-ом открываю exe и не могу найти нужного текста. А во-вторых, если в бинарнике прописана переменная одной длины, а я по данному адресу изменю байты, то могу затереть байты другой переменной? Да, еще не понял как unicode-данные перезаписывать, там же два байта на символ. Кто может подсказать?
     
  2. blackbox

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

    Joined:
    31 Dec 2011
    Messages:
    362
    Likes Received:
    62
    Reputations:
    11
    Пожаловался. По делу: нашел нужные строки в хекс-редакторе, сейчас попробоую открыть и перезаписать данные массивом tchar.
    UPD: Еще не понятно как записать массив байт, меньший чем в файле.
    Например в проекте у меня прописано TCHAR HOST[] = "127.0.0.1\0\0\0\0...\0";
    Но если я перезапишу данными 1.1.1.1, то хвост от 0.1 остается. Я добавляю к 1.1.1.1 данные вида "\0" но старые байт все-равно не перезаписываются
     
    #3 blackbox, 29 Jul 2015
    Last edited: 29 Jul 2015
  3. i~DOS

    i~DOS Member

    Joined:
    26 Mar 2009
    Messages:
    42
    Likes Received:
    40
    Reputations:
    4
  4. blackbox

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

    Joined:
    31 Dec 2011
    Messages:
    362
    Likes Received:
    62
    Reputations:
    11
    Спасибо, разобрался. Что я не сразу понял: нужно переменные, которые будешь менять забивать большим количеством нулем. А когда файл модифицируешь, то после записи самих строк, в конце еще нулей дописать. С TCHAR точно так же как и с char, только количество байт для перезаписи указываешь * sizeof(TCHAR). Вот пример, если кому пригодится потом:

    Code:
    hFile = CreateFile(fname, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);
        if (!hFile)
        {
            nError = GetLastError();
            
        }
        LONG offset;
         offset =  0x00012AB0;
        wcscpy_s(data, m_sStringData);
        SetFilePointer(hFile, offset, NULL, 0);
        WriteFile(hFile, data, wcslen(data) * sizeof(TCHAR), &dwWritten, NULL);
        WriteFile(hFile, L"\00", 100, &dwWritten, NULL);
     
    makag likes this.
  5. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    не хочу показаться придирчивым, но
    ты бы почитал что такое TCHAR чисто для понимания и избежания некорректных формулировок.
     
  6. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    патчить секцию кода плохая идея, есть разные ограничения/неудобства, та же длина строк, лучше писать, как сказали выше - в ресурсы, либо в конец бинарника, оверлеем, с выставлением какой-нибудь метки для обозначения конфига, а в программе при запуске реализовать функцию инициализации, которая проверит/расшифрует/установит сделает другие действия по настройке программы к работе либо грохнет процесс, в случае отсутствия конфы и т.д.
     
    makag likes this.
  7. blackbox

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

    Joined:
    31 Dec 2011
    Messages:
    362
    Likes Received:
    62
    Reputations:
    11
    Возможно, но это самый распространенный и простой пример, вроде бы. А вот описанный алгоритма я не совсем представляю как реализовать, поэтому простым путем пошел.