Jump to content
Korean Random
StranikS_Scan

PjOrion - редактирование, компиляция, декомпиляция, обфускация модов (Версия: 1.3.5 Дата: 11.08.2019)

Пользуетесь ли вы Орионом?  

310 members have voted

You do not have permission to vote in this poll, or see the poll results. Please sign in or register to vote in this poll.

Recommended Posts

Всем привет! Сделал Альфу новой версии. Закидываю сюда, чтоб можно было пощупать.


 

Скачать (только для тестов!)

 


 

Что уже сделано:

 

1. Исправлена ошибка в работе функции оступов, табуляция не всегда заменялась пробелами.

2. Вместо отдельных функций UnPyc 0.8.1 полностью задействован модуль pyREtic (теперь меньше крашиться на скриптах)

3. Добавлена функция декомпиляции загруженного в среде объекта (модуля, класса, функции) из модуля pyREtic (выделяете мышкой имя модуля или класса, в выпадающем меню выбираете "Decompile selected Object..." и вуаля).

4. И самое вкусное - запилил трансмиттер для обмена данными с клиентом игры.

 

Трасмиттер сырой, только сейчас наладил его. Однако работает. Обмен данными идет через файловые мьютексы и буферы. Запуск клиента делается через Орион. В главном меню всё увидите. Как клиент запуститься можно в его среде выполнять любой код через Орион, пункт в меню отдельно сделан "Exec in client (SHIFT+F5)".

 

Например вот такой код:

 

from gui import SystemMessages
SystemMessages.pushMessage('Hello!', type=SystemMessages.SM_TYPE.Warning)
Edited by StranikS_Scan
  • Upvote 4

Share this post


Link to post

Short link
Share on other sites

Не правильно подгружается код. Новый код не останавливает старый.

Пример

Исполняем-

import BigWorld
from gui import SystemMessages
def _loop():
    SystemMessages.pushMessage('Hello!', type=SystemMessages.SM_TYPE.Warning)
    BigWorld.callback(2, _loop)
_loop()

Меняем Hello на Hello BigWold. Исполняем.

Видим, что вылазят 2 месбокса с разными записями.

Так не получится отладить скрипт. Старый должен останавливаться.

 

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

заработал del module)

Edited by lportii

Share this post


Link to post

Short link
Share on other sites

@lportii, вся питоновская часть трансмиттера есть в wottransmission.zip. Глянь что не так. Я не проф. программист, потому буду весьма рад помощи спецов.

Чтение и выполнение кода, который Орион сливает в буфер происходит тут - модуль transmitter.py:

....

def orion_transfer_check():
    global client_mutex, \
           orion_mutex, \
           orion_buffer      
    if not orion_mutex.check():
        client_mutex.lock()
        try:
            code = orion_buffer.read()
        finally:
            client_mutex.unlock()
        if len(code)>0:
            try:
                exec code in sys.modules[__name__].__dict__
            except Exception as E:
                print str(E)                 
    BigWorld.callback(0.5, orion_transfer_check)

....

Share this post


Link to post

Short link
Share on other sites

можно в программу добавить откат назад написанного при ошибке и при выделении одинаковых значений что б выделялись все такие же значения (как в notepad++)

Share this post


Link to post

Short link
Share on other sites

можно в программу добавить откат назад написанного при ошибке и при выделении одинаковых значений что б выделялись все такие же значения (как в notepad++)

 

Ctrl+Z и Ctrl+Shift+Z работают. В выпадающем меню они вроде прописаны.

 

Поиск и замена текста будет, все руки не доходят. А вот подсветка одинаковых значений - это кттс.

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

Не смеши, какой я специалист.

Но попробовал. Должно быть что то вроде такого:

   import marshal
   m_code = compile(code, "<orion_script.py>", "exec")
   data = marshal.dumps(m_code)
   try:
      exec marshal.loads(data)
   except Exception as E:
     print str(E)

Но оно не работает, виснет орион.

 

Так тоже не хочет.

   m_code = compile(code, "orion_script.py", "exec")
   import types
   module = types.ModuleType('orion')
   sys.modules['orion_'] = module
   try:
      exec m_code in module.__dict__
   except Exception as E:
      print str(E)

Может та какие то ограничения есть, как то странно отказывается выполнять почти любое изменение.

Edited by lportii

Share this post


Link to post

Short link
Share on other sites

@lportii, у меня сейчас написано - exec code in sys.modules[__name__].__dict__ - это означает выполнить код (из Ориона) в окружении текущего модуля. Так как процедура orion_transfer_check() находиться в модуле transmitter.py, то и выполнение происходит в этом модуле.

 

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

 

Но меня волнует твой коммент выше. Я не уверен что именно про это ты писал.

Share this post


Link to post

Short link
Share on other sites

Если при запуске клиент игры запускает benchmarklocation из орионовского пакета

то и код будет выполняться в среде клиента. Я немного не понял зачем тут mutex.

Share this post


Link to post

Short link
Share on other sites

