Как узнать с какими аргументами вызывается SubVi; подмена SubVi

Создание приложений, библиотек, инсталляторов
Ответить
ID_LV
interested
interested
Сообщения: 3
Зарегистрирован: 22 мар 2023, 15:36
Версия LabVIEW: 2010
Благодарил (а): 1 раз
Поблагодарили: 1 раз
Контактная информация:

Как узнать с какими аргументами вызывается SubVi; подмена SubVi

Сообщение ID_LV »

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

Суть задачи: есть exe-файл созданный на labview 2010 (если я правильно понял) и нет исходников и авторов. Программа- наша очень старая разработка, и с точки зрения законности конфликта тут нет.
Программу нужно либо изменить либо переписать. Однако не все тонкости алгоритма ясны.
Используя https://github.com/mefistotelis/pylabview я получил набор SubVI и они в целом хорошо проименованы и общая структура прояснилась, но не полностью. SubVis можно пересобрать в новый проект (тут проблем нет, огромное спасибо mefistotelis, dadreamer и всем кто внёс вклад) . Однако блок схемы и лицевые панели почти везде удалены.

Конкретные вопросы:
1.Мне нужно понять, с какими параметрами одни SubVi вызываются из других SubVi. Как это сделать?
Я попытался прочитать(глазами) полученный XML через "readRSRC.py -x -vv -i 2" но не особо успешно - может есть где то описание как c ним работать? И как работать c созданными прядом bin и map файлами? (Я вот уже установил IDA и x32dbg, но опыта c ними нет.... не ясно как найти начало "функции" SubVi чтобы можно было посмотреть какие передаются аргументы.... и в IDA и в x64dbg...)

2. Можно ли подменить одни SubVi на другие и пересобрать весь проект? Я попытался - но была ошибка (что-то про ...is not executable... точно не помню но если нужно уточню). Идея была в том чтобы сделать SubVi c такими же входами и выходами и таким же именем, а внутри расположить оригинальное SubVi но все вызовы логировать в файл. А уж если бы можно было бы и все лицевые панели (UI) также "обернуть",,,,

3. Можно ли иным способом логировать все вызовы определённого SubVi другими SubVi в проекте чтобы понять c какими аргументами b когда они вызывались....может и даже кем ? (может e LabVIEW уже есть такой функционал а я изобретаю велосипед?)

Не умею сдаваться, для меня это крайне болезненно. Расчитываю на вашу помощь.
Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1236
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Версия LabVIEW: 2013-2020
Благодарил (а): 23 раза
Поблагодарили: 30 раз
Контактная информация:

Re: Как узнать с какими аргументами вызывается SubVi; подмена SubVi

Сообщение Kosist »

ID_LV писал(а): 22 мар 2023, 16:43 Не умею сдаваться, для меня это крайне болезненно. Расчитываю на вашу помощь.
Как говорится, "Работать надо не 12 часов, а головой.".
Если Вы уже несколько недель не могли решить эту задачу, то может лучше потратить время на переписание программы? Ведь хотите Вы того или нет, но Ваша задача нерешаемая. Разбирать екзешник, подменять виайки - зачем? Если Вы знаете, что делает программа - просто ее перепишите. Тонкости алгоритмов решите потом, при тестировании и использовании. Тем более, что если когда-то их решили, то и сейчас можно будет.
Мы делили апельсин - много наших полегло...
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: Как узнать с какими аргументами вызывается SubVi; подмена SubVi

Сообщение dadreamer »

ID_LV писал(а): 22 мар 2023, 16:431.Мне нужно понять, с какими параметрами одни SubVi вызываются из других SubVi. Как это сделать?
Я попытался прочитать(глазами) полученный XML через "readRSRC.py -x -vv -i 2" но не особо успешно - может есть где то описание как c ним работать? И как работать c созданными прядом bin и map файлами? (Я вот уже установил IDA и x32dbg, но опыта c ними нет.... не ясно как найти начало "функции" SubVi чтобы можно было посмотреть какие передаются аргументы.... и в IDA и в x64dbg...)
Можете спросить у автора в Issues, он охотно там отвечает. Мне этими картами пользоваться не доводилось. Вообще, так сходу открыть код :vi: в IDA или x64dbg и сразу найти место, где начинается собственно код на БД, это как найти иголку в стоге сена. Особенно для более-менее сложного приложения, где потоков явно не один и не два, а уж "сгустков" (clumps) ещё больше. Хотя, можете попробовать: http://labview-rus.blogspot.com/2010/01/3.html Я обычно ставил на БД какие-то ориентиры, например, вызов DbgPrintf через CLFN (или какой-то другой редко вызываемой в самом :labview: функции), дальше в отладчике ставил бряк на функцию и при запуске :vi: примерно находил место, где выполняется код. У вас нет доступа к исходникам, так что код на БД не поменять...
ID_LV писал(а): 22 мар 2023, 16:432. Можно ли подменить одни SubVi на другие и пересобрать весь проект? Я попытался - но была ошибка (что-то про ...is not executable... точно не помню но если нужно уточню). Идея была в том чтобы сделать SubVi c такими же входами и выходами и таким же именем, а внутри расположить оригинальное SubVi но все вызовы логировать в файл. А уж если бы можно было бы и все лицевые панели (UI) также "обернуть",,,,
Именно этот способ работает, я только что проверил на простейшем приложении: саб-ВИ "сумма двух чисел", основной :vi: вызывает этот саб-ВИ. Скомпилировал, извлёк :vi: из exe, создал новый проект, перекинул туда :vi: , саб-ВИ "сумма двух чисел" заменил на саб-ВИ "произведение двух чисел", скомпилировал, запустил exe - всё прекрасно сработало. Единственный нюанс - потребовалось снять вот эти галочки:
2023-03-24_11-28-13.jpg
Иначе :labview: не мог удалить "лишние" зависимости и жаловался на это. Проверьте, что у заменяющего саб-ВИ типы, количество, имена параметров точно совпадают с таковыми из оригинального саб-ВИ, а также что conpane (соединительная панель) в точности такая же. Да, и версии :labview: у оригинала и заменителя должны быть одинаковые.
ID_LV писал(а): 22 мар 2023, 16:433. Можно ли иным способом логировать все вызовы определённого SubVi другими SubVi в проекте чтобы понять c какими аргументами b когда они вызывались....может и даже кем ? (может e LabVIEW уже есть такой функционал а я изобретаю велосипед?)
Можно попробовать Remotely Debugging Executables in LabVIEW, если повезло и в параметрах билда стояла опция "Enable debugging". Если же нет, можно использовать Passing Data Between LabVIEW Executable Reference VI and a VI (пример). Я, правда, бряки не пробовал ставить, скорее всего, без дебага их нельзя будет поставить. Но можно читать значения контролов и индикаторов, симулируя какие-либо действия в исследуемой программе.
ID_LV
interested
interested
Сообщения: 3
Зарегистрирован: 22 мар 2023, 15:36
Версия LabVIEW: 2010
Благодарил (а): 1 раз
Поблагодарили: 1 раз
Контактная информация:

Re: Как узнать с какими аргументами вызывается SubVi; подмена SubVi

Сообщение ID_LV »

Dadreamer, Вы были абсолютно правы. Подходы предложенные работают. Изначальная причина по которой у меня не получилось - несовпадение версий, точнее версия то 2010 но вот патч в оригинале был другой. Долго искал нужный патчи а потом забыл ответить и поблагодарить вас.
Большое спасибо за помощь!
Ответить

Вернуться в «Создание приложений»