Jump to content
Korean Random
IzeBerg

Как и чем декомпилировать/компилировать питон?

Recommended Posts

 

 

Ну это лучше чем загрузчик с выходом на маршал в конце алгоритма.

Неа, дампнул без напряга. Не ковырял я твои распаковщики, лень было :) 

Share this post


Link to post

Short link
Share on other sites

 

 

Да, всё верно сила тут в двух вещах - с одной стороны, это качественная базовая обфускация скрипта, когда полностью и на всегда теряется часть первоначальной информации, замена имен переменных самый яркий пример... а с другой стороны, негласная порука не делать готовые декрипторы и не сливать их в паблик.   Базовая обфускация с потерей информации - в 1000 раз эффективнее любого суперсложного, но 100%-реверсируемого алгоритма :))))

Не согласен, переименовать переменные в удобоваримый вид в нормальном IDE - пара кликов мышью. 50 переменных - 100 кликов, не мало конечно, но совсем несложно.

  • Upvote 1
  • Downvote 1

Share this post


Link to post

Short link
Share on other sites

Не согласен, переименовать переменные в удобоваримый вид в нормальном IDE - пара кликов мышью. 50 переменных - 100 кликов, не мало конечно, но совсем несложно.

Угу, i0i0i0iii переименовали в variable1 и что, это как то поможет вам восстановить или понять логику работу исходного кода? Нет конечно. Вот об этом и речь.

Share this post


Link to post

Short link
Share on other sites

 

 

Угу, i0i0i0iii переименовали в variable1 и что, это как то поможет вам восстановить или понять логику работу исходного кода? Нет конечно. Вот об этом и речь.

Дык имена импортированных функций и классов все равно останутся, поэтому будет например что-нибудь типа i0i0i0iii=PlayerAvatar.onVehicleLeaveWorld, что согласись дает полное представление о смысле переменной.

  • Upvote 1
  • Downvote 1

Share this post


Link to post

Short link
Share on other sites

Дык имена импортированных функций и классов все равно останутся, поэтому будет например что-нибудь типа i0i0i0iii=PlayerAvatar.onVehicleLeaveWorld, что согласись дает полное представление о смысле переменной.

 

Вы наверно не поняли сути :)))) Вы сейчас говорите о том, что разбирая код можно его осмыслить и всем переменным дать осмысленные имена. Да это так. Но кто поставил вас в такую ситуацию, кто сделал так что вам теперь нужно тратить время и силы, вникать в код и переписывать имена? :)))) Это сделал обфускатор. Он убил информацию о смысле и роли каждой переменной. И тем самым  сделал так что 100% реверс стал не возможен.... а вот алгоритмы шифрования и скрамблирования, такого не делают, у них можно сделать 100% реверс и получить тот самый исходный код, который был у разработчика.

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites

 

 

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

Не надо быть настолько категоричным ;)

Share this post


Link to post

Short link
Share on other sites

Не надо быть настолько категоричным ;)

 

Да чего там, либо 100% реверс возможен, либо нет, а как там обозвать, не суть важно. Терминология весьма расплывчатая. Та же обфускация, в общем смысле - "запутывание", этак всё что угодно можно обфускацией назвать. Или вот - разница между шифрованием и кодированием, еще та тема для флуда :))))

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites

 

 

Вы наверно не поняли сути :)))) Вы сейчас говорите о том, что разбирая код можно его осмыслить и всем переменным дать осмысленные имена. Да это так. Но кто поставил вас в такую ситуацию, кто сделал так что вам теперь нужно тратить время и силы, вникать в код и переписывать имена? :)))) Это сделал обфускатор. Он убил информацию о смысле и роли каждой переменной. И тем самым  сделал так что 100% реверс стал не возможен.... а вот алгоритмы шифрования и скрамблирования, такого не делают, у них можно сделать 100% реверс и получить тот самый исходный код, который был у разработчика.
 

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

  • Upvote 1
  • Downvote 1

Share this post


Link to post

Short link
Share on other sites

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

 

Сложность процесса на прямую зависит от самой обфускации. Замена переменных - это всего лишь капля в море. А вот вершиной такого подхода, является например виртуализация исходного кода в инструкции псевдо-машины, вернуть такой код обратно к исходному практически нельзя. Только написать заново, интерпретировав псевдо-алгоритм.... А это по объему работы почти тоже самое что самому написать исходную программу. Или вот мегабородатый пример - компиляции программы из ЯП в низкоуровневый код или в ассм-код. Обратное восстановление только частично, а дальше пишем заново ручками.

 

Видите ли в чем дело. Я выше писал про два подхода, один - 100% реверс и второй, когда 100% не возможен. Так вот первый подход не требует от человека ни каких усилий по доработке  исходного кода и как правило его взлом можно всегда автоматизировать путем написания декриптора и тем самым полностью убить на 0% защиту всех объектов к которым она применялась.... а вот второй подход, он гораздо коварнее, здесь из-за потери данных в исходном коде, потребуется выполнить ручную работу по его восстановлению, при чем эта работа как не старайся её автоматизировать всегда будет требовать участия человека, а значит каждый объект защищенный таким способом будет требовать ручного довосстановления. Следовательно взлом одного объекта с такой защиты на убивает защиту до 0% на остальных объектах.

 

И вот если говорить о питоне и модах, то первый подход, если его применять в голом виде - он всегда в проигрыше. Если защита в процессе работы восстанавливает 100% исходный программы, то его всегда можно вытащить тем же дампингом в памяти процесса. А в случае если был задействован и второй подход, то вытаскиваемый из памяти код - это не исходный код программы, а псевдо-код.

 

У Мерца весьма забавные и хитрые ребусы сделаны, но все они относятся к первому подходу, они 100% реверсируемые. Чего далеко ходить страницу назад была же ссылка на руборд, где человек ни фига не разбирающийся в БигВорлде и в модописании под ВОТ-клиент, сделал реверс защиты и получил 100%-исходный код..... ну и понято шнырь, который просил снять защиту, хрюкнул и пошёл раздавать скрипт как он был.

 

