Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

CarLine Forums _ C/C++ _ Скрипты в свою программу

Автор: slalex 29.4.2016, 2:30

Может кто подскажет как можно в свою программу добавить выполнение Си-подобных скриптов, причем что-бы кроме стандартных инструкций, можно было сделать некоторые свои команды, вызывать свои функции,

я так понял придется в программу запихать какой-то простенький си интерпретатор, может кому попадались примеры реализации такой идеи?

Автор: Saveliy 29.4.2016, 3:19

Это не быстрое дело, посидеть нужно основательно. В принципе реализация не сложная, просто создаешь свое API между пользователем и твоим софтом.

Тебе придется создать свой парсер. Перечень своих методов, их реализацию, описание возможностей, чтобы пользователи, используюя твою функцию, знали, что она будет делать на выходе. По сути все просто, называешь один метод например __hochuEepromDelete(), вызывая который, будет польностью стерта еепром. Или например __hochuAllEepromFill(hex), вызывая который, этот метод перепишет весь еепром указанном в параметре hex значением.

Далее пишешь реализацию этой функции, так сказать в свою lib (библиотеку). Потом пишешь свой парсер, в котором пошагово будешь считывать "команды" из скрипта и выполнять их, подгружая свои функции. Реализация парсера, самая важная часть, будет ли это просто построчный скрипт (это самое простое), или будет это серьезный парсер с возможностью парсинга вложенных команд, например ты дашь пользователям возможность не пошагово выполнять команды, а сможешь распознавать реальную эмуляцию циклов for, while и вложенных в них неограниченно других циклов и команд. Можно конечно заюзать что-то наподобие eval, но я бы не разрешил пользователям исполнять свой произвольный код. API, оно и в африке API.
Если кратко, то примерно так.. Далее по задачам.

Автор: stepan_v 29.4.2016, 12:55

Есть смысл посмотреть в сторону промежуточного преобразования в https://ru.wikipedia.org/wiki/%D0%91%D0%B0%D0%B9%D1%82-%D0%BA%D0%BE%D0%B4, написав свой интерпретатор. Это позволит избежать анализа синтаксиса и семантики, при этом все стандартные операции уже будут представлены двоичными кодами, а внешние функции названиями. При грамотном подходе получится изоляция чужого кода в неком подобии собственной виртуальной машины, пересечение только на уровне функций API, а их уже можно жестко контролировать по входным параметрам.

Как вариант, использовать байт-код java-машины, лень искать, но наверняка есть и трансляторы готовые, и открытые исходники машины-интерпретатора, которые можно под себя адаптировать.

Автор: Saveliy 29.4.2016, 13:28

Подгонять под себя порою выходит дольше, чем написать самому. Конечно наверняка есть подобные готовые интерпретаторы, может кто кинет ссылки для ознакомления. Но лично по мне, если писать интерпретатор самому, пользователю можно предоставить выбор языка для написания скрипта, как это сделано например в программаторе UPA, но можно и не выпедриваться, ограничить лишь одним типом языка программирования.

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

P.S. а ставить софт и пользователя в зависимость от Java, я лично против такого подхода. Тогда уж изначально весь софт писать на Java и быть морально готовым к "принудительно-обязательной" установке Java на машину, понимая, что без нее не пойдет софт.

Автор: Grrek 29.4.2016, 13:30

Цитата(slalex @ 29.4.2016, 3:30) *
Может кто подскажет как можно в свою программу добавить выполнение Си-подобных скриптов, причем что-бы кроме стандартных инструкций, можно было сделать некоторые свои команды, вызывать свои функции,

я так понял придется в программу запихать какой-то простенький си интерпретатор, может кому попадались примеры реализации такой идеи?

Тебе нужно в адаптер els запихнуть озу с батарейкой, в нем у тебя будут ключи. Все остальное сломают. Не трать попросту время.

Автор: Saveliy 29.4.2016, 13:32

Цитата(Grrek @ 29.4.2016, 13:30) *
Тебе нужно в адаптер els запихнуть озу с батарейкой, в нем у тебя будут ключи. Все остальное сломают. Не трать попросту время.

Я ему уже это говорил, но в таком случае придется только свой адаптер лепить, а это уже другая история. Да и в ELS не "воткнешь" батарейку, производством ELS занимаются другие люди.

P.S. Думаю скрипты нужны не для защиты, а по защите с удовольствием в другой теме пообщаемся, правда по сути все сказано вами одной фразой..

Автор: Grrek 29.4.2016, 13:47

Цитата(Saveliy @ 29.4.2016, 14:32) *
Я ему уже это говорил, но в таком случае придется только свой адаптер лепить, а это уже другая история. Да и в ELS не "воткнешь" батарейку, производством ELS занимаются другие люди.

P.S. Думаю скрипты нужны не для защиты, а по защите с удовольствием в другой теме пообщаемся, правда по сути все сказано вами одной фразой..

Я имел в виду в адаптер ELS встраивать криптомодуль , что бы не городить отдельный адаптер

Автор: stepan_v 29.4.2016, 14:33

