Коллеги, кинте plz пару линков на статьи или поделитесь кусочком кода, отвечающим на вопрос, как правильно записать (разместить) в exe что то свое.
Например, Я хочу хранить в exe серийный номер, дабы не создавать на диске или в реестре файлов/записей.
Т.е. работает приложение. Открыли на запись этот же файл в бинарном режиме, сместились куда надо (нашли метку?) записали, закрыли файл, если что то нужно подкорректировать, подкорректировали.
06.11.08 14:36: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Здравствуйте, nen777w, Вы писали:
N>Коллеги, кинте plz пару линков на статьи или поделитесь кусочком кода, отвечающим на вопрос, как правильно записать (разместить) в exe что то свое. N>Например, Я хочу хранить в exe серийный номер, дабы не создавать на диске или в реестре файлов/записей. N>Т.е. работает приложение. Открыли на запись этот же файл в бинарном режиме, сместились куда надо (нашли метку?) записали, закрыли файл, если что то нужно подкорректировать, подкорректировали.
Я думаю, что самое простое будет что-то типа такого.
Размещаешь в исполняемом файле свой буфер:
Дальше ищешь в исполняемом файле строчку "nachalo_moego_bufera" и после неё пишешь свои данные.
Только в выполняемый файл так просто писать не получится. Под юниксом надо вначале удалить выполняющийся файл, далее на его месте создать копию и в ней менять. В винде надо переименовать выполняющийся файл, далее на его месте создать копию и в ней менять.
Здравствуйте, nen777w, Вы писали:
N>Коллеги, кинте plz пару линков на статьи или поделитесь кусочком кода, отвечающим на вопрос, как правильно записать (разместить) в exe что то свое. N>Например, Я хочу хранить в exe серийный номер, дабы не создавать на диске или в реестре файлов/записей. N>Т.е. работает приложение. Открыли на запись этот же файл в бинарном режиме, сместились куда надо (нашли метку?) записали, закрыли файл, если что то нужно подкорректировать, подкорректировали.
Серийник храним в виде ресурса типа RCDATA, обновляем его с помощью
BeginUpdateResource() -> UpdateResource() -> EndUpdateResource()
нет проблем
_U_>Серийник храним в виде ресурса типа RCDATA, обновляем его с помощью _U_>BeginUpdateResource() -> UpdateResource() -> EndUpdateResource() _U_>нет проблем
смущает вот это:
pFileName
[in] Pointer to a null-terminated string that specifies the executable file in which to update resources. An application must be able to obtain write access to this file; it cannot be currently executing.
Вопрос тогда в догонку.
Как я понял строки указанные явно, размещаются в специальной секции данных exe файла.
Два вопроса:
1) Есть ли способ гарантировано разместить строку (как метку) по заданому смещению.
2) Есть ли способ получить смещения по которым размещаются таблицы виртуальных функций (для конкретного класса)?
p.s.
Как наверно уже стало понятно, пишу защиту для Win32 приложения.
nen777w пишет:
> Коллеги, кинте plz пару линков на статьи или поделитесь кусочком кода, > отвечающим на вопрос, как правильно записать (разместить) в exe что то свое. > Например, Я хочу хранить в exe серийный номер, дабы не создавать на > диске или в реестре файлов/записей.
Прочитайте в MSDN про ресурсы. Пользовательские ресурсы.
Здравствуйте, nen777w, Вы писали:
N> записать (разместить) в exe что то свое. N>Например, Я хочу хранить в exe серийный номер, дабы не создавать на диске или в реестре файлов/записей.
Антивирусы, фаерволы и проактивные защиты будут очень недовольны Вирусы ведь тоже очень хотят храниться в EXE файлах.
P.S.: А потом шароварщики, юзающие такие горе-защиты, возмущаются, что их продукт начали детектировать как малварь.
Здравствуйте, nen777w, Вы писали:
N>Коллеги, кинте plz пару линков на статьи или поделитесь кусочком кода, отвечающим на вопрос, как правильно записать (разместить) в exe что то свое. N>Например, Я хочу хранить в exe серийный номер, дабы не создавать на диске или в реестре файлов/записей. N>Т.е. работает приложение. Открыли на запись этот же файл в бинарном режиме, сместились куда надо (нашли метку?) записали, закрыли файл, если что то нужно подкорректировать, подкорректировали.
Имхо, это неправильно. Писать в свой же ехе не есть хорошо. Помимо того, что сказал IID по поводу антивирусов, добавлю:
1. тебе, по идее, не даст ОС записать в уже запушенный ехе, т.к. он будет защищен во время выполнения виндой;
2. лучше уж хранить в файле свои ключи.
R>Имхо, это неправильно. Писать в свой же ехе не есть хорошо. Помимо того, что сказал IID по поводу антивирусов, добавлю: R>1. тебе, по идее, не даст ОС записать в уже запушенный ехе, т.к. он будет защищен во время выполнения виндой;
Серьезно? А вы попробуйте
Есть даже утилита для тяжёлых случаев Unlocker называется.
R>2. лучше уж хранить в файле свои ключи.
Можно и так, но при переносе exe на другую машину он чист, а не хотелось бы. Раз патчили, значит левак.
Я по сути, буду генерировать ключ по ключу + привзяка к винту (винт есть носитель инофрмации), результат писать в файл.
Даже если пропатченный файл перенесли, он уже не будет запускаться на другой машине.
+ небольшие мутки с таблицами виртуальных функций.
Единственное что смущает что по этому поводу подумает антивирь.
Здравствуйте, nen777w, Вы писали:
R>>1. тебе, по идее, не даст ОС записать в уже запушенный ехе, т.к. он будет защищен во время выполнения виндой;
N>Серьезно? А вы попробуйте N>Есть даже утилита для тяжёлых случаев Unlocker называется.
Здравствуйте, nen777w, Вы писали:
N>Есть даже утилита для тяжёлых случаев Unlocker называется.
С очень хорошей долей вероятности может свалить систему в BSOD. Вероятность зависит от сторонних фильтров ФС, понатыканных сторонним софтом.
N>Можно и так, но при переносе exe на другую машину он чист, а не хотелось бы. Раз патчили, значит левак.
А как вы определите, патчили файл или нет ? (hint: любая ваша проверка внутри EXE точно так же пропатчивается). Security by obscurity короче.
Правильный способ убедиться в неизменности PE — цифровая подпись. Конечно, проверяющий код не должен быть скомпрометирован.
N>Я по сути, буду генерировать ключ по ключу + привзяка к винту (винт есть носитель инофрмации), результат писать в файл.
в файл, но не в EXE(!)
N>Даже если пропатченный файл перенесли, он уже не будет запускаться на другой машине.
Будет (см. выше о security)
N>+ небольшие мутки с таблицами виртуальных функций.
Всё что угодно, но только на этапе "навешивания" защиты, а не пересборка бинаря on the fly.
N>Единственное что смущает что по этому поводу подумает антивирь.
Антивирь совершенно справедливо надаёт линейкой по рукам. Больно. И отправит читать Шнайера.
R>>>1. тебе, по идее, не даст ОС записать в уже запушенный ехе, т.к. он будет защищен во время выполнения виндой;
N>>Серьезно? А вы попробуйте N>>Есть даже утилита для тяжёлых случаев Unlocker называется.
R>Попробовал. Получил ERROR_SHARING_VIOLATION.
Хех... Ну а если подумать?
1) Запускается файл exe, выползает диалог: введи брат ключ.
2) Брат вводит ключ
3) Создаем каталог tmp
4) Переносим!!! своё exe туда
5) Копируем своё exe оттуда на старое место
винда сейчас лочит от записи перенесённый exe в каталоге!
6) Открываем файл который мы вернули в зад на запись.
7) Патчим, антивирусняки совершенно не напрягаются по этому поводу т.к. этот скопированный назад exe не является запущенным
8) Создаем батник (или другим способом)
9) Говорим юзверю: брат спасибо за ключ щас надо перезапустицо.
10) Имеем результат. Файл пропатчен, антивирусняки спят спокойно.
Здравствуйте, nen777w, Вы писали:
R>>>>1. тебе, по идее, не даст ОС записать в уже запушенный ехе, т.к. он будет защищен во время выполнения виндой;
N>>>Серьезно? А вы попробуйте N>>>Есть даже утилита для тяжёлых случаев Unlocker называется.
R>>Попробовал. Получил ERROR_SHARING_VIOLATION.
N>Хех... Ну а если подумать?
N>1) Запускается файл exe, выползает диалог: введи брат ключ. N>2) Брат вводит ключ N>3) Создаем каталог tmp N>4) Переносим!!! своё exe туда N>5) Копируем своё exe оттуда на старое место
N>винда сейчас лочит от записи перенесённый exe в каталоге!
N>6) Открываем файл который мы вернули в зад на запись. N>7) Патчим, антивирусняки совершенно не напрягаются по этому поводу т.к. этот скопированный назад exe не является запущенным N>8) Создаем батник (или другим способом) N>9) Говорим юзверю: брат спасибо за ключ щас надо перезапустицо. N>10) Имеем результат. Файл пропатчен, антивирусняки спят спокойно.
Дополнение, про 8й пункт это я не дописал, что удаляем скопированный файл в tmp каталог вместе с каталогом после завершения приложения.
Здравствуйте, nen777w, Вы писали:
N>Хех... Ну а если подумать?
N>1) Запускается файл exe, выползает диалог: введи брат ключ. N>2) Брат вводит ключ N>3) Создаем каталог tmp N>4) Переносим!!! своё exe туда N>5) Копируем своё exe оттуда на старое место
N>винда сейчас лочит от записи перенесённый exe в каталоге!
N>6) Открываем файл который мы вернули в зад на запись. N>7) Патчим, антивирусняки совершенно не напрягаются по этому поводу т.к. этот скопированный назад exe не является запущенным N>8) Создаем батник (или другим способом) N>9) Говорим юзверю: брат спасибо за ключ щас надо перезапустицо. N>10) Имеем результат. Файл пропатчен, антивирусняки спят спокойно.
Жуть.
Вот по поводу 10-го пункта не соглашусь. Файрвол, если прога с инетом работает, подумает, что это новая версия и не пустит в инет, точнее спросит стоит ли пускать.
И еще: если прога лежит в Program Files, то там часто бывает режим только для чтения, вернуть пропатченную версию не получится под простым пользователем.
N>>10) Имеем результат. Файл пропатчен, антивирусняки спят спокойно. R>Жуть. R>Вот по поводу 10-го пункта не соглашусь. Файрвол, если прога с инетом работает, подумает, что это новая версия и не пустит в инет, точнее спросит стоит ли пускать. R>И еще: если прога лежит в Program Files, то там часто бывает режим только для чтения, вернуть пропатченную версию не получится под простым пользователем.
Эх... Кабы была поддержка сети, и сервер, я б защиту не так построил. А так конечно жуть, но работает.
Касперыч вот сидит и не жужит. Правда сказать я под Админом. Надо бы под простым юзером как Вы говорите попробовать.
Но думаю что запустить программу под администратром как то таки можно. Я помню где то уже делал такое, надо пошарица по исходникам.
Вопрос теперь в другом. Как найти в exe таблицы виртуальных функций. Вообще может либа какая есть которая PE файлы разбирает по кусочкам а потом собирает? А то ну так влом писать свой парсер, да и в формате надо разобраться.
Вот незря говорят, что российские программы — это мощные, продуманные, сложные защиты от копирования с небольшими дополнительными возможностями.
Это же надо, обходить защиту файлов, антивирусы и даже исзыскивать способ запуска приложения под администратором, только ради того, чтобы надавать по рукам наглецам, запускающим программу без лицензии...
Здравствуйте, nen777w, Вы писали:
N>Коллеги, кинте plz пару линков на статьи или поделитесь кусочком кода, отвечающим на вопрос, как правильно записать (разместить) в exe что то свое. N>Например, Я хочу хранить в exe серийный номер, дабы не создавать на диске или в реестре файлов/записей. N>Т.е. работает приложение. Открыли на запись этот же файл в бинарном режиме, сместились куда надо (нашли метку?) записали, закрыли файл, если что то нужно подкорректировать, подкорректировали.
При такой постановке — задача не решаема
Здравствуйте, nen777w, Вы писали:
N>Вопрос теперь в другом. Как найти в exe таблицы виртуальных функций. Вообще может либа какая есть которая PE файлы разбирает по кусочкам а потом собирает? А то ну так влом писать свой парсер, да и в формате надо разобраться.
Извините, а ваша защита тоже так же работать будет?
Из всех вариантов записи в ЕХЕ, если использовать, то лучше только "легальный" — через ресурсы. иначе АВ устроит кипишь .. с большой вероятностью.
а лучше все же, наоборот, удостовериться, что никто не сможет никогда изменить ЕХЕ, а отдельно писать информацию.. ИМХО
Вся сложность в записи в запущенный файл. А почему бы не заюзать библиотекчку для этого? Назвать как-нить лево, типа OpenGLDriver.dll b юзать её ресурся для чего тебе надо. От супер мега хацкеров конечно не спасет, ну лучше чем ничего
A>Здравствуйте, nen777w, Вы писали: A>Вся сложность в записи в запущенный файл. А почему бы не заюзать библиотекчку для этого? Назвать как-нить лево, типа OpenGLDriver.dll b юзать её ресурся для чего тебе надо. От супер мега хацкеров конечно не спасет, ну лучше чем ничего
Сложности записи в тело запущенного exe как раз нет. Я выше описал способ это сделать.
Помимо записи я хочу ещё сделать патч, в частности патч (настройку) VTBL.
Здравствуйте, nen777w, Вы писали:
N>Коллеги, кинте plz пару линков на статьи или поделитесь кусочком кода, отвечающим на вопрос, как правильно записать (разместить) в exe что то свое. N>Например, Я хочу хранить в exe серийный номер, дабы не создавать на диске или в реестре файлов/записей. N>Т.е. работает приложение. Открыли на запись этот же файл в бинарном режиме, сместились куда надо (нашли метку?) записали, закрыли файл, если что то нужно подкорректировать, подкорректировали.
А как насчет такого трюка:
Пользователь скачивает инсталляционный пакет.
Непосредственно перед самой закачкой, какой-то php скрипт пишет в иссталляционынй пакет серийный номер,
либо как вариант, прописывается номер в exe-шник, и потом на сервере собирается инсталляционный пакет,
хотя это наверное сложнее.
Потому, в случае первого варианта, исталляционный пакет перед окончанием работы быстренько прописывает
в exe-шник сериыйный номер. Думаю, у антивируса не возникнет подозрения от того, что инсталляционный
пакет создает exe-файл?
То есть прикол в том, чтобы номер прописывался ДО первого запуска приложения пользователем, а именно во
время скачивания.
В общем, мой совет не к тому, как вообще записать в ехе-шник, а как записать так, чтобы ни один антивирус
носа не подточил, да и хакерам жизнь усложнить. Кроме того, если связать прописываемый серийный номер с
зарегистрированным пользователем, можно получить немного информации о том, кто из твоих пльзователей
стал источником взломанной проги, если конешно, фокус не разгадают и серийник не притрут. А там глядишь,
выйдешь на e-mail, IP-адреса, и личность хакера. Хотя это больше фантазии.
Сори что квотинг убрал.
Ага. Я как раз так и думал. Типа юзверь выбирает место куда ставить, получаем серийный номер девайса, или ещё что то, просим ввести ключк, генерируем ключ привязаный к этому номеру, создаем в процессе инсталяции екзкшник с прописанным ключиком.
Вот как то так.
Хотя надёжно защитить не получится. На данный момент времени мне известно только одно приложение которое вот уже 2-года не могут взломать и наверно никогда и не взломают. Это Steinberg Cubase 4.
Steinberg Cubase 3 — базировался на такой же защите, но его усилиями команды H2O взломали, хотя они честно признались что это было охринительно сложно, в 4-й версии они что то там подправили и теперь вероятно взломать его уже не сможет никто.
Здравствуйте, Rocky, Вы писали:
... R>И еще: если прога лежит в Program Files, то там часто бывает режим только для чтения, вернуть пропатченную версию не получится под простым пользователем.
В висте есть "виртуальные"(FILE_ATTRIBUTE_VIRTUAL) файлы — Физически такой файл находится в профиле, а отображается может на 'Program Files'. "Фича" для совместимости с любителями писать в системные папки.
Здравствуйте, nen777w, Вы писали:
N>Хотя надёжно защитить не получится. На данный момент времени мне известно только одно приложение которое вот уже 2-года не могут взломать и наверно никогда и не взломают. Это Steinberg Cubase 4. N>Steinberg Cubase 3 — базировался на такой же защите, но его усилиями команды H2O взломали, хотя они честно признались что это было охринительно сложно, в 4-й версии они что то там подправили и теперь вероятно взломать его уже не сможет никто.
Cubase 3 был защищен аппаратным ключом (USB), который они смогли проэмулировать программно.
Здравствуйте, nen777w, Вы писали:
N>Коллеги, кинте plz пару линков на статьи или поделитесь кусочком кода, отвечающим на вопрос, как правильно записать (разместить) в exe что то свое.
Вариант, допускающий запуск под контролем атакующего, не обеспечит надёжную защиту. Правильно — делать это на своём сервере. Как-то так
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth