Jump to content
Korean Random
StranikS_Scan

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

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

314 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

У других не становится, а у тебя становится. Короче ты либо подробно пишешь что ты делаешь и я пытаюсь понять что там у тебя не получается, либо иди ты туда откуда пришел коров пасти.... Он там видите ли атрибуты "Только чтение" на ini-файлы ставит, а потом пишет сюда мне что у него настройки не сохраняются.

 

Глызы свои открой на сообщение #1263

Share this post


Link to post

Short link
Share on other sites

Удалил файл - по умолчанию/ Стало то что ниже.

aUkxDQpvTzANCnFwDQpkYg0KcXBiZA0KeXUNCmFiY2RlZmdoaWtsbW5vcHFyc3R2eHl6DQphYmNkZWZnaGlrbG1ub3BxcnN0dnh5ejAxMjM0NTY3ODkNCkFCQ0RFRkdISUtMTU5PUFFSU1RWWFlaDQpBQkNERUZHSElLTE1OT1BRUlNUVlhZWjAxMjM0NTY3ODk=

 

Заменил на это (то что ниже) и сделал файла обфускацию. Закрыл Орион.

 

aXYxDQpvTzANCnFwDQpkYg0KcXBiZA0KeXUNCmFiY2RlZmdoaXZsbW5vcHFyc3R2eHl6DQphYmNkZWZnaGl2bG1ub3BxcnN0dnh5ejAxMjM0NTY3ODkNCkFCQ0RFRkdISXZMTU5PUFFSU1RWWFlaDQpBQkNERUZHSEl2TE1OT1BRUlNUVlhZWjAxMjM0NTY3ODk=

 

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

 

 

aUkxDQpvTzANCnFwDQpkYg0KcXBiZA0KeXUNCmFiY2RlZmdoaWtsbW5vcHFyc3R2eHl6DQphYmNkZWZnaGlrbG1ub3BxcnN0dnh5ejAxMjM0NTY3ODkNCkFCQ0RFRkdISUtMTU5PUFFSU1RWWFlaDQpBQkNERUZHSElLTE1OT1BRUlNUVlhZWjAxMjM0NTY3ODk=

 

Беру Орион 1.2.5 28/04/2015

- запускаю, выхожу

- открываю ini-файл

- заменю в нем на

aXYxDQpvTzANCnFwDQpkYg0KcXBiZA0KeXUNCmFiY2RlZmdoaXZsbW5vcHFyc3R2eHl6DQphYmNkZWZnaGl2bG1ub3BxcnN0dnh5ejAxMjM0NTY3ODkNCkFCQ0RFRkdISXZMTU5PUFFSU1RWWFlaDQpBQkNERUZHSEl2TE1OT1BRUlNUVlhZWjAxMjM0NTY3ODk=

 

- сохраняю, закрываю

- запускаю Орион

- вбиваю код aaa=123;print aaa

- жмякаю Script - Obfuscate - Names..., вижу

nM3O3pK.png

- нажимаю Randomize, затем ОК

- теперь жму Bytecode - Obfuscate - Compile script...

- затем жму Bytecode - Protect - Protect pyc-file...

- выхожу из Ориона

- смотрю ini- файл, там

SymbolDictionary=aXYxDQpvTzANCnFwDQpkYg0KcXBiZA0KeXUNCmFiY2RlZmdoaXZsbW5vcHFyc3R2eHl6DQphYmNkZWZnaGl2bG1ub3BxcnN0dnh5ejAxMjM0NTY3ODkNCkFCQ0RFRkdISXZMTU5PUFFSU1RWWFlaDQpBQkNERUZHSEl2TE1OT1BRUlNUVlhZWjAxMjM0NTY3ODkNCg==

 

И где проблема??????????????????

Share this post


Link to post

Short link
Share on other sites

 

 

Я думаю в нём ......

Лично моё мнение , можно не отвечать .

Edited by o-0-0-0
  • Downvote 1

Share this post


Link to post

Short link
Share on other sites

Ты уже сохранённый скрипт в папке Ориона обфусцируй

bytecode/obfuscate/compile py-file и выйди из Ориона. Он у меня всё по умолчанию ставит после этого.

Без программистских заморочек всяких попробуй...

Edited by KACTET

Share this post


Link to post

Short link
Share on other sites

Ты хотел сказать скрипт выполняется в рабочей среде трансмиттера

wottransmission.transmitter  -> exec (sleep_buffer+str(code)) in sys.modules[__name__].__dict__