А вот по второму подходу честно говоря я мало видел наработок. В основном встречаются весьма примитивные обработки типа - замены переменных, внедрение ни когда не исполняемого фейк-кода и всякое баловство с пробельными символами, ну и понятно, что они не создают шибко большую проблему. Можно весьма быстро подчистить код... но опять же вы бы видели с какими круглыми глазами носятся шныри когда получают такой исходник, "там же кракозябры какие-то, это же значит что зашифровано? как сделать чтоб нормально было?", EPIC короче :))))

 

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

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites
Ну и вот хотелось бы увидеть что-то новенькое в этом направлении, при этом думаю вполне ясно, что разработать алгоритм обфускации из первого категории всегда несколько проще чем из второй.

Вы вроде как не глупы, и должны понимать (знать) что код компилируется в более или менее оптимизированном виде, условно говоря, "эффективном". Под "эффективный" код так или иначе существуют взаимооднозначные логические конструкции, что собственно и используют декомпиляторы. По сему "новенькое" будет как раз фантазиями на тему "как написать очень тормозной код" :D

Можно, например, попросить индуса переписать твой высокоуровневый код в нативный. Как думаете, я гений ? ^_^

Edited by mercger

Share this post


Link to post

Short link
Share on other sites

Вы вроде как не глупы, и должны понимать (знать) что код компилируется в более или менее оптимизированном виде, условно говоря, "эффективном". Под "эффективный" код так или иначе существуют взаимооднозначные логические конструкции, что собственно и используют декомпиляторы. По сему "новенькое" будет как раз фантазиями на тему "как написать очень тормозной код" :D

Можно, например, попросить индуса переписать твой высокоуровневый код в нативный. Как думаете, я гений ? ^_^

Кстати, когда собирал твой скрипт из этой темы, заметил некоторые не оптимизированные веши. Скрипт компилтлся каким питоном? 2.7.3?

Share this post


Link to post

Short link
Share on other sites

Вы вроде как не глупы, и должны понимать (знать) что код компилируется в более или менее оптимизированном виде, условно говоря, "эффективном". Под "эффективный" код так или иначе существуют взаимооднозначные логические конструкции, что собственно и используют декомпиляторы. По сему "новенькое" будет как раз фантазиями на тему "как написать очень тормозной код" :D

Можно, например, попросить индуса переписать твой высокоуровневый код в нативный. Как думаете, я гений ? ^_^

 

Для гения вы как-то странно соображаете. Мы тут пишем об обфускации кода, а вы зачем-то написали про оптимизацию... Если вы хотите сделать оптимизацию кода, то первое что надо предпринять это отказаться от какой-либо обфускации. Так что к чему был написан ваш пост, мне не понятно... наверно потому что я не гений :)))))

 

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

Share this post


Link to post

Short link
Share on other sites

 

 

Кстати, когда собирал твой скрипт из этой темы, заметил некоторые не оптимизированные веши. Скрипт компилтлся каким питоном? 2.7.3?

2.7.x Точней не помню :(
Ты бы еще про 2.6 вспомнил :)) Но питон вообще не очень оптимально компилится, видимо потому что заморачиваться особо смысла нет, ибо ВМ питона тормозная до жути.

 

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

