mercger 4 #166305 Posted April 1, 2014 Ну это лучше чем загрузчик с выходом на маршал в конце алгоритма. Неа, дампнул без напряга. Не ковырял я твои распаковщики, лень было :) Quote Share this post Link to post Short link Share on other sites
if_then_else 1 #166433 Posted April 2, 2014 Да, всё верно сила тут в двух вещах - с одной стороны, это качественная базовая обфускация скрипта, когда полностью и на всегда теряется часть первоначальной информации, замена имен переменных самый яркий пример... а с другой стороны, негласная порука не делать готовые декрипторы и не сливать их в паблик. Базовая обфускация с потерей информации - в 1000 раз эффективнее любого суперсложного, но 100%-реверсируемого алгоритма :)))) Не согласен, переименовать переменные в удобоваримый вид в нормальном IDE - пара кликов мышью. 50 переменных - 100 кликов, не мало конечно, но совсем несложно. 1 1 Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #166434 Posted April 2, 2014 Не согласен, переименовать переменные в удобоваримый вид в нормальном IDE - пара кликов мышью. 50 переменных - 100 кликов, не мало конечно, но совсем несложно. Угу, i0i0i0iii переименовали в variable1 и что, это как то поможет вам восстановить или понять логику работу исходного кода? Нет конечно. Вот об этом и речь. Quote Share this post Link to post Short link Share on other sites
if_then_else 1 #166437 Posted April 2, 2014 Угу, i0i0i0iii переименовали в variable1 и что, это как то поможет вам восстановить или понять логику работу исходного кода? Нет конечно. Вот об этом и речь. Дык имена импортированных функций и классов все равно останутся, поэтому будет например что-нибудь типа i0i0i0iii=PlayerAvatar.onVehicleLeaveWorld, что согласись дает полное представление о смысле переменной. 1 1 Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #166438 Posted April 2, 2014 (edited) Дык имена импортированных функций и классов все равно останутся, поэтому будет например что-нибудь типа i0i0i0iii=PlayerAvatar.onVehicleLeaveWorld, что согласись дает полное представление о смысле переменной. Вы наверно не поняли сути :)))) Вы сейчас говорите о том, что разбирая код можно его осмыслить и всем переменным дать осмысленные имена. Да это так. Но кто поставил вас в такую ситуацию, кто сделал так что вам теперь нужно тратить время и силы, вникать в код и переписывать имена? :)))) Это сделал обфускатор. Он убил информацию о смысле и роли каждой переменной. И тем самым сделал так что 100% реверс стал не возможен.... а вот алгоритмы шифрования и скрамблирования, такого не делают, у них можно сделать 100% реверс и получить тот самый исходный код, который был у разработчика. Edited April 2, 2014 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites
mercger 4 #166476 Posted April 2, 2014 а вот алгоритмы шифрования и скрамблирования, такого не делают, у них можно сделать 100% реверс и получить тот самый исходный код, который был у разработчика. Не надо быть настолько категоричным ;) Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #166484 Posted April 2, 2014 (edited) Не надо быть настолько категоричным ;) Да чего там, либо 100% реверс возможен, либо нет, а как там обозвать, не суть важно. Терминология весьма расплывчатая. Та же обфускация, в общем смысле - "запутывание", этак всё что угодно можно обфускацией назвать. Или вот - разница между шифрованием и кодированием, еще та тема для флуда :)))) Edited April 2, 2014 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites
if_then_else 1 #166533 Posted April 3, 2014 Вы наверно не поняли сути :)))) Вы сейчас говорите о том, что разбирая код можно его осмыслить и всем переменным дать осмысленные имена. Да это так. Но кто поставил вас в такую ситуацию, кто сделал так что вам теперь нужно тратить время и силы, вникать в код и переписывать имена? :)))) Это сделал обфускатор. Он убил информацию о смысле и роли каждой переменной. И тем самым сделал так что 100% реверс стал не возможен.... а вот алгоритмы шифрования и скрамблирования, такого не делают, у них можно сделать 100% реверс и получить тот самый исходный код, который был у разработчика. Я не отрицаю, что деобфускация это дополнительная работа для потенциального "взломщика". Просто не надо переоценивать сложность этого процесса. Так как мы не можем прогнать через обфускатор весь исходный код, приведение кода в читаемый вид - задача не столь сложная. И на мой взгляд если человек может вытащить исходники из винегрета с "ложным" кодом и шифрованием, то привести переменные к читаемому виду сможет без проблем. 1 1 Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #166549 Posted April 3, 2014 (edited) Я не отрицаю, что деобфускация это дополнительная работа для потенциального "взломщика". Просто не надо переоценивать сложность этого процесса. Так как мы не можем прогнать через обфускатор весь исходный код, приведение кода в читаемый вид - задача не столь сложная. И на мой взгляд если человек может вытащить исходники из винегрета с "ложным" кодом и шифрованием, то привести переменные к читаемому виду сможет без проблем. Сложность процесса на прямую зависит от самой обфускации. Замена переменных - это всего лишь капля в море. А вот вершиной такого подхода, является например виртуализация исходного кода в инструкции псевдо-машины, вернуть такой код обратно к исходному практически нельзя. Только написать заново, интерпретировав псевдо-алгоритм.... А это по объему работы почти тоже самое что самому написать исходную программу. Или вот мегабородатый пример - компиляции программы из ЯП в низкоуровневый код или в ассм-код. Обратное восстановление только частично, а дальше пишем заново ручками. Видите ли в чем дело. Я выше писал про два подхода, один - 100% реверс и второй, когда 100% не возможен. Так вот первый подход не требует от человека ни каких усилий по доработке исходного кода и как правило его взлом можно всегда автоматизировать путем написания декриптора и тем самым полностью убить на 0% защиту всех объектов к которым она применялась.... а вот второй подход, он гораздо коварнее, здесь из-за потери данных в исходном коде, потребуется выполнить ручную работу по его восстановлению, при чем эта работа как не старайся её автоматизировать всегда будет требовать участия человека, а значит каждый объект защищенный таким способом будет требовать ручного довосстановления. Следовательно взлом одного объекта с такой защиты на убивает защиту до 0% на остальных объектах. И вот если говорить о питоне и модах, то первый подход, если его применять в голом виде - он всегда в проигрыше. Если защита в процессе работы восстанавливает 100% исходный программы, то его всегда можно вытащить тем же дампингом в памяти процесса. А в случае если был задействован и второй подход, то вытаскиваемый из памяти код - это не исходный код программы, а псевдо-код. У Мерца весьма забавные и хитрые ребусы сделаны, но все они относятся к первому подходу, они 100% реверсируемые. Чего далеко ходить страницу назад была же ссылка на руборд, где человек ни фига не разбирающийся в БигВорлде и в модописании под ВОТ-клиент, сделал реверс защиты и получил 100%-исходный код..... ну и понято шнырь, который просил снять защиту, хрюкнул и пошёл раздавать скрипт как он был. А вот по второму подходу честно говоря я мало видел наработок. В основном встречаются весьма примитивные обработки типа - замены переменных, внедрение ни когда не исполняемого фейк-кода и всякое баловство с пробельными символами, ну и понятно, что они не создают шибко большую проблему. Можно весьма быстро подчистить код... но опять же вы бы видели с какими круглыми глазами носятся шныри когда получают такой исходник, "там же кракозябры какие-то, это же значит что зашифровано? как сделать чтоб нормально было?", EPIC короче :)))) Ну и вот хотелось бы увидеть что-то новенькое в этом направлении, при этом думаю вполне ясно, что разработать алгоритм обфускации из первого категории всегда несколько проще чем из второй. Edited April 3, 2014 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites
mercger 4 #167040 Posted April 6, 2014 (edited) Ну и вот хотелось бы увидеть что-то новенькое в этом направлении, при этом думаю вполне ясно, что разработать алгоритм обфускации из первого категории всегда несколько проще чем из второй. Вы вроде как не глупы, и должны понимать (знать) что код компилируется в более или менее оптимизированном виде, условно говоря, "эффективном". Под "эффективный" код так или иначе существуют взаимооднозначные логические конструкции, что собственно и используют декомпиляторы. По сему "новенькое" будет как раз фантазиями на тему "как написать очень тормозной код" :D Можно, например, попросить индуса переписать твой высокоуровневый код в нативный. Как думаете, я гений ? ^_^ Edited April 6, 2014 by mercger Quote Share this post Link to post Short link Share on other sites
jeroohn 285 #167043 Posted April 6, 2014 Вы вроде как не глупы, и должны понимать (знать) что код компилируется в более или менее оптимизированном виде, условно говоря, "эффективном". Под "эффективный" код так или иначе существуют взаимооднозначные логические конструкции, что собственно и используют декомпиляторы. По сему "новенькое" будет как раз фантазиями на тему "как написать очень тормозной код" :D Можно, например, попросить индуса переписать твой высокоуровневый код в нативный. Как думаете, я гений ? ^_^ Кстати, когда собирал твой скрипт из этой темы, заметил некоторые не оптимизированные веши. Скрипт компилтлся каким питоном? 2.7.3? Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #167055 Posted April 6, 2014 Вы вроде как не глупы, и должны понимать (знать) что код компилируется в более или менее оптимизированном виде, условно говоря, "эффективном". Под "эффективный" код так или иначе существуют взаимооднозначные логические конструкции, что собственно и используют декомпиляторы. По сему "новенькое" будет как раз фантазиями на тему "как написать очень тормозной код" :D Можно, например, попросить индуса переписать твой высокоуровневый код в нативный. Как думаете, я гений ? ^_^ Для гения вы как-то странно соображаете. Мы тут пишем об обфускации кода, а вы зачем-то написали про оптимизацию... Если вы хотите сделать оптимизацию кода, то первое что надо предпринять это отказаться от какой-либо обфускации. Так что к чему был написан ваш пост, мне не понятно... наверно потому что я не гений :))))) Любая защита - это избыточный и ненужный код с точки зрения исходного алгоритма. Так что бессмысленно говорить тут об оптимизации. Quote Share this post Link to post Short link Share on other sites
mercger 4 #167067 Posted April 6, 2014 Кстати, когда собирал твой скрипт из этой темы, заметил некоторые не оптимизированные веши. Скрипт компилтлся каким питоном? 2.7.3? 2.7.x Точней не помню :(Ты бы еще про 2.6 вспомнил :)) Но питон вообще не очень оптимально компилится, видимо потому что заморачиваться особо смысла нет, ибо ВМ питона тормозная до жути. Для гения вы как-то странно соображаете. Мы тут пишем об обфускации кода, а вы зачем-то написали про оптимизацию... Вы зачем прикидываетесь не умным :( Quote Share this post Link to post Short link Share on other sites
fecell 125 #167550 Posted April 9, 2014 (edited) Дык имена импортированных функций и классов все равно останутся, поэтому будет например что-нибудь типа 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 April 11, 2014 by fecell Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #167935 Posted April 11, 2014 @fecell, думаю такой вот вариант будет получше и не надо тратить процессорное время и раздувать код на "явное" шифрование имён в коде: iI1Ii11111iIi = __import__(sys._getframe(0).f_code.co_consts[3]) i1i1II = getattr(iI1Ii11111iIi, sys._getframe(0).f_code.co_consts[4]) Quote Share this post Link to post Short link Share on other sites
fecell 125 #167990 Posted April 11, 2014 (edited) @fecell, думаю такой вот вариант будет получше и не надо тратить процессорное время и раздувать код на "явное" шифрование имён в коде: Тоже не плохо. upd: шифровать все равно придется, чтобы скрыть namespace. Edited April 13, 2014 by fecell Quote Share this post Link to post Short link Share on other sites
mercger 4 #168234 Posted April 12, 2014 facell, описанные вами способы увеличат время декомпиляции скрипта на 15-20 минут, если только не начинать пробивать лбом стену. Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #168303 Posted April 12, 2014 (edited) В закромах нашел мод с обфускацией в кавычках, кто автор не знаю, аналогична по характеру алгоритму 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 April 12, 2014 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites
mercger 4 #168307 Posted April 12, 2014 (edited) А мои моды не безызвестны, как посмотрю....Это мои первые попытки изучения питона и танков. Очень интересно где ты раздобыл это ;)З.Ы. Обфускация макса не менее смешная, да. Edited April 12, 2014 by mercger Quote Share this post Link to post Short link Share on other sites
fecell 125 #168322 Posted April 13, 2014 facell, описанные вами способы увеличат время декомпиляции скрипта на 15-20 минут, если только не начинать пробивать лбом стену. Все верно, print того что __import__() и getattr() передается вывел и вопрос закрыт. Это лишь пример как скрыть название импортов и методов от явного указания в коде или в целом в namespace *.pyc файла. добавим в код функцию для их корректировки.... но об этом в следующий раз если кому то интересно куда пропал?.. Quote Share this post Link to post Short link Share on other sites