Если при запуске клиент игры запускает benchmarklocation из орионовского пакета

то и код будет выполняться в среде клиента. Я немного не понял зачем тут mutex.

 

Наверно мне стоит нарисовать схему работы трасмиттера и описать его логику. Сейчас займусь этим и опубликую через 1-2 часа.

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

Наверно мне стоит нарисовать схему работы трасмиттера и описать его логику. Сейчас займусь этим и опубликую через 1-2 часа.

Да наверное

Я выполнил код -

import sys
print sys.modules[__name__].__dict__

Сначала в Орионе, потом подключился к wot и выполнил еще раз.

Там вполне ясно видно, какие модули подключены.

Поэтому немного не понятно, почему не работает мой код.

Заработало.

Вот таким кодом я пытал Орион -

code = str(\
'from gui import SystemMessages'+('\n')+\
'import BigWorld'+('\n')+\
'def _loop():'+('\n')+\
'    SystemMessages.pushMessage("Hello Orion!", type=SystemMessages.SM_TYPE.Warning)'+('\n')+\
'    BigWorld.callback(2, _loop)'+('\n')+\
'_loop()'+('\n')
)
try:
    del sys.modules["orion"]
except: pass

import marshal
m_code = compile(code, "orion", "exec")

import types
module = types.ModuleType("orion")
sys.modules["orion"] = module

try:
    exec m_code in module.__dict__
except Exception as E:
    print str(E)

Прямо в самом Орионе.

"Hello Orion!" можно менять, что бы увидеть результат.

 

Что бы выключить - code = ""

try:
    del sys.modules["orion"]
except: pass

все так же не работает.

 

Спасибо за отличную программу.

Edited by lportii

Share this post


Link to post

Short link
Share on other sites

Описалово в процессе, выложу завтра. Сегодня голова не работает.

 

По поводу вот этого:

 

Не правильно подгружается код. Новый код не останавливает старый.

Пример

Исполняем-

import BigWorld
from gui import SystemMessages
def _loop():
    SystemMessages.pushMessage('Hello!', type=SystemMessages.SM_TYPE.Warning)
    BigWorld.callback(2, _loop)
_loop()

Меняем Hello на Hello BigWold. Исполняем.

Видим, что вылазят 2 месбокса с разными записями.

Так не получится отладить скрипт. Старый должен останавливаться.

 

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

заработал del module)

 

Если ты в среде объявил функцию _loop(), то ты можешь её удалить командой del __loop. И она удалиться из среды ВОТ. Проверил удаляется.

Если ты запустил вызов этой функции по таймеру через BigWorld.callback.... а потом вызвал del __loop, то объявление функции удалиться, а очередной её вызов в BigWorld.callback приведет к ошибке, типа *** NameError: global name '_loop' is not defined. Так как ошибки перехватываются через try except, обертывающие команду exec code in...., то сам модуль и среда не крашатся, а спокойно продолжат работать, но функция __loop больше не вызывается.

 

Импорт модулей из файла и виртуальный импорт я сделаю. Тогда проще будет убивать код через del модуль.

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites
Если ты в среде объявил функцию _loop(), то ты можешь её удалить командой del __loop. И она удалиться из среды ВОТ. Проверил удаляется.

Если ты запустил вызов этой функции по таймеру через BigWorld.callback.... а потом вызвал del __loop, то объявление функции удалиться, а очередной её вызов в BigWorld.callback приведет к ошибке, типа *** NameError: global name '_loop' is not defined. Так как ошибки перехватываются через try except, обертывающие команду exec code in...., то сам модуль и среда не крашатся, а спокойно продолжат работать, но функция __loop больше не вызывается.

Да, об этом говорили раньше. Но человек работающий с клиентом игры не должен думать о

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

Share this post


Link to post

Short link
Share on other sites

Да, об этом говорили раньше. Но человек работающий с клиентом игры не должен думать о

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

 

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

Share this post


Link to post

Short link
Share on other sites

Раньше я пытался работать, и спрашивал как остановить модуль, а ты с МаксТ предлагал

решения для частных случаев.

Если Орион только терминал, почему мой простой подгузчик модулей через такой же exec

не работает с запущеным Орионом? (что то вроде - Error import code..)

Выше 112 посту я писал код в котором объявляется новый модуль 'orion', он вообще куда помещается?

В среду клиента или в модуль Ориона в среде в среде клиента?

Share this post


Link to post

Short link
Share on other sites

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

Share this post


Link to post

Short link
Share on other sites

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

 

Запуск реплея будет. В течении часа выложу вторую тестовую версию с большим функционалом и описание логики работа трассмитера.

Share this post


Link to post

Short link
Share on other sites

Прошло 5 часов, автор как обычно пропал, наверно ответственность искать пошел.. Спасибо кстате что на 4-ке (сайте) ответил мне на сообщение 3-недельной давности..

Edited by ProstoNoob

Share this post


Link to post

Short link
Share on other sites