Цитата(Saveliy @ 29.4.2016, 14:28) *
Подгонять под себя порою выходит дольше, чем написать самому.

И да, и нет. Что-то простое - да. А в деле синтаксического анализа гораздо проще полагаться на готовые отлаженные решения, чтобы не ходить гордо по ранее отложенным другими в сторону граблям :)


Цитата(Saveliy @ 29.4.2016, 14:28) *
пользователю можно предоставить выбор языка для написания скрипта, как это сделано например в программаторе UPA, но можно и не выпедриваться, ограничить лишь одним типом языка программирования

Для возможности выбора языка придется делать интерпретатор для каждого, если это писать самому. Тут хотя бы си сделать, как я понимаю :) Но даже и в рамкаж одного языка предусмотреть все варианты написания практически невозможно. Мне приходилось мучиться с подобными системами, когда всё вроде бы написано правильно, а не работает, потому что по-какой-то причине разработчик предусмотрел только другой, отличный от этого, формат описания.

Цитата(Saveliy @ 29.4.2016, 14:28) *
Впрочем, все зависит от задач, кому-то за глаза распознавание нескольких команд

Чем больше ограничений, тем сложнее будет реализовать хоть что-то. Многие ли захотят готовые скрипты специально адаптировать?

Цитата(Saveliy @ 29.4.2016, 14:28) *
И кстати синтаксический анализ нужен обязательно, это просто правило хорошего тона, предупреждать пользователя о ошибках.

Но я и предлагаю возложить это на сторонний софт, а программе подсовывать уже скомпилированный байт-код. Что-то похожее вроде есть в айпрог+ (подробно не изучал, исключительно общее впечатление).

Цитата(Saveliy @ 29.4.2016, 14:28) *
P.S. а ставить софт и пользователя в зависимость от Java, я лично против такого подхода. Тогда уж изначально весь софт писать на Java и быть морально готовым к "принудительно-обязательной" установке Java на машину, понимая, что без нее не пойдет софт.

Во-первых, никто не говорит, что нужно брать именно формат байт-кода JVM, это лишь один из вариантов. Во-вторых, если интерпретировать будет сама программа, зачем ей Java на машине?

Grrek, вопрос именно про возможность расширения функционала сторонними скриптами. При чем тут защита? :) Давайте по теме. А о защите лучше в привате общаться ))

Цитата(Grrek @ 29.4.2016, 14:30) *
запихнуть озу с батарейкой, в нем у тебя будут ключи. Все остальное сломают

Не вижу никаких проблем сломать и такой вариант. Вообще, надо исходить из того, что не бывает абсолютно стойких систем. Вопрос исключительно в соизмеримости затрат с результатом. Если только это не дело принципа ))

Автор: Saveliy 29.4.2016, 14:50

Цитата(stepan_v @ 29.4.2016, 14:33) *
Многие ли захотят готовые скрипты специально адаптировать?

Так я и говорю, зависит от задач. Если задача не просто дать пользователям какие-то дополнительные возможности, а еще и возможность чужие скрипты подсовывать, это тогда еще нужно и не просто скрипты реализовать, но и возможность GUI, окошек диалога, но это уже в другую степь идем, тут то не для программатора скрипты, да и сами скрипты тогда должны быть по стандарту, ибо например скрипты от Оранжа уже не подойдут, у них свой "язык", впрочем и удругих тоже, под всех не подстроишься. Это только если все будут придерживаться единого стандарта, либо потеть разработчику над унификацией, конвертацией. Но что либо можно советовать только тогда, когда мы услышим саму задачу, а то нас сейчас понесет)))

Цитата(stepan_v @ 29.4.2016, 14:33) *
Давайте по теме. А о защите лучше в привате общаться ))

Вот и я говорю, не нужно тему расчленять на разные вопросы, если охота на этот счет пообщаться, то отдельной темой, например пока здесь http://carline.ru/forum/index.php?showforum=427, специально создал сейчас раздел. А на счет привата, об общих способах защиты можно и нужно пообщаться на виду, а о конечной реализации, уже в привате конечно.

Автор: Saveliy 29.4.2016, 14:51

Цитата(stepan_v @ 29.4.2016, 14:33) *
А в деле синтаксического анализа гораздо проще полагаться на готовые отлаженные решения, чтобы не ходить гордо по ранее отложенным другими в сторону граблям

Это еще кстати зависит от типа SDK, на котором пишешь софт, может таких библиотек, модулей просто не будет для того SDK, на котором пишешь.

Автор: Saveliy 30.4.2016, 0:28

slalex, Естестественно примеры легче подгонять и подстраивать, но некоторых примеров просто нет, например хекс редактор, мне все пришлось вручную писать, каждый шаг, ибо сколько не искал, готовых компонентов нет для Embarcadero, и когда сам написал, понял, почему. Потому что нужно все движения отслеживать, отрисовывать и тд, масса процедур из вне и прочее. Со скриптами проще, только понять, что ты хочешь сделать, для каких целей. Тут кстати еще вопрос, как их криптовать, ибо у тебя нет адаптера с процессором, в котором есть криптомодуль, а без крипто оно не имеет смысла. Криптовать вручную, ломанут софт и расшифрую все скомпилированные исходники. Ну и тд. Хотя впрочем и так не имеет смысла скрипты вводить, это же не программатор, а только для ОБД делать скрипты, это вешалка будет, не имея крипто оборудования, привязки. Плюс чисто на си делать не имеет смысла, кто может делать на СИ, сам напишет софт для ELS, а свой формат скриптов, большинство не будет заморачиваться с конвертацией, а будут писать скрипты именно под твой софт. Хотя идея со скриптами старая, давно реализованная, от оранжа, айпрога до упы и даже тритона, не вижу смысла в скриптах. Если в личных целях, не для пользователей, может быть, тогда это все меняет. Но все ответы на эти вопросы и будущие можно было получить в теме, если бы ты общался, а не молчал))

Автор: slalex 30.4.2016, 0:58

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

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

по реализации, похоже надо искать какие-то исходники компиляторов, когда-то видел типа рефератов с такими проектами.

идея думаю хорошая и давно назрела.

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

не хотелось-бы пойти по какому-то не правильному пути.

Автор: Saveliy 30.4.2016, 1:27

Цитата(slalex @ 30.4.2016, 0:58) *
те-же функции включение-отключения бортовика на Логанах, делаются одной кан командой

Одно дело, когда нечем это делать, другое дело, что послать эту команду может человек любого уровня развития через любой канхакер и ему подобные девайсы и со скриптами (типа UPA-CAN) и без jyys[, просто из своего файлика вставил пакет и все дела.

Цитата(slalex @ 30.4.2016, 0:58) *
идея думаю хорошая и давно назрела.

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

Цитата(slalex @ 30.4.2016, 0:58) *
по реализации, похоже надо искать какие-то исходники компиляторов

Конечно нужны примеры, чтобы понять и допилить, но ты написал свой вопрос в теме по C++, а модули, компоненты и примеры нужно искть для Delphi. Твой вопрос в разделе C++ сбил с толку, непонятно, что искать. Интерпретатор СИ для С++, или интерпретаро СИ для Delphi.. Если это просто будут исходники, можно покряхтеть и конвертировать, хотя дело неприятное, переписывать под другой язык, а если это еще и компонент, тем более нет смысла.

Автор: Saveliy 30.4.2016, 1:36

Цитата(slalex @ 30.4.2016, 0:58) *
то как сделаны скрипты в Оранже, наводит на мысль что там всё сделано с нуля через длинный IF

IF не IF, а в оранже действительно сделано с нуля, и я лично так-же предпочитаю в своих проектах, мне нравится такой подход, я очень жестко отношусь к навешиванию чужих библиотек в проект. Правда порою это выходит дольше и затяжнее по времени. Хотя бывает очень часто и наоборот, самому написать быстрее.

Цитата(slalex @ 30.4.2016, 0:58) *
а в Айпроге можно писать сложные конструкции, как буд-то применено какое-то стандартное решение.

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

Автор: slalex 30.4.2016, 2:25

Цитата(Saveliy @ 30.4.2016, 2:27) *
Интерпретатор СИ для С++, или интерпретаро СИ для Delphi..


я на С++ пишу, поэтому в идеале нужен "Интерпретатор СИ для С++"

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

Автор: slalex 30.4.2016, 2:34

вот кажется то что надо http://sources.codenet.ru/download/4269/LittleC.html

Автор: Saveliy 30.4.2016, 11:23

Не знаю, как это в реале будет, по ходу это дело только под язык СИ, расширение на другие языки не присутствует.

На первый взгляд идея не плоха, но без напильника никуда, зато из этого Little C можно понадергать готовых методов, их там масса. Глянух исходники, принцип Eval, провели анализ файла и выполнили. Вот только под другие языки, Pascal, Basic тут не прокатит, надо переписывать.

Хотел тест провести, но требуется компонент TSynMemo. Надо найти и установить, пощупать.

Little_C.png

Автор: Saveliy 30.4.2016, 12:00

Вобщем, если на СИ, на мой взгляд, самое лучшее, это вот:
http://www.softintegration.com/

Есть все что душе угодно, включая графическую библиотеку. Минус, что на русском инфы почти нет, в отличие от Little.
Впрочем, если не замахиваться, то и Little за глаза, надо пощупать и то и другое, сравнить и по типу задач примерить возможности.

Автор: slalex 30.4.2016, 12:19

у меня Little C запустился,
думаю самое то что надо и вряд-ли что-то лучше найти,
все комменты и описание на русском.

Автор: Saveliy 30.4.2016, 12:21

Цитата(slalex @ 30.4.2016, 12:19) *
у меня всё запустилось,
думаю самое то что надо и вряд-ли что-то лучше найти,
все комменты и описание на русском.

У тебя значит уже стоял этот компонент SynMemo. Да, мне кажется для твоих задач, самое оно, и на русском много примеров. Я бы даже сказал, частенько бывает так, чем проще, тем лучше, особенно если не нужна кроссплатформенность.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)