А ты как хотел бы?  in sys.modules["__main__"].__dict__

Вообще было бы прикольно, если среду выполнения можно было бы перекидывать на любой модуль. А если по минимуму напряги, то можно просто выполнять код в DMZ.

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

exec 'a = 4; b = 5; a, b = b, a; c = max(a, b);' in dict()
То что среда выполнения будет уничтожена после выполнения кода за отсутствием жестких ссылок на словарь, создаваемый dict(), это уже другой момент, но код выполняться будет.

"Псевдокод по большому счету, думаю, допилишь))"

В Орионе же (трансмиттере) будет достаточно прописать

dmz = dict()
...
exec user_code in dmz
Если с переключением среды выполнения делать, то

dmz = dict()
env = dmz
...
def getEnv(moduleName, dmz):
    module = sys.modules.get(moduleName, None) if moduleName is not None else None
    return module.__dict__ if module is not None else dmz
...
#OrionCommand, dmz may be global var instead of arg
#moduleName is sent from Orion via transmitter
env = getEnv(moduleName, dmz)
...
exec userCode in env

Share this post


Link to post

Short link
Share on other sites

Так-с.

 

 

 

Вообще было бы прикольно, если среду выполнения можно было бы перекидывать на любой модуль.

 

Я тоже узрел такую возможность. Выбрать любой запущенный модуль, и в его теле выполнить свой код. Типа такого

 

N6QaW6f.png
 

 

А если по минимуму напряги, то можно просто выполнять код в DMZ.

 

Дим-зона - это просто сленг? Или описано в доках?

 

 

 

То что среда выполнения будет уничтожена после выполнения кода за отсутствием жестких ссылок на словарь, создаваемый dict()

 

А по точнее? Если в ДЗ будет хук-функция, что с ней произойдет по завершении exec? Словарь останется висеть? Весь или только хук в нем? И как нему получить доступ из вне, он где будет храниться это славарь, в globals() текущего модуля, где выполняется exec? 

 

PS: Технически такая штука и в самой питон-среде Орина мона попробовать сделать, там словарь указывается при вызове )))


И еще трабла с опцией

script = \
'class LOG_LEVEL:'+'\n'+\
'    DEV = 1'+'\n'+\
'    ST = 2'+'\n'+\
'    CT = 3'+'\n'+\
'    SVR_RELEASE = 4'+'\n'+\
'    RELEASE = 1'

Вот с этим в каком виде опцию сделать и как оформить? Тут в реальном времени переключиться не получится. Только перед запуском игры можно выставить циферы. Я не разбирался, что вообще эти циферы тут обозначают? Я могу опцию в окно WOT-Transmission - Options засунуть. Осталось понять как оформить.

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites

Дим-зона - это просто сленг? Или описано в доках?

Сленг. По сути среда, находящаяся по факту и не в трансмиттере, и не "в клиенте", в которой можно безопасно выполнять некоторые команды, в.т.ч очистку без риска для остальной части кода. Сильно напоминает значение этого термина.

DMZ

А по точнее? Если в ДЗ будет хук-функция, что с ней произойдет по завершении exec? Словарь останется висеть? Весь или только хук в нем? И как нему получить доступ из вне, он где будет храниться это славарь, в globals() текущего модуля, где выполняется exec?

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

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

Создается словарь (dict()), жесткая ссылка на него попадает в стек.

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

Во время выполнения кода все создаваемые переменные, функции и т.д. сохраняются как элементы словаря :) Это механика питона такая. Он использует словарь пространства имен как хранилище данных, и соответственно, жесткая ссылка на данные в переменных идет тоже именно из такого словаря пространства имен!!! Для каждого модуля свое пространство, оно привязано к модулю, модуль к системе (интерпретатору), поэтому питон его и не убивает! Если "отобрать" модуль у всех импортировавших его (убить жесткую ссылку) и удалить ссылку на модуль из sys.modules, интерпретатор убьет "объект модуль" и соответственно его пространство имен и все его переменные (если кроме как в sys.modules модули больше не хранятся). Можешь кстати поэкспериментировать с большим модулем (большая константа-переменная внутри и помониторить объем занимаемой процессом питона пямяти - оно будет видно... загрузку и выгрузку данных)

После выполнения кода жесткая ссылка на объект (словарь dict()) теряется (он по сути никуда ни к какому объекту не привязан), словарь уничтожается уборщиком мусора. Следом за ним по той же причине улетают находящиеся в нем переменные и объекты, кроме тех, которые еще чем-то заюзаны, например, импортированные модули.

