2016-01-17 4 views
0

Один из наших сотрудников создал приложение python, которое он обманул, а затем закодировал base64. В настоящее время сотрудник приостановлен после других действий и не будет декомпилировать или предоставить базу кода. HR сортируются.Декомпилировать и деформировать файлы python

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

Он запутан с использованием https://github.com/lhr0909/PythonObfuscator (я нашел его историю команд), а затем закодировал base64.

+3

Базовое 64 декодирование тривиально, деобфускация может не выполняться (например, разумные имена переменных не могут быть автоматизированы). Просто вернитесь к более ранней версии (и если вы не использовали исходный контроль ...) Если есть «другие действия» *, почему это имеет значение? – jonrsharpe

+0

'python -m trace --trace script.py' должен предоставить вам все вызовы, выполняемые скриптами. То, что вы делаете, - это судебное доказательство, которое я предполагаю, и это грязная работа. Есть некоторые инструменты для устранения обфускации, но они редко бывают полными. – Torxed

+1

Вот почему * некоторые люди используют системы контроля версий ... – bereal

ответ

8

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

from random import randrange 
print([[randrange(n) for _ in range(n)] for _ in range(n)]) 

, который генерирует:

exec("import re;import base64");exec((lambda p,y:(lambda o,b,f:re.sub(o,b,f))(r"([0-9a-f]+)",lambda m:p(m,y),base64.b64decode("NyA0IDMgMAo1KFtbMCg4KSAyIDkgNiAxKDgpXSAyIDkgNiAxKDgpXSk=")))(lambda a,b:b[int("0x"+a.group(1),16)],"randrange|range|for|import|random|print|in|from|n|_".split("|"))) 

Замена второго exec с print:

exec("import re;import base64");print((lambda p,y:(lambda o,b,f:re.sub(o,b,f))(r"([0-9a-f]+)",lambda m:p(m,y),base64.b64decode("NyA0IDMgMAo1KFtbMCg4KSAyIDkgNiAxKDgpXSAyIDkgNiAxKDgpXSk=")))(lambda a,b:b[int("0x"+a.group(1),16)],"randrange|range|for|import|random|print|in|from|n|_".split("|"))) 
           ^^^^^ 

Запуск этого сейчас показывает:

from random import randrange 
print([[randrange(n) for _ in range(n)] for _ in range(n)]) 
+0

Привет @Achampion, спасибо за ваш ответ. Я запустил это до сих пор .. Я могу декодировать base64, но тогда код запутался, будет ли такое декодирование тоже? –

+0

@Carl см. Вопрос, который я связал выше; это просто найти и заменить шестнадцатеричные индексы – jonrsharpe

+0

@Carl obfuscator кодирует в base64, если это единственный base64, о котором вы говорите, тогда да, он его декодирует. – AChampion