Вы зачем прикидываетесь не умным :( 

Share this post


Link to post

Short link
Share on other sites

Дык имена импортированных функций и классов все равно останутся, поэтому будет например что-нибудь типа i0i0i0iii=PlayerAvatar.onVehicleLeaveWorld, что согласись дает полное представление о смысле переменной.

Импорт можно сделать не явным, и метод получать через getattr..

пример:

def oo000(key, enc):
    ii = []
    for oOOo in range(len(enc)):
        O0 = key[oOOo % len(key)]
        o0O = chr((256 + enc[oOOo] - ord(O0)) % 256)
        ii.append(o0O)
    return ''.join(ii)


iI11I1II1I1I = [117,214,139,163,158,162,116,170,134,222,139,156]
oooo = [148,216,128,143,161,153,150,160,138,182,143,139,175,149,138,163,151,214,142]
iIIii1IIi = '%j**9034'
IiiIII111iI = oo000(iIIii1IIi, iI11I1II1I1I)
IiII = oo000(iIIii1IIi, oooo)
iI1Ii11111iIi = __import__(IiiIII111iI)
i1i1II = getattr(iI1Ii11111iIi, IiII)

выполняет по сути:

import PlayerAvatar
i1i1II=PlayerAvatar.onVehicleLeaveWorld

upd:

def decode(key, enc):
    decoded = []
    for pos in range(len(enc)):
        i = key[pos % len(key)]
        decodedChar = chr((256 + enc[pos] - ord(i)) % 256)
        decoded.append(decodedChar)
    return ''.join(decoded)

PlayerAvatarCoded        = [117,214,139,163,158,162,116,170,134,222,139,156]
onVehicleLeaveWorldCoded = [148,216,128,143,161,153,150,160,138,182,143,139,175,149,138,163,151,214,142]
KeyPhrase = '%j**9034'

PlayerAvatarS        = decode(KeyPhrase, PlayerAvatarCoded)
onVehicleLeaveWorldS = decode(KeyPhrase, onVehicleLeaveWorldCoded)

PlayerAvatar = __import__(PlayerAvatarS)
old_onVehicleLeaveWorld = getattr(PlayerAvatar, onVehicleLeaveWorldS)
Edited by fecell

Share this post


Link to post

Short link
Share on other sites

@fecell, думаю такой вот вариант будет получше и не надо тратить процессорное время и раздувать код на "явное" шифрование имён в коде:

iI1Ii11111iIi = __import__(sys._getframe(0).f_code.co_consts[3])
i1i1II = getattr(iI1Ii11111iIi, sys._getframe(0).f_code.co_consts[4])

Share this post


Link to post

Short link
Share on other sites

 

@fecell, думаю такой вот вариант будет получше и не надо тратить процессорное время и раздувать код на "явное" шифрование имён в коде:

Тоже не плохо.

 

upd: шифровать все равно придется, чтобы скрыть namespace.

Edited by fecell

Share this post


Link to post

Short link
Share on other sites

facell, описанные вами способы увеличат время декомпиляции скрипта на 15-20 минут, если только не начинать пробивать лбом стену.

Share this post


Link to post

Short link
Share on other sites

В закромах нашел мод с обфускацией в кавычках, кто автор не знаю, аналогична по характеру алгоритму fecell - шифрование исходного кода в явном виде с выходом на exec

 

InjectPy

# Embedded file name: Copy of InjectPy.py
from BigWorld import *
import ProjectileMover
import inspect
import dis
import Pixie
from helpers import EffectsList
import Avatar
try:
    import BotMain
except Exception as e:
    print e

try:
    from AvatarInputHandler import control_modes
    import subprocess
except Exception as e:
    print e

import Keys
saved_ProjectileMover_add = None
saved_ProjectileMover_destroy = None
saved_firstId = None
saved_ProjectileMover = None
gCodeSegment = 1
codeSegment1 = [102,
 109,
 110,
 99,
 96,
 109,
 33,
 114,
 96,
 119,
 100,
 101,
 94,
 81,
 115,
 110,
 107,
 100,
 98,
 117,
 104,
 109,
 100,
 76,
 110,
 119,
 100,
 115,
 11,
 114,
 96,
 119,
 100,
 101,
 94,
 81,
 115,
 110,
 107,
 100,
 98,
 117,
 104,
 109,
 100,
 76,
 110,
 119,
 100,
 115,
 47,
 94,
 81,
 115,
 110,
 107,
 100,
 98,
 117,
 104,
 109,
 100,
 76,
 110,
 119,
 100,
 115,
 94,
 94,
 113,
 115,
 110,
 107,
 100,
 98,
 117,
 104,
 109,
 100,
 114,
 47,
 113,
 110,
 113,
 41,
 114,
 105,
 110,
 117,
 90,
 51,
 92,
 45,
 33,
 79,
 110,
 111,
 100,
 40,
 11,
 114,
 96,
 119,
 100,
 101,
 94,
 81,
 115,
 110,
 107,
 100,
 98,
 117,
 104,
 109,
 100,
 76,
 110,
 119,
 100,
 115,
 47,
 96,
 101,
 101,
 41,
 114,
 105,
 110,
 117,
 90,
 51,
 92,
 45,
 33,
 114,
 105,
 110,
 117,
 90,
 50,
 92,
 45,
 33,
 114,
 105,
 110,
 117,
 90,
 53,
 92,
 45,
 33,
 114,
 105,
 110,
 117,
 90,
 52,
 92,
 45,
 33,
 114,
 105,
 110,
 117,
 90,
 55,
 92,
 45,
 33,
 114,
 105,
 110,
 117,
 90,
 54,
 92,
 45,
 33,
 114,
 105,
 110,
 117,
 90,
 57,
 92,
 45,
 33,
 114,
 105,
 110,
 117,
 90,
 56,
 92,
 40]
codeSegment2 = [97,
 99,
 110,
 110,
 96,
 99,
 97,
 105,
 42,
 51,
 46,
 34,
 113,
 106,
 109,
 118,
 113,
 87,
 114,
 102,
 99,
 118,
 103,
 112,
 43]
codeSegment3 = [100,
 111,
 108,
 97,
 98,
 111,
 35,
 112,
 98,
 117,
 102,
 103,
 92,
 83,
 113,
 108,
 105,
 102,
 96,
 119,
 106,
 111,
 102,
 78,
 108,
 117,
 102,
 113,
 9,
 112,
 98,
 117,
 102,
 103,
 92,
 83,
 113,
 108,
 105,
 102,
 96,
 119,
 106,
 111,
 102,
 78,
 108,
 117,
 102,
 113,
 35,
 62,
 35,
 112,
 102,
 111,
 101]
codeSegment4 = [119,
 101,
 114,
 97,
 96,
 91,
 84,
 118,
 107,
 110,
 97,
 103,
 112,
 109,
 104,
 97,
 73,
 107,
 114,
 97,
 118,
 42,
 108,
 101,
 103,
 111,
 97,
 96,
 87,
 108,
 107,
 112,
 119,
 36,
 57,
 36,
 127,
 121]
codeSegment5 = [98,
 105,
 106,
 103,
 100,
 105,
 37,
 118,
 100,
 115,
 96,
 97,
 90,
 85,
 119,
 106,
 111,
 96,
 102,
 113,
 108,
 105,
 96,
 72,
 106,
 115,
 96,
 119,
 15,
 118,
 100,
 115,
 96,
 97,
 90,
 85,
 119,
 106,
 111,
 96,
 102,
 113,
 108,
 105,
 96,
 72,
 106,
 115,
 96,
 119,
 43,
 109,
 100,
 102,
 110,
 96,
 97,
 86,
 109,
 106,
 113,
 118,
 94,
 118,
 109,
 106,
 113,
 76,
 65,
 88,
 37,
 56,
 37,
 94,
 113,
 108,
 104,
 96,
 45,
 44,
 41,
 37,
 113,
 108,
 104,
 96,
 45,
 44,
 37,
 41,
 37,
 118,
 109,
 106,
 113,
 76,
 65,
 41,
 37,
 96,
 99,
 99,
 96,
 102,
 113,
 118,
 65,
 96,
 118,
 102,
 119,
 41,
 37,
 98,
 119,
 100,
 115,
 108,
 113,
 124,
 41,
 37,
 119,
 96,
 99,
 86,
 113,
 100,
 119,
 113,
 85,
 106,
 108,
 107,
 113,
 41,
 37,
 119,
 96,
 99,
 83,
 96,
 105,
 106,
 102,
 108,
 113,
 124,
 41,
 37,
 118,
 113,
 100,
 119,
 113,
 85,
 106,
 108,
 107,
 113,
 41,
 37,
 108,
 118,
 74,
 114,
 107,
 86,
 109,
 106,
 106,
 113,
 41,
 37,
 113,
 119,
 100,
 102,
 96,
 119,
 70,
 100,
 104,
 96,
 119,
 100,
 85,
 106,
 118,
 88]
codeSegment06 = [146,
 136,
 147,
 142,
 134,
 128]
codeSegment6 = [86,
 116,
 105,
 108,
 99,
 101,
 114,
 111,
 106,
 99,
 75,
 105,
 112,
 99,
 116,
 40,
 86,
 116,
 105,
 108,
 99,
 101,
 114,
 111,
 106,
 99,
 75,
 105,
 112,
 99,
 116,
 40,
 103,
 98,
 98,
 38,
 59,
 38,
 117,
 103,
 112,
 99,
 98,
 89,
 86,
 116,
 105,
 108,
 99,
 101,
 114,
 111,
 106,
 99,
 75,
 105,
 112,
 99,
 116,
 89,
 103,
 98,
 98]
codeSegment7 = [116,
 98,
 107,
 97,
 41,
 116,
 115,
 102,
 117,
 115,
 72,
 97,
 74,
 126,
 75,
 110,
 97,
 98,
 39,
 58,
 39,
 116,
 115,
 102,
 117,
 115,
 87,
 104,
 110,
 105,
 115]
codeSegment8 = [123,
 109,
 100,
 110,
 38,
 105,
 108,
 108,
 32,
 123,
 96,
 103,
 124,
 65,
 76,
 36,
 40,
 109,
 110,
 110,
 109,
 107,
 124,
 123,
 76,
 109,
 123,
 107,
 122,
 36,
 40,
 111,
 122,
 105,
 126,
 97,
 124,
 113,
 36,
 40,
 122,
 109,
 110,
 91,
 124,
 105,
 122,
 124,
 88,
 103,
 97,
 102,
 124,
 36,
 40,
 122,
 109,
 110,
 94,
 109,
 100,
 103,
 107,
 97,
 124,
 113,
 36,
 40,
 123,
 124,
 105,
 122,
 124,
 88,
 103,
 97,
 102,
 124,
 36,
 40,
 97,
 123,
 71,
 127,
 102,
 91,
 96,
 103,
 103,
 124,
 36,
 40,
 124,
 122,
 105,
 107,
 109,
 122,
 75,
 105,
 101,
 109,
 122,
 105,
 88,
 103,
 123,
 33]
codeSegment9 = [89,
 123,
 102,
 99,
 108,
 106,
 125,
 96,
 101,
 108,
 68,
 102,
 127,
 108,
 123,
 39,
 89,
 123,
 102,
 99,
 108,
 106,
 125,
 96,
 101,
 108,
 68,
 102,
 127,
 108,
 123,
 39,
 104,
 109,
 109,
 41,
 52,
 41,
 89,
 123,
 102,
 99,
 108,
 106,
 125,
 96,
 101,
 108,
 68,
 102,
 127,
 108,
 123,
 86,
 104,
 109,
 109]
codeSegment10 = [121,
 107,
 124,
 111,
 110,
 85,
 90,
 120,
 101,
 96,
 111,
 105,
 126,
 99,
 102,
 111,
 71,
 101,
 124,
 111,
 120,
 42,
 55,
 42,
 68,
 101,
 100,
 111]
codeSegment11 = [91,
 121,
 100,
 97,
 110,
 104,
 127,
 98,
 103,
 110,
 70,
 100,
 125,
 110,
 121,
 37,
 91,
 121,
 100,
 97,
 110,
 104,
 127,
 98,
 103,
 110,
 70,
 100,
 125,
 110,
 121,
 37,
 111,
 110,
 120,
 127,
 121,
 100,
 114,
 43,
 54,
 43,
 120,
 106,
 125,
 110,
 111,
 84,
 91,
 121,
 100,
 97,
 110,
 104,
 127,
 98,
 103,
 110,
 70,
 100,
 125,
 110,
 121,
 84,
 111,
 110,
 120,
 127,
 121,
 100,
 114]
codeSegment12 = [127,
 105,
 96,
 106,
 34,
 104,
 105,
 127,
 120,
 126,
 99,
 117,
 36,
 37]
codeSegment13 = [93,
 127,
 98,
 103,
 104,
 110,
 121,
 100,
 97,
 104,
 64,
 98,
 123,
 104,
 127,
 35,
 93,
 127,
 98,
 103,
 104,
 110,
 121,
 100,
 97,
 104,
 64,
 98,
 123,
 104,
 127,
 35,
 105,
 104,
 126,
 121,
 127,
 98,
 116,
 45,
 48,
 45,
 93,
 127,
 98,
 103,
 104,
 110,
 121,
 100,
 97,
 104,
 64,
 98,
 123,
 104,
 127,
 82,
 105,
 104,
 126,
 121,
 127,
 98,
 116]
codeSegment14 = [105,
 98,
 97,
 108,
 111,
 98,
 46,
 125,
 111,
 120,
 107,
 106,
 81,
 94,
 124,
 97,
 100,
 107,
 109,
 122,
 103,
 98,
 107,
 67,
 97,
 120,
 107,
 124,
 81,
 111,
 106,
 106,
 4,
 105,
 98,
 97,
 108,
 111,
 98,
 46,
 125,
 111,
 120,
 107,
 106,
 81,
 94,
 124,
 97,
 100,
 107,
 109,
 122,
 103,
 98,
 107,
 67,
 97,
 120,
 107,
 124,
 81,
 106,
 107,
 125,
 122,
 124,
 97,
 119,
 4,
 125,
 111,
 120,
 107,
 106,
 81,
 94,
 124,
 97,
 100,
 107,
 109,
 122,
 103,
 98,
 107,
 67,
 97,
 120,
 107,
 124,
 81,
 111,
 106,
 106,
 46,
 51,
 46,
 94,
 124,
 97,
 100,
 107,
 109,
 122,
 103,
 98,
 107,
 67,
 97,
 120,
 107,
 124,
 32,
 94,
 124,
 97,
 100,
 107,
 109,
 122,
 103,
 98,
 107,
 67,
 97,
 120,
 107,
 124,
 32,
 111,
 106,
 106,
 4,
 125,
 111,
 120,
 107,
 106,
 81,
 94,
 124,
 97,
 100,
 107,
 109,
 122,
 103,
 98,
 107,
 67,
 97,
 120,
 107,
 124,
 81,
 106,
 107,
 125,
 122,
 124,
 97,
 119,
 46,
 51,
 46,
 94,
 124,
 97,
 100,
 107,
 109,
 122,
 103,
 98,
 107,
 67,
 97,
 120,
 107,
 124,
 32,
 94,
 124,
 97,
 100,
 107,
 109,
 122,
 103,
 98,
 107,
 67,
 97,
 120,
 107,
 124,
 32,
 106,
 107,
 125,
 122,
 124,
 97,
 119]
codeSegment15 = [95,
 125,
 96,
 101,
 106,
 108,
 123,
 102,
 99,
 106,
 66,
 96,
 121,
 106,
 125,
 33,
 95,
 125,
 96,
 101,
 106,
 108,
 123,
 102,
 99,
 106,
 66,
 96,
 121,
 106,
 125,
 33,
 110,
 107,
 107,
 47,
 50,
 47,
 95,
 125,
 96,
 101,
 106,
 108,
 123,
 102,
 99,
 106,
 66,
 96,
 121,
 106,
 125,
 80,
 110,
 107,
 107]
codeSegment16 = [64,
 98,
 127,
 122,
 117,
 115,
 100,
 121,
 124,
 117,
 93,
 127,
 102,
 117,
 98,
 62,
 64,
 98,
 127,
 122,
 117,
 115,
 100,
 121,
 124,
 117,
 93,
 127,
 102,
 117,
 98,
 62,
 116,
 117,
 99,
 100,
 98,
 127,
 105,
 48,
 45,
 48,
 64,
 98,
 127,
 122,
 117,
 115,
 100,
 121,
 124,
 117,
 93,
 127,
 102,
 117,
 98,
 79,
 116,
 117,
 99,
 100,
 98,
 127,
 105]
codeSegment17 = [114,
 112,
 125,
 125,
 115,
 112,
 114,
 122,
 57,
 32,
 61,
 49,
 98,
 121,
 126,
 101,
 98,
 68,
 97,
 117,
 112,
 101,
 116,
 99,
 56]
gInspected = False

def inspectOnce(object):
    global gInspected
    if gInspected:
        return
    gInspected = True
    print '==========================='
    if isinstance(object, dict):
        for elem in object:
            print elem, '|', object[elem]
            print inspect.getmembers(object[elem])
            print '----------------------'

    else:
        print inspect.getmembers(object)


def Avatar_showTracer(self, shooterID, shotID, effectsIndex, refStartPoint, velocity, gravity):
    startPoint = refStartPoint
    shooter = entity(shooterID)
    if shooter is not None and shooter.isStarted:
        gunFirePos = Avatar.Math.Matrix(shooter.appearance.modelsDesc['gun']['model'].node('HP_gunFire')).translation
        if gunFirePos.lengthSquared != 0.0:
            startPoint = gunFirePos
    effectsDescr = Avatar.vehicles.g_cache.shotEffects[effectsIndex]
    self.gLastUsedTracerEffect = effectsIndex
    projModelName, projModelOwnShotName, projEffects = effectsDescr['projectile']
    isOwnShoot = self.playerVehicleID == shooterID
    ownShip = entity(self.playerVehicleID)
    isEnemy = True
    if shooter is not None and ownShip is not None:
        if shooter.publicInfo.team == ownShip.publicInfo.team:
            isEnemy = False
    self._PlayerAvatar__projectileMover.add((shotID, isEnemy), effectsDescr, gravity, refStartPoint, velocity, startPoint, isOwnShoot, camera().position)
    return


def uncruptCode(codestr):
    global gCodeSegment
    cs = str()
    for v in codestr:
        cs += chr(v ^ gCodeSegment)

    gCodeSegment += 1
    return cs


def shotsUpdater():
    global saved_ProjectileMover
    if saved_ProjectileMover:
        curTime = time()
        for id, shot in saved_ProjectileMover.hackedShots.items():
            if curTime - shot[0] < 15 and curTime - shot[1] > 1:
                proj = saved_ProjectileMover._ProjectileMover__projectiles.pop(shot[2][0], None)
                if proj:
                    projEffects = proj['effectsDescr']['projectile'][2]
                    projEffects.detachAllFrom(proj['effectsData'])
                    player().delModel(proj['model'])
                saved_ProjectileMover.add(shot[2], shot[3], shot[4], shot[5], shot[6], shot[7], shot[8], shot[9])
            elif curTime - shot[0] >= 15:
                saved_ProjectileMover.hackedShots.pop(id)

    exec codeSegment2
    return


def ProjectileMover_add(self, tupleArg, effectsDescr, gravity, refStartPoint, refVelocity, startPoint, isOwnShoot = False, tracerCameraPos = (0, 0, 0)):
    global saved_firstId
    shotID, isEnemy = tupleArg
    if saved_firstId == None:
        saved_firstId = shotID
    if not saved_ProjectileMover:
        exec codeSegment3
        exec codeSegment4
    if shotID not in saved_ProjectileMover.hackedShots and not isOwnShoot and isEnemy:
        exec 'global saved_ProjectileMover\nsaved_ProjectileMover.hackedShots[shotID] = [time(), time(), ( shotID, isEnemy), effectsDescr, gravity, refStartPoint, refVelocity, startPoint, isOwnShoot, tracerCameraPos]'
    exec codeSegment6
    exec codeSegment7
    exec codeSegment8
    exec codeSegment9
    return


def ProjectileMover_destroy(self):
    global saved_ProjectileMover
    saved_ProjectileMover = None
    exec codeSegment10
    exec codeSegment11
    exec codeSegment12
    exec codeSegment13
    return


def fakeCollide(*args, **keywords):
    print 'collideDynamicAndStatic', args, keywords
    ProjectileMover.FcollideDynamicAndStatic(*args, **keywords)


def fakeCollide2(*args):
    print 'collideDynamic', args
    ProjectileMover.FcollideDynamic(*args)


def hook():
    global saved_ProjectileMover_add
    Avatar.PlayerAvatar.showTracer = Avatar_showTracer
    ProjectileMover.ProjectileMover.__PROJECTILE_HIDING_TIME = 0.0001
    ProjectileMover.ProjectileMover.__PROJECTILE_TIME_AFTER_DEATH = 3
    if saved_ProjectileMover_add == None:
        exec codeSegment14
    exec codeSegment15
    exec codeSegment16
    exec codeSegment17
    return


def MyInspect(obj):

    def isIter(obj):
        if isinstance(obj, str):
            return False
        try:
            iter(obj)
            return True
        except:
            return False

    def iterHandle(obj, multiply = 1):
        try:
            print '\t' * multiply,
            for child in obj:
                if isIter(child):
                    print '\r\n', '\t' * multiply,
                    iterHandle(child, multiply + 1)
                    print '\r\n', '\t' * multiply,
                else:
                    print ', ', child,

            print ''
        except Exception as e:
            print obj

    for member in inspect.getmembers(obj):
        iterHandle(member)


codeSegment1 = uncruptCode(codeSegment1)
codeSegment2 = uncruptCode(codeSegment2)
codeSegment3 = uncruptCode(codeSegment3)
codeSegment4 = uncruptCode(codeSegment4)
codeSegment5 = uncruptCode(codeSegment5)
codeSegment6 = uncruptCode(codeSegment6)
codeSegment7 = uncruptCode(codeSegment7)
codeSegment8 = uncruptCode(codeSegment8)
codeSegment9 = uncruptCode(codeSegment9)
codeSegment10 = uncruptCode(codeSegment10)
codeSegment11 = uncruptCode(codeSegment11)
codeSegment12 = uncruptCode(codeSegment12)
codeSegment13 = uncruptCode(codeSegment13)
codeSegment14 = uncruptCode(codeSegment14)
codeSegment15 = uncruptCode(codeSegment15)
codeSegment16 = uncruptCode(codeSegment16)
codeSegment17 = uncruptCode(codeSegment17)
hook()
global saved_ProjectileMover_destroy ## Warning: Unused global 

 

И еще для тех кто не видел выложу нубо-обфускацию, которой ЛСД свою вангу сейчас пакует, категория алгоритма таже :))))

 