По сути __del__ класса выполняется как раз перед тем, как объект (данные) будет убит сборщиком мусора. По этому методу отслеживают удаление объекта и мониторят использование пямяти.

З.Ы. Думаю, ты знаешь что все объекты в питоне, не являющиеся базовыми (int, float, str... (список в доках посмотреть можно)), передаются по ссылке/указателю. Хотя возможно для кого-то это будет очень неожиданной новостью. Для тех, кто не в теме - ссылка. Читайте там еще комменты.

 

Upd.

Вот с этим в каком виде опцию сделать и как оформить? Тут в реальном времени переключиться не получится. Только перед запуском игры можно выставить циферы. Я не разбирался, что вообще эти циферы тут обозначают? Я могу опцию в окно WOT-Transmission - Options засунуть. Осталось понять как оформить.

Можно изменить метакласс таким образом, чтобы он не убивал функции, и динамически читал состояние флагов уровня логгирования и вызывал либо нормальную функцию, либо заглушку/ничего не вызывал.

Share this post


Link to post

Short link
Share on other sites
Создается словарь (dict()), жесткая ссылка на него попадает в стек.

 

Понаписал-то из букваря. Я тебя не об этом спрашивал, это я и так знаю. А вопрос то был про место хранения dict(), будет ли он порожден без привязки к конкретному модулю.

А вообще не думаю что это шибко полезно. Вот например берем код типа

#Константа
CONST = 123

def Hook(var):
  Old_def(CONST)

Old_def = xxx.yyy
xxxx.yyy = Hook

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

Решил проверить

s ='import math\n'+\
   'const=123\n'+\
   'def hook(a):\n'+\
   ' print const\n'+\
   'math.cos=hook'
exec s in dict()

Делаю 

import math
print math.cos(0)

и работает, однако

<<< 123

При этом в словаре __main__ ни чего нет

<<< {'DebugOutput': <class __main__.DebugOutput at 0x03FE89D0>, '__builtins__': <module '__builtin__' (built-in)>, '__builtin__': <module '__builtin__' (built-in)>, '__package__': None, 'sys': <module 'sys' (built-in)>, 's': 'import math\nconst=123\ndef hook(a):\n print const\nmath.cos=hook', 'OrionSysExitHook': <function OrionSysExitHook at 0x04225F30>, '__name__': '__main__', 'OrionExitClass': <class '__main__.OrionExitClass'>, '__doc__': None, 'math': <module 'math' (built-in)>}

ЗЫ: Таким макаром можно скрывать исполняемый код модуля в памяти среды ))))

 

 

Можно изменить метакласс таким образом, чтобы он не убивал функции, и динамически читал состояние флагов уровня логгирования и вызывал либо нормальную функцию, либо заглушку/ничего не вызывал.

 

Перепиши класс. 

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites

А вопрос то был про место хранения dict(), будет ли он порожден без привязки к конкретному модулю.

Я это написал не из букваря, просто ты меня не совсем понял.

Любой объект в питоне не привязан ни к какому модулю. И любой объект существует, пока имеется хотя бы одна ссылка на него. Вопрос лишь в том, кто на него ссылается. Объект (словарь) создается в памяти, жесткая ссылка на него одна и она в стеке, он существует пока есть эта ссылка. То есть на время выполнения команды exec. Потому что потом (после выполнения команды exec) ссылка вытаскивается из стека, словарь остается без ссылок и отправляется в мусорник вне очереди.

ЗЫ: Таким макаром можно скрывать исполняемый код модуля в памяти среды

Твой хук не удаляется, потому что на него ссылается math.cos.

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

И если ты так бросишь модуль, все его глобальные переменные помрут.

Потому что на них никто не будет ссылаться.

Так что модуль придется куда-то привязать. Если не в sys.modules, то значит куда-то еще. Да и sys.modules это значимый путь в логике импорта, так что так прокатит только со standalone модулями, которые никем не используются извне. Т.е. для большей части модов. Но ссылку на модуль, повторюсь, хранить где-то придется.

Перепиши класс.

Ок. Попробую. Есть кой-какие идеи.

 

Upd.

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

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

Проблема решается, если вместо хука использовать не функцию, а callable класс, и в него на стадии init прописывать артибутами хук и оригинал, либо писать хук в коде __call__ этого класса. А потом этот класс подкинуть вместо функции))

 

Upd #2.

В-общем, как просил.

"Классы на логгер"

