KACTET 317 #286424 Posted August 4, 2015 У других не становится, а у тебя становится. Короче ты либо подробно пишешь что ты делаешь и я пытаюсь понять что там у тебя не получается, либо иди ты туда откуда пришел коров пасти.... Он там видите ли атрибуты "Только чтение" на ini-файлы ставит, а потом пишет сюда мне что у него настройки не сохраняются. Глызы свои открой на сообщение #1263 Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #286428 Posted August 4, 2015 Удалил файл - по умолчанию/ Стало то что ниже. aUkxDQpvTzANCnFwDQpkYg0KcXBiZA0KeXUNCmFiY2RlZmdoaWtsbW5vcHFyc3R2eHl6DQphYmNkZWZnaGlrbG1ub3BxcnN0dnh5ejAxMjM0NTY3ODkNCkFCQ0RFRkdISUtMTU5PUFFSU1RWWFlaDQpBQkNERUZHSElLTE1OT1BRUlNUVlhZWjAxMjM0NTY3ODk= Заменил на это (то что ниже) и сделал файла обфускацию. Закрыл Орион. aXYxDQpvTzANCnFwDQpkYg0KcXBiZA0KeXUNCmFiY2RlZmdoaXZsbW5vcHFyc3R2eHl6DQphYmNkZWZnaGl2bG1ub3BxcnN0dnh5ejAxMjM0NTY3ODkNCkFCQ0RFRkdISXZMTU5PUFFSU1RWWFlaDQpBQkNERUZHSEl2TE1OT1BRUlNUVlhZWjAxMjM0NTY3ODk= Открыл Ini файл и что я вижу? А вижу что в низу... В данном случае 2 буковки не изменились.. Но они меняются если ничего не трогать а делать обфускацию с протектором. Но алфавит опять занулился по умолчанию. aUkxDQpvTzANCnFwDQpkYg0KcXBiZA0KeXUNCmFiY2RlZmdoaWtsbW5vcHFyc3R2eHl6DQphYmNkZWZnaGlrbG1ub3BxcnN0dnh5ejAxMjM0NTY3ODkNCkFCQ0RFRkdISUtMTU5PUFFSU1RWWFlaDQpBQkNERUZHSElLTE1OT1BRUlNUVlhZWjAxMjM0NTY3ODk= Беру Орион 1.2.5 28/04/2015 - запускаю, выхожу - открываю ini-файл - заменю в нем на aXYxDQpvTzANCnFwDQpkYg0KcXBiZA0KeXUNCmFiY2RlZmdoaXZsbW5vcHFyc3R2eHl6DQphYmNkZWZnaGl2bG1ub3BxcnN0dnh5ejAxMjM0NTY3ODkNCkFCQ0RFRkdISXZMTU5PUFFSU1RWWFlaDQpBQkNERUZHSEl2TE1OT1BRUlNUVlhZWjAxMjM0NTY3ODk= - сохраняю, закрываю - запускаю Орион - вбиваю код aaa=123;print aaa - жмякаю Script - Obfuscate - Names..., вижу - нажимаю Randomize, затем ОК - теперь жму Bytecode - Obfuscate - Compile script... - затем жму Bytecode - Protect - Protect pyc-file... - выхожу из Ориона - смотрю ini- файл, там SymbolDictionary=aXYxDQpvTzANCnFwDQpkYg0KcXBiZA0KeXUNCmFiY2RlZmdoaXZsbW5vcHFyc3R2eHl6DQphYmNkZWZnaGl2bG1ub3BxcnN0dnh5ejAxMjM0NTY3ODkNCkFCQ0RFRkdISXZMTU5PUFFSU1RWWFlaDQpBQkNERUZHSEl2TE1OT1BRUlNUVlhZWjAxMjM0NTY3ODkNCg== И где проблема?????????????????? Quote Share this post Link to post Short link Share on other sites
o-0-0-0 77 #286430 Posted August 4, 2015 (edited) Я думаю в нём ...... Лично моё мнение , можно не отвечать . Edited August 4, 2015 by o-0-0-0 1 Quote Share this post Link to post Short link Share on other sites
KACTET 317 #286435 Posted August 4, 2015 (edited) Ты уже сохранённый скрипт в папке Ориона обфусцируй bytecode/obfuscate/compile py-file и выйди из Ориона. Он у меня всё по умолчанию ставит после этого. Без программистских заморочек всяких попробуй... Edited August 4, 2015 by KACTET Quote Share this post Link to post Short link Share on other sites
GPCracker 2,088 #286484 Posted August 5, 2015 Ты хотел сказать скрипт выполняется в рабочей среде трансмиттера 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 Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #286489 Posted August 5, 2015 (edited) Так-с. Вообще было бы прикольно, если среду выполнения можно было бы перекидывать на любой модуль. Я тоже узрел такую возможность. Выбрать любой запущенный модуль, и в его теле выполнить свой код. Типа такого А если по минимуму напряги, то можно просто выполнять код в 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 August 5, 2015 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites
GPCracker 2,088 #286496 Posted August 5, 2015 Дим-зона - это просто сленг? Или описано в доках?Сленг. По сути среда, находящаяся по факту и не в трансмиттере, и не "в клиенте", в которой можно безопасно выполнять некоторые команды, в.т.ч очистку без риска для остальной части кода. Сильно напоминает значение этого термина. DMZ А по точнее? Если в ДЗ будет хук-функция, что с ней произойдет по завершении exec? Словарь останется висеть? Весь или только хук в нем? И как нему получить доступ из вне, он где будет храниться это славарь, в globals() текущего модуля, где выполняется exec?Работой связанной с контролем объектов в питоне занимается уборщик мусора, он уничтожает объект, когда количество жестких ссылок на него становится равным нулю. При выполнении кода, описанного мной, происходит примерно следующее (хочешь понять подробнее - скомпилируй и посмотри на опкодах): Создается словарь (dict()), жесткая ссылка на него попадает в стек. Выполняется код в пространстве имен, определенном в этом словаре, билтин автоматом добавляется, все остальные импортированные в другое пространство имен модули, переменные и т.д. буду недоступны. Разные модули выполняют свой код в своем пространстве имен, происходит то же самое. Во время выполнения кода все создаваемые переменные, функции и т.д. сохраняются как элементы словаря :) Это механика питона такая. Он использует словарь пространства имен как хранилище данных, и соответственно, жесткая ссылка на данные в переменных идет тоже именно из такого словаря пространства имен!!! Для каждого модуля свое пространство, оно привязано к модулю, модуль к системе (интерпретатору), поэтому питон его и не убивает! Если "отобрать" модуль у всех импортировавших его (убить жесткую ссылку) и удалить ссылку на модуль из sys.modules, интерпретатор убьет "объект модуль" и соответственно его пространство имен и все его переменные (если кроме как в sys.modules модули больше не хранятся). Можешь кстати поэкспериментировать с большим модулем (большая константа-переменная внутри и помониторить объем занимаемой процессом питона пямяти - оно будет видно... загрузку и выгрузку данных) После выполнения кода жесткая ссылка на объект (словарь dict()) теряется (он по сути никуда ни к какому объекту не привязан), словарь уничтожается уборщиком мусора. Следом за ним по той же причине улетают находящиеся в нем переменные и объекты, кроме тех, которые еще чем-то заюзаны, например, импортированные модули. По сути __del__ класса выполняется как раз перед тем, как объект (данные) будет убит сборщиком мусора. По этому методу отслеживают удаление объекта и мониторят использование пямяти. З.Ы. Думаю, ты знаешь что все объекты в питоне, не являющиеся базовыми (int, float, str... (список в доках посмотреть можно)), передаются по ссылке/указателю. Хотя возможно для кого-то это будет очень неожиданной новостью. Для тех, кто не в теме - ссылка. Читайте там еще комменты. Upd. Вот с этим в каком виде опцию сделать и как оформить? Тут в реальном времени переключиться не получится. Только перед запуском игры можно выставить циферы. Я не разбирался, что вообще эти циферы тут обозначают? Я могу опцию в окно WOT-Transmission - Options засунуть. Осталось понять как оформить.Можно изменить метакласс таким образом, чтобы он не убивал функции, и динамически читал состояние флагов уровня логгирования и вызывал либо нормальную функцию, либо заглушку/ничего не вызывал. Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #286499 Posted August 5, 2015 (edited) Создается словарь (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 August 5, 2015 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites
GPCracker 2,088 #286520 Posted August 5, 2015 А вопрос то был про место хранения 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) Код не проверял, но думаю смысл ты понял. Quote Share this post Link to post Short link Share on other sites
seriych 2,178 #286572 Posted August 5, 2015 (edited) @StranikS_Scan, А почему когда я пытаюсь делать: import urllib import urllib2 оно говорит, что я нехороший человек Поиск, Карл! Но вообще FAQ пихать не в шапку, во второе сообщение не честно! :-) И еще на случай, если я не один такой дебил, надо написать, что питон должен быть ровно той же версии, что в проге, а то я сначала последнюю 2.7.10 скачал и оно опять сказало, что я нехороший человек. И версию, наверное, x86 качать надо, судя по надписи only x86 в заголовке ориона Edited August 5, 2015 by seriych Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #286576 Posted August 5, 2015 И еще на случай, если я не один такой дебил, надо написать, что питон должен быть ровно той же версии, что в проге, а то я сначала последнюю 2.7.10 скачал и оно опять сказало, что я нехороший человек. Либы версие-зависимы жы. Наверно проще в первом посте, где ссылки, еще и архивчик с либами выкладывать, чтоб не замарачиваться с поисками и установками. ЗЫ: Тебе сейчас проше скачать Python 2.7.10 x86, поставить и подключится к его Python27.dll и проблема исчезнет. Я уже перешел на него, потому либы к 2.7.9 не могу сейчас выложить. Quote Share this post Link to post Short link Share on other sites
GPCracker 2,088 #286585 Posted August 6, 2015 И еще на случай, если я не один такой дебил, надо написать, что питон должен быть ровно той же версии, что в проге, а то я сначала последнюю 2.7.10 скачал и оно опять сказало, что я нехороший человек. И версию, наверное, x86 качать надо, судя по надписи only x86 в заголовке орионаПросто файлик от 0.8.10 x86 с названием python27.dll из папки с виндой копируешь в папку с питоном, если у тебя его там не, указываешь путь в Орионе к нему и все будет пучком) Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #286603 Posted August 6, 2015 Просто файлик от 0.8.10 x86 с названием python27.dll из папки с виндой копируешь в папку с питоном, если у тебя его там не, указываешь путь в Орионе к нему и все будет пучком) Что такое 0.8.10? В папки винды ни чего нет.? А чем он будет лучше файлика python27.dll в папке с Орионом? И как это ему поможет приконнектится к пидам от Питона 2.7.10? Quote Share this post Link to post Short link Share on other sites
GPCracker 2,088 #286615 Posted August 6, 2015 Что такое 0.8.10?Опечатка. Python 2.7.10. В папки винды ни чего нет.?При установке python27.dll может оказаться в папке винды, для подключения к Ориону ее нужно скопировать в папку питона (если python27.dll там нет), чтобы потом не заморачиваться с путями. А чем он будет лучше файлика python27.dll в папке с Орионом?Ну если версия одинаковая (внешний питон -- Орион), то ничем. И как это ему поможет приконнектится к пидам от Питона 2.7.10?Пути поиска модулей... Когда python27.dll находится в папке с питоном рядом с python.exe, все необходимые пути к пидам уже есть. Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #286616 Posted August 6, 2015 Пути поиска модулей... Когда python27.dll находится в папке с питоном рядом с python.exe, все необходимые пути к пидам уже есть. Я так понял из его поста, что пиды от 2.7.10 не захотели работать с движком 2.7.9. Мне казалось что такой сильной версие-зависимости не должно быть. Или в этот раз там что-то перекомпили...Хотя может он просто x64 поставил, а только потом увидел что нужно x86. Quote Share this post Link to post Short link Share on other sites
GPCracker 2,088 #286620 Posted August 6, 2015 Я так понял из его поста, что пиды от 2.7.10 не захотели работать с движком 2.7.9. Мне казалось что такой сильной версие-зависимости не должно быть. Или в этот раз там что-то перекомпили... Хотя может он просто x64 поставил, а только потом увидел что нужно x86. Насколько я понимаю, все обновления питона 2.7 - это фиксы багов... Так что мне кажется все должно в принципе работать. Но перестраховаться и версии выровнять никогда не мешает) Возможно, он либо поставил не ту версию (х64) питона, либо не прописал пути к пидам. Та фича с копированием dll по сути снимает необходимость пути к пидам провисывать каждый раз в sys.paths. По крайней мере у меня так все фурычит норм. Я поначалу тоже как-то хитро выкручивался с путями, когда разбирался почему пиды не работают... Quote Share this post Link to post Short link Share on other sites
Vampire_BY 3 #286876 Posted August 8, 2015 У меня не находит клиент игры даже когда я указываю путь к нему в ручную. В чем может быть проблема? Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #286879 Posted August 8, 2015 У меня не находит клиент игры даже когда я указываю путь к нему в ручную. В чем может быть проблема? Можно чуть по подробней, что куда делаете и скрины? Quote Share this post Link to post Short link Share on other sites
Redneck 3 #286884 Posted August 8, 2015 Можно немного хотелок? 1. Автосейв. 2. Folding (ни разу не видел как это в локализованных IDE называется :( ). Хотя бы простой, чтобы можно было сворачивать классы/функции. Ну и это баг наверное - в диалоге Save As всегда хочет сохранить с расширением исходного файла. Приходится каждый раз руками писать. Мелочь, но всё же. 1 Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #286885 Posted August 8, 2015 Folding (ни разу не видел как это в локализованных IDE называется :( )Текст-блоки это называется 2 1 Quote Share this post Link to post Short link Share on other sites