Прошло 5 часов, автор как обычно пропал, наверно ответственность искать пошел.. Спасибо кстате что на 4-ке (сайте) ответил мне на сообщение 3-недельной давности..

 

Вот завязывай давай. Не вышло за час, пошёл спать. Забавную штуку обнаружил, оказывается питон в клиенте "замирает" когда реплей на паузе стоит и обмен данными не идет. Буфер от Ориона клиент даже читать не хочет. А делаю скорость прокрутки реплея не 0 и всё работает. Не очень приятный нюанс, но жить можно.

 

Выкладываю вторую Альфу!


 

Скачать: 

 


 

Что изменилось от первой Альфы:

 

1. Убрано ограничение на формат файлов, открываемых через Drag-And-Drop

2. Добавлена опция групповой отмены действий в редакторе "Group operations"

3. Реализованы поиск и замена текста в редакторе

4. По WOT-Transmission, по мимо мелких доработок и поддержки UTF-8, чтоб кириллица не пропадала, добавил функции:

Game replays... - можно загружать клиент с реплеем

Close WorldOfTanks - можно убить клиент (очень удобно и не страшно, так как настройки клиента не пропадают)

Import/Reload current script - текущий скрипт XXX.py, открытый в редакторе будет импортирован как модуль XXX в игру, если такой модуль уже есть, то будет выполнена его перезагрузка

Import/Reload py-file... - можно импортировать (перезагрузить) любой левый скрипт

Open <preferences.xml> - откроет ваш preferences.xml, зачем, да просто так, может кому пригодиться чтоб далеко не лазить

5. Также в окне Options, я добавил опцию запуска клиента - полный экран, окно, окно на весьма экран, очень удобно (юзается preferences.xml)

 

Теперь небольшие замечания и разъяснения:

 

1. Как работает WOT-Transmission

post-7009-0-59543400-1404634507_thumb.png

Обратите внимание WOT-Transmission это отдельная фича, при этом со средой питона, которую эмулирует Орион, она ни как не связана. Ваши скрипты Орион в текстовом виде отправляет в буфер orion_buffer, а на стороне клиента идёт чтение этого буфера и выполнение записанных в нем скриптов. Для этого при загрузке клиента Орион скармливает ему модули из пакета wottransmission.zip, которые и отвечают за прием и выполнение скриптов в клиенте. Кроме того вся инфа поступающая в лог в клиенте перехватывается и направляется в буфер client_buffer, от куда её забирает уже Орион и выводит пользователю. Для того чтобы избежать конфликтов доступа двух программ к одному буферу используются файловые мьютексы client_mutex и orion_mutex.

 

Таким обзором, для работы с питон-средой клиента надо юзать только опции из меню WOT-Transmission->.

 

2. Перезагрузка модулей в клиенте игры

Все кто с ней сталкиваются знают, что проблема перезагрузки заключается во внешних ссылках на загруженный модуль. Если из другого модуля обратиться к текущему и импортировать какой-либо элемент, то будет вот такая внешняя ссылка. Обычный метод reload() эти ссылки ни как не обновляет. Поэтому я нашел в тырнете модуль rebuild.py (лежит в wottransmission.zip) и задействовал его для перезагрузки. Он не только делает reaload(), но и пробегает по всем загруженным модулям и пытается обновиться ссылки в них.

 

Поэтому если взять код выше:

import BigWorld
from gui import SystemMessages
def _loop():
    SystemMessages.pushMessage('Hello!', type=SystemMessages.SM_TYPE.Warning)
    BigWorld.callback(2, _loop)

_loop()

Импортировать его командой "Import/Reload current script", то начнут вылазить сообщения "Hello!", как и ожидается.

 

Затем изменить его на:

 

import BigWorld
from gui import SystemMessages
def _loop():
    SystemMessages.pushMessage('Hello222222222!', type=SystemMessages.SM_TYPE.Warning)
    BigWorld.callback(2, _loop)

И импортировать его снова командой "Import/Reload current script", то старый модуль замениться на новый и вместо "Hello!", начнуть вылазить "Hello2222!".

 

3. Полное удаление или остановка модуля

Над этим я пока работаю....... Если внешних ссылок на модуля нет (типа как BigWorld.callback(2, _loop) из примера выше), то достаточно наверно просто del модуль сделать или зарелодить пустой модуль, а потом убить его имя. Но вот если внешние ссылки есть, то фиг от них избавишься таким путем. Чтобы "Hello!" перестал вылазить нуно сделать del _loop.....либо, либо доработать модуль rebiuld.py, чтоб он убивал внешние ссылки если мы "удаляем" модуль.

 

4. И по реплеям...

ОБРАТИТЕ ВНИМАНИЕ! Когда реплей остановлен, то клиент "спит" и скрипты, отправленные Орионом в буфер, будут просто в нем накапливаться. Как только вы продолжите воспроизведение клиента, он "проснётся"  и они все будут им выполнены.

Edited by StranikS_Scan
  • Upvote 2

Share this post


Link to post

Short link
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...