class _LogCallable(object):
	def __init__(self, logLevel, origin, dummy):
		self.logLevel = logLevel
		self.origin = origin
		self.dummy = dummy
		return
	
	def __call__(self, *args, **kwargs):
		return self.origin(*args, **kwargs) if self.logLevel >= _logLevel else self.dummy(*args, **kwargs)

class _LogWrapper(object):
	def __init__(self, logLevel):
		self.logLevel = logLevel
		return
	
	def __call__(self, func):
		dummy = lambda *args, **kwargs: None
		return _LogCallable(self.logLevel, func, dummy)

Код не проверял, но думаю смысл ты понял.

Share this post


Link to post

Short link
Share on other sites

@StranikS_Scan,

А почему когда я пытаюсь делать:

import urllib

import urllib2

 

оно говорит, что я нехороший человек

 

 

 

Поиск, Карл!

Но вообще FAQ пихать не в шапку, во второе сообщение не честно! :-)

 

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

Edited by seriych

Share this post


Link to post

Short link
Share on other sites

 

 

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

 

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


ЗЫ: Тебе сейчас проше скачать Python 2.7.10 x86, поставить и подключится к его Python27.dll и проблема исчезнет. Я уже перешел на него, потому либы к 2.7.9 не могу сейчас выложить.

Share this post


Link to post

Short link
Share on other sites

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

Просто файлик от 0.8.10 x86 с названием python27.dll из папки с виндой копируешь в папку с питоном, если у тебя его там не, указываешь путь в Орионе к нему и все будет пучком)

Share this post


Link to post

Short link
Share on other sites

Просто файлик от 0.8.10 x86 с названием python27.dll из папки с виндой копируешь в папку с питоном, если у тебя его там не, указываешь путь в Орионе к нему и все будет пучком)

 

Что такое 0.8.10?

В папки винды ни чего нет.?

А чем он будет лучше файлика python27.dll в папке с Орионом?

И как это ему поможет приконнектится к пидам от Питона 2.7.10?

Share this post


Link to post

Short link
Share on other sites

Что такое 0.8.10?

Опечатка. Python 2.7.10.

В папки винды ни чего нет.?

При установке python27.dll может оказаться в папке винды, для подключения к Ориону ее нужно скопировать в папку питона (если python27.dll там нет), чтобы потом не заморачиваться с путями.

А чем он будет лучше файлика python27.dll в папке с Орионом?

Ну если версия одинаковая (внешний питон -- Орион), то ничем.

И как это ему поможет приконнектится к пидам от Питона 2.7.10?

Пути поиска модулей... Когда python27.dll находится в папке с питоном рядом с python.exe, все необходимые пути к пидам уже есть.

Share this post


Link to post

Short link
Share on other sites

 

 

Пути поиска модулей... Когда python27.dll находится в папке с питоном рядом с python.exe, все необходимые пути к пидам уже есть.

 

Я так понял из его поста, что пиды от 2.7.10 не захотели работать с движком 2.7.9. Мне казалось что такой сильной версие-зависимости не должно быть. Или в этот раз там что-то перекомпили...Хотя может он просто x64 поставил, а только потом увидел что нужно x86. 

Share this post


Link to post

Short link
Share on other sites

Я так понял из его поста, что пиды от 2.7.10 не захотели работать с движком 2.7.9.

Мне казалось что такой сильной версие-зависимости не должно быть. Или в этот раз там что-то перекомпили...

Хотя может он просто x64 поставил, а только потом увидел что нужно x86.

Насколько я понимаю, все обновления питона 2.7 - это фиксы багов... Так что мне кажется все должно в принципе работать. Но перестраховаться и версии выровнять никогда не мешает)

Возможно, он либо поставил не ту версию (х64) питона, либо не прописал пути к пидам.

Та фича с копированием dll по сути снимает необходимость пути к пидам провисывать каждый раз в sys.paths. По крайней мере у меня так все фурычит норм.

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

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

Можно немного хотелок?

 

1. Автосейв.

2. Folding (ни разу не видел как это в локализованных IDE называется :( ). Хотя бы простой, чтобы можно было сворачивать классы/функции.

 

Ну и это баг наверное - в диалоге Save As всегда хочет сохранить с расширением исходного файла. Приходится каждый раз руками писать. Мелочь, но всё же.

  • Downvote 1

Share this post


Link to post

Short link
Share on other sites

Folding (ни разу не видел как это в локализованных IDE называется :( )

Текст-блоки это называется
  • Upvote 2
  • Downvote 1

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...