LINUX.ORG.RU

Выучил c++: как внедрить в бинарь свой код

 ,


0

2

Выучил я с++ и написал программу.

Теперь осталось запаковать ее и сделать первый выпуск.

Вот что я хочу: хочу, чтобы в бинарном файле можно было изменить строку. То есть бинарник будет как бы именным, с неким штампом, подписью, токеном. Я хочу типа регекспом искать в бинарнике некую строку и заменять ее на уникальную. Ну типа логина. Строка это будет например char name[10] = «holderxxxx». Вот мне этот holderxxxx нужно заменять на реальное значение, чтобы потом в коде вывести «привет name»

Как такое сделать?

★★★★

Если длина строки не меняется, то простым редактированием бинарника. Я что-то такое подобное проделывал (подменял имена функций в бинарной библиотеке), работало

Sahas ★★★★☆
()
Ответ на: комментарий от gobot
cat test.cpp
#include <iostream>
#include <string>

int main() {
  std::string s = "Hello, world!\n";
  std::cout << s;
}
g++ test.cpp
./a.out
Hello, world!

sed -i 's/world/Vasya/' a.out 
./a.out 
Hello, Vasya!

-O2 компиляция всё оптимизирует, поэтому с ней такой фокус не прокатывает

update: static std::string s = «Hello, world!\n» работает и в случае -O2

Sahas ★★★★☆
()
Последнее исправление: Sahas (всего исправлений: 2)
Ответ на: комментарий от gobot

Да, бинарник представляет из себя несколько секций с кодом и данными, операционка при «запуске» читает это с диска и раскладывает в памяти, посему секцию с данными можно условно безопасно редактировать.

sparks ★★★★
()
Ответ на: комментарий от anonymous

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

gobot ★★★★
() автор топика

Выучил я с++

Да блин, даже Страуструп может себе позволить иногда сказать «Это магия». А он выучил.

rumgot ★★★★★
()

Если тебе нужно каким-то образом идентифицировать внутри программы ее так скажем серийный номер, то я бы делал так: использовал какую-нибудь криптографическую библиотеку (например Botan) и с помощью ее расшифровывал бы во некий зашифрованный тобой файл и котором будет вся требуемая тебе информация. Ключ для расшифровки нужно не хранить в виде статической строки (тогда ее легко можно найти в бинарнике), а получать неким запутанным образом из функции или последовательных вызовов функций.

rumgot ★★★★★
()
Последнее исправление: rumgot (всего исправлений: 1)
Ответ на: комментарий от rumgot

Так он для пиара это говорил) Магия есть, например что адрес может перезаписать и тупо напихать туда новые данные. Брутальный язык, да

gobot ★★★★
() автор топика
Ответ на: комментарий от rumgot

Нет, мне не это нужно. Более примитивно. Тупо логин чтобы не вбивать, а чтобы он был уже готовый в бинаре. Хотя конечно это не логин, а токен, по которому будет http запрос на сервер и идентификация

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

логин чтобы не вбивать, а чтобы он был уже готовый в бинаре.

А не проще вынести его в конфиг и там править по мере надобности? И даже свой конфиг для каждого юзера можно создать. А можно передать в командной строке.

aureliano15 ★★
()
Ответ на: комментарий от gobot

не думал что так тривиально)

попробуешь, узнаешь как «тривиально» бывает ;)

anonymous
()

Выучил я с++ и написал программу. Как такое сделать?

А говоришь выучил.

anonymous
()
Ответ на: комментарий от aureliano15

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

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

Может быть что-нибудь на тему «exepack» посмотреть?

Какой-нибудь UPX или чем там сейчас пакуют исполнимые бинарники?

Ну, чтобы:

токен, по которому будет http запрос на сервер и идентификация

не так уж просто разглядеть.

Собираем->вшиваем токен->запаковываем получившееся. Как-то так.

Когда-то ASPack здорово нервы попортил на оффтопике, было дело.

Toxo2 ★★★★
()
Ответ на: комментарий от gobot

а когда выйдет следующая версия опять всем бинарники именные раздавать будешь?

biglpfan
()
Ответ на: комментарий от anonymous

Да ладно, это мелочи, главное сделал то что хотел всего за пару недель. Сэкономил денег. Норм

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

один бинарь

Если речь о чужом блобе без исходников, тогда да.

лучше бы формат бинаря б уже создали с правкой, типа EXIF

Так для этого существуют интерпретируемые языки. А бинарь, — он на машинном языке, с абсолютной адресацией, отсюда и проблемы с правкой. А если эту адресацию произвольно смещать, то получится интерпретатор. Какой тогда смысл?

aureliano15 ★★
()
Ответ на: комментарий от Toxo2

Спасибо, посмотрю, мне еще биари ffmpeg надо как то паковать

gobot ★★★★
() автор топика
Ответ на: комментарий от aureliano15

Исходники мои. В exe же есть какие то ресурсы? Там можно и версию прописать и авторское право. Типа exif

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

:-D

Да это не ваш «счет» … /настроение хорошее/.

anonymous
()
Ответ на: комментарий от fsb4000

