Как узнать исходный код программы exe python

Хола, хацкер, хотел когда-то узнать, что скрывается за скомпилированным приложением? Сегодня мы рассмотрим способ реверса скомпилированного (pyinstaller’ом) exe-шника. Поехали!

Воруем чужой код. Реверс инжиниринг Python.

Что нам понадобится?

  • PyInstaller Extractor.
  • Uncompyle6.
  • HxD / Или другой HEX редактор.

Для начала скачиваем скрипт Extractor. После устанавливаем Uncompyle6 при помощи pip’a:

pip install uncompyle6
Установка UnCompyle6.

Теперь мы можем приступить к реверсу.

Мне в руки попал РАТника на питоне, скомпилированного pyinstaller’ом. Собственно, порядок действий не будет отличаться от любого другого файла. Приступим.

Сначала нам нужно получить все файлы/библиотеки/dll из исполняемого файла. Для этого нам нужен pyExtractor. Запускаем скрипт следующим образом:

python pyinstxtractor.py имяфайла.exe
Пример успешного выполнения.

Рядом с exe-шником создалась папка:

Тут, в моём случае мне понадобится файл BlackSec, в ином это будет имя файла без расширения. (К примеру ваш файл назывался build.exe, после Extractor’a конечный файл будет просто build).

Секрет exe файла как узнать!

Файл BlackSec — pyc без «магического» числа.

pyc — Это скомпилированный байт-код. Если вы импортируете модуль, python построит файл *.pyc , который содержит байт-код, чтобы упростить импорт

Что такое «магическое» число говорить не буду, но вот ссылочка на Вику, она вам всё расскажет.

Нам нужно получить pyc файл для получения кода. Для этого запускаем HEX редактор и переносим туда файл без расширения, в моём случае это BlackSec:

Сейчас нам нужно присвоить нашему файлу магическое число, его мы возьмём из соседних файлов в папке PYZ-00.pyz_extracted. Копируем любой файл из папки, (я всегда использую __future__.pyc) в HEX редактор:

Теперь нам нужно скопировать байты, в которых содержится магическое число, чтобы всё прошло успешно, нужно чтобы первая строка двух файлов (BlackSec Сохранить как. И сохраняем с расширением .pyc:

По сути всё практически готово, осталось декомпилировать .pyc файл при помощи uncompyle, для этого в cmd запускаем команду:

uncompyle6 -o source.py ИмяВашегоФайла.pyc

Всё, возле нашего pyc файла появился файл содержащий код exe-шника.

Mission Passed!

Заключение.

Как видишь, хацкер, python тоже поддаётся декомпиляции. В сторону защиты кода следует использовать обфускаторы/протекторы, для питона порекомендую pyArmor, он превращает код в «непонятный» набор символов.

Читайте также:
Как называется программа для программирования на питоне

На этом статья заканчивается, до связи, хацкер.

Источник: teletype.in

Как я могу получить исходный код функции Python?

Я могу получить имя функции, используя foo.func_name . Как я могу программно получить исходный код, как я набрал выше?

Rafał Dowgird 09 янв. 2009, в 10:45
Поделиться

How to get Source code from .exe

Я не понимаю ваш вопрос. Не могли бы вы уточнить предложение «как я могу получить» и решить путаницу с «func_name» и «somemethod»? Спасибо!

guerda 09 янв. 2009, в 09:10
S.Lott 09 янв. 2009, в 11:13
Обратите внимание, что в Python 3 вы можете получить имя функции, используя foo.__name__
MikeyE 29 апр. 2018, в 07:35
Вы можете получить и много других вещей .
not2qubit 21 окт.

2018, в 15:55
Возможный дубликат Как вы заставляете Python записывать код функции, имеющейся в памяти?
recnac 28 апр. 2019, в 01:40
Показать ещё 3 комментария

Поделиться:

13 ответов

Если функция принадлежит исходному файлу, доступному в файловой системе, то для inspect.getsource(foo) может потребоваться inspect.getsource(foo) :

Если foo определяется как:

def foo(arg1,arg2): #do something with args a = arg1 + arg2 return a
import inspect lines = inspect.getsource(foo) print(lines)
def foo(arg1,arg2): #do something with args a = arg1 + arg2 return a

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

Rafał Dowgird 09 янв. 2009, в 10:08
Поделиться

Возвращает кортеж; tuple [0] — это список строк, представляющих строки исходного кода, а tuple [1] — это номер строки в контексте выполнения, где он был запущен. В IPython; это номер строки в ячейке, а не весь блокнот

The Red Pea 23 сен. 2014, в 05:32

Этот ответ явно не упоминает об этом, но inspect.getsource (foo) возвращает источник в одной строке вместо кортежа, где tuple [0] — это список строк. getsource будет более полезен, если вам нужно заглянуть в реп

whaley 23 авг. 2015, в 13:49
это не работает, например, с функцией len . Где я могу найти исходный код для функции len ?
oaklander114 15 сен. 2016, в 06:06
Кажется, не работает в режиме ожидания.
ctrl-alt-delor 21 нояб. 2017, в 12:59
или inspect.getsourcelines(foo)
Sławomir Lenart 17 окт. 2018, в 10:59

Читайте также:
Не устанавливаются программы на Макбук

Показать ещё 3 комментария

В проверять модуль есть методы для извлечения исходного кода из объектов python. По-видимому, он работает только в том случае, если источник находится в файле. Если бы у вас было это, я думаю, вам не нужно было бы получать источник из объекта.

runeh 09 янв. 2009, в 09:44
Поделиться

Да, похоже, он работает только для объектов, определенных в файле. Не для тех, которые определены в переводчике.

sastanin 09 янв. 2009, в 09:49
к моему удивлению, это работает и в ноутбуках Ipython / Jupyter
Dr. Goulu 22 янв. 2016, в 11:51

Я попытался использовать inspect в интерпретаторе python 3.5.3 . import inspect + inspect.getsource(foo) работал нормально.

André C. Andersen 07 май 2017, в 18:52
somebody 08 авг. 2017, в 01:08
Показать ещё 2 комментария

dis является вашим другом, если исходный код недоступен:

>>> import dis >>> def foo(arg1,arg2): . #do something with args . a = arg1 + arg2 . return a . >>> dis.dis(foo) 3 0 LOAD_FAST 0 (arg1) 3 LOAD_FAST 1 (arg2) 6 BINARY_ADD 7 STORE_FAST 2 (a) 4 10 LOAD_FAST 2 (a) 13 RETURN_VALUE
schlamar 28 июнь 2013, в 06:36
Поделиться
Выдает ошибку типа для встроенных функций.
Noumenon 25 авг. 2015, в 16:47
schlamar 26 авг.

2015, в 11:57
удачи в отображении этой информации в виде QToolTip ();)
Tcll 31 авг. 2015, в 03:57
Показать ещё 1 комментарий

Если вы используете IPython, вам нужно ввести «foo??»

In [19]: foo?? Signature: foo(arg1, arg2) Source: def foo(arg1,arg2): #do something with args a = arg1 + arg2 return a File: ~/Desktop/ Type: function
prashanth 09 май 2016, в 09:12
Поделиться

Очень полезно в записной книжке IPython и Jupyter, если / когда вы случайно удалили несколько ячеек, содержащих функции, которые вы только что потратили на создание и тестирование .

AGS 28 июнь 2016, в 13:22

Хотя я обычно соглашаюсь с тем, что inspect является хорошим ответом, я бы не согласился с тем, что вы не можете получить исходный код объектов, определенных в интерпретаторе. Если вы используете dill.source.getsource из dill , вы можете получить источник функций и лямбда, даже если они определены в интерактивном режиме. Он также может получить код для связанных или несвязанных методов и функций класса, определенных в карри. однако вы не сможете скомпилировать этот код без прилагаемого объектного кода.

Читайте также:
Как установить программу майкрософт паблишер

>>> from dill.source import getsource >>> >>> def add(x,y): . return x+y . >>> squared = lambda x:x**2 >>> >>> print getsource(add) def add(x,y): return x+y >>> print getsource(squared) squared = lambda x:x**2 >>> >>> class Foo(object): . def bar(self, x): . return x*x+x . >>> f = Foo() >>> >>> print getsource(f.bar) def bar(self, x): return x*x+x >>>
Mike McKerns 24 янв. 2014, в 19:35
Поделиться
похоже, не работает с функциями, определенными внутри exec
Ant6n 04 март 2014, в 00:55
Mike McKerns 04 март 2014, в 03:04

Это кажется очень интересным. Можно ли использовать dill для ответа на этот вопрос: stackoverflow.com/questions/13827543/…

ArtOfWarfare 20 фев. 2015, в 16:34
Mike McKerns 20 фев. 2015, в 18:08

Однако это работает для глобалов: >>> a = 10; print( [key for key, val in globals().items() if val is a][0] )

Mike McKerns 20 фев. 2015, в 18:08
ArtOfWarfare 20 фев. 2015, в 18:24
Mike McKerns 20 фев.

2015, в 19:36

Источник: overcoder.net

Как я могу увидеть исходный код встроенных методов Python? [Дубликат]

Для модулей, классов, функций и нескольких других объектов вы можете использовать inspect.getfile или inspect.getsourcefile . Однако для встроенных объектов и методов это приведет к TypeError . Как полагают C0deH4cker, встроенные объекты и методы реализованы на C, поэтому вам нужно будет просмотреть исходный код C. isdigit — метод встроенного строкового объекта, который реализован в файле stringobject.c в каталоге Objects исходного кода Python. Этот метод isdigits реализуется из строки 3392 этого файла. См. Также мой ответ здесь на аналогичный, но более общий вопрос.

ответ дан Community 17 August 2018 в 18:48

Метод isdigit() , о котором вы говорите, является встроенным методом встроенного типа данных. Смысл, источник этого метода написан на C, а не на Python. Если вы действительно хотите увидеть исходный код, я предлагаю вам перейти на http://python.org и загрузить исходный код Python.

ответ дан C0deH4cker 17 August 2018 в 18:48

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru