Никогда подобным не занимался, поэтому появился вопрос. Я так понимаю, что суть в том заменить по данному адресу группу байт. Но у меня приложение использует unicode, я winhex-ом открываю exe и не могу найти нужного текста. А во-вторых, если в бинарнике прописана переменная одной длины, а я по данному адресу изменю байты, то могу затереть байты другой переменной? Да, еще не понял как unicode-данные перезаписывать, там же два байта на символ. Кто может подсказать?
Используй ресурсы EXE-файла. https://msdn.microsoft.com/en-us/library/windows/desktop/ms648030(v=vs.85).aspx https://msdn.microsoft.com/en-us/library/windows/desktop/ms648049(v=vs.85).aspx https://msdn.microsoft.com/en-us/library/windows/desktop/ms648032(v=vs.85).aspx
Пожаловался. По делу: нашел нужные строки в хекс-редакторе, сейчас попробоую открыть и перезаписать данные массивом tchar. UPD: Еще не понятно как записать массив байт, меньший чем в файле. Например в проекте у меня прописано TCHAR HOST[] = "127.0.0.1\0\0\0\0...\0"; Но если я перезапишу данными 1.1.1.1, то хвост от 0.1 остается. Я добавляю к 1.1.1.1 данные вида "\0" но старые байт все-равно не перезаписываются
Вот именно оно самое: https://www.google.ru/search?q=patching+pe+file Пример примитивного билдера на delphi можно найти здесь: http://avtuh.ru/2011/06/03/delphi-sozdaem-bilder-builder.html
Спасибо, разобрался. Что я не сразу понял: нужно переменные, которые будешь менять забивать большим количеством нулем. А когда файл модифицируешь, то после записи самих строк, в конце еще нулей дописать. С 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);
не хочу показаться придирчивым, но ты бы почитал что такое TCHAR чисто для понимания и избежания некорректных формулировок.
патчить секцию кода плохая идея, есть разные ограничения/неудобства, та же длина строк, лучше писать, как сказали выше - в ресурсы, либо в конец бинарника, оверлеем, с выставлением какой-нибудь метки для обозначения конфига, а в программе при запуске реализовать функцию инициализации, которая проверит/расшифрует/установит сделает другие действия по настройке программы к работе либо грохнет процесс, в случае отсутствия конфы и т.д.
Возможно, но это самый распространенный и простой пример, вроде бы. А вот описанный алгоритма я не совсем представляю как реализовать, поэтому простым путем пошел.