Есть например, такая cli утилита: https://github.com/electron/rcedit

В inet есть исходники Windows XP Windows Server 2003.
Посмотрел кстати работу с ресурсами /впрочем и без исходников весь нужный API есть/.
«Одним движением руки диалоговое окно Windows превращается в форму 1С».

И ведь ничего не хакал, все что нужно для разработки API есть в документации Microsoft, github, …

Здесь самая большая проблема - НЕОХОТА и ее брат ЛЕННОСТЬ.

Владимир

anonymous
()
Ответ на: комментарий от gobot

Исходники мои.

Тогда непонятно, что мешает добавить небольшую функцию, читающую конфиг? На мой взгляд, каждый раз править бинарник — не лучшая идея. Да ещё нужно уложиться в заданную длину и в конце строки дописать символ с кодом 0.

В exe же есть какие то ресурсы? Там можно и версию прописать и авторское право. Типа exif

Но при сдвиге этого ресурса сдвигается всё остальное, а значит простым текстовым редактором этого не сделать. Можно, конечно, придумать специальный редактор для объектников, но он уже есть и называется линкером.

aureliano15 ★★
()
Ответ на: комментарий от gobot

Ну посему неохота сразу? Охота. Но знаний не хватает

Опять вы «на свой счет» приняли.
О себе говорил …

Владимир

anonymous
()
Ответ на: комментарий от aureliano15

Насколько я понял, автору это больше «для фана». Дать каждому по именованому бинарнику в виде новогоднего подарка, например. Если к бинарнику будет прилагаться ещё и конфиг — это уже не так интересно.

Понятно, что делать на основе этого какую-то защиту от копирования неразумно. Помимо прочего, такие защиты на раз ломаются. А вот просто «именной бинарник» — почему бы и нет.

hobbit ★★★★★
()

А что мешает перлинковать бинарь? 20 цпп, например, в одном хранятся строки, правишь, линкуешь, отдаешь. Зачем править бинарь через задницу?

pavlick ★★
()
Ответ на: комментарий от gobot

Вы защиту от копирования хотите сделать?

Шутка

Проверяйте наличие пустого файла с именем клиента. Сто пудов будет достаточно … /для начала/

Владимир

anonymous
()
Ответ на: комментарий от aureliano15

Тогда непонятно, что мешает добавить небольшую функцию, читающую конфиг

Нет конфига. Бинарь формируется на сервере. Хочу в него записать данные юзера

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

А почему ты считаешь, что грепать бинарь проще, чем перелинковать?

Глянул твою соседнюю твою ветку, не обижайся, но я бы постеснялся что-то клиентам давать на данном этапе, тем более многопоточное.

pavlick ★★
()
Последнее исправление: pavlick (всего исправлений: 1)
Ответ на: комментарий от hobbit

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

gobot ★★★★
() автор топика
Ответ на: комментарий от pavlick

Да какое там многопоточное. Один тред, который читает трубу ffmpeg

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

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

Для фана делайте update бинарника с использованием вэб … /каждый пятый вторник/.

Владимир

anonymous
()

А чем подстановка штампа и подписи через директивы препроцессора не подошла?

...
printf("Hello, %s!", STAMP);
...
gcc -DSTAMP=Greatings ...

Выведет строку «Hello, Greatings!».

З.Ы. Чисто пример. З.Ы.[2] да, надо будет компилировать каждый именной исполняемвый файл, но зато не будет магии

anonymous
()
Ответ на: комментарий от rumgot

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

Лол нафига? Асимметричное шифрование для кого изобрели?

hateyoufeel ★★★★★
()
Ответ на: комментарий от hateyoufeel

Лол нафига? Асимметричное шифрование для кого изобрели?

А что принципиально поменяется? В случае ассиметричного все равно нужно хранить один из пары ассиметричных ключей.

rumgot ★★★★★
()
Ответ на: комментарий от gobot

Бинарь формируется на сервере. Хочу в него записать данные юзера

А! Т. е. на сервере, с которого раздаётся какое-то потоковое видео/аудио по логину, формируется этот самый бинарь для каждого зарегистрированного пользователя. Но мне кажется, что и в этом случае лучше создать конфиг вместе с екзешником для каждого или скрипт, из которого вызывается екзешник с логином-паролем в качестве аргументов. Впрочем, это дело хозяйское. Просто модификация бинарника, особенно автоматическая, потенциально опасна. Да и не проще такой вариант.

@hobbit написал:

Если к бинарнику будет прилагаться ещё и конфиг это уже не так интересно.

Разве для того, чтобы заинтриговать пользователей.

aureliano15 ★★
()
Ответ на: комментарий от aureliano15

конфиг вместе с екзешником

тогда юзеру придётся качать два файла, да ещё и располагать их в одной директории
В общем нужно будет уже создавать установщик!
Да ещё и юзер будет способен хакать файл с настройками!

Bad_ptr ★★★★★
()
Ответ на: комментарий от Bad_ptr

нужно будет уже создавать установщик!

Тоже верно.

юзер будет способен хакать файл с настройками!

Хакать свой собственный логин и пароль?

aureliano15 ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.