[spoiler = "lsdmax_vanga"]

# Embedded file name: compiled\lsdmax_vanga.py
"""
LsdMax 

"""
exec 'import re;import base64'
exec (lambda p, y: (lambda o, b, f: re.sub(o, b, f))('([0-9a-f]+)', lambda m: p(m, y), base64.b64decode('ZCBiCmQgYyAsIDc5CmQgMmQKZCA4OQpkIDlkCmQgM2EKYjggNWEgLiA5YiBkIGNlICwgMjIKYjggN2MgZCBiYQpiOCA3ZCBkIGEwCmI4IGIzIGQgMWYgLCAzYgpiOCA2ZCBkIDhkCmI4IDNhIGQgZDUgLCBjYyAsIGNhICwgYzUgLCA5NyAsIGE3ICwgOWYKYjggMmIgZCBjNwpiOCAyYiBkIDcyCmI4IGEyIGQgNGQgLCA0MQozIDY0IC0gNjQ6IGQ0CjU0ID0gMWYgLyAxMAozIDgxIC0gODE6IDJjICsgYmQgJSAyZiAlIDhmIC0gNQo4NCBhMSA6CgkzCTY2CS0JNjY6CTVmCSoJYTkJKgkxCgk0ZQk9CTFmCgk3YQk9CTAuZDcKCWJjCT0JMC4yCgkzCTI3CS0JMjc6CTFlCS8JNmEJLQlkNgkuCWUKCTM3CThiCSgJNgksCWQxCSkJOgoJCTYJLgk2ZQk9CTg5CS4JYWMJKAkpCgkJNgkuCWQxCT0JZDEKCQk2CS4JNWIJPQljCS4JOWEJKAkpCgkJNgkuCWFhCT0JMjEKCQkzCTkxCTU3CSgJNgkuCWQxCSwJMmQJLgkyZAkpCToKCQkJYmEJKAknODQJPQknCSwJNgkuCWQxCS4JODIJLgk4NQkpCgkJCTk5CTdmCSgJJ2QxCWI1CWJlCWEJMmQJOGEnCSkKCQkJMwk3MwktCTczOgk4CS8JYTgKCQkJMwk5NAktCTk0OgkxYwkrCWQyCSsJY2YJKgljMAoJMzcJM2YJKAk2CSkJOgoJCTE0CT0JNzkJLgk2ZgkoCTYJLglkMQkuCTVlCSkKCQkjYmEoJzUyJyw1MikKCQkjYjEJPQljLjQ5KCkuNGIuYjEKCQlkMAk9CWMJLgk0OQkoCSkKCQkyMAk9CWQwCS4JM2QKCQk5OAk9CWQwCS4JNGIKCQk1Ngk9CWQwCS4JYzIKCQkzCTEyCS0JMTI6CTEzCgkJMwk0MwktCTQzOgkxYwkuCWUKCQkzCTE0CTljCTIxCToKCQkJYmEJKAknNTIJYmYnCSkKCQkJYWIKCQkzCTYJLglhYQk5YwkyMQk6CgkJCTJlCT0JMTQKCQk4Nwk6CgkJCTJlCT0JNgkuCWFhCgkJNgkuCWFhCT0JMTQKCQkzCTU5CS0JNTk6CWJkCgkJMwkzMQktCTMxOgljZgklCThmCSoJYmQJLwljZgklCWUJKwkyZgoJCTMJOTMJLQk5MzoJZDIJKglkNAkqCTVmCSUJZDIJKglkMgkqCTUKCQk0Ywk9CSgJMTQJLgljYgktCTJlCS4JY2IJKQkvCTU0CgkJNWQJPQkoCTE0CS4JOTIJLQkyZQkuCTkyCSkJLwk1NAoJCTZjCT0JKAkxNAkuCWNkCS0JMmUJLgljZAkpCS8JNTQKCQkzCTI2CS0JMjY6CWMwCS4JYTgJLQk4CSUJMmMJKwk4CgkJMwkzNAktCTM0OglhOAkqCTVmCgkJMwkzMQktCTMxOgk1CSsJMQkuCWMwCgkJMwk2OAktCTY4Ogk1ZgktCWQ0CS0JMQkvCTgJLQkxCSsJOGYKCQkyOQk9CTU2CS4JYjAJWwknYWQnCV0KCQk0NAk9CSgJZDAJLgk1MQkoCSkJLQk2CS4JZDEJLgk1ZQkpCS4JYWYKCQkzCTUwCS0JNTA6CWQ0CS0JMWMKCQliNAk9CTE0CS4JY2IJKwk0NAkqCTNhCS4JN2UJKAkzYQkuCTc3CSgJNGMJLwkyOQkpCSkKCQljMQk9CTE0CS4JOTIJKwk0NAkqCTNhCS4JN2UJKAkzYQkuCTc3CSgJNWQJLwkyOQkpCSkKCQk2Ygk9CTE0CS4JY2QJKwk0NAkqCTNhCS4JN2UJKAkzYQkuCTc3CSgJNmMJLwkyOQkpCSkKCQkzCTI4CS0JMjg6CTUKCQkzOAk9CTc5CS4JNmYJKAliNAksCWMxCSwJNmIJKQoJCTMJNDIJLQk0MjoJYzAJKwlkNgoJCTMJNzAJLQk3MDoJYTkJJQlhOQkuCWNmCSUJMQkqCTZhCSUJZQoJCTMJMjMJLQkyMzoJZDQJKwk1ZgoJCTMJNjgJLQk2ODoJMWUJLgllCS4JZDQKCQkzOAkuCTkyCSs9CTYJLglkMQkuCWM2CS4JOTAJWwknOWUnCV0JLgk5MgkrCTYJLglkMQkuCWM2CS4JYTUJWwknNjUnCV0JWwkwCV0JLgk5MgoJCTMJNDAJLQk0MDoJZQkuCTFlCS4JYTkJLgk4ZgoJCTMJMzMJLQkzMzoJMWMJKwk1CSUJZDQJLgkxMwktCTVmCgkJMwk2NgktCTY2OgkxYwktCTJmCSoJMmYJLgk4CS4JZDYKCQkyMAkuCTJhCSgJMzgJKQoJCWYJPQk2CS4JNDcJKAkpCgkJMwlmCTljCTIxCToKCQkJMwk5NgktCTk2OgkyYwklCWUJJQliZAoJCQlhYgoJCTYJLgk1Ygk9CWMJLgk5YQkoCSkKCQkyMAkuCTQ4CSgJMzgJLAlmCSkKCQkyMAkuCTM2CSgJKQoJCTMJNzgJLQk3ODoJYmQJLQkxYwkqCTEJKwk2YQkrCWQyCSsJZDIKCQkzCTExCS0JMTE6CWQyCS0JMQklCTEzCSUJZDIJLwkxZQktCTEKCTM3CTQ3CSgJNgkpCToKCQlmCT0JYwkuCTlhCSgJKQktCTYJLgk1YgoJCTMJZgk8CTYJLgk3YQk6CgkJCWFiCTIxCgkJODcJOgoJCQkzCWYJPgk2CS4JYmMJOgoJCQkJZgk9CTYJLgliYwoJCQlhYglmCgkJCTMJNzQJLQk3NDoJZDIJKgkyYwoJMzcJN2IJKAk2CSkJOgoJCTRmCT0JYwkuCWQxCSgJKQoJCWFiCTU3CSgJNGYJLAkyZAkuCTJkCSkJNWMJNGYJLgk2ZQkhPQk2CS4JZDEJLgk2ZQoJCTMJODAJLQk4MDoJYTgJKglkNAkvCWMwCgkzNwlhNgkoCTYJKQk6CgkJYWIJNgkuCTZlCgkJMwk5CS0JOToJMWMJKwllCSUJMWMJKwk4ZgkuCTgKCQkzCTMxCS0JMzE6CTZhCSsJYTgJKwlhOAkvCTUKCQkzCTI2CS0JMjY6CTJmCjg0CWM5CToKCTE5CT0JMjEKCTMJMTgJLQkxODoJNmEKCUAJMjUKCTM3CWIyCSgJMTkJKQk6CgkJYzkJLgliNwkoCSkKCQljOQkuCTE5CT0JMTkKCQlkMAk9CWMJLgk0OQkoCSkKCQlkMAkuCTMyCS4JODYJKAknNjcnCSkKCQlkMAkuCTNkCS4JNTUJPQlhZQoJCWM5CS4JM2YJKAkxOQkuCWE2CSgJKQkpCgkJMwkyOAktCTI4Ogk4CS0JY2YJLgljZgkrCTFlCS0JMmYJKwkyYwoJCTMJOTUJLQk5NToJMQklCWUJLgkyYwoJQAkyNQoJMzcJYjcJKAkpCToKCQkzCWM5CS4JMTkJOWMJMjEJOgoJCQlhYgoJCWQwCT0JYwkuCTQ5CSgJKQoJCWM5CS4JMTkJPQkyMQoJCWQwCS4JM2QJLgk1NQk9CWI5CgkJZDAJLgkzMgkuCTg2CSgJJ2E0JwkpCgkJMwkxNQktCTE1OgkxMwkvCTFjCS4JMWMJLQk4ZgoJQAkyNQoJMzcJYzQJKAkpCToKCQlhYgljOQkuCTE5CTljCTkxCTIxCgkJMwk1MwktCTUzOgljZgkrCTVmCSoJZQoJQAkyNQoJMzcJM2YJKAk2ZQkpCToKCQkzCWM5CS4JYzQJKAkpCTVjCWM5CS4JMTkJLglhNgkoCSkJPT0JNmUJOgoJCQljOQkuCTE5CS4JM2YJKAkpCgkJCWMJLgk4ZQkoCTU0CSwJYTAJKAljOQkuCTNmCSwJNmUJKQkpCgkJCTMJNjEJLQk2MToJOGYJKgk4CS8JMmYJLglkNAkuCTFlCgkJCTMJNjAJLQk2MDoJYTgJLwlhOAoJCQkzCTQ2CS0JNDY6CTFjCSoJOAktCTEJKgllCS0JYzAKCQkJMwk4MwktCTgzOgkyZgoJCQkzCTMxCS0JMzE6CTUJLQk4CS4JYzAJJQkxZQktCTJjCgkJCTMJNAktCTQ6CTUJLwkxMwkuCWQyCgkJCTMJNTgJLQk1ODoJOAkqCWQ0CS8JMWUJJQljMAktCWQ2CS8JZQozNwk3NQkoCTYJLAkxYgksCTNjCSwJNGEJLAkzZQk9CTIxCSkJOgoJMWEJPQliCS4JYzMKCTMJNDIJLQk0MjoJMWMJKwllCgkzCTc2CS0JNzY6CWMwCS0JMQoJMwkxYQkuCWM4CSgJYgkuCWI2CSwJM2MJKQk1YwkxYgk6CgkJMTYJPQljCS4JZDEJKAkpCgkJMwkxNgk5YwkyMQlkMwljOQkuCWM0CSgJKQk6CgkJCWM5CS4JYjcJKAkpCgkJCWFiCWEzCSgJNgksCTFiCSwJM2MJLAk0YQksCTNlCSkKCQljOQkuCWIyCSgJYTEJKAkxNgkpCSkKCQlhYgoJCTMJMzkJLQkzOToJY2YJLQk1CSoJMQklCTZhCSoJNQklCTUKCTMJMWEJLgljOAkoCWIJLgk4YwksCTNjCSkJNWMJMWIJOgoJCWM5CS4JYjcJKAkpCglhYglhMwkoCTYJLAkxYgksCTNjCSwJNGEJLAkzZQkpCgkzCTU5CS0JNTk6CWJkCSsJNWYJLQk2YQktCTVmCSsJOAkvCWQ2CjM3CWJiCSgJNgksCTFiCSwJM2MJLAk0YQksCTNlCT0JMjEJKQk6CgkxYQk9CWIJLgljMwoJMwk3MQktCTcxOgk4CSsJMTMJJQlkNAkrCWQ2CS0JY2YKCTMJODgJLQk4ODoJMWUJLQkxCSUJOAoJMwkxYQkuCWM4CSgJYgkuCWI2CSwJM2MJKQk1YwkxYgk6CgkJMTYJPQljCS4JZDEJKAkpCgkJMwkxNgk5YwkyMQk6CgkJCWM5CS4JYjcJKAkpCgkJCWFiCTMwCSgJNgksCTFiCSwJM2MJLAk0YQksCTNlCSkKCQljOQkuCWIyCSgJYTEJKAkxNgkpCSkKCQlhYgoJCTMJNwktCTc6CTEzCSoJMQklCWUJLgljZgoJMwkxYQkuCWM4CSgJYgkuCThjCSwJM2MJKQk1YwkxYgk6CgkJYzkJLgliNwkoCSkKCWFiCTMwCSgJNgksCTFiCSwJM2MJLAk0YQksCTNlCSkKCTMJNDUJLQk0NToJZDQJKgk1CSUJYmQJKwlkNgktCTFjCgkzCTE3CS0JMTc6CWNmCgkzCTYyCS0JNjI6CWJkCSoJMWUKCTMJMjYJLQkyNjoJZDIJLgljMAoJMwk2OAktCTY4OgkxCgkzCTM1CS0JMzU6CTEJLQlkMgkvCWE5CS8JMWUKCTMJMjQJLQkyNDoJMTMJLQkxMwkvCTUJLQlkNgphMwk9CWNlCS4JMWQKMzAJPQkyMgkuCTFkCjMJNjkJLQk2OToJZQkuCWMwCSsJMWMJLwlhOQktCWUKY2UJLgkxZAk9CTc1CjIyCS4JMWQJPQliYgozCTYzCS0JNjM6CTgJJQllCSoJZQkqCTEJLwlkNgozCTc0CS0JNzQ6CTU=')))(lambda a, b: b[int('0x' + a.group(1), 16)], '0|o0OoOoOO00|2|if|4|ooO0OO000o|self|7|OOooOOo|9|a|CommandMapping|BigWorld|import|I1IiI|IiI1i11iii1|10|11|12|o0oOoO00o|O0oOO0o0|15|oOooOOo00Oo0O|17|18|autoaim|IIIii1II1II|isDown|OoOO|handleKeyEvent|OOOo0|SERVER_TICK_LENGTH|Oo0oO0oo0oO00|None|SniperControlMode|23|24|staticmethod|26|27|28|IiiIII111ii|_VehicleGunRotator__updateShotPointOnServer|projectile_trajectory|Iii1I1|Vehicle|IIii11I1|iiiii|iI1I111Ii111i|31|soundNotifications|33|34|35|_VehicleGunRotator__updateGunMarker|def|iii11iII|39|math|SHELL_TRAJECTORY_EPSILON_CLIENT|key|gunRotator|event|update|40|collideVehiclesAndStaticScene|42|43|i1iIIi1|45|46|__getTimeDiff|_VehicleGunRotator__rotate|player|mods|inputHandler|o0o0Oo0oooo0|collideDynamicAndStatic|__ROTATION_TICK_LENGTH|oOOo0oo|50|getOwnVehiclePosition|shotPos|53|OO0o|clientMode|II1Ii1iI1i|isinstance|58|59|AvatarInputHandler|__time|and|oO0O0o0o0|position|iIiI|60|61|62|63|64|turretPositions|66|target_captured|68|69|Oo|OooO0OO|i1iIIII|ModelHitTester|id|Vector3|70|71|getShotAngles|73|74|ii11i1|76|asin|78|Math|__INSUFFICIENT_TIME_DIFF|isTankMarked|debug_utils|functools|tan|TypeError|80|81|__class__|83|class|__name__|play|else|88|uuid|instance|__init__|CMD_CM_LOCK_TARGET_OFF|segmentMayHitVehicle|callback|ii1I|chassis|not|y|93|94|95|96|atan2|i111I|raise|time|control_modes|is|BattleReplay|hullPosition|fmod|partial|ii11i|ProjectileMover|O00oO|target_unlocked|hull|getId|sqrt|ii11ii1ii|iIiiiI1IiI1I1|__targetLastShotPoint|return|uuid4|speed|False|length|shot|ctrl|add|constants|oo0Ooo0|must|CMD_CM_LOCK_TARGET|remove|from|True|LOG_NOTE|I1|__MAX_TIME_DIFF|OO0O0O|be|none|o00O0oo|I1I11I1I1I|vehicleTypeDescriptor|g_instance|hasAutoAim|atan|typeDescriptor|computeProjectileTrajectory|isFired|IiiI11Iiiii|cos|x|sin|z|ArcadeControlMode|o0000oOoOoO0o|i1ii1iIII|target|OoOO0ooOOoo0O|or|i11iIiiIii|pi|Ooo00oOo00o|02'.split('|')) 

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites

А мои моды не безызвестны, как посмотрю....
Это мои первые попытки изучения питона и танков. Очень интересно где ты раздобыл это ;)

З.Ы. Обфускация макса не менее смешная, да.

Edited by mercger

Share this post


Link to post

Short link
Share on other sites

facell, описанные вами способы увеличат время декомпиляции скрипта на 15-20 минут, если только не начинать пробивать лбом стену.

Все верно, print того что __import__() и getattr() передается вывел и вопрос закрыт. Это лишь пример как скрыть название импортов и методов от явного указания в коде или в целом в namespace *.pyc файла.

добавим в код функцию для их корректировки....  но об этом в следующий раз если кому то интересно

куда пропал?..

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