Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Выход за границу массива #1

Open
gill0bates opened this issue Nov 7, 2022 · 11 comments
Open

Выход за границу массива #1

gill0bates opened this issue Nov 7, 2022 · 11 comments

Comments

@gill0bates
Copy link

Вываливается с out of range - говорят это типовый способ защиты от реврсинга.
Есть где то информация, что с этим делать?

@ProhorP
Copy link
Owner

ProhorP commented Nov 8, 2022

Здравствуйте, информации нет. Я переводил закрытые общие модули содержащие 10000 строк - ошибок не было. С вашим случаем не сталкивался.

@gill0bates
Copy link
Author

Могу скинуть пример bin файла (260 строк), пока сам не пойму в чем причина, возможно в операторах jmp.

@ProhorP
Copy link
Owner

ProhorP commented Nov 9, 2022

скидывайте

@gill0bates
Copy link
Author

Module.zip

Вот пример файла. Есть пару вопросов - писать более некуда пишу сюда.

  1. Почему обработка распознает jmp как условные операторы, а не как просто переходы?
  2. В строке 31 инструкция {3,8} - загрузить в переменную с индексом 8 (здесь в принципе и падает) - в данной процедуре все лишь три локальных переменных, как ему удается обратится к 8-ой при выполнении?
  3. Как определюются границы процедур и локальные переменные которые им принадлежат? Не влияют ли безусловные переходы на доступность локальных переменныз?
  4. Что делать с командами, которые не поддерживает 1С (например 41 - переход если истина?

@ProhorP
Copy link
Owner

ProhorP commented Nov 10, 2022

  1. Просто переходы определяются другим оператором, в коде обработки можешь посмотреть ее номер.
  2. Посмотрю по возможности, прямо сейчас нет времени, но планирую глянуть.
  3. Границы процедур определяются каки-м то номером. Посмотри в коде обработки "КонецПроцедуры" - там увидишь.
  4. Такие команды никак не обрабатываются обработкой - нужно самому тебе придумать поведение при 41 операторе.

@gill0bates
Copy link
Author

Огромное спасибо за такой эпохальный труд - буду копать.

@ProhorP
Copy link
Owner

ProhorP commented Nov 10, 2022

Посмотрел ваш модуль, его отдельно видимо корректировали, даже возможно через подобную обработку. Используются метки "Перейти" в соседние процедуры, что невозможно ни в одном языке программирования кроме ассемблера :) Там всего 260 строк, это значит что примерно около 100 строк кода. Я бы на вашем месте либо бросил затею, либо попытался бы проследить все прыжки (оператор 42) и переход на заданный шаг(39) и так оследить из каких процедур в какие переместили код. Оператор 39 очень сложный, он является дополнением к проверкам условий ("Если", "Пока" "Для" "Для каждого" "Исключение" и другие, смотрите в модуле к каким операторам он привязан), но он всегда является как бы границей любого условного ветвления, он не используется сам по себе. Если у вас получится вычислить, что он не относится к условному ветвлению - значит он не является частью кода 1С, а просто является указателем на следующий участок кода. Больше я вам посоветовать ничего не могу. Но обязательно прочитайте статью от изначального автора https://habr.com/ru/post/489392/. У меня на написание обратного преобразования кода ушло 3 недели по 8 часов в день.

@gill0bates
Copy link
Author

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

Самый прям такой вопрос который мне неясено от слова совсем - пресловутая инструкция {3,8} - обращение к другой локальной переменной из модуля где этой переменной нет.

@ProhorP
Copy link
Owner

ProhorP commented Nov 11, 2022

До {3,8} кажется был переход в середину другой процедуры. у 3-й процедуры есть такое количество переменных.

@gill0bates
Copy link
Author

Да, но мы же находимся в контексте первой процедуры (когда возвращаемся из перехода) или сам переход дает доступ к этим переменным?

@ProhorP
Copy link
Owner

ProhorP commented Nov 12, 2022

вот тут я вам не отвечу, не знаю.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants