C/c++ из python (c api)

Автодокументирование кода

Для того, чтобы облегчить написание документации и улучшить ее в целом, существуют различные Python-пакеты. Один из них – pyment.

Pyment работает следующим образом:

  1. Анализирует один или несколько скриптов.
  2. Получает существующие строки документации.
  3. Генерирует отформатированные строки документации со всеми параметрами, значениями по умолчанию и т.д.
  4. Далее вы можете применить сгенерированные строки к своим файлам.

Этот инструмент особенно полезен когда код плохо задокументирован, или когда документация вовсе отсутствует. Также pyment будет полезен в команде разработчиков для форматирования документации в едином стиле.

Установка:

Использование:

Для большинства IDE также существуют плагины, помогающие документировать код:

  • AutoDocstring – для VS Code.
  • Auto​Docstring – для SublimeText.
  • Python DocBlock Package – для Atom.
  • Autodoc – для PyCharm.

В PyCharm существует встроенный функционал добавления документации к коду. Для этого нужно:

  1. Переместить курсор под объявление функции.
  2. Написать тройные кавычки «»» и нажмите «Enter».

Твоя собственная функция!

Помнишь функции, такие как , которые можно использовать в Python? Тогда у нас есть хорошая новость — сейчас ты научишься писать свои собственные функции!

Функция — это последовательность инструкций, которые должен выполнить Python. Каждая функция в Python начинается с ключевого слова , имеет свое имя и параметры. Давай начнем с простого примера. Замени код в python_intro.py на следующий:

python_intro.py

Отлично, наша первая функция готова!

Ты можешь задаться вопросом, почему мы написали имя функции в конце файла. Причина в том, что Python читает и исполняет код из файла сверху вниз. Поэтому для использования нашей функции мы должны вызвать её в конце файла.

Давай запустим и посмотрим, что произойдет:

command-line

Примечание: если это не сработало, не поддавайся панике! Вывод командной строки поможет тебе понять, почему так произошло:

  • Если ты получила ошибку , то, возможно, ты что-то неправильно ввела, поэтому проверь, что ты использовала одно и то же имя при создании функции в строке и при её вызове в строке .
  • Если ты получила ошибку , проверь, что обе строки с вызовом начинаются с одинакового количества проблелов: python хочет, чтобы весь код внутри функции был аккуратно выровнен.
  • Если при запуске команда не вывела вообще ничего, проверь, чтобы в начале последней строки не было отступа — если он есть, эта строка тоже становится частью функции, и функция никогда не запустится.

Давай напишем нашу первую функцию с параметрами. Мы будем использовать предыдущий пример — функцию, которая пишет ‘hi’ и имя пользователя:

python_intro.py

Как ты можешь заметить, мы передали нашей функции параметр :

python_intro.py

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

command-line

Упс, ошибка. К счастью, Python выдает довольно подробное сообщение об ошибке. Оно говорит нам, что функция (которую мы определили) имеет один обязательный аргумент (), и мы забыли передать его при вызове функции. Давай исправим это в конце файла:

python_intro.py

И запустим ещё раз:

command-line

А если мы поменяем имя?

python_intro.py

И повторим:

command-line

Теперь, как ты думаешь, что произойдет, если ты наберешь другое имя? (Не Ola или Sonja) Попробуй сама и проверь, была ли ты права. Результат должен быть таким:

command-line

Шикарно, верно? Так тебе не придется повторяться каждый раз, когда ты захочешь изменить имя. И это именно та причина, для которой нам и нужны функции — ты никогда не захочешь повторять свой код!

Давай попробуем что-то похитрее — существует немало имён, и писать условие для каждого будет тяжело, правда?

python_intro.py

Давай выполним этот код:

command-line

Поздравляем! Ты только что научилась писать свои собственные функции 🙂

Комментарии

Комментариями — это строки, начинающиеся с символа . Ты можешь написать всё, что тебе заблагорассудится, после символа , и Python не обратит на это внимания. Комментарии могут помочь другим людям быстрее понять твой код.

Давай посмотрим, как они выглядят:

python_intro.py

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

Подведём итог

В последних трёх упражнениях ты познакомилась с:

  • сравнением — в Python ты можешь сравнивать объекты друг с другом при помощи , , , , и операторов , ;
  • Boolean — типом объекта, который может иметь только два значения: или ;
  • сохранением файлов — хранение кода в файлах позволяет выполнять длинные программы;
  • if…elif…else — условными операторами, которые позволяют выполнять код только при определенных условиях;
  • комментариями — строками, которые Python не запускает и которые позволяют документировать твой код.

Пришло время для последней части этой главы!

Introduction

There are many ways to gain control over a compromised system, a common way is to gain interactive shell access, which enables you to try to gain full control of the operating system. However, most basic firewalls blocks direct remote connections. One of the methods to bypass this, is to use reverse shells.

A reverse shell is a program that executes local cmd.exe (for Windows) or bash/zsh (for Unix-Like) commands and sends the output to a remote machine. With a reverse shell, the target machine initiates the connection to the attacker machine, and the attacker’s machine listens for incoming connections on a specified port, this will bypass firewalls.

Do you want to implement such code in Python ? Let’s do it!

The basic idea is that the attacker’s machine will keep listening for connections, once a client (or target machine) connects, the server will send shell commands to the target machine and expects output results.

Related: How to Use Hash Algorithms in Python using hashlib.

Completion

Completion is a very interesting feature: when the user presses the TAB key, the interpreter will try to complete the command or propose several alternatives. Completion will be available only if the computer supports the readline module. You can disable completion by passing the None value to the completekey attribute of the Cmd class constructor.

The interpreter is able to process completion for commands names, but for commands arguments you will have to help it. For the command xxx, this is done by defining a complete_xxx method. For example, if you have defined a color command, the completion method for this command could be:

_AVAILABLE_COLORS = ('blue', 'green', 'yellow', 'red', 'black')
def complete_color(self, text, line, begidx, endidx):
    return 

The complete_xxx method takes four arguments:

  • text is the string we are matching against, all returned matches must begin with it

  • line is is the current input line

  • begidx is the beginning index in the line of the text being matched

  • endidx is the end index in the line of the text being matched

It should return a list (possibly empty) of strings representing the possible completions. The arguments begidx and endidx are useful when completion depends on the position of the argument.

Доступ к интерактивной консоли

Доступ к интерактивной консоли Python можно получить с любого локального компьютера или сервера, на котором установлен Python.

Для входа в интерактивную консоль Python используйте команду:

Если вы настроили среду разработки, вы можете получить доступ к консоли внутри этой среды.  Сначала запустите среду:

Затем откройте консоль:

  • Настройка локальной среды разработки для Python 3 в Ubuntu 16.04
  • Установка Python 3 и настройка среды разработки на сервере Ubuntu 16.04

В этом случае по умолчанию используется версия Python 3.5.2, которая отображается на выходе вместе с уведомлением об авторских правах и командами для дополнительной информации:

Поле для ввода следующей команды – три знака больше:

Вы можете указать определенную версию Python, добавив номер версии в команду без пробелов:

Вывод сообщает, что теперь будет использоваться версия Python 2.7.12. Если бы она была версией Python по умолчанию, открыть её интерактивную консоль можно было бы с помощью команды python2.

Чтобы вызвать интерактивную консоль версии Python 3 по умолчанию, нужно ввести:

Также консоль этой версии можно вызвать с помощью команды:

Add _io.WindowsConsoleIO

Currently an instance of _io.FileIO is used to wrap the file descriptors
representing standard input, output and error. We add a new class (implemented
in C) _io.WindowsConsoleIO that acts as a raw IO object using the Windows
console functions, specifically, ReadConsoleW and WriteConsoleW.

This class will be used when the legacy-mode flag is not in effect, when opening
a standard stream by file descriptor and the stream is a console buffer rather
than a redirected file. Otherwise, _io.FileIO will be used as it is today.

This is a raw (bytes) IO class that requires text to be passed encoded with
utf-8, which will be decoded to utf-16-le and passed to the Windows APIs.
Similarly, bytes read from the class will be provided by the operating system as
utf-16-le and converted into utf-8 when returned to Python.

Client Side

Let’s see the code of the client now, open up a new file and write:

For demonstration purposes, I will connect to my local machine in the same network, which its IP address is «192.168.1.103». You can test this on the same machine by using the host as localhost or 127.0.0.1 on both sides.

Let’s create the socket and connect to the server:

Remember, the server sends a greeting message after the connection is established, let’s receive it and print it:

Going to the main loop, we first receive the command from the server, execute it and send the result back, here is the code for that:

subprocess’ getoutput(command) function returns the output of executing the command in the shell, just as we desire !

Наш первый CLI на Click

Наш первоначальный читает -файл с диска, обрабатывает его (как именно он это делает — пока что не важно) и сохраняет результат в. Пути к входному и выходному файлу настраиваются пользователем

И пользователь должен указать путь к входному файлу. Путь к выходному файлу указывается по желанию. Обычно им считается . Вот так выглядит этот код при использовании :

import click@click.command()@click.option("--in", "-i", "in_file", required=True,    help="Path to csv file to be processed.",)@click.option("--out-file", "-o", default="./output.xlsx",    help="Path to excel file to store the result.")def process(in_file, out_file):    """ Processes the input file IN and stores the result to     output file OUT.    """    input = read_csv(in_file)    output = process_csv(input)    write_excel(output, out_file)if __name__ =="__main__":    process()

И что мы тут делаем?

1. Мы декорируем метод , который будет вызываться из командной строки через .

2. Затем определяем аргументы командной строки через декоратор . Но внимательно следите за правильными названиями аргументов в декорированной функции. Если в добавляется строка без дефиса, то аргумент должен совпадать с этой строкой. Этим и объясняется и . Если все имена начинаются с дефисов, то создает название аргумента по самому длинному имени и заменяет все дефисы внутри слова на нижнее подчеркивание. Название пишется в нижнем регистре. Пример: и . Более подробно можно почитать в .

3. Через соответствующие аргументы задаем наши предварительные условия значениями по умолчанию или необходимыми аргументами.

4. Добавляем текст справки к нашим аргументами. Он будет показываться при вызове функции через . Здесь же отображается из нашей функции.

Теперь можете вызвать этот несколькими способами:

# Печатает helppython -m cli_tutorial.cli --help# Используйте -i для загрузки файлаpython -m cli_tutorial.cli -i path/to/some/file.csv# Указываем оба файлаpython -m cli_tutorial.cli --in path/to/file.csv --out-file out.xlsx

Круто! Вот мы и создали свой первый с помощью !

Обратите внимание: я не прописываю , и , т.к. предполагаю, что они существуют и корректно выполняют свою работу

Одной из проблем является то, что мы передаем параметры как общие строки. Почему же это проблема? Да потому, что такие строки должны быть преобразованы к фактическим типам. А это может приводить к ошибкам из-за плохо отформатированного пользовательского ввода. Взгляните на пример, в котором мы использовали пути и пытались загрузить -файл. Пользователь может указать строку, которая и вовсе не является путем. И даже если эту строку правильно отформатировать, нужный файл может отсутствовать либо же у вас не окажется прав доступа. Разве не правильнее было бы автоматически проверять ввод и интерпретировать его или сразу выдавать ошибку с информативным сообщением? И в идеале все это делалось бы без написания длиннющих кусков кода. с нами полностью согласен. Поэтому в нем можно задавать тип аргументов.

Major new features of the 3.8 series, compared to 3.7

  • PEP 572, Assignment expressions
  • PEP 570, Positional-only arguments
  • PEP 587, Python Initialization Configuration (improved embedding)
  • PEP 590, Vectorcall: a fast calling protocol for CPython
  • PEP 578, Runtime audit hooks
  • PEP 574, Pickle protocol 5 with out-of-band data
  • Typing-related: PEP 591 (Final qualifier), PEP 586 (Literal types), and PEP 589 (TypedDict)
  • Parallel filesystem cache for compiled bytecode
  • Debug builds share ABI as release builds
  • f-strings support a handy specifier for debugging
  • is now legal in blocks
  • on Windows, the default event loop is now
  • on macOS, the spawn start method is now used by default in
  • can now use shared memory segments to avoid pickling costs between processes
  • is merged back to CPython
  • is now 40% faster
  • now uses Protocol 4 by default, improving performance

There are many other interesting changes, please consult the «What’s New» page in the documentation for a full list.

Conclusion

Here is some ideas to extend that code:

  • Use threading built-in module to enable the server to accept multiple client connections in the same time.
  • Add a custom command that gets system and hardware information using psutil third party module, check this tutorial: How to Get Hardware and System Information in Python.
  • Add download and upload commands to download and upload files from/to the client, check this out: How to Transfer Files in the Network using Sockets in Python.
  • Make a custom command to record the client’s screen and then download the video recorded, this tutorial can help: How to Make a Screen Recorder in Python.
  • Add another command to record the client’s audio on his/her default microphone, check this tutorial.
  • Replace the greeting with information like the current working directory using os.getcwd() function in the built-in os module.
  • And many more ! There are endless of possibilities, the only limit here is your imagination !

To conclude, a reverse shell isn’t generally meant for being a malicious code, it can be used for legitimate purposes, for example, you can use this to manage your servers remotely.

DISCLAIMER: We are not responsible for any misuse of the code provided in this tutorial, use it on your own responsibility.

Happy Coding

View Full Code
Sharing is caring!

Read Also

How to Make a Port Scanner in Python

Learn how to write a port scanner in Python using sockets, starting with a simple port scanner and then diving deeper to a threaded version of a port scanner that is reliable for use.

How to Make a Network Scanner using Scapy in Python

Building a simple network scanner using ARP requests and monitor the network using Scapy library in Python.

Установка из источника

Это отличный навык, которому стоит научиться. Существуют более простые способы, которые мы рассмотрим позже в этой статье. Тем не менее, существует ряд пакетов, которые нужно установить именно этим способом. Например, чтобы использовать easy_install, вам сначала нужно установить setuptools. Чтобы сделать это, вам нужно скачать tar или zip файл с PyPI (https://pypi.python.org/pypi/setuptools), и извлечь его в вашей системе

Далее, обратите внимание на файл setup.py. Откройте сессию терминала и измените каталог на папку, содержащую файл setup

После этого запустите следующую команду:

Python

python setup.py install

1 python setup.py install

Если Python не расположен в пути вашей системы, вы получите сообщение об ошибке, указывающее на то, что команда не была найдена, или приложение неизвестно. Вы также можете вызвать эту команду, применив весь путь к Python. Для пользователей Windows это выглядит так:

Python

c:\python34\python.exe setup.py install

1 c:\python34\python.exe setup.py install

Этот метод особенно удобен, если у вас несколько установленных версий Python и вам нужно установить пакет на разные версии. Все что вам нужно, это указать полный путь к конкретной версии Python и установить пакет. Некоторые пакеты содержат в себе С код, например, заглавные файлы С, которые должны быть скомпилированы под пакет для корректной установки. В случае с Linux, у вас должен быть установленный C/C++ компилятор, так что вы можете установить пакет без головной боли. Возвращаясь к Windows, вам нужна правильная версия Visual Studio, для корректной компиляции пакета. Некоторые люди упоминают также и MingW, который можно использовать для этих целей, но я не знаю, как сделать так, чтобы это работало. Если в пакете присутствует установщик Windows, используйте его. В таком случае вы можете забыть о компиляции в принципе.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector