0% acharam este documento útil (0 voto)
421 visualizações255 páginas

Hacking Ético com Python para Iniciantes

O documento descreve a introdução de um livro sobre hacking ético usando a linguagem de programação Python. O autor explica o objetivo do livro em ensinar hacking ético de forma legal e segura usando ferramentas virtuais. O resumo também discute os principais componentes da segurança cibernética que serão abordados no livro, como disponibilidade, integridade, autenticidade e confidencialidade.
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
421 visualizações255 páginas

Hacking Ético com Python para Iniciantes

O documento descreve a introdução de um livro sobre hacking ético usando a linguagem de programação Python. O autor explica o objetivo do livro em ensinar hacking ético de forma legal e segura usando ferramentas virtuais. O resumo também discute os principais componentes da segurança cibernética que serão abordados no livro, como disponibilidade, integridade, autenticidade e confidencialidade.
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

Machine Translated by Google

Machine Translated by Google

Sanjib Sinha

Iniciando o Hacking Ético com Python


Machine Translated by Google

Sanjib Sinha
Howrah, Bengala Ocidental, Índia

Qualquer código-fonte ou outros materiais suplementares mencionados pelo autor neste texto
estão disponíveis para os leitores em [Link] . Para obter
informações detalhadas sobre como localizar o código-fonte do seu livro, acesse
[Link]/source-code/ . Os leitores também podem acessar o código-
fonte no SpringerLink na seção Supplementary Material de cada capítulo.

ISBN 978-1-4842-2540-0 e-ISBN 978-1-4842-2541-7 DOI


10.1007/978-1-4842-2541-7

Número de controle da Biblioteca do Congresso: 2016963222

© Sanjib Sinha 2017

Este trabalho está sujeito a direitos autorais. Todos os direitos são reservados pela Editora,
quer a totalidade ou parte do material esteja em causa, nomeadamente os direitos de tradução,
reimpressão, reutilização de ilustrações, recitação, difusão, reprodução em microfilmes ou de
qualquer outra forma física, e transmissão ou armazenamento de informação e recuperação,
adaptação eletrônica, software de computador ou por metodologia semelhante ou diferente agora
conhecida ou futuramente desenvolvida.

Nomes, logotipos e imagens de marcas registradas podem aparecer neste livro. Em vez de
usar um símbolo de marca registrada com todas as ocorrências de um nome, logotipo ou
imagem de marca registrada, usamos os nomes, logotipos e imagens apenas de forma editorial
e para benefício do proprietário da marca registrada, sem intenção de infringir a marca registrada.
O uso nesta publicação de nomes comerciais, marcas registradas, marcas de serviço e termos
semelhantes, mesmo que não sejam identificados como tal, não deve ser considerado uma
expressão de opinião sobre se estão ou não sujeitos a direitos de propriedade.

Embora se acredite que os conselhos e informações deste livro sejam verdadeiros e


precisos na data de publicação, nem os autores, nem os editores, nem a editora podem
aceitar qualquer responsabilidade legal por quaisquer erros ou omissões que
Machine Translated by Google

pode ser feito. O editor não oferece nenhuma garantia, expressa ou implícita, com
relação ao material aqui contido.

Impresso em papel sem ácido

Distribuído para o comércio de livros em todo o mundo pela Springer Science+Business


Media New York, 233 Spring Street, 6th Floor, New York, NY 10013. Telefone 1-800-
SPRINGER, fax (201) 348-4505, e-mail orders-ny@ [Link] ou visite
[Link]. Apress Media, LLC é uma LLC da Califórnia e o único membro
(proprietário) é a Springer Science + Business Media Finance Inc (SSBM Finance Inc).
SSBM Finance Inc é uma corporação de Delaware.
Machine Translated by Google

Dr. AVIJIT SEN, DRISTIPRADIP, KOLKATA.


(Para trazer luz à escuridão)
Machine Translated by Google

Prólogo – Objetivo do Hacker


Este livro destina-se a iniciantes em programação completa ou pessoas em geral que não
sabem nada sobre nenhuma linguagem de programação, mas desejam aprender hacking ético.

Vamos esclarecer primeiro: o Ethical Hacking não está associado a nenhum tipo de
atividades eletrônicas ilegais. Eles sempre ficam dentro das leis. Este livro é
destinado àquelas pessoas – jovens e idosos – que são criativas e curiosas e que desejam
desenvolver um hobby criativo ou assumir a profissão de segurança na Internet atuando como
hacker ético. Tendo isso em mente, também aprenderemos a linguagem de programação
Python 3 para aprimorar nossa habilidade como hackers éticos.
Este livro não se destina a nenhum tipo de usuário mal-intencionado. Se alguém tentar
usar este livro ou qualquer tipo de exemplo de código deste livro para fins ilegais, este livro
não assumirá responsabilidade moral por esses comportamentos maliciosos.
Se você acha que pode usar este livro para qualquer finalidade maliciosa, então você
são aconselhados a ler o primeiro capítulo “Legal Side of Ethical Hacking”. Espero que
você não goste da ideia de acabar na prisão por danificar alguns outros sistemas.
Gostaria de começar esta breve introdução com uma imagem. Esta imagem retrata
muitas coisas que mais tarde discutirei em detalhes. Ele diz: “O autor está usando a
distribuição Linux “Ubuntu” como seu sistema operacional padrão. Ele instalou o Virtual
Box – uma espécie de máquina virtual – que roda também no Windows.
E nessa Virtual Box ele instalou mais três sistemas operacionais. Um é “Windows XP” e os
outros dois são “Kali Linux” e “Windows 7 Ultimate”.
A imagem também diz, e isso é muito importante, “Atualmente três sistemas operacionais
estão rodando virtualmente no desktop”.
Machine Translated by Google

( A caixa virtual está executando três sistemas operacionais. Você pode tentar qualquer
tipo de experimento neste sistema operacional virtual. Isso não danificará seu sistema
principal. )
Como um hacker ético, você aprenderá como se defender. Para se defender às vezes
você precisa atacar seu inimigo. Mas é uma parte do seu sistema de defesa. É uma parte
de sua estratégia de defesa. Quanto mais você souber sobre a estratégia de seu inimigo, mais
poderá se defender. Você precisa aprender que essas ferramentas são usadas com frequência
por hackers ou crackers mal-intencionados. Eles usam a mesma ferramenta que você usa para se
defender.
Seja você um hacker ético ou um cracker malicioso, você faz o mesmo
coisa. Você usa ferramentas de software idênticas para atacar o sistema de segurança. Apenas
seu propósito ou intenção é diferente.
Provavelmente você sabe que uma grande montadora antes de lançar um novo modelo
do carro geralmente testa o sistema de travamento. Eles têm seus próprios engenheiros
de segurança e, além disso, chamam os especialistas em bloqueio para testar a vulnerabilidade.
Eles pagam uma boa quantia em dinheiro se você conseguir quebrar o sistema de travamento
do carro. Basicamente é um trabalho de “PENTESTING”. Os especialistas em travamento
PENTEAM o sistema e verificam se há algum ponto fraco no sistema.
É um bom exemplo de hacking ético. Os especialistas em travamento são convidados a fazer
o trabalho e são bem pagos. Pelo contrário, os ladrões de carros fazem o mesmo trabalho
sem nenhum convite. Eles simplesmente quebram o sistema de travamento de um carro
estacionado na beira da estrada e o levam embora. Espero que agora você tenha
Machine Translated by Google

entendeu a diferença entre hacking ético e cracking.


Sua principal intenção está centrada na segurança do sistema. A segurança consiste
de quatro componentes principais. À medida que o livro avança, você encontrará cada
vez mais palavras como “PENTESTING”, “EXPLOIT”, “PENETRATION”, “BREAK IN
THE SYSTEM”, “COMPROMISE THE ROUTER” etc. Os quatro componentes principais
mencionados abaixo lidam principalmente com esses termos. Os principais componentes
são:

1. Disponibilidade

2. Integridade

3. Autenticidade

4. Confidencialidade

Veremos como os crackers querem atacar esses componentes para obter acesso a
o sistema. Como o principal objetivo de um hacker é explorar as vulnerabilidades do
sistema, ele quer ver se há alguma fraqueza nesses componentes principais.
Vamos supor que o hacker queira bloquear a disponibilidade dos dados. Naquilo
caso, ele usará o método “Negação de Ataque” ou 'DoS'. Para fazer esse ataque,
geralmente os hackers usam recursos ou largura de banda do sistema. Mas o DoS tem
muitas outras formas. Quando o recurso ou a largura de banda do seu sistema são
consumidos completamente, o servidor geralmente falha. O alvo final é um sistema, mas o
número de vítimas é abundante. É como se milhões de pessoas se reunissem na frente da
porta principal de sua casa e a prendessem com uma espécie de corrente humana para que
você e seus familiares não pudessem entrar por ela.
O segundo componente-chave A integridade não deve ser comprometida a qualquer
custo. O que significa este termo “integridade”? É basicamente centrado na natureza dos
dados. Quando essa natureza dos dados é adulterada por algum tipo de ataque 'BIT
FLIPPING', a integridade do sistema também é comprometida. Isso pode ser feito apenas
alterando a própria mensagem. Os dados podem estar em movimento ou em repouso, mas
podem ser alterados. Imagine o que acontece quando uma transação de dinheiro é adulterada
com a adição de mais alguns zeros no final! Vamos supor que um banco está transferindo
dinheiro. Em sua instrução está escrito: “transferir $ 10.000”. Agora, o invasor altera o texto
criptografado de maneira que o valor mude para $ 10.000.000. Portanto, o ataque é direcionado
à própria mensagem ou a uma série de mensagens.
Machine Translated by Google

A questão da autenticação é normalmente tratada pela filtragem Media Access


Control (MAC). Se for colocado corretamente, a rede não permite dispositivos não
autorizados. O que acontece se alguém forjar o endereço MAC de uma estação de rede
legítima e retirá-lo? Ele pode assumir a identidade da estação e controlá-la. Isso é chamado
de ataque de autenticação ou falsificação de endereço MAC.
Finalmente, a questão da confidencialidade se eleva acima de tudo. Os dados trafegam
em texto não criptografado pela rede confiável. Aqui dados significam informação. O roubo de
informações como quebrar a senha de alguém é um ataque de confidencialidade. Os dados
ou informações são destinados a alguém, mas em vez do destinatário, o hacker obtém o
acesso. Na verdade, o cracker o rouba quando os dados estão se movendo pela rede confiável
como texto não criptografado.
Machine Translated by Google

Agradecimentos
KARTICK PAUL, GERENTE DE SISTEMA, AAJKAAL, KOLKATA, Sem sua ajuda
persistente e inspiradora, eu não poderia escrever este livro.
Machine Translated by Google

Conteúdo
Parte I

Capítulo 1: Lado Legal do Hacking

Capítulo 2: Ambiente de Hacking

Hacking ético e rede

O que significa rede?

Resumo

Capítulo 3: Instalando o Virtual Box

Capítulo 4: Instalando o Kali Linux e outros sistemas operacionais no VB

Capítulo 5: Terminal Linux, Comandos Básicos

Resumo

parte II

Capítulo 6: Python 3 e Hacking Ético

Capítulo 7: Ambiente Python

Capítulo 8: Sintaxes Gerais

Crie a função main()

Recuo e espaço em branco

comentando

Atribuição de valores

Capítulo 9: Variáveis, Objetos e Valores


Machine Translated by Google

Usando Números

Corda

O que é tipo e ID

Valores Lógicos

Tuplas e listas

Dicionário

Objeto

Capítulo 10: Condicionais

Capítulo 11: Loops

Enquanto Loops

Para Loops

Capítulo 12: Expressões Regulares

Usando o módulo “re”

Reutilizando com expressões regulares

Pesquisando com Expressões Regulares

Capítulo 13: Exceções, Erros de Captura

Capítulo 14: Funções

Valores de retorno

Gerar funções

Listas de Argumentos

Argumentos nomeados
Machine Translated by Google

Capítulo 15: Aulas

Metodologia Orientada a Objetos

A Fundação da Orientação a Objetos

Entendendo Classes e Objetos

Escreva seu próprio jogo, “Bom Vs Ruim”

Classe Primária e Objeto

Acessando Dados de Objeto

Polimorfismo

Usando Geradores

Herança

Decorador

Capítulo 16: Métodos de String

Capítulo 17: Entrada e saída de arquivos

Capítulo 18: Contêineres

Operando em tupla e objeto de lista

Operando no Objeto de Dicionário

Capítulo 19: Banco de dados

Vamos começar com SQLite3

MySQL para grandes projetos

Capítulo 20: Módulo

Capítulo 21: Depuração, Módulo Unittest


Machine Translated by Google

Capítulo 22: Soquete e Rede

Capítulo 23: Importando o Módulo Nmap

Capítulo 24: Construindo um Nmap Network Scanner

Parte III

Capítulo 25: Proteja o anonimato na Internet

Capítulo 26: Dark Web e Tor

Wikipédia oculta

Capítulo 27: Cadeias de Proxy

Capítulo 28: Rede Privada Virtual ou VPN

Capítulo 29: Endereço MAC

Epílogo — O que vem a seguir

Índice
Machine Translated by Google

Resumo do conteúdo
Sobre o autor

Sobre o Revisor Técnico

Agradecimentos

Prólogo – Objetivo do Hacker

Parte I

Capítulo 1: Lado Legal do Hacking

Capítulo 2: Ambiente de Hacking

Capítulo 3: Instalando o Virtual Box

Capítulo 4: Instalando o Kali Linux e outros sistemas operacionais no VB

Capítulo 5: Terminal Linux, Comandos Básicos

parte II

Capítulo 6: Python 3 e Hacking Ético


Machine Translated by Google

Capítulo 7: Ambiente Python

Capítulo 8: Sintaxes Gerais

Capítulo 9: Variáveis, Objetos e Valores

Capítulo 10: Condicionais

Capítulo 11: Loops

Capítulo 12: Expressões Regulares

Capítulo 13: Exceções, Erros de Captura

Capítulo 14: Funções

Capítulo 15: Aulas

Capítulo 16: Métodos de String

Capítulo 17: Entrada e saída de arquivos

Capítulo 18: Contêineres


Machine Translated by Google

Capítulo 19: Banco de dados

Capítulo 20: Módulo

Capítulo 21: Depuração, Módulo Unittest

Capítulo 22: Soquete e Rede

Capítulo 23: Importando o Módulo Nmap

Capítulo 24: Construindo um Nmap Network Scanner

Parte III

Capítulo 25: Proteja o anonimato na Internet

Capítulo 26: Dark Web e Tor

Capítulo 27: Cadeias de Proxy

Capítulo 28: Rede Privada Virtual ou VPN

Capítulo 29: Endereço MAC

Epílogo — O que vem a seguir


Machine Translated by Google

Índice
Machine Translated by Google

Sobre o autor e sobre o técnico


Revisor

Sobre o autor
Sanjib Sinha

escreve histórias e códigos - nem sempre na mesma ordem.


Ele começou com C# e .NET framework e ganhou um Microsoft Community
Contributor Award em 2011. Mais tarde, o movimento Open Source Software o atraiu e ele
se tornou um entusiasta do Linux, PHP e Python, especializando-se e trabalhando em White Hat
Ethical Hacking.
Como iniciante, ele teve que lutar muito - sempre - para descobrir uma maneira fácil de
aprender a programar. Ninguém lhe disse que codificar é como escrever: imaginar uma imagem e
trazê-la para a Terra com a ajuda de palavras e símbolos.
Ao longo de seus livros, ele tentou ajudar os iniciantes a partir de sua perspectiva - como um
iniciante.

Sobre o Revisor Técnico


Abir Ranjan Atarthy

é um hacker ético certificado pela Ec-Council, auditor ISO27001 e implementador de PCIDSS.

Ele tem mais de 12 anos de extensa experiência de domínio na condução do


Programas de informação e segurança cibernética em todos os aspectos principais, ou
seja, política, padrões, procedimentos, conscientização, segurança de rede, segurança da Web,
segurança de aplicativos Android, resposta a incidentes, análise de segurança, monitoramento
de segurança, proteção contra malware, configuração de segurança, criptografia, proteção de
dados Conhecimento da maioria ferramentas avançadas no setor de segurança com
conhecimento complementar em linguagens de script para explorar vulnerabilidades manualmente.
Ele é autor de vários artigos técnicos que foram publicados em IT
revistas de segurança e é freqüentemente convidado para falar em muitas conferências de
segurança cibernética e fóruns Python.
Ele projetou cursos de segurança cibernética para empresas em rede e web
Machine Translated by Google

testes de penetração, análise forense e criptografia.


A Abir realiza regularmente workshops, sessões de treinamento e programas de certificação
para empresas, organizações governamentais, estabelecimentos de defesa, agências de segurança,
faculdades de engenharia e universidades em programação Python, testes de penetração e análise
forense cibernética.
Ele criou várias ferramentas criptográficas e de segurança de TI usando Python.
Ele realizou Programas de curto prazo em programação orientada a objetos e
Tópicos selecionados em Engenharia de Software do Instituto Indiano de Tecnologia
-Kharagpur.
Abir é considerado um especialista no assunto em segurança cibernética e é frequentemente
citados pelos principais jornais e canais de TV.
Atualmente, ele lidera o departamento de inteligência de ameaças cibernéticas no TCG
Soluções Digitais Unip. Ltda.
Machine Translated by Google

Parte I
Machine Translated by Google

© Sanjib Sinha
2017 Sanjib Sinha, Beginning Ethical Hacking with Python, DOI 10.1007/978-1-4842-2541-7_1

1. Lado Legal do Hacking

Sanjib Sinha 1

(1) Howrah, Bengala Ocidental, Índia

Material eletrônico suplementar A versão


online deste capítulo (doi:10.1007/978-1-4842-2541-7_1) contém material suplementar,
que está disponível para usuários autorizados.

À medida que o tempo passa e progredimos, nosso antigo ambiente também está mudando muito
rapidamente. Não era como antes, quando mantemos registros inserindo dados em um grande
diário de bordo e os empilhamos um a um por data. Agora mantemos os dados em um computador.
Não vamos mais ao mercado para comprar nada. Encomendamos pela Internet e o pagamento é
feito com cartão de crédito ou débito. O crime também mudou de acordo. . A natureza de

Criminosos costumavam roubar seus dados fisicamente antes. Eles agora o pegam pela
Internet usando computadores. Agora, os computadores se tornaram uma nova ferramenta para os
negócios, bem como para os crimes tradicionais. Com base nisso, um termo —“cyberlaw”—vem à
tona. Como um hacker ético, a primeira e mais básica coisa que você deve lembrar é “não tente
penetrar ou adulterar qualquer outro sistema sem pedir permissão”.

Você pode perguntar como eu experimentaria meu conhecimento. A resposta é os sistemas


. Em
do Virtual Box que você
suaquiser e experimente
máquina virtual vocêneles
pode (a imagem
instalar acimaunidades
quantas mostra ooperacionais
Virtual Box e dois
sistemas operacionais em execução nele). Experimente tudo neles. Tentar qualquer vírus em sua
máquina virtual não afetará seu sistema principal. Ao mesmo tempo, você continuará aprendendo
sobre malware, vírus e todo tipo de ataque possível.

Alguns exemplos podem lhe dar uma ideia de que tipo de crimes de computador são
puníveis em nosso sistema legal.
Machine Translated by Google

Se você usar qualquer ferramenta de software para gerar um número de cartão de crédito ou débito ,
então é uma ofensa altamente punível. Convidará a uma multa de cinquenta mil
dólares e quinze anos de prisão. Criar um site falso para obter números de cartão de
crédito com uma falsa promessa de vender produtos inexistentes é uma ofensa
altamente punível. Segue-se prisão rigorosa e multa pesada. Posso dar vários outros
exemplos que podem trazer problemas para você se não cumprir a lei.

Lembre-se, você é um hacker ético e está aprendendo ferramentas de hacking


para proteger o seu sistema ou o do seu cliente. Por uma questão de proteção e
.
defesa, você precisa conhecer os métodos de ataque, exploração ou penetração
Experimente cada experimento em sua máquina virtual.
Essa é a regra número um do hacking ético.
Machine Translated by Google

© Sanjib Sinha
2017 Sanjib Sinha, Beginning Ethical Hacking with Python, DOI 10.1007/978-1-4842-2541-7_2

2. Ambiente de Hacking
Sanjib Sinha 1

(1) Howrah, Bengala Ocidental, Índia

A primeira coisa que você precisa é de uma máquina virtual . Como eu disse antes, eu tenho
Ubuntu como meu sistema operacional padrão e dentro da minha máquina virtual eu instalei
dois sistemas operacionais - um é o Windows XP e o outro é o Kali Linux.

Tecnicamente, a partir de agora eu mencionaria Windows XP e Kali Linux como


minhas máquinas virtuais. Kali Linux é uma distribuição Linux que vem com muitas
ferramentas úteis para hackers. Portanto, sugiro fortemente usá-lo como sua máquina
virtual. Você também pode ler a página de documentação do Kali Linux, que também será uma
grande ajuda.
Ao mesmo tempo, eu não sugeriria o uso do Windows de qualquer tipo para fins éticos
propósito de hacking. Alguns podem argumentar que poucas ferramentas de hacking
podem ser usadas no Windows, então por que você está sugerindo o contrário? A questão
é: no mundo do hacking ético, você precisa ser anônimo o tempo todo. Você não vai querer
manter seu rastro, de qualquer maneira, para que possa ser rastreado. Permanecer anônimo é
um grande desafio. No Linux é bastante fácil e você pode permanecer anônimo por enquanto.

Tendo isso em mente, explico detalhadamente essa técnica de ser anônimo para que, antes
de pular para a grande tarefa, você torne sua defesa muito mais forte. Ser anônimo é a coisa
mais importante no mundo do hacking ético. Manter-se anônimo no Windows não é possível.
Portanto, é melhor se adaptar primeiro ao ambiente Linux. Outra coisa importante é que a maioria
das grandes ferramentas de hacking não está disponível no ambiente Windows. não se preocupe.
Você pode instalar o Ubuntu amigável dentro do sistema Windows ou pode facilmente particionar
Se você nunca ouviu falar de nenhuma distribuição Linux , seu disco em duas partes e
instalar o Ubuntu e o Windows
Machine Translated by Google

separadamente como seus dois sistemas operacionais padrão. É preferível fazer o


último. Instalar e desinstalar sistemas operacionais paralelos sempre ensina algo novo. Se
você estiver familiarizado com o Windows, não direi para simplesmente descartá-lo para
aprender hacking ético. Você pode mantê-lo e usá-lo para o seu trabalho diário. Não há
nenhum problema em fazer isso.
No mundo da Internet, o Linux é mais usado. Então você precisa aprender alguns
comandos do Linux. A instalação de software no Linux é um pouco diferente dos ambientes
Windows. Existem distribuições Linux como Fedora ou Debian e muito mais. Chamei
Ubuntu apenas porque é extremamente popular e os usuários do Windows se sentem
confortáveis dentro dele. As operações são mais ou menos as mesmas, incluindo as
instalações de software. Para iniciantes, não é uma boa ideia instalar o Kali Linux como
sistema operacional padrão. Você deve ler a documentação do Kali, onde fica claro que o
Kali é mais para desenvolvedores. Você vai instalá-lo dentro do seu Virtual Box. Kali Linux
é um tipo de distribuição Linux que vem com muitas ferramentas de hacking. Você precisa
conhecê-los e usá-los no curso de hacking ético.

A instalação da máquina virtual é uma etapa muito importante como a primeira


etapa da construção do seu ambiente. No próximo capítulo, mostrarei como você pode
fazer isso para diferentes sistemas operacionais. Outra coisa importante é aprender uma
linguagem de programação que realmente vai te ajudar a aprender melhor o hacking ético.
3.x A escolha óbvia é Python . já chegou
No momento
e é considerado
em que oescrevo
futuro desta
este livro,
linguagem.
PythonEle
está alcançando rapidamente a versão antiga do Python 2.x, que está no mercado há
algum tempo. A página oficial de download do Python fornece o repositório de instaladores
do Python para os sistemas operacionais Windows, Mac OS X e Linux. Se você baixar um
instalador, será de grande ajuda porque vem com o interpretador Python, a biblioteca padrão
e os módulos padrão. A biblioteca padrão e os módulos embutidos são especificamente
muito importantes porque oferecem vários recursos úteis que o ajudarão a atingir seu
objetivo como um hacker ético. Entre os módulos úteis, você obterá serviços criptográficos,
manipulação de dados da Internet, interação com protocolos IP, interoperabilidade com o
sistema operacional e muito mais. Então vá em frente, pegue qualquer bom livro para
iniciantes em Python, leia a documentação oficial e saiba que isso faz parte do seu
cronograma de aprendizado. Python é uma linguagem extremamente fácil de aprender.

Para criar um ambiente de hacker ético ideal, alguns passos são extremamente
importantes. As etapas incluem: instalar a máquina virtual ou o Virtual Box (VB), ter um
conhecimento básico sobre redes e aprender uma linguagem de programação útil como o
Python. Vamos primeiro dar uma olhada no conhecimento básico de rede.
Machine Translated by Google

Hacking ético e rede Um conhecimento


básico sobre internetworking é extremamente importante se você quiser
aprender hacking ético. À medida que você avança e quer se aprofundar, é
aconselhável aprender mais sobre networking. Hacking ético e internetworking
estão intimamente associados. À medida que avança neste livro, você
encontrará palavras como “pacote”, “switch”, “roteador”, “modem”, “TCP/IP”, “OSI” e muito m
A primeira coisa que você precisa saber é: os dados viajam por muitas camadas.
Hackers éticos tentam entender essas camadas. Depois de entender o movimento, eles desejam
rastrear e bloquear os dados ou recuperar os dados.

Neste capítulo, veremos brevemente como funcionam os modelos de interligação de redes.


Veremos os diferentes tipos de modelos de rede. Também aprenderemos sobre os dispositivos que
compõem uma rede.

O que significa rede?


Uma rede é um conjunto de dispositivos conectados por meio de mídia. Uma das principais
características de uma rede é: os dispositivos contêm serviços e recursos. Os dispositivos contêm
computadores pessoais, switches, roteadores e servidores, entre outros. O que eles fazem
basicamente? Eles enviam dados e obtêm dados por comutação ou por roteamento. Na verdade, eles
conectam os usuários para que eles obtenham dados completos em vez de obtê-los por partes.
Portanto, os serviços básicos que esses dispositivos fornecem incluem comutação, roteamento,
endereçamento e acesso a dados.
Podemos concluir que uma rede conecta principalmente usuários para aproveitar esses
serviços. Esse é o seu primeiro trabalho. O segundo trabalho também é muito importante. Uma rede
sempre mantém um sistema para que os dispositivos permitam aos usuários compartilhar os recursos
de forma mais eficiente.
Agora surge um problema - não um problema trivial. Os fabricantes de hardware e
software não se conhecem. Eles pertencem a diferentes países e compartilham diversas culturas.
Quando o conceito de rede surgiu pela primeira vez, descobriu-se que o hardware e o software não
combinavam. Como eu disse antes, uma rede é uma coleção de dispositivos. Esses dispositivos
são construídos principalmente de hardware e software que falam em idiomas diferentes.

Para resolver este problema, um modelo de rede comum com comunicação


funções são necessárias para que dispositivos diferentes possam interoperar.
A importância dos modelos de interligação de redes consiste em alguns conceitos
principais. Primeiro, eles encorajam a interoperabilidade. Em segundo lugar, eles fornecem uma
Machine Translated by Google

referência através da qual os dados serão comunicados. Terceiro, eles facilitam a engenharia
modular.
Existem dois tipos de modelos de interligação de redes: o .
modelo de referência OSI (Open Systems Interconnection) e o modelo TCP/IP
(Transmission Control Protocol/Internet Protocol). Ambos os modelos são amplamente
utilizados hoje.
O modelo de referência Open Systems Interconnection (OSI) foi desenvolvido pela Internet
Standards Organization (ISO) e possui sete camadas ao todo. As camadas são as seguintes:
aplicação (camada 7), apresentação (camada 6), sessão (camada 5), transporte (camada 4), rede
(camada 3), enlace de dados (camada 2) e física (camada 1).

Vamos muito brevemente tentar entender como esse modelo funciona. Suponha que um usuário
tenta abrir uma página da web. A primeira coisa que ele faz é enviar uma solicitação ao servidor
localizado a vários milhares de quilômetros de distância. Aqui, o disco rígido ou hardware do servidor
é a última camada (camada 1), denominada “física”. Assim, a requisição do usuário primeiro bate na
camada de “aplicação” (7) que é a mais próxima e depois segue em frente. Cada processo em cada
camada envolve um complicado funcionamento de “bits e bytes”. Um computador só entende 0 e 1.
Mas o usuário não gosta de ver um vídeo em 0 e 1.

Vamos dividir o processo em mais detalhes.


Na camada de aplicação (7), o usuário interage com o dispositivo que pode ser um
computador pessoal ou smartphone ou qualquer coisa que você possa imaginar. Assim, a
camada de aplicação basicamente lida com a interação do usuário. O nome do datagrama é
“dados”. O usuário solicita os dados e, finalmente, recupera os dados.
O que acontece quando o usuário envia solicitações da camada 7? Entra na próxima camada: (6)
apresentação . O processo de encapsulamento é iniciado. Os dados são formatados
e criptografados. Em seguida, a camada 5 ou sessão entra em cena. Essa camada gerencia a
comunicação de ponta a ponta. Suponha que você
mídia
digite
social.
umaEssa
senha
camada
e façamantém
login emasua
comunicação
conta de
de ponta a ponta (usuário para servidor) para que você possa permanecer conectado à sua página.
Diga a esta camada que o nome do datagrama é “dados”.

Para ajudá-lo a manter sua sessão, as próximas três camadas funcionam muito bem.
duro. São eles: transporte (camada 4), rede (camada 3), enlace de dados (camada 2),
respectivamente. O nome do datagrama da camada de transporte é “segmento”. Por que isso é
chamado de “segmento”? É chamado de “segmento” porque divide sua solicitação em várias frações.
Primeiro, adiciona números de porta de origem e destino. Em seguida, tenta torná-lo confiável,
adicionando números de sequência. Assim, em poucas palavras, fornece controle de fluxo,
sequenciamento e confiabilidade.
O que acontece depois?
Machine Translated by Google

Sua requisição entra na camada 3 que se chama rede . O nome do


datagrama é “pacote”. Ele adiciona endereços IP de origem e destino. Também garante que sua
solicitação encontre o melhor caminho para chegar ao destino.
Agora sua solicitação de dados está quase chegando ao estágio final. Ele entra na camada
2 que é link de dados. Está se aproximando do ponto final que é o hardware do servidor.
Portanto, essa camada adiciona endereços de controle de acesso à mídia (MAC) de origem e destino.
Em seguida, ele passa pelos processos do Frame Check System (FCS). Ele verifica quadro a quadro
se as solicitações de origem chegam ao destino correto. É por isso que o datagrama é conhecido
como “quadro”.
Agora entrou no destino final que é a camada 1 ou física.
Existem apenas bits no meio físico. O nome do datagrama é “bits e bytes”.

Agora podemos imaginar um pequeno escritório com um roteador, dois switches e alguns
desktops, laptops, impressoras e servidores. O roteador está conectado aos switches e os switches
estão conectados aos dispositivos como desktops, laptops, impressoras e servidores. Aqui desktops,
laptops, impressoras e servidores pertencem à camada 1 que é física. Os switches pertencem a
camada 2 que é enlace de dados, e o roteador cabe na camada 3 que é rede.

Os roteadores são dispositivos da camada 3 e executam algumas tarefas definidas. Eles


são: comutação de pacotes, filtragem de pacotes, seleção de caminho e, finalmente, comunicação.
A tarefa de comutação de pacotes envolve o processo de levar um pacote para o próximo dispositivo.
Aqui, o próximo dispositivo são os interruptores. A filtragem de pacotes sugere em seu nome o que
ela realmente faz. Ele permite ou bloqueia pacotes dependendo de certos critérios. A seleção de
caminho determina o melhor caminho através da rede até o destino. A comunicação é outra parte
importante desta camada.
Os roteadores se comunicam com outras redes como a Internet.
Entre roteadores, dispositivos da camada 3, e o aplicativo final, físico, dispositivos da camada
1, existem switches que são dispositivos da camada 2. Em alguns casos, os switches executam a
tarefa dos dispositivos da camada 3. Os switches basicamente lidam com filtragem e
encaminhamento de quadros. Também mantém a conexão entre a camada 3 e a camada 1.

Resumo Vamos
recapitular rapidamente o que acabamos de aprender sobre as relações entre hacking ético e
internetworking.

1. Os modelos de interconexão de redes incentivam a interoperabilidade entre diferentes


Machine Translated by Google

dispositivos, fornecendo uma referência para descrever a comunicação de dados.


Ao mesmo tempo, facilita a engenharia modular.

2. Existem dois tipos de modelos de interligação de redes. Eles são referência OSI
Modelo e Modelo TCP/IP.

3. O Modelo OSI tem sete camadas. São eles: aplicação (camada 7),
apresentação (camada 6), sessão (camada 5), transporte (camada 4), rede (camada
3), enlace de dados (camada 2) e físico (camada 1).

4. O modelo TCP/IP tem quatro camadas. São eles: aplicação (camada 4),
transporte (camada 3), rede (camada 2) e rede (camada 1).

5. Um hacker ético tenta entender esse processo de comunicação de dados e penetra


de acordo com a vulnerabilidade.
Machine Translated by Google

© Sanjib Sinha
2017 Sanjib Sinha, Beginning Ethical Hacking with Python, DOI 10.1007/978-1-4842-2541-7_3

3. Instalando o Virtual Box

Sanjib Sinha 1

(1) Howrah, Bengala Ocidental, Índia

A primeira pergunta que vem à nossa mente é: por que precisamos de uma caixa virtual
quando temos um sistema operacional padrão instalado? Existem várias razões.
O motivo mais importante é: em uma caixa virtual podemos jogar com qualquer sistema
operacional sem medo de estragá-lo, até quebrá-lo. Existe toda a possibilidade de que, ao testar
uma ferramenta de hacking, possamos quebrar um sistema. Eu encorajo você a fazer isso. É
uma máquina virtual. Então, vá em frente. Teste tudo o que vier à sua mente. Outro grande
motivo para usar a caixa virtual é a segurança. Quando você visita um site. você pode considerá-
lo seguro, mas na realidade não pode ser assim. Mas nada importa no caso de uma caixa virtual.
Não é sua máquina original com dados confidenciais. Visitar um site inseguro não é mais irritante.

Apenas uma coisa que você precisa se lembrar. Fique dentro da lei. Ao testar suas
ferramentas de hacking ou códigos em execução,
sistema.
você não pode comprometer nenhum outro
O site oficial do Oracle Virtual Box oferece muitas opções de download.
Você pode escolher qualquer um deles. De acordo com o seu sistema operacional, vá
para a seção “download” e veja o que está disponível para você. A partir da próxima imagem,
você terá uma ideia de como prosseguir.
Machine Translated by Google

Figura 3-1. Seção de download do Virtual Box para hosts Linux

A linha selecionada da imagem acima mostra o sistema operacional padrão I


estou executando atualmente. Esse é o Ubuntu 14.04 (Trusty) e a arquitetura é
AMD64 Virtual
. Box é muito fácil de instalar. Seja qual for o seu sistema operacional
(Mac OS X, Windows ou Linux), você pode instalá-lo. Primeiro, você precisa
saber sobre o seu próprio sistema operacional. Pode ser arquitetura de 32 ou 64
bits. Em qualquer distribuição Linux, é extremamente fácil de aprender. [Link]
o
terminal e digitar: “uname -a”.

O terminal fornecerá algumas informações vitais que incluem todos os dados


relativos ao meu sistema padrão atual. O Linux é da versão 3.19.0 e o nome do
superusuário é “hagudu”. Também indica que tipo de arquitetura de sistema é esse.
Se parece com isso:
Machine Translated by Google

Figura 3-2. Uma imagem de terminal que informa sobre a arquitetura do sistema

Como no meu caso, você vê claramente que “x86_64” significa 64 bits. Na


página de download oficial do Virtual Box para todas as distribuições do Linux,
você primeiro baixa os pacotes necessários e depois os instala de acordo com a
natureza do seu sistema operacional. Para Red Hat, Fedora ou qualquer distribuição
Linux pertencente a essa categoria, você notará que a última extensão é “.rpm”. Nesse
caso, você pode mover para a pasta Virtual Box e emitir comandos como “rpm -i” ou
“yum install” caso execute o Red Hat ou Fedora.. Mas existem métodos mais simples
para instalar o Virtual Box.
Para os iniciantes absolutos, é muito útil executar a distribuição Ubuntu
Linux como seu sistema operacional padrão. Você pode instalar o Virtual Box
diretamente do centro de software sem abrir o terminal ou emitir qualquer comando.
O centro de software Ubuntu tem muitas categorias. Um deles mostra o software
“instalado”.
Machine Translated by Google

Figura 3-3. O centro de software do Ubuntu mostra o Virtual Box em execução

Não está lá por padrão. Nesse caso, é extremamente fácil de instalar. Você pode
basta digitar “Caixa Virtual” na caixa de texto de pesquisa e ela aparecerá. Siga em
frente e pressione o botão de instalação.
Machine Translated by Google

© Sanjib Sinha
2017 Sanjib Sinha, Beginning Ethical Hacking with Python, DOI 10.1007/978-1-4842-2541-7_4

4. Instalando o Kali Linux e outros sistemas


operacionais no VB

Sanjib Sinha 1

(1) Howrah, Bengala Ocidental, Índia

Uma vez instalado o Virtual Box em sua máquina, você não precisa se preocupar em instalar
vários sistemas operacionais nela. No início, estamos interessados em instalar o Kali Linux em
nosso Virtual Box. Acesse o site oficial do Kali Linux e baixe a imagem ISO da versão estável
mais recente.
Kali Linux é uma distribuição Linux muito maior do que outras distribuições Linux.
Deve ser em torno de 3 GB. O Ubuntu e outros têm cerca de 1 GB ou um pouco mais.
Agora que o processo de instalação terminou, você pode armazená-lo em seu disco
rígido local ou gravá-lo em um DVD. Agora abra sua Caixa Virtual e clique em “Novo”. Ele abrirá
automaticamente uma nova janela que perguntará que tipo de sistema operacional você vai
instalar. A imagem a seguir é bastante auto-explicativa.
Machine Translated by Google

Figura 4-1. Como instalar um sistema operacional na máquina virtual

Você vê no Virtual Box que já instalei dois sistemas operacionais.


Um é o Kali Linux e o outro é o Windows XP . No seu caso, quando você
for instalar o novo, o painel esquerdo da sua caixa virtual estará vazio.
Todo o procedimento é muito explícito em si. Ele irá guiá-lo para fazer o que
fazer a seguir. Basicamente, na Internet existem muitos guias ilustrativos que o
ajudarão a fazer a mesma coisa. Agora é hora de anotar o nome do sistema
operacional que você está prestes a instalar. Em seguida, selecione o tipo (se é
Linux ou Windows, etc.) e a versão. Na longa lista de seção de versões, você não
encontrará o nome de Kali. Mas basicamente é “Debian”. Então vá em frente e
selecione o Debian de 32 bits ou 64 bits de acordo com a arquitetura do seu sistema.
Clique em “next” e ele pedirá o uso de memória conforme mostrado na próxima imagem.
Machine Translated by Google

Figura 4-2. O processo de instalação do Kali Linux no Virtual Box solicita o tamanho da memória

Você pode alocar o tamanho da memória de acordo com a capacidade de sua máquina. Mínimo
1 GB é bom. É melhor se você puder alocar mais. Na próxima etapa, ele solicitará capacidade de
armazenamento e algumas outras coisas essenciais.
Posso garantir que, como iniciante, você não encontrará nenhuma dificuldade em
instalando Kali Linux em sua Caixa Virtual. A parte mais importante deste processo de instalação
é que você precisa manter sua conexão com a Internet funcionando para que o Kali Linux ajuste
seus pré-requisitos online de acordo.
Normalmente, quando um sistema operacional é instalado em uma máquina virtual, ele vem
em um tamanho pequeno e fica assim. A próxima imagem mostrará o tamanho original.
Machine Translated by Google

Figura 4-3. Kali Linux em execução no Oracle VM Virtual Box

Mas trabalhar com esse tamanho é realmente complicado. Para resolver esse problema,
normalmente é usado o Virtual Box Guest Addition. Mas antes disso, você pode querer atualizar
e atualizar seu Kali Linux recém-instalado. Essa é uma boa prática que ajuda você a estar sempre
atualizado. Depois de fazer login digitando nome de usuário e senha, você encontrará o terminal
no painel esquerdo. Abra-o e digite: apt-get update Você deve estar online para que ele seja
atualizado por conta própria. Pode demorar algum

tempo. Depois que terminar, você emite o segundo comando: apt-get


upgrade Normalmente, a atualização leva mais tempo do que a
atualização. Se você é um usuário root, não deve haver nenhum problema. Mas se você
criou outro usuário e fez login como esse usuário, você deve digitar o comando “su” antes. “su”
significa superusuário ou usuário root que é o administrador. Ele pedirá sua senha de superusuário
instantaneamente. Você dá e vai funcionar bem.

Voltemos a um velho problema. O Kali Linux recém-instalado parece pequeno e você


obviamente está perdido e não sabe o que fazer.
Como você obterá a visualização em tela cheia?
Aqui está um comando que irá resgatá-lo deste problema e resolvê-lo.
Você precisa instalar mais um pacote e atualizar sua máquina virtual novamente para que ela
obtenha a visualização em tela cheia .
Machine Translated by Google

Figura 4-4. Kali Linux executando Oracle VM Virtual Box com ferramenta de ataques de senha

Abra o terminal e digite: apt-get


update && apt-get install -y dkms linux
cabeçalhos - $(uname -r)
Isso instalará o pacote necessário que executará o Virtual Box Guest Addition. É
algo que você pode imaginar como uma ferramenta que controla o tamanho da tela do seu
sistema operacional host.
Como você o executará depois que o pacote estiver instalado? A próxima imagem será
guiá-lo para encontrar o lugar onde você vai obtê-lo.
Machine Translated by Google

Figura 4-5. Obtendo o tamanho de tela cheia do Kali Linux no Virtual Box

Leve o ponteiro do mouse para a parte central superior, onde você obterá o menu
“Dispositivos”. O último diz assim: “insira a imagem do CD da edição de convidado”.
Clique nele e ele cuidará de tudo automaticamente.
Normalmente deve funcionar bem. Se não, encare como um desafio. Procure na
internet. Há muitas mãos amigas esperando por você para ajudar no que você deseja obter.

Agora vamos instalar o Windows 7 Ultimate . O processo inicial é o


mesmo. Você abre a caixa virtual. Vá em “novo” e clique. Ele abrirá uma janela que solicitará
que você digite o nome do sistema operacional que você vai instalar. Em seguida, ele solicitará
o tamanho da memória. Para o Windows 7 Ultimate, você precisa alocar pelo menos 2 GB. Maior
é melhor. Para a capacidade de armazenamento do disco rígido, 50 GB são suficientes.

Agora você está pronto para se conectar à imagem ISO do sistema .


operacional Esta parte é um pouco complicada, mas qualquer guia online mostrará como
você pode conectá-los.
Quando você clicar na seção “armazenamento” da sua caixa virtual, uma janela será aberta,
solicitando a conexão com a imagem ISO. Não é nada difícil.
A vantagem do Virtual Box é que, se você deixar de fazer algum trabalho, isso não afetará sua
máquina original.
Machine Translated by Google

Figura 4-6. A instalação do Windows 7 Ultimate ocorre

Figura 4-7. O Windows 7 Ultimate está sendo instalado

Quando qualquer novo sistema operacional é instalado em sua máquina virtual, geralmente
é pequeno em tamanho. Mas existe uma técnica que o ajudará a obter a tela cheia original
Machine Translated by Google

efeito.
Para o Windows 7 Ultimate, há uma pasta Virtual Box Guest Addition disponível
na seção de armazenamento. A caixa de cor azul vem com uma etiqueta. Ele lê
. Basta
Virtual Box Guest Additions contém vários arquivos.
clicarVocê
nele. notará
Ele vaidois arquivos
se abrir. Será“.exe”
. Um éépara
o outro é para a arquitetura do sistema de 64 bits. Minha máquina 32bits,
de 64 bits então
e
eu clico e a executo. Os passos são muito simples. Ele vai pedir para ser instalado.
Clique em OK e prossiga. Isso fará com que o estado da máquina virtual do Windows 7
Ultimate fique cheio
tela.

Instalamos o Virtual Box com sucesso em nossa máquina virtual e instalamos o


Kali Linux e o Windows 7 Ultimate nele. Agora é hora de se mover
sobre.
Machine Translated by Google

© Sanjib Sinha
2017 Sanjib Sinha, Beginning Ethical Hacking with Python, DOI 10.1007/978-1-4842-2541-7_5

5. Terminal Linux, Comandos Básicos


Sanjib Sinha 1

(1) Howrah, Bengala Ocidental, Índia

É extremamente importante conhecer o terminal e os comandos do Linux. Não em grandes


detalhes, mas esse conhecimento primário o ajudará imensamente no futuro. Quanto mais você
se aprofundar no mundo do hacking ético, mais começará a sentir que precisa saber
o mais
sistema
sobre
Linux. Este livro não o levará tão longe. Mas é necessário um conhecimento muito básico para
que você possa entender o que está acontecendo ao seu redor.

Pode parecer repetitivo, mas eu gostaria que fosse cimentado em sua mente que
sem conhecer o Linux corretamente, você não pode se aprofundar no misterioso mundo do
hacking ético. Portanto, você deve conhecer os comandos básicos primeiro. Esses comandos
informarão sobre o próprio computador. Ele informará a localização do sistema de arquivos -
onde você está no seu computador. Por esses comandos, você pode alterar a permissão de um
sistema de arquivos, copiar ou remover permanentemente um arquivo. Você pode adicionar um
novo usuário ao seu sistema. Você pode ter uma lista de arquivos que estão atualmente no
diretório onde você está. Esta listagem inclui os arquivos ocultos. Resumindo, você pode pelo
menos fazer as operações básicas por meio do teclado sem usar o ponteiro do mouse. Isso é
ótimo do ponto de vista de um iniciante, presumo.

Para começar, vamos primeiro iniciar o Kali Linux. Na imagem a seguir, você verá uma
representação em tela cheia de Kali. Vou explicar algumas coisas primeiro, para que, como
iniciante, você aprenda o que precisa saber primeiro sobre Kali.
Machine Translated by Google

Figura 5-1. Visualização em tela cheia do Kali Linux com seu painel esquerdo

A imagem acima mostra a visualização em tela cheia do Kali Linux. No painel esquerdo,
na parte superior, está o navegador “Iceweasel”. Em seguida, segue a ferramenta de linha
de comando. Precisamos dessa ferramenta com bastante frequência nas próximas lições. A
ferramenta de linha de comando ou terminal basicamente lida com todos os tipos de entradas
de teclado. Os bons programadores dificilmente usam o ponteiro do mouse. Eles ficam mais
confortáveis com este terminal e digitação. O sistema de arquivos o segue. Se você clicar
nele, abrirá uma janela como qualquer versão do Windows NT. Você verá vários diretórios e
pastas como “Início”, “Downloads”, “Imagens”, etc.
Vamos começar com a ferramenta de comando abrindo-a. Você pode fazer parecer
maior. Basta usar as teclas “control” e “shift” com o sinal “+”.
Na imagem a seguir você verá alguns comandos iniciais que normalmente
digitamos para saber que tipo de arquivos temos em alguns diretórios ou pastas.
Machine Translated by Google

Figura 5-2. Kali Linux com a ferramenta de linha de comando

O que a imagem mostra?


Isso mostra que eu digitei “ls” primeiro. O que esse comando “ls” significa? Isto
significa listagem. Digo ao Kali para mostrar a listagem de arquivos e pastas que você
possui e, em uma fração de segundo, ele me mostra tudo o que tem.
Em seguida, usei o comando “cd”. O que isso significa?
Este comando “cd” significa “alterar diretório”. Você vê na imagem que mudei o diretório
para “home” e emita o comando “ls” novamente para ver o que ele tem. Tem uma pasta
chamada “sanjib” e um arquivo. A pasta “sanjib” significa que o “root” ou o próprio sistema
possui um usuário chamado “sanjib”. Agora, como root ou administrador, criei esse usuário
para que no início eu possa fazer login como “sanjib”. Você pode criar vários usuários em um
sistema Linux para que, de várias máquinas, eles possam acessar seus arquivos e pastas. Mas
os usuários nunca terão o privilégio de root. Eles não podem penetrar no espaço do
administrador, mas o root ou administrador sempre pode ver o que os usuários estão fazendo.
Como root, um administrador pode criar ou deletar qualquer usuário.

Deste lugar você pode adivinhar o que está acontecendo. Mudamos o diretório e
verificamos o que “sanjib” tem em seu diretório “Downloads”.
Em seguida, aprendemos sobre o comando “pwd” . Ele declara sua posição. Como root,
se você estiver no diretório “Home” e emitir um comando “pwd”, ele terá uma saída como esta:
Machine Translated by Google

root@kali:/home# pwd /home


root@kali:/home#

Ele diz que você está no diretório “/home”. Este comando “pwd” é importante
quando você precisa controlar um sistema grande e complicado. Muitas vezes você
pode esquecer onde está trabalhando. Normalmente, se você quiser voltar ao diretório
anterior, precisará digitar isto:

root@kali:/# cd /home/sanjib/ root@kali:/home/


sanjib# cd .. root@kali:/home#

Isso significa que você primeiro vai para o diretório “sanjib” e depois volta com um “cd”
comando com dois pontos.
Em seguida, aprendemos sobre o comando “cp” . Este comando significa cópia.
Você pode copiar um arquivo de um destino para outro. Vimos que em nosso diretório
“home” temos um arquivo, “[Link] .” Vamos copiar este arquivo para
o diretório “Documentos” do usuário “sanjib”.

root@kali:/home# cp -v [Link]
/home/sanjib/Documents/
'[Link]' ->
'/home/sanjib/Documents/[Link]'
root@kali:/home#

Agora gostaríamos de ir para a pasta de documentos “sanjib” e ver se o arquivo


foi copiado corretamente ou não.

root@kali:/home# cd sanjib/Documents/ root@kali:/home/


sanjib/Documents# ls [Link] root@kali:/
home/sanjib/Documents#

Eu mudei o diretório para “sanjib/Documents” e emito o “ls”


comando para ver a listagem. Ele mostra o arquivo. Então está funcionando corretamente.
Você pode aprender sobre qualquer comando com muita facilidade. Você só precisa adicionar um “—
help” como este: “cp –help .” Ele fala tudo sobre esse comando e é muito
detalhado. Ele informa sobre qualquer comando em detalhes.
Outro comando muito importante é “mv” . Com este comando, você pode
Machine Translated by Google

mover qualquer arquivo de uma pasta para outra pasta. Este comando é mais ou menos
como um comando “cp”. Mas há uma grande diferença. Este comando move
completamente o arquivo de um lugar para outro. Outro comando importante é “gato”.
Você pode ler qualquer arquivo de texto com a ajuda deste comando.
Eu tenho uma pasta chamada “Writing” e tenho alguns documentos lá. Agora
com a ajuda deste comando podemos ler qualquer arquivo de texto. Lembre-se que é
verdade apenas para um arquivo de texto. Para um experimento, eu queria ler um
arquivo com extensão “.odt” e a próxima imagem mostra como ficou no terminal.

Figura 5-3. Tentando ler um arquivo não texto com o comando “cat”

Nesta parte, quero mostrar outro truque que costuma ser usado no Linux.
Suponha que você queira escrever um arquivo de texto muito rapidamente. Você
pode usar "nano". Ele vem com todas as distribuições do Linux. Basta digitar “nano” no
seu terminal e ele abrirá um editor de texto no próprio terminal. A próxima imagem mostra
como isso acontece.
Machine Translated by Google

Figura 5-4. Nanoeditor de texto. Como salvar um arquivo e sair do editor está escrito nele.

Agora você pode ler com segurança este novo arquivo, “[Link]”, com o
comando “cat”. Tudo o que você precisa fazer é emitir um comando no seu terminal como este:

romance de [Link]

Ele lerá seu arquivo no próprio terminal.


Agora pode ser uma boa ideia editar este arquivo. Você pode editá-lo no terminal usando
“nano” . Nesse caso, você precisa escrever no seu terminal este comando:

[Link]

Isso dirá ao “nano” para abrir o arquivo. O resto é o mesmo. Você pode editar qualquer
parte e, com as teclas “control” e “o”, você pode salvá-la novamente. Então você pode
sair do arquivo com “control” e “x”.
Na próxima imagem veremos como fica quando tentamos ler um arquivo por
usando o comando "gato".
Machine Translated by Google

Figura 5-5. Lendo um arquivo de texto usando o comando “cat”

Normalmente, programadores experientes costumavam trabalhar no terminal e no texto


editores como “VI”, “VIM” ou “NANO” são extremamente populares.
Agora vamos aprender um comando Linux muito importante chamado “grep”.
Este comando faz algum tipo de pesquisa dentro de um arquivo e o faz de uma
maneira muito interessante. Vamos primeiro ver o que temos em nosso diretório raiz.
Emitimos um comando como este em nosso terminal e vemos a saída.

hagudu@hagudu-H81M-S1: $ cd /etc/apt
hagudu@hagudu-H81M-S1:/etc/apt$ ls [Link].d
[Link]
[Link] confiá[Link].d [Link] t
preferências.d [Link].d
trustdb .gpg [Link] hagudu@hagudu-H81M-S1:/
etc/apt$ t

Como você pode ver, nós mudamos o diretório para “/etc/apt” e vemos o
listagem. Encontramos muitos arquivos lá e atualmente estamos interessados
no arquivo “[Link]”. Podemos usar o comando “cat” para ler o arquivo, mas
temos algo diferente em mente.
Gostaríamos de pesquisar alguma palavra em particular e queremos separá-las
e vê-los em segregação. O comando “grep” junto com outro
Machine Translated by Google

comando, “|” (cachimbo), nos ajudará a fazê-lo.


Na verdade, dizemos ao terminal para exibir o conteúdo de "[Link]" primeiro
e, em seguida, canalize esse termo para o nosso processo de pesquisa. Vamos ver como funciona.
Se simplesmente escrevermos um comando como “cat [Link]”, ele
exibirá uma longa lista dos fontes deste sistema Linux. Você pode escrever e vê-
los. Mas estamos interessados em pesquisar a palavra “src” e queremos ver
quantas vezes essa palavra foi usada no “[Link]”.
Portanto, o comando final e a saída são assim:

hagudu@hagudu-H81M-S1:/etc/apt$ cat [Link] |


grep src
deb-src [Link] trusty principal restrito

deb-src [Link]
trusty-updates principal restrito deb-src http://
[Link]/ubuntu/ universo confiável

deb-src [Link]
universo de atualizações confiáveis
deb-src [Link] trusty multiverse deb-src http://
[Link]/ubuntu/ trusty-updates multiverse deb-src http://
[Link] .[Link]/ubuntu/ trusty-backports principal universo restrito
multiverso deb-src [Link] trusty

segurança principal restrita


deb-src [Link] confiável
universo de segurança
deb-src [Link] trusty security multiverse # deb-
src [Link] trusty partner

deb-src [Link] trusty main # deb-src http://


[Link]/ubuntu trusty universe hagudu@hagudu-H81M-S1:/etc/
apt$

É interessante notar que primeiro emitimos um comando como este: cat


Machine Translated by Google

[Link] | grep src E a


saída longa que segue esse comando tem todas as instruções que contêm “src”.

Podemos até filtrar o arquivo de origem de forma mais distinta. Podemos restringir nosso
pesquise mais e diga ao terminal para encontrar a palavra “src” apenas com letras
minúsculas anotando este comando:

cat [Link] | grep –i src

No futuro, usaremos extensivamente este comando “grep” para escanear um


rede com uma determinada palavra.
Outro comando importante é “eco” . Este comando literalmente ecoa
tudo o que você escreve no seu terminal. Você também pode fazer algo mais com este
comando. Você pode até alterar um arquivo de texto com este comando.
Anteriormente, escrevemos um arquivo de texto “[Link]” e o salvamos em nosso
diretório pessoal. Agora vamos sobrescrever esse arquivo com este comando “echo”.

hagudu@hagudu-H81M-S1: $ echo "NÃO GOSTO DISSO


NOVEL MAIS ENTÃO MUDAREI" > [Link] hagudu@hagudu-H81M-
S1: $ cat [Link]

NÃO GOSTO MAIS DESSA NOVELA ENTÃO MUDAREI

hagudu@hagudu-H81M-S1: $

Primeiro, ecoamos algum texto em nosso terminal e, em seguida, usamos “>” (sinal de
maior que) para colocar esse texto no arquivo “[Link]”. No próximo comando, usamos
novamente o comando “cat” para ler o arquivo “[Link]” e descobrimos que o arquivo foi
alterado.
Agora vamos aprender como criar diretórios no Linux. Há um muito útil
comando: “mkdir”. Significa claramente "criar diretório". Vamos criar um diretório
com o nome deste projeto: “Ethical Hacking”. Você pode imaginar que o comando é
extremamente simples: mkdir Ethical Hacking Não, não é. Nesse caso, se você escrever
dessa maneira, o terminal Linux entenderá
algo mais. Ele compreende que você deseja criar dois diretórios separados. Um
é “Ético” e o outro é “Hacking”. Ele já criou dois diretórios dessa forma. Portanto, vamos
removê-los primeiro e, a seguir, criaremos um diretório com um significado mais significativo.

Para remover um diretório, você deve ter o privilégio “root”. Significa que você é um
Machine Translated by Google

administrador ou superusuário do sistema. No Ubuntu, se quisermos ser um “root” ou


“superusuário”, emitimos primeiro o comando “sudo”. No Kali Linux é diferente: “su”. Mas em
ambos os casos, depois de escrever esse comando, o sistema solicitará a senha por meio do
terminal. Vamos ver como funciona.
Primeiro, emitimos o comando e, na próxima etapa, verificamos com o comando “ls”
se esses diretórios ainda existem.

hagudu@hagudu-H81M-S1: $ sudo rm -rf Ético/


Hacking/
[sudo] senha para hagudu: hagudu@hagudu-
H81M-S1: $ ls

Funcionou - dois diretórios foram removidos com sucesso. Vamos tentar entendê-lo
mais. Já sabemos que o comando “rm” representa a palavra “remover”. Mas e o comando “-
rf” que o segue? O comando “-rf” significa “faça recursivamente com força”. Geralmente este
comando “-rf” é usado para remover diretórios. Você deve ter muito cuidado ao usar este
comando porque no Linux, depois de usar este comando, o arquivo ou diretório é excluído
permanentemente. É quase impossível recuperá-los. É sábio ter muito cuidado ao usá-lo.

Espero que você também tenha notado que iniciamos nossa linha de comando com
“sudo” sempre forneça
. E vocêaescreve
senha que vocêele
“sudo”, costuma
pede a digitar
[Link] fazer
Neste login
caso, no sistema.
você

Vamos novamente fazer o diretório corretamente e desta vez o nomeamos “Ethical


Hacking”, para que o sistema não o interprete mais como dois diretórios separados.

hagudu@hagudu-H81M-S1: $ mkdir Ethical-Hacking hagudu@hagudu-H81M-S1:


$ cd Ethical-Hacking/ hagudu@hagudu-H81M-S1: /Ethical-Hacking$ ls
hagudu@hagudu-H81M-S1: / Hacking ético$ touch file1 file2

hagudu@hagudu-H81M-S1: /Ethical-Hacking$ ls arquivo1 arquivo2


hagudu@hagudu-H81M-S1: /Ethical-Hacking$

Primeiro criamos o diretório “Ethical-Hacking”. Então usamos “cd” para ir


dentro dele e, com a ajuda do “ls”, verificamos se o diretório está vazio.
Depois emitimos o comando “touch” para criar dois arquivos: “file1” e
Machine Translated by Google

“arquivo2”. Novamente, emitimos o comando “ls” para verificar se dois arquivos foram
criados com sucesso.
No Ethical Hacking, o anonimato é um grande negócio. No próximo capítulo,
aprenderemos isso em detalhes. Antes disso, você precisa entender que, no processo de
anonimato, é bom ser qualquer usuário e não o usuário root. Como root ou superusuário, você
primeiro adiciona um usuário em seu Kali Linux virtual. Defina uma senha. Desligue Kali. Reinicie
e faça login como o novo usuário. É uma boa prática.

Agora, como você poderia adicionar um usuário? Vamos abrir nosso Kali virtual e como raiz
user, usaríamos o comando “adduser” no terminal. Suponha que nosso novo usuário tenha um
nome como “xman”. Nesse caso, o comando será bem simples: adduser
Homem X.

Depois de emitir este comando, Kali solicita a senha e outros detalhes. Forneça uma senha
forte de pelo menos oito caracteres com caracteres alfanuméricos. Agora desligue sua máquina
e faça login como “xman”. Para outros detalhes, não é obrigatório que você forneça sua
identidade real. Você pode preenchê-los com quaisquer dados.

Como root ou superusuário, você pode adicionar quantos usuários desejar. Você pode
excluí-los a qualquer momento. Você pode restringir suas atividades de qualquer ângulo.
Como administrador, você pode adicionar um usuário que não poderá fazer login após seis
meses. Você pode criar grupos e definir uma regra para que a entrada seja restrita. Alguns
usuários podem entrar nesse grupo. Alguns não podem.
Primeiramente você precisa adicionar um usuário, “xman”, e logar no sistema como o
novo. Um usuário não tem permissão para acessar ou adulterar qualquer arquivo do root
ou superusuário. Mas como superusuário, você sempre pode alterar a permissão do arquivo. É
um conceito muito importante de todos os ângulos. Na Internet, o conceito de permissão de
arquivo é extremamente importante.
Qualquer arquivo tem três tipos de permissões relacionadas a ele. Pode ser apenas
"somente leitura". O significado é claro. Você não pode escrever nele ou executá-lo. Pode ser
"somente gravação". Outro estado do arquivo é “modo executável”. Se for executável, você pode
executar qualquer ação ao executá-lo. Você pode escrever um programa Python simples.
Este programa receberá entradas dos usuários e fornecerá saídas. Depois de escrever um
arquivo Python, você pode torná-lo executável.
Vejamos como isso acontece. Vamos abrir nosso terminal Kali Linux e, com o
ajuda do comando “ls” , vemos o que temos lá atualmente.

sanjib@kali: $ cd Documents/ sanjib@kali: /


Documents$ ls [Link]
Machine Translated by Google

sanjib@kali: /Documents$ ls -la total 7048 drwxr-xr-


x 2 sanjib sanjib 4096 29 de maio 10:30 . drwxr-xr-
x 18 sanjib sanjib 4096 3 de junho 09:59 .. -r-xr-xr-x 1 root root 7208397 29 de
maio 10:30

[Link]
sanjib@kali: /Documentos$

Primeiro, vamos para a pasta "Documentos" e executamos o comando "ls". Isso


mostra apenas um arquivo: “[Link]”. Nosso próximo comando é “ls
– la”. Significa: queremos uma listagem de todos os arquivos com todos os detalhes. Você
pode ver a diferença acima. A saída está em vermelho. Ele mostra dois arquivos ocultos
com o arquivo visto anteriormente. E também mostra os proprietários dos arquivos e também
mostra as permissões. Consideremos esta linha minuciosamente.

-r-xr-xr-x 1 root root 7208397 29 de maio 10:30


[Link]

Ele nos diz que o dono deste arquivo é “root”. E a linha de partida também é muito
importante. Ele lida com permissões de arquivo.

r-xr-xr-x

O que isto significa? Tem três partes distintas. A primeira parte é “rx”. A segunda e
terceira partes também são as mesmas: “rx”. A primeira parte é para o proprietário do
arquivo ou usuário atual. A segunda parte é para “grupo”. E a parte final ou terceira é
para o superusuário que está visualizando este arquivo. Já criei outro usuário, “sanjib”,
e loguei como “sanjib”. É por isso que você vê este tipo de saída: sanjib@kali:ÿ/
Documents$ ls -la
Agora para deixar esse conceito mais claro vamos criar um usuário chamado “xman”.
E faremos login como “xman” e veremos o que temos em nossa pasta Documentos.
Para criar um novo usuário, você precisa fazer login como root ou superusuário.
Vamos supor que tenhamos logado como “root”. Os comandos e a saída são fornecidos
abaixo.

root@kali: # adduser xman Adicionando


usuário `xman' ...
Adicionando novo grupo `xman' (1002) ...
Adicionando novo usuário `xman' (1001) com o grupo `xman'...
Machine Translated by Google

Criando o diretório pessoal `/home/xman'...


Copiando arquivos de `/etc/skel'...
Insira a nova senha UNIX: Redigite a
nova senha UNIX: passwd: senha
atualizada com sucesso Alterando as informações do usuário
para xman Insira o novo valor ou pressione ENTER para o
padrão
Nome completo []: xman anonymous Número
do quarto []: 123 Telefone comercial []: 321
Telefone residencial []: 213 Outro []: anon As
informações estão corretas? [S/n] e root@kali:
# Parabéns! Você acabou de criar com sucesso
um novo usuário chamado 'xman'. Você percebe que ele
pediu a senha e disse para você redigitar a senha do UNIX
novamente.

Vamos sair como “root” e entrar como “xman”. Vamos também para a pasta
“Documentos” do “xman” e ver o que temos.

xman@kali: $ cd Documents/ xman@kali: /


Documents$ ls xman@kali: /Documents$ ls
-la total 8 drwxr-xr-x 2 xman xman 4096 Jun 3
10:33 .

drwxr-xr-x 14 xman xman 4096 3 de junho 10:33 .. xman@kali: /


Documentos$

Tudo corre como esperado. Só falta uma coisa. Este novo usuário
não tem esta linha: -r-xr-xr-x 1 root root 7208397 29 de maio 10:30
[Link].
Talvez tenhamos movido esse arquivo executável de qualquer pasta raiz
para a pasta “Documentos” do usuário “sanjib” antes.
Agora já sabemos como criar um arquivo usando o editor de texto “nano”. Assim, podemos
seguir em frente e ter um arquivo Python bem pequeno. Presumivelmente,
então mantenho
vocêtudo
nãomuito
conhece
simples
Python,
apenas para mostrar como podemos alterar as permissões de arquivo.
Machine Translated by Google

#!/usr/bin/python3 print("Digite
seu nome.") inputs = input(">>>>>>")
outputs = inputs def main(): print(outputs)
if __name__ == '__main__': principal()

Dentro do editor “nano” escrevemos um programa simples que receberá entrada


e dará saída. Salve o arquivo como “[Link]” e saia de “nano” e vamos emitir “ls – la”
para ver o que ele mostra.

xman@kali: /Documents$ ls -la total 12 drwxr-xr-


x 2 xman xman 4096 3 de junho 10:50 .

drwxr-xr-x 15 xman xman 4096 3 de junho 10:42 .. -rw-r--r-- 1 xman xman


86 3 de junho 10:44 [Link] xman@kali: /Documents$

Como você vê, o arquivo diz tudo. Ele diz que agora a pasta “Documentos” tem um
novo arquivo, “[Link]”, e foi criado às 10:44. O proprietário é “xman” e tem permissões
de arquivo como esta: rw-r--r-- Agora você sabe o que isso significa. Significa: o usuário
“xman” pode ler e escrever este arquivo, mas não pode “executar” este arquivo.

xman@kali: /Documents$ chmod +x [Link] xman@kali: /Documents$


ls -la total 12 drwxr-xr-x 2 xman xman 4096 Jun 3 10:50 . drwxr-xr-x
15 xman xman 4096 3 de junho 10:42 .. -rwxr-xr-x 1 xman xman 86 3
de junho 10:44 [Link] xman@kali: /Documents$

Veja como usamos o comando “chmod” para alterar a permissão do arquivo


para executável. Depois de alterar a permissão do arquivo para executável, ele
muda a cor para verde. E também veja a permissão do arquivo:
rwxr-xr-x
A primeira parte eu marquei em vermelho para vocês entenderem a diferença
Machine Translated by Google

entre eles. A primeira parte da permissão diz que “x” foi adicionado desde que usamos o
comando “xman@kali:ÿ/Documents$ chmod +x [Link]” .
Vamos executar o arquivo e ver como ele pega a entrada e dá a saída.

xman@kali: /Documents$ ./[Link]

Digite seu nome.

>>>>>>xman
Homem X

Quando você executa o arquivo, ele pede para digitar seu nome e devolve gentilmente
a saída.

Resumo Você
aprendeu alguns comandos básicos do Linux neste capítulo. Agora pelo menos você tem uma
ideia de como um sistema Linux está funcionando e como você pode usar seu terminal ou
linha de comando para operar seu sistema.
No processo de aprendizagem do hacking ético, você o considera extremamente útil.
No futuro, você precisará aprender mais alguns comandos do Linux. Seu conhecimento de
Linux ou qualquer outro sistema operacional deve ser louvável. À medida que você progride,
espero, seu “apetite vem com a alimentação”.
Discutimos rudimentos suficientes para pisar no chão do hacking ético. Agora é hora
de seguir em frente. Estamos prontos para dar o primeiro passo importante no mundo do
hacking ético aprendendo uma linguagem de programação muito útil: Python 3.

Discutimos o Python 3 de maneira que você não precise de programação


fundo. Ele foi discutido detalhadamente para que você alcance o estágio intermediário
e escreva seu próprio programa em Python 3. À medida que avança no vasto universo do
hacking ético, você descobrirá a importância de aprender Python.
Machine Translated by Google

parte II
Machine Translated by Google

© Sanjib Sinha
2017 Sanjib Sinha, Beginning Ethical Hacking with Python, DOI 10.1007/978-1-4842-2541-7_6

6. Python 3 e Hacking Ético

Sanjib Sinha 1

(1) Howrah, Bengala Ocidental, Índia

O Python pode fazer muitas coisas, especialmente no campo de soquete e rede.


Além disso, no monitoramento do sistema tem grande importância. No nível avançado de
hacking ético, ele pode lançar um feitiço mágico. Você pode escrever seu próprio programa
Python para qualquer tipo de finalidade de segurança.
Lembre-se, qualquer programa escrito em Python ou qualquer linguagem emite
algumas instruções . E são mais ou menos iguais. Eles são:
ENTRADA: Obtenha dados do teclado ou de qualquer arquivo ou fonte.
SAÍDA: Exibe dados na tela ou envia para qualquer arquivo, dispositivo ou qualquer outro
fonte.

MATEMÁTICA: Faça algumas operações matemáticas básicas como somar,


subtrair, multiplicar ou dividir. Pode ser complexo também. Depende da sua aplicação.

EXECUÇÃO CONDICIONAL: Verifique se as condições estão devidamente


conheceu. Como “se isso é verdade, então faça outra coisa/faça outra coisa”.
REPETIÇÃO: Executar alguma ação repetidamente.
A maioria das pessoas costumava ter uma plataforma Windows ou Macintosh em casa.
Antes de começar, peço que experimente o Linux como um sistema operacional duplo. Existem
muitas distribuições Linux gratuitas e fáceis de usar disponíveis. Você pode tentar o Ubuntu ou
qualquer pacote Debian. Basta baixar a imagem ISO estável e gravá-la em um DVD e instalá-la
junto com o sistema operacional em execução. Isso vai ajudar. O Python vem com todas as
distribuições do Linux.
O Linux disponível rodará dentro do Windows, então sempre que você quiser tentar
qualquer linguagem de programação de código aberto como Python ou PHP, você pode
aproveitá-la. Você pode tentar o terminal Linux sempre que necessário.
Basicamente, Python vem com qualquer distribuição Linux, então você não precisa
Machine Translated by Google

se preocupe com a instalação no Linux. Isso também é uma vantagem.


Se você quiser manter o Windows, visite a seção de download do site oficial do Python.
De acordo com a configuração do seu sistema, baixe o arquivo “[Link]”
windows.
paraAo
extrair esse arquivo, você obterá o “pacote do Windows Installer python-3.4.4”. Basta executá-lo e
seguir os passos simples. Sugiro que você baixe a documentação junto com o pacote do instalador.
Esta documentação é extremamente útil, não apenas para iniciantes, mas também para
programadores experientes. Após o download, abra a documentação.

Esta documentação foi desenvolvida exclusivamente para programadores, não


para iniciantes. Mas como iniciante, você precisa se acostumar com este manual para que, após
um certo período, ele se torne parte de sua vida de programação.
Quase todos os problemas de programação possíveis são discutidos nesta
documentação e, além disso, você pode desenvolver o código e criar um aplicativo incrível
com a ajuda desta documentação.
Se parece com isso:

Figura 6-1. página de documentação do Python 3


Machine Translated by Google

© Sanjib Sinha
2017 Sanjib Sinha, Beginning Ethical Hacking with Python, DOI 10.1007/978-1-4842-2541-7_7

7. Ambiente Python
Sanjib Sinha 1

(1) Howrah, Bengala Ocidental, Índia

Você vai aprender Python 3. Python 2 já existe há muito tempo e tem uma enorme biblioteca e
suporte a módulos, mas Python 3 é a linguagem do futuro.
Você também pode instalar facilmente o Python 3. Consulte a seção de download do site
oficial. Em qualquer distribuição Linux moderna, abra seu terminal
fornecerá
e digiteo “python3”.
interpretador
Ele
Python ou shell onde você pode escrever seu código.

Lembre-se, o Python vem com todas as distribuições modernas do Linux. Então você não
precisa mais instalá-lo. Mas alguns pacotes que você pode precisar instalar. Existem muitos
tutoriais e muita ajuda da comunidade que você pode obter pela Internet.
O interpretador Python em uma distribuição Linux típica se parece com isto:
Machine Translated by Google

Figura 7-1. Imagem do interpretador Python

Em qualquer distribuição Linux moderna, você não precisa fazer nada. Abra o
terminal e digite “python3”, e você terá uma saída como esta:

hagudu@hagudu-H81M-S1: $ python3 Python


3.4.3 (padrão, 14 de outubro de 2015, [Link])
[GCC 4.8.4] no linux Digite
"help", "copyright", "credits" ou "license"
Para maiores informações.
>>>

Ele diz que meu computador tem Python 3.4.3. Agora você pode escrever algum
código diretamente nele para obter uma saída como esta:

>>> nome = "Sanjib" >>>


print(nome)
Sanjib
>>>

No Linux, primeiro você salva um arquivo Python. Escreva este código:

<código>
Machine Translated by Google

#!/ usr/ bin/ python3 def


main():
print("Olá Python!") if
__name__ == "__main__": main() </
code>

Se você é novo no Linux, primeiro salve este arquivo Python como “[Link]” e
depois mude-o para executável com este comando:

sudo chmod +x olá.py

No terminal, execute este arquivo com este comando:

./olá.py

Ele dará a saída: Hello Python!


Este é o seu primeiro código Python.
Para Windows, baixe o instalador e o documento do Python. O documento vem em
um arquivo “.chm”. Isso ajudará mais tarde. Para instalar o Python, basta executar o instalador.
Ele será instalado em sua unidade “C” em um minuto. Agora você pode ir para “todos
os programas” e executar o Python a partir daí. Normalmente, um pequeno IDE chamado
IDLE vem com o Python. Você pode escrever código e apenas executá-lo. Vejamos como fica:
Machine Translated by Google

Figura 7-2. Python IDE no Windows

Na imagem acima, você vê no topo o IDLE, que é o Python Shell.


Você pode obter diretamente a saída dele. Você também pode acessar a seção de arquivos
do IDLE e criar um novo arquivo. Eu fiz isso. Eu criei um arquivo, ”[Link]”, e escrevi algum
código nele. Em seguida, a partir do IDLE, você pode executar este módulo ou apenas
pressionar F5 e ele continuará em execução. Como você pode ver na figura, nosso código
Python desenhou uma bela forma. No Windows 7 ou posterior, você pode abrir o Power Shell e
digitar a mesma coisa e obterá o mesmo resultado. Mas prefiro que você instale primeiro um
bom editor de texto Python ou IDE.
Para Linux, a edição da comunidade “Pycharm” é uma boa escolha. É de graça. Para
Windows ou Mac, existem vários bons editores de texto gratuitos. Pesquise na Internet
e instale. A principal vantagem é que você não precisa recuar cada linha de código. É
automatizado. Em segundo lugar, o suporte de uma grande biblioteca Python está disponível
em cada IDE.
Machine Translated by Google

© Sanjib Sinha
2017 Sanjib Sinha, Beginning Ethical Hacking with Python, DOI 10.1007/978-1-4842-2541-7_8

8. Sintaxes Gerais
Sanjib Sinha 1

(1) Howrah, Bengala Ocidental, Índia

Neste capítulo aprenderemos algo apenas para experimentar alguns códigos. Aprenderemos as
mesmas coisas em detalhes mais tarde. Tudo o que precisamos fazer agora é tentar escrever
algum código em Python e ver como funciona. Ao mesmo tempo, aprenderemos sobre as sintaxes
gerais usadas frequentemente em Python.

Crie a função main( ) Como eu disse, os


scripts Python são quase como a linguagem humana. Você não precisa usar muitos
caracteres ou símbolos especiais. Tudo o que você precisa lembrar é que “indentação”
desempenha um papel muito importante no Python. Quando você aplica algumas
condições especiais dentro do seu código, esse recuo é importante.
Poucas coisas se repetem em todos os códigos. Assim, você pode escrevê-lo em um arquivo
separado e apenas usá-los em cada novo arquivo Python. O código da estrutura de sintaxe geral
se parece com isto:

<código>

#!/ usr/ bin/ python3 def main():

print("Eu sou um arquivo Python de sintaxe geral") if __name__ ==


"__main__": main() </code>

Salve este arquivo como “[Link]”. Quando você executar este arquivo, ele dirá
ou imprimirá: “Eu sou um arquivo Python de sintaxe geral”.
Machine Translated by Google

A primeira linha, “#!/ usr/ bin/ python3”, denota o caminho do interpretador


Python. A grandeza do Python é que ele permanece o mesmo em todos os sistemas
operacionais. Na segunda parte, definimos uma função main() e, sob essa função
main(), não podemos, podemos
chamarchamar
uma função antes
qualquer de ser
função. Semdefinida. Considere
uma função main(),este
você
exemplo:

<código>
#!/ usr/ bin/ python3 def
main():
print("Eu sou um arquivo Python de sintaxe geral")
Deixe-nosFazerAlgo()

def LetUsDoSomething():
print("Estou fazendo algo")

if __name__ == "__main__": main() </


code>

Agora ele dará uma boa saída como esta:

Eu sou um arquivo Python de sintaxe geral


Eu estou fazendo algo

Suponha que você não tenha nenhuma função main(). Agora, se você quiser
chamar a função LetUsDoSomething() antes dessa função ser definida, ela dará
um erro.
Tente este código e veja o erro:

<código>

#!/ usr/ bin/ python3


LetUsDoSomething() def
LetUsDoSomething(): print("Estou
fazendo algo") </code>

Ele diz: NameError LetUsDoSomething() não está definido. Você


sempre pode chamá-lo depois que a função é definida. Nesse caso, você não precisa
definir a função main(). Mas em uma longa linha de código onde muitas funções são
Machine Translated by Google

envolvidos, nem sempre é possível mantê-lo. Para resolver esse problema, é uma boa
prática definir primeiro a função main(). Depois disso, você pode escrever qualquer
função após a função main() e chamá-la dentro de main().

Recuo e espaço em branco Eles desempenham


um papel muito importante quando você trabalha com Python.
Recuo ou espaço em branco é muito, muito importante. Antes de começar
a aprender Python, você precisa entender isso corretamente. Considere este código:

<código>
# codificação=utf-8
def main():
print('Uma linha dentro da função principal.')
print("Uma linha fora da função principal.") if __name__
== main():main() </code>

Olhe para este código. A função print() dentro da função main() foi recuada. Tem
cerca de quatro espaços. E a segunda função print() está fora da função main(). E veja o
código; ele cai na mesma linha com a função main(). Portanto, quando executamos este
programa, a função externa print() é executada primeiro. E a saída é assim:

//saída Uma
linha fora da função principal.
Uma linha dentro da função principal. //
saída finalizada

Se tentarmos empurrar a função print() de fora um pouco para dentro, isso dará um
erro, porque o interpretador Python pensará que está dentro da função main().
Na verdade, isso não é verdade. Se quisermos enviar essa “função externa print()
” para dentro da função main(), função
precisamos
print()colocá-lo
assim: na mesma linha do interior

<código>
# codificação=utf-8
def main():
print('Uma linha dentro da função principal.')
Machine Translated by Google

print("Uma linha fora da função principal.") if __name__


== main():main() </code>

Agora a saída muda. Se parece com isso:

//saída Uma
linha dentro da função principal.
Uma linha fora da função principal. //saída
finalizada

Aprendemos uma lição muito importante que devemos aprender de cor. A lição
é: espaço em branco ou recuo em Python desempenha um papel importante. Quando
escrevemos uma função e colocamos algumas outras funções dentro dela, elas devem cair na mesma linha.
Em qualquer editor de texto ou IDE, isso é feito automaticamente. Quando você pressiona
a tecla “enter” ou “return”, as linhas seguintes continuam caindo na mesma linha. Se você
quiser sair dessa função, basta seguir o primeiro exemplo. Apenas para entender como a
indentação funciona em Python, escrevemos um código um pouco extenso e vemos como
fica.

<código>
# codificação=utf-8
def main():
# print('Uma linha dentro da função principal.') # #
print("Uma linha fora da função principal.")

OutsideMainFunction() def
OutsideMainFunction(): x = 0 while x
< 5: print(x) x = x + 1

if __name__ == main():main() </code>

Veja o código. Temos uma função main(). Adicionalmente, temos uma


função chamada “OutsideMainFunction() '”. Está realmente fora da função
main(). Portanto, são funções diferentes e têm suas próprias indentações.
Dentro de “OutsideMainFunction ()” vemos um “loop while”. Que “enquanto
Machine Translated by Google

loop” também tem seu próprio recuo. Na verdade, é melhor chamá-lo de "bloqueio".
Portanto, cada bloco de código tem seu próprio “espaço em branco” ou o código dentro
desse bloco é recuado de acordo. Se você não usa nenhum IDE e tenta escrevê-lo em
seu terminal, deve usar a barra de espaço. Dentro de uma função, se você usar “quatro
espaços”, então o que quer que você escreva dentro dessa função deve cair na mesma
linha. Ou seja, sempre que você escreve uma nova linha, ela deve ter “quatro espaços”.
Você não pode dar dois ou três espaços de repente. Mas se você escrever outra função,
poderá alterar essa regra. Nesse caso, a nova função tem seu próprio bloco de código e
sua própria regra. Você pode usar dois espaços agora.

Comentar Em
qualquer tipo de programação, comentar é muito importante. Outro
programador lerá seu programa. Cada passo seu deve ser legível. Se houver algum
tipo de reviravolta ou você tentar algo especial, você deve explicar isso dentro do seu
código. Considere este código:

<código>
# esta é a função main() def main():

OutsideMainFunction()
# esta função está fora de main() function def
OutsideMainFunction(): x = 0 while x < 5: print(x) x = x + 1

if __name__ == main():main() </code>

Normalmente, qualquer comentário é escrito com uma marca # (hash).


Quando o interpretador Python vê #, ele sabe que é um comentário e o ignora. Em
nosso código, definimos claramente o que é a função main() e também dizemos em
nossos comentários que existe outra função que está fora da função main().
Normalmente um programador experiente nunca comenta coisas tão simples. Mas
para começar, você pode adicionar comentários quando achar necessário. Porque depois
de algum tempo, quando você revisitar seus códigos antigos, poderá se lembrar por que fez
isso. Comentar é útil nesse sentido. Ao mesmo tempo, você não pode confiar em todos os
comentários. Os programadores muitas vezes se esquecem de alterar os comentários quando eles
Machine Translated by Google

mudar seus códigos.

Atribuindo valores Em
Python, o operador de atribuição é um sinal de igual (=). Quando você escreve “a =
10”, significa que “a” é uma variável ou um contêiner. Esta variável “a” é atribuída a
um valor inteiro. Qual é esse valor? É 10. Esse valor poderia ser uma string. O que é
uma corda? Uma string é uma adição de caracteres. Suponha que você escreva “b =
Dois”. Significa que a variável “b” é atribuída a um valor de string, e essa string é “Dois”,
que nada mais é do que três caracteres: “T”+“w”+“o”.
De acordo com sua atribuição, o Python interpreta o valor e mantém um local de
armazenamento definido para eles. Ele sabe quantos bits e bytes serão necessários
para eles.
Em Python, tudo é objeto. Python é uma programação orientada a objetos
linguagem. Como iniciante, você pode não entender esse conceito. Não se preocupe.
Discutiremos isso em detalhes à medida que progredirmos. Você aprenderá. Atualmente
você apenas lembra que um objeto significa uma instância de classe. Imagine-se como
um objeto. Nesse caso, você é uma instância da classe “humana”. Você tem algumas
propriedades como altura, largura, etc. Você também pode fazer algo. A classe “humana”
é um projeto de você e de outros humanos e na classe “humana”, tudo foi bem definido.
Existem muitas propriedades e muitos verbos de ação definidos. E de acordo com essa
definição, você, eu e outros humanos continuamos fazendo coisas.

Quando dizemos em Python que tudo é um objeto, significa que tudo tem uma classe
ou projeto por trás. Escrevemos assim:

<code>
#!/ usr/ bin/ python3 #
coding=utf-8 a = 1 print(a)
print(type(a)) print(id(a)) a
= "One" print(a) print(type
(a)) print(id(a)) </código>
Machine Translated by Google

E a saída é assim:

// saída 1

<class 'int'>
139113568
One
<class 'str'>
3073583584 //
saída finalizada

No próximo capítulo, aprenderemos sobre isso com mais detalhes.


Machine Translated by Google

© Sanjib Sinha
2017 Sanjib Sinha, Beginning Ethical Hacking with Python, DOI 10.1007/978-1-4842-2541-7_9

9. Variáveis, Objetos e Valores


Sanjib Sinha 1

(1) Howrah, Bengala Ocidental, Índia

Em Python tudo é um objeto. Para começar, você precisa se lembrar de algumas


coisas:

1. Variáveis, funções e até código são objetos.

2. Todo objeto tem um ID, tipo e valor.


ID significa identificação de uma instância particular de um objeto. Esse
O ID não pode mudar durante o tempo de vida desse objeto.

3. Tipo identifica uma classe de um objeto. Não pode mudar para a vida de
objeto.

4. Valor é o conteúdo do objeto e objetos mutáveis só podem mudar de valor. Objetos


imutáveis não podem mudar de valor.

5. Cada variável em Python é um objeto de primeira classe. O que parece uma variável
simples na verdade é algo mais complexo.
Vejamos o que significam esses termos.

<código>
#!/ usr/ bin/ python3 def main():
x=1
Machine Translated by Google

print(x)
print(id(x))
print(type(x)) x = 2
print(x) print(id(x))
print(type(x)) x = 1
print(x) print(id( x))
print(tipo(x))

if __name__ == "__main__": main() </


code>

Aqui está a saída:

<blockquote> 1
10455040 classe
'int' 2 10455072
classe 'int' 1
10455040 classe
'int' </blockquote>

Como você pode ver, alterar os valores de “x” não afeta os objetos imutáveis
e o identificador exclusivo do objeto “1” permanece o mesmo. O que foi alterado é
simplesmente a referência da variável. Primeiro, referimos “1” (objeto inteiro
imutável) a “x” (variável) e depois o alteramos. O ID e o tipo permanecem os mesmos.
Lembre-se, números, strings e “tuplas” são imutáveis. Listas,
dicionários e outros objetos são mutáveis (alteráveis), mas dependem.
Vejamos um exemplo muito breve onde é explicado na seção de
comentários. A saída é dada junto com ele.
Machine Translated by Google

<code>
#!/ usr/ bin/ python3 # em
python tudo é objeto # uma variável é uma
referência a um objeto # cada objeto tem uma identidade
ou um ID x = 1 print(type(x)) print(id(x) ))
################# # classe 'int' # 139113568
################## # número, string, tupla -> imutável
# lista, dicionário -> mutável x = 1 y = 1 print(type(x))
print(id(x)) print(type(y)) print(id(y)) if x == y :
print("Verdadeiro")

outro:
print("False") se x
for y: print("True")
senão:

print("False")
################## #
veja as duas últimas linhas, ambas são verdadeiras #
class 'int' # 139113568 # class 'int' # 139113568

# Verdadeiro
#
Verdadeiro
################## a = dict(x = 1, y = 1)
Machine Translated by Google

print(type(a))
print(id(a)) b =
dict(x = 1, y = 1) print(id(b)) if a
== b: print("True") else:

print("False") se a
for b: print("True") senão:

print("False")
################## #
veja as duas últimas linhas, uma é verdadeira, mas o id não é o
mesmo, então é falso
# classe 'dict' #
3072650252 #
3072692524
# Verdadeiro
# False
################## para
i in range(0, 3):
print(i, "=", id(i))
################## # 0 =
139113552 # 1 = 139113568 # 2 =
139113584 ####### ###########
< / código>

Vemos a saída dentro do código. Você percebe que cada saída é


comentada para que, quando executarmos esse código, isso nunca afete o
script principal. Existem muitos valores. Inteiros, strings, tuplas, listas e
finalmente dicionários.
Agora vamos entender o que realmente são e como funcionam.

Usando Números
Machine Translated by Google

Em Python existem dois tipos de números. Um é um número inteiro e o outro é


um float. Temos métodos internos em Python que podem alterar um inteiro para
um float e alterar um float para um inteiro. Espero que você entenda o código abaixo.
A saída é autoexplicativa. Leia o comentário também.

<código>
#!/ usr/ bin/ python3 def
main(): x = 3

print(x)
print(id(x))
print(type(x))
print("*********") x = 3 /2
print(x) print(id(x))
print( type(x))
print("*********") x =
round(42 / 9) print(x)
print(id(x)) print(type(x))
print("** *******") #
queremos arredondar
para cima x = 42 // 9
print(x) print(id(x))
print(type(x)) print("********
**") # quantos dígitos queremos
arredondar para x = round(42 / 9,
3) print(x) print(id(x)) print(type(x))
print("****** ***") x = 43% 7 print(x)
Machine Translated by Google

print(id(x))
print(type(x))
print("*********") x =
int(34.78) print(x)
print(id(x)) print(type(x) ))
print("*********") x =
float(23) print(x)
print(id(x)) print(type(x))
print("******** **") if
__name__ == "__main__":
main() </code>

E aqui está a saída que obtemos deste código:

<blockquote> 3
10455104

classe 'int'
*********
1.5
140223146811728
classe 'flutuar'
*********

4 10455136
classe 'int'
*********

5 140223146823568
classe 'int'
*********
4.667
140223146811968
Machine Translated by Google

classe 'flutuar'
*********

1 10455040
classe 'int'
*********
34
10456096
classe 'int'
*********
23.0
140223146811968
classe 'flutuar'
*********
</blockquote>

Como você vê na saída, cada número tem uma classe e um ID. Para números,
esse ID é imutável. Portanto, se você atribuir o mesmo número (suponha que seja
1) a duas variáveis diferentes, assim: a = 1 e b = 1; o ID de “a” e “b” é o mesmo.

String
Em Python, string é um objeto imutável e pode ser escrito entre aspas
duplas ou simples. Considere este código:
<código>
#!/ usr/ bin/ python3 def
main():
strings = "Eu te amo." print(strings)
anotherStrings = "Eu te amo
mas\nnão sei
quanto você me ama."
print(anotherStrings) if
__name__ == "__main__": main() </
code>

E aqui está a saída:


Machine Translated by Google

<blockquote> Eu
te amo.
Eu te amo, mas
não sei o quanto você me ama. </blockquote>

Como você vê, usamos uma barra invertida para obter uma nova linha. E nós temos um exato
quebrar onde precisávamos.
Há também uma saída de string bruta. Veja este código:

<código>
#!/ usr/ bin/ python3 def
main():
strings = "Eu te amo." print(strings)
anotherStrings = "Eu te amo
mas\nnão sei
quanto você me ama."
print(anotherStrings) rawStrings
= r"Eu te amo, mas\nnão sei o quanto você me ama."

print(rawStrings) if
__name__ == "__main__": main() </
code>

E aqui está a saída:

<blockquote> Eu
te amo.
Eu te amo, mas
não sei o quanto você me ama.
Eu te amo, mas\nnão sei o quanto você me ama. </blockquote>

A última instrução é chamada de string bruta, onde uma barra invertida não está mais
funcionando e obtemos uma saída bruta. E é usado em expressão regular. Discutiremos
isso em detalhes em nosso capítulo sobre expressões regulares.
Podemos inserir um inteiro no meio de uma string. Eu mostro a você os dois
métodos usados em Python 2 e Python 3, mas lembre-se, é melhor você se ater ao
Machine Translated by Google

construção usada em Python 3.


Vamos primeiro ver o código Python 2:

<código>
dias = 8
letras = "%s dias por semana não são suficientes para te amar." %days
print(letras) </code>

A saída é assim:

<blockquote> 8 dias
por semana não são suficientes para te amar. </blockquote>

Vejamos agora o código Python 3:

<code>
days = 8
lyrics = "{} dias por semana não são suficientes para te amar."
print([Link](dias)) </code>

A saída:

<blockquote> 8 dias
por semana não são suficientes para te amar. </blockquote>

Qual é a principal diferença entre essas duas construções? A diferença está na versão
mais recente do Python; tratamos string como um objeto. Portanto, um objeto “letras” usou
um método chamado format() e passou um parâmetro que deseja formatar nele. Na linha
print([Link](days)) usamos um ponto (“.”), para chamar o método format() que está
embutido na classe string.
Em sua vida de codificação, você precisa usar muitas strings e algumas delas. Você
pode ter várias quebras de linha . não pode usar a barra invertida “n” todas as vezes. Isso é
incômodas.
Existe um truque que você pode usar em Python para usar várias novas linhas.
Machine Translated by Google

<code>
newLines = """\
primeira linha
segunda linha terceira
linha
mais por vir...
"""
print(novaslinhas) </
code>

Na saída as linhas se quebram automaticamente.

<blockquote>
primeira linha
segunda linha
terceira linha
mais por vir... </
blockquote>

Agora você pode usar aspas simples em vez de aspas duplas. Você não pode
usar barra invertida no início, mas isso irá gerar um espaço no início da linha.

O que é tipo e ID Python é


uma linguagem de programação orientada a objetos. Tudo aqui é um objeto. Cada
objeto tem uma identificação única, que é conhecida como ID. Vamos abrir nosso
terminal no Linux ou, se você tiver Windows ou Mac, abra o Python Shell e teste
este código:

<código>

>>> x = 10
>>> x
10 >>>
type(x) <class
'int'> >>> id(x)
10455328
Machine Translated by Google

>>> y = 10

>>> e

10

>>> tipo(s)

<class 'int'>

>>> id(y)

10455328

>>> a = dict(nome='sanjib')

>>> um

{'nome': 'sanjib'}

>>> tipo(a)

<class 'dict'>

>>> id(a)

139984318683592

>>> b = dict(nome='sanjib')

>>> b

{'nome': 'sanjib'}

>>> tipo(b)

<class 'dict'>

>>> id(b)

139984318683720
Machine Translated by Google

>>> a == b

Verdadeiro

>>> a é b

Falso

>>>
</código>

Aqui primeiro atribuímos um valor inteiro “10” à variável “x” e depois atribuímos
o mesmo valor a “y”. Posteriormente, verificamos o ID de duas variáveis e descobrimos
que o ID é o mesmo. Dissemos isso na seção anterior. Agora você vê a saída.

Podemos verificar se dois objetos atribuídos a duas variáveis diferentes são os


mesmo ou não, escrevendo desta forma:

<código>

>>> x == y

Verdadeiro

>>> x é y

Verdadeiro

>>>
</código>

Aqui fica evidente que ambas as variáveis “x” e “y” apontam para o mesmo objeto
inteiro, “10”. Portanto, o valor é o mesmo e as variáveis também são as mesmas. Mas isso
não aconteceu no caso de um objeto de dicionário que escrevemos logo depois disso.
Os dicionários “a” e “b” possuem o mesmo valor, mas como os objetos do dicionário
são mutáveis, ele altera o ID.

<código>

>>> a = dict(nome='sanjib')

>>> um
Machine Translated by Google

{'nome': 'sanjib'}

>>> tipo(a)

<class 'dict'>

>>> id(a)

139984318683592

>>> b = dict(nome='sanjib')

>>> b

{'nome': 'sanjib'}

>>> tipo(b)

<class 'dict'>

>>> id(b)

139984318683720

>>> a == b

Verdadeiro

>>> a é b

Falso

>>>
<código>

Ele diz que o ID do dicionário muda, embora duas variáveis tenham os mesmos valores.
Quando verificamos logicamente, diz, sim, o valor de duas variáveis é o mesmo,
mas como o ID é diferente, são objetos diferentes.
Como iniciante, você pode achar esse conceito um pouco estranho. Mais tarde,
porém, à medida que você progredir, descobrirá que esse conceito é extremamente útil.
Se dois dicionário
Um objeto de dicionário precisa ser alterado para fins de programação.
Machine Translated by Google

os objetos têm o mesmo ID, não podemos alterá-los.

Valores Lógicos
Vamos considerar outro shell script para testar valores lógicos: True e False.

<código>
>>> a, b = 0, 1

>>> a == b

Falso

>>> a < b

Verdadeiro

>>> a > b

Falso

>>> a = Verdadeiro

>>> um

Verdadeiro

>>> tipo(a)

<class 'bool'>

>>> id(a)

10348608

>>> b = Verdadeiro

>>> b

Verdadeiro
Machine Translated by Google

>>> tipo(b)

<class 'bool'>

>>> id(b)

10348608

>>>

</código>

Aqui vemos que existem classes “bool” e o operador “==” representa o teste de
qualidade entre dois valores. Como “a” tem valor 0 e “b” tem valor 1, a saída é “False”. “A”
é menor que “b”? Sim. Assim, a saída sai como "True".

Esses "True" e "False" representam classes "bool", . E é “imutável”,


portanto, se duas variáveis forem "True", elas terão o mesmo ID.

Tuplas e Listas.
Python tem muitos tipos sequenciais (listas de coisas). Consideremos este código:

<código>

x = (1, 2, 3, 4) print(x)
print(type(x)) </code>

Tem saída assim:

<blockquote> (1, 2,
3, 4) classe 'tupla'
</blockquote>

Então é da classe “tupla” e tem uma lista de coisas. Lembre-se, a tupla é imutável.
Você não pode inseri-lo ou atualizá-lo. Mas você pode iterar assim:
Machine Translated by Google

<código>
para i em x:
print(i) </
code>

Ele dará todos os números que você tem dentro da tupla.


Pelo contrário, “lista” é outro tipo sequencial que é mutável e você pode alterá-
lo conforme necessário. Considere este código:

<código>
a = [1, 2, 3, 4]
imprimir(a)
imprimir(tipo(a)) </
código>

Tem saída assim:

<blockquote> [1,
2, 3, 4] classe
'lista' </blockquote>

Você pode inseri-lo ou atualizá-lo conforme necessário. Suponha que


você queira acrescentar a “tupla x” nesta lista e também inserir a “tupla x” no início.
Então o código completo fica assim:

<code>
#!/ usr/ bin/ python3 #
tupla x = (1, 2, 3, 4)

# lista a
= [1, 2, 3, 4]

# anexando a tupla x à lista [Link](x)


print(a)

# inserindo a tupla x na primeira posição [Link](0, x)


Machine Translated by Google

imprimir(a)

# Agora iterando a lista final a for i in a: print(i)


</code>

E a saída é assim:

<blockquote> [1,
2, 3, 4, (1, 2, 3, 4)] # após anexar [(1, 2, 3, 4), 1, 2, 3, 4, (1, 2, 3 ,
4)] # depois de inserir

# Quando iteramos a lista 'a' a saída fica assim (1, 2, 3, 4) 1 2 3 4 (1, 2,


3, 4) </blockquote>

Em Python, uma string também é um tipo sequencial e você pode iterar por meio dela.
Considere este código:

<código>

strings = "Isto é uma string." para


WeWillIterateThroughIt em strings:
print(WeWillIterateThroughIt) </code>

E a saída é como de costume:

<blockquote>

oi

s
Machine Translated by Google

eu

s
t
r
eu

n
g
.
</blockquote>

Uma string é um tipo sequencial. Considere este código:

<código>
strings = "string."
print(strings[1:3]) </code>

Isso significa que a string fica assim:

0=s1
=t2=
r3=i
4=n

5=g

Então strings[1:3] significa que a sequência começa na posição 1 e vai até


terceiro nd
posição 3, excluindo a saída posição. Significa que para em 2 posição. Então o
3 é o esperado:

<blockquote> tr </
blockquote>

Dicionário
Machine Translated by Google

Python tem outro tipo de valor agregado muito forte: dicionário. É uma aula, como
sempre. É mais como matriz associativa ou hash em outras linguagens.
Considere este código:

<code>
#!usr/ bin/ python3
EnglishDictionaries = {'bare':'jejune',
'anger':'dudgeon', 'abuse':'vituperate', 'howl':'ululate'}
print(EnglishDictionaries) # obtendo uma forma não
mais legível por humanos para chaves em
EnglishDictionaries:

print(keys, "=", EnglishDictionaries[keys]) </code>

E a saída é:

<blockquote>
{'abuse': 'vituperate', 'bare': 'jejune', 'howl': 'ululate', 'ranger':
'dudgeon'} abuso = vituperate nua = jejune howl = ululate raiva = dudgeon
< / citação em bloco>

Agora podemos classificar este dicionário em ordem alfabética como esta:

<código>

PortugueseDictionaries = {'bare':'jejune',
'ranger':'dudgeon', 'abuse':'vituperate', 'howl':'ululate'}

para chaves em sorted([Link]()): print(keys, "=",


EnglishDictionaries[keys]) </code>

E obtemos uma boa saída limpa em ordem alfabética:

<blockquote>
Machine Translated by Google

abuso = vituperar raiva =


dudgeon nu = jejune uivar =
ulular </blockquote>

Também podemos escrever um dicionário de outra maneira usando uma construção do


dicionário de classe. Considere este código:

<código>

sinônimos = dict(bare='jejune', raiva='dudgeon', abuse= 'vituperate', howl=


'ululate') </code>

Acabamos de alterar o nome da variável, mas usamos o mesmo par de palavras.


Agora podemos classificá-los como antes para obter o mesmo resultado. Lembre-se de uma
coisa: quando você usa a função dict(), você não deve escrever chaves entre aspas, mas
valores de string devem ser citados como eu fiz. Como o dicionário é mutável, você pode
inserir pares de valores-chave nele, como listas.

Object
Python é uma linguagem orientada a objetos. Vamos discuti-lo mais tarde em detalhes.
Digamos que existe uma classe ou blueprint e dessa classe ou blueprint podemos obter vários
tipos de objetos. Faça a aula de humanos. É realmente uma classe muito complexa! Tem
muitos tipos de propriedades; muitos tipos de ações são executadas por esta classe. Quando
criamos um objeto ou instância dessa classe, esse objeto ou instância pode levar adiante todas
as características dessa classe. Lembre-se, sempre houve um ser humano bom e um ser
humano mau.
Vamos supor que uma classe Humano tenha dois tipos de humanos: um é bom e o
outro é ruim. Na realidade, não é tão simples. Mas para começar nosso aprendizado, partimos
de um cenário menos complexo.
Considere o código abaixo:

<code> #!/
usr/ bin/ python3 class Humano:

def __init__(self, kind = "Bom"): [Link] = kind


Machine Translated by Google

def whatKind(self):
retornar [Link]
def main():
GoodHuman = Human()
print([Link]())
BadHuman = Human("Bad")
print([Link]())
if __name__ == "__main__": main() </code>

E aqui está a saída:

<blockquote>
Bom
Ruim
</blockquote>

No código acima, o objeto é a instância de uma classe e encapsula cada


propriedade e método da classe ou blueprint. Na aula acima, assumimos uma
espécie de planta onde todo ser humano é bom. Portanto, no método de
inicialização, escrevemos este código:

<código>
classe Humano:

def __init__(self, kind = "Bom"): [Link] = kind

def whatKind(self):
return [Link] </code>

Aqui, “self” significa uma referência ao objeto. E o próximo parâmetro define


o tipo de objetos humanos que queremos criar.
O que significa esta linha?

<código>
def whatKind(self):
retornar [Link]
</código>
Machine Translated by Google

Ele retorna o valor de que tipo de objeto humano queremos criar. O


os próximos passos são bastante auto-explicativos:

<código>
def main():
GoodHuman = Human()
print([Link]())
BadHuman = Human("Bad")
print([Link]())
if __name__ == "__main__": main() </
code>

Quando criamos nosso primeiro objeto, “GoodHuman”, não precisamos passar


nenhum valor como “good” como valor padrão que já foi passado implicitamente
pelo processo de inicialização. Mas quando queremos criar “BadHuman”, precisamos
passar o valor explicitamente e ele retorna esse valor.
Machine Translated by Google

© Sanjib Sinha
2017 Sanjib Sinha, Beginning Ethical Hacking with Python, DOI 10.1007/978-1-4842-2541-7_10

10. Condicionais
Sanjib Sinha 1

(1) Howrah, Bengala Ocidental, Índia

Em Python existem dois tipos de condicionais. São eles: execuções condicionais


e valores condicionais ou expressões condicionais. Em execuções condicionais,
executamos ou verificamos a condição da instrução. Sabemos que entre dois valores
podem existir três tipos de condições. Ou é menor ou maior ou é igual. Escreva este
código:

<code>
def conditionals_exec(): a, b = 1, 3 if a
< b: print("a é menor que b")

elif a > b:
print("a é maior que b") else:

print("a é igual a b") conditionals_exec()

</código>

A saída é:

######################### # a é
menor que b ###################
######
Machine Translated by Google

A saída é óbvia. Agora você pode alterar o valor e testar o código.


Agora tente reescrever a declaração acima de uma maneira diferente. Podemos dizer
que x é menor que y ou maior que y. Caso contrário, é óbvio que eles são iguais.

<código>

def valores_condicionais(): a, b = 1, 2
declarações = "menor que" se a
< b senão " não
menor que."
print(statements)
conditional_values() </code>

Essas funções podem ser escritas de forma mais conveniente e organizada com
as funções main() agora:

<código>

def principal():
print("Esta é a função principal.")
conditionals_exec() conditional_values()

def conditionals_exec(): a, b = 1, 3 se
a < b:

print("a é menor que b") elif a > b:


print("a é maior que b") else:

print("a é igual a b")

def valores_condicionais(): a, b = 1, 2
declarações = "menor que" se a
< b senão " não
menor que."
print(declarações)

if __name__ == "__main__": main()


Machine Translated by Google

</ código>

Se executarmos este programa agora, a saída será:

######################### # Esta é a
função principal. # menor que # a é menor
que b #########################

Agora podemos mudar o lugar de conditional_values(), e


conditionals_exec() e a saída mudará de acordo:

######################### # Esta é a
função principal. # a é menor que b # menor
que #########################
Machine Translated by Google

© Sanjib Sinha
2017 Sanjib Sinha, Beginning Ethical Hacking with Python, DOI 10.1007/978-1-4842-2541-7_11

11. Voltas
Sanjib Sinha 1

(1) Howrah, Bengala Ocidental, Índia

“While loop” é a forma mais simples de loop em Python. Mas você precisa entendê-
lo corretamente. Caso contrário, pode acabar consumindo sua memória executando o
loop infinito. Normalmente, a maioria dos trabalhos é feita por “loop for”. Mas em alguns casos
especiais, você precisa usar “while loop”. Um entendimento básico é importante.

Loops while Em
inglês simples, costumamos dizer: “Embora seja verdade, ele continua em execução. Enquanto
não é verdade, para”. Logicamente, a mesma coisa acontece aqui. Enquanto uma afirmação é
verdadeira, o processo continua. Você precisa de um mecanismo para interromper esse
processo. Aquilo é importante. Caso contrário, essa declaração consumirá sua memória.
Considere este código:

<código>
b=1
while b < 50: print(b)
b = b + 1 </
code>

O que isso significa? Isso significa que a afirmação “b < 50” é verdadeira até que o conjunto
ou bloco de código seja verdadeiro dentro dela. Dentro do bloco escrevemos “b = b + 1” e antes
do início do loop while definimos o valor de b como 1.
Assim, em cada etapa, b progride adicionando 1 ao seu valor e termina em 49. Em
Machine Translated by Google

a saída você terá de 1 a 49.


Vamos mais longe. Considere este código:

<código>

#!/ usr/ bin/ python3 # série


simples de fibonacci # soma de dois
números define o próximo conjunto a, b = 0, 1 while b < 50:

print(b, end=' ') a, b = b, a


+ b </code>

A saída é bastante óbvia:

<blockquote> 1 1 2
3 5 8 13 21 34 </blockquote>

Para os iniciantes, vamos escrever este código de uma forma mais legível e ele irá
dar uma saída completamente diferente:

<code>
#!/ usr/ bin/ python3 a, b = 0,
1 while b < 30: print(b, end='
') a = b

b = a + b </
código>

Vamos explicar as etapas uma a uma para entendê-lo corretamente.


O loop começa com 1. Na primeira etapa, o valor de “a” é 1. Na próxima etapa
o valor de “b” é 2. Agora o valor de “a” é 2, então o valor de “b” é 4. Agora o valor de
“a” é 4, então o valor de “b” é 8 (4+4) . Agora o valor de “a” é 8 então o valor de “b” é (8 +
8) = 16. Agora o valor de “a” é 16. Qual será o valor de b? Será 16 + 16 = 32. Mas 32 é
maior que 30. Portanto, sairá do conjunto de códigos do loop while.

A saída do código acima será:


Machine Translated by Google

<blockquote> 1
2 4 8 16 </
blockquote>

Vamos escrever todo o código em um novo formato:

<code>
#!/ usr/ bin/ python3 #
série simples de fibonacci # soma
de dois números define o próximo conjunto a, b = 0, 1
while b < 30:

print("a = ", a, "=" , "b = ", b, "," , fim ='


')
a, b = b, a + b
print("***********") a, b = 0, 1
while b < 30:

print("a = ", a, "=" , "b = ", b, "," , fim ='


')
a=b
b=a+b
</código>

E a saída será:

<blockquote> a = 0
eb=1 , a=1eb=1 , a=1e
b=2=5 , a=2eb=3 , a=3eb=5 , a
e b = 8 = 21 , a = 8 e b = 13 , a = 13 e b
,
*********** Linhas de separação *********** a = 0 e b = 1 a = 1 e b = 2 a
= 2 e a = 8 e b = 16 , ,
b = 4 a = 4 e, b = 8 </blockquote> , ,

Agora espero que isso explique como os loops while funcionam.


Machine Translated by Google

For Loops O
loop mais comum usado em Python é o loop for. Na verdade, quase todos os
tipos de tarefas de loop podem ser executados por meio do loop “for”.
Há uma razão, é claro. Com a ajuda do loop for, podemos iterar pelos
objetos Python e podemos iterar pela maioria dos objetos Python.
Vejamos um exemplo:

<code>
#!/ usr/ bin/ python3 song
= open('[Link]') para linhas em
[Link](): print(lines, end='') </
code>

E a saída da música é assim:

<blockquote>
Yo, garota, você me tocou forte, sua
solidão me fez chorar
eu sou um nerd muito burro
Eu pensei sobre as palavras, eu não poderia manter
Então eu choro
Um nerd estúpido
</blockquote>

Temos uma música escrita em um arquivo chamado “[Link]” e apenas iteramos


através deste arquivo. Poderíamos ter iterado linha por linha conforme elas são
indexadas. Considere este código onde acabamos de usar a função "enumerate()"
e o valor do índice:

<code>
# enumerar
músicas = open('[Link]') for index,
lines in enumerate([Link]()): print(index, lines, end='') </
cede>

E a saída é assim:
Machine Translated by Google

<blockquote>
0 Yo, garota você me tocou forte 1 sua
solidão me fez chorar
2 eu sou um nerd tão estúpido
3 Pensei nas palavras, não consegui manter
4 Então eu choro
5 Um nerd estúpido
</blockquote>

Agora, o que significa esta função “enumerate()”? Dicionário diz:


enumeração é um tipo de numeração que é uma lista numerada. Vamos considerar
esta linha de código:

<código>

strings = "Isto é uma string." # agora


vamos descobrir quantos 's' estão dentro desta string para index, s in
enumerate(strings):

se s == 's':
print("Olá, sou 's' e estou localizado na posição
{}".format(index)) </code>

E temos uma saída:

<blockquote>
Olá, sou 's' e estou localizado na posição 3
Olá, sou 's' e estou localizado na posição 6
Olá, sou 's' e estou localizado na posição 10 </blockquote>

Isso é extremamente útil. Você pode pesquisar qualquer caractere dentro de qualquer string. Em
Python, funções ou sub-rotinas são extremamente importantes para a reutilização
de códigos. Podemos chamar uma função várias vezes e passar muitos
argumentos ou parâmetros para obter diferentes efeitos. Agora vamos passar um
. Considere este código abaixo:
parâmetro dentro da função loops()

<código>
#!/ usr/ bin/ python3
Machine Translated by Google

def main():
loops(0)
loops()
loops(3)

def loops(a = 4): for i in


range(a, 6): print(i, " ")
print("*************") if
__name__ == "__main__" :
main() </código>

O que este código significa? Na função loops(), o , nós passamos um


parâmetro a é atribuído a um valor 4. É o valor padrão. Para que no futuro, se
esquecermos de passar algum argumento, o código não seja quebrado.
Chamamos essa função três vezes dentro da função main(), mas com três
valores diferentes de qualquer
, e um argumento.
deles é NULL. Ou seja, não passamos

A saída muda com o novo código:

<blockquote> 0 1

2
3
4
5
*************
4
5
*************
3
4
5
*************
</blockquote>
Machine Translated by Google

Agora é óbvio que você pode brincar com esse código. Você pode passar dois
argumentos dentro da função loops() e controlam a função range() para obter
valores diferentes.
Machine Translated by Google

© Sanjib Sinha
2017 Sanjib Sinha, Beginning Ethical Hacking with Python, DOI 10.1007/978-1-4842-2541-7_12

12. Expressões Regulares

Sanjib Sinha 1

(1) Howrah, Bengala Ocidental, Índia

Pesquisar e substituir por expressões regulares é igualmente fácil e muito simples


por natureza. Para fazer isso, ajustaremos um pouco nosso código antigo. Usamos o
módulo “re” e ele faz os trabalhos simples. A expressão regular é em si um grande tópico.
Tentamos entender as coisas básicas para que possamos usá-lo em nossos projetos futuros.

Usando o Módulo “re” Se


você quiser usar o módulo “re”, o primeiro passo é a importação. Precisamos importar o
módulo primeiro e escrevê-lo no topo do código. Considere este código onde temos um
arquivo de texto chamado “[Link]” e ele está armazenado em nossa pasta “principal”.

<código>

#!/ usr/ bin/ python3 import


re def main(): ReplaceWord()

DEmarcationLine()
MatchAndReplaceWord()

def ReplaceWord(): try:


files = open("../
primary/[Link]") for line in files: # você pode
pesquisar qualquer palavra print([Link]('lenor|
more', "#### #",
Machine Translated by Google

line), end=' ') exceto


FileNotFoundError como e:
print("Arquivo não encontrado:", e)

def MatchAndReplaceWord(): try:


files = open("../primary/[Link]")
for line in files: # você pode pesquisar qualquer
padrão que possa

corresponder e, em seguida, substituir por esta palavra


match = [Link]('(len|neverm)ore',
linha)
if match:
print([Link]([Link](), "#####"), end='
') except FileNotFoundError as e:

print("Arquivo não encontrado:", e)

def DEmarcationLine():
imprimir("*************")

if __name__ == "__main__": main() </


code>

Antes de termos a saída, vamos ver o que está escrito dentro do arquivo. O
“[Link]” na pasta “principal” tem estas linhas:

<blockquote>
primeira linha lenore são
nove, segunda linha e jantar terceira linha e
nunca mais acabou e quarta

quinta linha do pinho lenore e o


tremor aqui é mais linha e uma
nova linha eu te amo onde você
está ficando agora?
Machine Translated by Google

eu não sei </


blockquote>

Como você vê, essas frases não são muito significativas. Nossa principal
preocupação é muito simples. Escrevemos algumas linhas sem sentido e depois
tentamos trabalhar com o uso do módulo “re”. Agora executamos o código e aqui está a saída:

<blockquote>
primeira linha #####e
são nove, segunda linha e dine terceira linha e
nunca##### mais e quarta quinta linha de
pinho #####e e o tremor aqui é ##### linha e
uma nova linha

eu te amo
onde você está ficando agora? não
sei *************
primeira linha #####
terceira linha e ##### sobre a quinta
linha ##### </blockquote>

Todas as palavras “lenore” e “nunca mais” foram substituídas por cinco


hashtags: “#####”. Usamos dois métodos de módulo “re” que importamos e
escrevemos no topo do código. Esses métodos são “[Link]()” e “[Link]()”.
Fornecemos a string antiga e a nova palavra. Demos cinco hashtags, mas você
poderia ter dado qualquer outra palavra, é claro.

Reutilizando com expressões regulares Você já


viu como podemos pesquisar e substituir palavras em um arquivo com a ajuda de
expressões regulares. Agora vamos tentar reutilizar o código para que possamos
usá-los novamente e novamente. Além disso, também tentaremos escrevê-los de
maneira mais legível.
Vamos primeiro escrever os passos. O que queremos alcançar é muito importante.
Vamos ter uma ideia clara primeiro e a melhor maneira é escrevê-la.
Machine Translated by Google

1. Precisamos abrir um arquivo e colocá-lo no “bloco try” para evitar qualquer mensagem
de erro desagradável. Os iniciantes podem achar esse “bloqueio de tentativas”
bastante intimidador. Eu não expliquei isso antes e de repente comecei a usá-lo. Eu
fiz isso intencionalmente. Isso é explicado no próximo capítulo, “Exceções, captura de
erros”. Mas antes disso, quero que você os escreva e se habitue a um conceito que
parece complexo. Depois de aprender esse "bloqueio de tentativa", revise esse código
novamente. Você vai achar extremamente fácil!
Além disso, à medida que avança, você descobrirá que usar o “try block” é sempre um
bom hábito.

2. Obter o padrão das palavras que queremos pesquisar e, usando sinalizadores, podemos
ignorar caso.

3. Use o método de pesquisa do módulo "re" para ver se esse padrão corresponde ao nosso
linha.

4. Agora, se corresponder, substitua-o por novas palavras.

Considere este código abaixo e leia os comentários. Nos comentários explico


brevemente o que vou fazer.

<code>
#!/ usr/ bin/ python3 import re

def principal():
CompilerAndReplaceWord()

def CompilerAndReplaceWord(): try: files =


open("../primary/[Link]") # você pode
pesquisar qualquer padrão que corresponda, ignorando
as maiúsculas ou minúsculas

pattern = [Link]('(len|neverm)ore', [Link]) for


line in files: # re module search that pattern in a

linha
Machine Translated by Google

if [Link](pattern, line): # encontramos


esse padrão e agora ele
é hora de substituí-los por uma nova string
print(padrã[Link]("######", linha),
fim =' ')
exceto FileNotFoundError como e:
print("Arquivo não encontrado:", e)

if __name__ == "__main__": main() </


code>

E na saída ele substitui todas as palavras “lenore” e “nunca mais” por


seis hashtags. Para fazer isso, ele também verifica as letras maiúsculas e minúsculas e,
finalmente, substitui todas elas.

<blockquote>
primeira linha ######
terceira linha e ###### sobre a quinta
linha de pinho ###### não sei ###### </
blockquote>

Pesquisando com expressões regulares As expressões


regulares são um método muito poderoso de correspondência de padrões. A expressão
regular é uma linguagem pequena em si mesma e pode ser muito simples e muito
complexa.
É implementado em Python com o módulo “re”.
Considere este código:

<code>
#!/ usr/ bin/ python3 import
re def main(): FindWord()

DEmarcationLine()
MatchWord() def
FindWord():
Machine Translated by Google

try:
files = open("../primary/[Link]") for line in files: #
você pode pesquisar qualquer palavra if
[Link]('lenor|more', line): print(line, end='
' ) exceto FileNotFoundError como e:

print("Fiel not found:", e) def MatchWord():


try: files = open("../primary/[Link]")

for line in files: # você


pode pesquisar qualquer padrão que corresponda a
esta palavra
match = [Link]('(len|neverm)ore',
linha)
se corresponder:

print([Link]()) exceto
FileNotFoundError como e:
print("O campo não foi encontrado:", e) def
DEmarcationLine():
print("*************") if __name__
== "__main__": main() </code>

Aqui procuramos um arquivo chamado “[Link]” que contém palavras como “lenor” ou “mais”
e isso também corresponde a algumas palavras que terminam com “ore”. Definimos duas
funções para pesquisar isso e usamos o módulo “re” Vamos. primeiro ver qual é o conteúdo
dentro do “[Link]”. Existem algumas palavras e linhas enganosas apenas para
testar nossa pesquisa.

<blockquote>
primeira linha lenore são
nove, segunda linha e jantar terceira linha e
nunca mais acabou e quarta

quinta linha do pinheiro lenore


Machine Translated by Google

e o tremor aqui é
mais linha e uma nova
linha eu te amo onde
você está ficando
agora? eu não sei </blockquote>

Depois de executar nosso código, encontramos este resultado de pesquisa.

<blockquote>
primeira linha lenore
terceira linha e nunca mais acabou
quinta linha do pinheiro lenore
*************
lenore
nunca mais
lenore </
blockquote>

É um exemplo de expressão regular muito simples. Está além do nosso escopo


ensinar expressão regular aqui, mas podemos pelo menos ter uma ideia. Eu
recomendo fortemente que você vá mais longe. Pesquise por “expressão regular” na
. Internet. Você encontrará muitos tutoriais. Aprender e compreender regularmente
expressão é muito importante. Quer você se torne um desenvolvedor web, um
hacker ético ou um programador Python; expressão regular vai ajudar.
Machine Translated by Google

© Sanjib Sinha
2017 Sanjib Sinha, Beginning Ethical Hacking with Python, DOI 10.1007/978-1-4842-2541-7_13

13. Exceções, Erros de Captura


Sanjib Sinha 1

(1) Howrah, Bengala Ocidental, Índia

Espero que você já tenha escrito muitos códigos. Se você realmente tivesse feito
isso, teria encontrado um ou dois erros. Existem dois tipos distinguíveis de erros. O
primeiro é “SyntaxError”. Isso significa que você tem um erro na sua sintaxe.
Considere este código:

<código>

>>> para i no intervalo(10) print(i)


SyntaxError: sintaxe inválida </code>

Como você vê, eu esqueci de usar “:” no loop for. É um erro de sintaxe.
Outro erro é "Exceções". Isso significa que você escreve um código perfeitamente.
Não há erros sintáticos. Mas você se esquece de definir uma variável. Vamos considerar
estas linhas de código:

<código>
>>> 10 * x
Traceback (última chamada mais recente):
Arquivo "<pyshell#1>", linha 1, em <module>
10 * x
NameError: nome 'x' não está definido >>> 10 / 0

Traceback (última chamada mais recente):


Arquivo "<pyshell#2>", linha 1, em <module>
10/0
Machine Translated by Google

ZeroDivisionError: divisão por zero >>> '2' + 2

Traceback (última chamada mais recente):


Arquivo "<pyshell#3>", linha 1, em <module>
'2' + 2
TypeError: Não é possível converter o objeto 'int' em str
implicitamente >>> inputs = input("Por favor, insira um número.")

Por favor, coloque um numero.


>>> entradas + 2 Traceback
(última chamada mais recente):
Arquivo "<pyshell#5>", linha 1, em <module> inputs + 2
TypeError: Can't convert 'int' object to str implicitly >>>
inputs = input("Please enter a number.")

Insira um número. 12 >>> entradas -


10 Traceback (última chamada mais
recente):
Arquivo "<pyshell#7>", linha 1, nas entradas do <módulo> -
10
TypeError: tipo(s) de operando não suportado para -: 'str' e 'int' >>> int(entradas)
- 10 2

>>>
</código>

Como você pode ver, existem muitos tipos diferentes de erros. E na última linha nós
saíram do erro e obtiveram uma saída perfeita. No último erro, obtemos um “TypeError”.
Tentamos subtrair um inteiro de um objeto string. Na última etapa, convertemos esse
inteiro de entrada de string e a subtração ocorreu sem problemas.

É sempre bom detectar esses erros e obter uma boa saída. A frase “try block” já foi
usada antes. Agora chega a hora de aprendermos como usar esses blocos para detectar
erros. Anote o código abaixo em seu editor de texto e salve-o como “[Link]”.

<código>
Machine Translated by Google

#!/ usr/ bin/ python3 def


main(): FileRead()

DemarcationLine()
LineStrip()
DemarcationLine()
CheckFileExtension()
def ReadFile(nome do arquivo):
files = open(filename) lines =
[Link]() for index, line in
enumerate(lines): print(index, "=", line)

def StripFile(nome do arquivo):


files = open(filename) para
linhas em files:print([Link]()) def RaisingError(filename):

if [Link](".txt"): linhas =
open(filename) for line in
lines:print([Link]()) else:

raise ValueError("O arquivo deve terminar com .txt")


def FileRead(): try:
ReadFile("../
primary/[Link]") # path está ok, ele lê o arquivo

except IOError as e:
print("Não foi possível abrir o arquivo:", e) def
LineStrip(): try: StripFile("primary/[Link]")

except IOError as e:
print("Could not open file:", e) # vai dar erro def
CheckFileExtension(): try: RaisingError("../primary/[Link]")

exceto IOError como e:


Machine Translated by Google

print("Não foi possível abrir o arquivo:", e)


exceto ValueError as e: print("Bad Filename:", e)

def DemarcationLine():
print("******************")
if __name__ == "__main __": main() </
code>

Execute este arquivo e você obterá esta saída:

<blockquote>
Não foi possível abrir o arquivo: [Errno 2] Não existe tal arquivo ou
diretório: '../primary/[Link]'
******************
Não foi possível abrir o arquivo: [Errno 2] Arquivo ou diretório
inexistente: 'primary/[Link]'
******************
Nome de arquivo incorreto: o arquivo deve terminar
com .txt </blockquote>

Como exercício, tente escrever este código com “Try” e “Except” e pegue se
houver algum erro.

<code>
#!/ usr/ bin/ python3 def
main():
GetARangeOfNumber() def
GetARangeOfNumber():
para índice em IteratingStepByStep(1,123, 7):
print(índice, end='')
def IteratingStepByStep(start, stop, step): number = start
while number <= stop: yield number number += step if
__name__ == "__main__": main() </code>
Machine Translated by Google

© Sanjib Sinha
2017 Sanjib Sinha, Beginning Ethical Hacking with Python, DOI 10.1007/978-1-4842-2541-7_14

14. Funções

Sanjib Sinha 1

(1) Howrah, Bengala Ocidental, Índia

Vamos primeiro definir a função e tentar saber por que a função está sendo usada em
Python. Considere este código:

<código>
#!/ usr/ bin/ python3 def
main():
print("Esta é a função principal.") if __name__
== "__main__": main() </code>

E a saída é:

<blockquote> Esta
é a função principal. </blockquote>

O que isso significa? Em primeiro lugar, vamos entender o que significa função.
Uma função é usada em qualquer linguagem de programação para reutilizar o código.
Os programadores são preguiçosos e, portanto, não querem escrever de novo e de novo.
E não é uma boa ideia escrever sempre a mesma coisa. Então o conceito de reutilização
entra e usamos a função para fazer isso.
Você pode considerar um exemplo muito simples. Suponha que queremos usar
uma linha de demarcação repetidas vezes. Você vai escrever assim de novo e de novo?
Machine Translated by Google

<código>

print("*************") </code>

Ou você vai escrever uma função e chamá-la quando for necessário? Assim:

<código>

def DemarcationLine():
print("*********")
DemarcationLine():
DemarcationLine():
DemarcationLine(): </code>

Cada vez que você chamar a função “DemarcationLine()” ela imprimirá uma
linha de demarcação.
Agora vamos à primeira questão. É sempre uma boa prática escrever
funções dentro da função main() e você pode chamá-las a qualquer momento. O
controle de fluxo não segue necessariamente para baixo. Você pode testar:

<código>

def OutraFunção(): print("Eu sou


outra função.") def TestFunção(): print("Vou
chamar outra função.")

OutraFunção()
TestFunction()
<código>

Ele imprimirá sem nenhum problema e fornecerá esta saída:

<blockquote> Vou
chamar outra função.
Eu sou outra função. </blockquote>

Agora vamos escrever o código acima de forma diferente.

<código>
Machine Translated by Google

def TestFunction():
print("Vou chamar outra função.")
OutraFunção()

TestFunction()

def OutraFunção(): print("Eu


sou outra função.") </code>

Um pouco de mudança na posição. nós não definimos


AnotherFunction() antes de TestFunction() e, por esse motivo, dará uma
saída de erro:

<blockquote> Vou
chamar outra função.
Traceback (última chamada mais recente):
Arquivo

"/home/hagudu/PycharmProjects/FirstPythonProject/funct ions/
defining_functions.py", linha 17, em <module>
TestFunction()
Arquivo

"/home/hagudu/PycharmProjects/FirstPythonProject/funct ions/
defining_functions.py", linha 15, em TestFunction
OutraFunção()
NameError: o nome 'AnotherFunction' não está definido </blockquote>

Então, cada vez que você chama uma função dentro de outra função, você precisa defini-la
primeiro. Mas esse problema pode ser resolvido se você definir a função main() primeiro. Agora
considere este código:

<code>
#!/ usr/ bin/ python3 def
main(): TestFunction() def
TestFunction():
print("Vou chamar outra
função.")
OutraFunção()
Machine Translated by Google

def OutraFunção(): print("Eu


sou outra função.") if __name__ ==
"__main__": main() </code>

E aqui está a saída:

<blockquote> Vou
chamar outra função.
Eu sou outra função. </
blockquote>

Agora veja, não nos preocupamos com a posição porque todas as funções estão
sob a função main(). Muito mais flexibilidade agora está sendo adicionada quando
você está usando a função main () como esta. Outra grande vantagem de usar função
é passar parâmetros ou argumentos por ela.

<code>
#!/ usr/ bin/ python3 def
main():
PassingParameters(1,2,3) def
PassingParameters(argumento1, argumento2, argumento3):

print("Aqui estão nossos argumentos:", argumento1,


argumento2, argumento3) if
__name__ == "__main__": main() </
code>

E a saída é:

<blockquote>
Aqui estão nossos argumentos: 1 2 3 </
blockquote>

Passamos três parâmetros ou argumentos e obtemos a saída conforme o esperado.


Mas o que acontece se esquecermos de passar algum argumento? Não queremos receber
nenhuma mensagem de erro desagradável. Podemos gerenciar isso de duas maneiras:
Machine Translated by Google

<código>
#!/ usr/ bin/ python3 def
main():
PassingParameters(1) def
PassingParameters(argumento1, argumento2 = 4, argumento3 = 6):
print("Aqui estão nossos argumentos:", argumento1,

argumento2, argumento3) if
__name__ == "__main__": main() </
code>

E a saída:

<blockquote>
Aqui estão nossos argumentos: 1 4 6 </
blockquote>

É chamado de passagem de valores padrão. Passamos dois valores padrão e


quando realmente chamamos a função, ela leva esse valor padrão. Agora podemos
substituir esses valores padrão a qualquer momento. Considere este:

<código>
#!/ usr/ bin/ python3 def
main(): PassingParameters(1,
10, 14) def PassingParameters(argumento1,
argumento2 = 4, argumento3 = 6): print("Aqui estão nossos
argumentos:", argumento1,

argumento2, argumento3) if
__name__ == "__main__": main() </
code>

E a saída:

<blockquote>
Aqui estão nossos argumentos: 1 10 14 </
blockquote>
Machine Translated by Google

Substituímos os valores padrão passando novos valores e o


a saída mudou de acordo. Podemos escrever este código desta forma também:

<código>

#!/ usr/ bin/ python3 def


main():
Passando Parâmetros(1)
def PassingParameters(argumento1, argumento2 = Nenhum, argumento3
= 6): if argumento2 == Nenhum:

print("Aqui estão nossos argumentos:", argumento1,


argumento2, argumento3) else:

print("Aqui estão nossos argumentos:", argumento1,


argumento2, argumento3) if __name__ == "__main__": main() </code>

E a saída:

<blockquote>
Aqui estão nossos argumentos: 1 Nenhum
6 </blockquote>

O que acontece se passarmos um novo valor para o argumento2? Considere este código:

<code>
#!/ usr/ bin/ python3 def
main(): PassingParameters(1,
12)
def PassingParameters(argumento1, argumento2 = Nenhum, argumento3
= 6): if argumento2 == Nenhum:

print("Aqui estão nossos argumentos:", argumento1,


argumento2, argumento3) else:

print("Aqui estão nossos argumentos:", argumento1,


argumento2, argumento3)
Machine Translated by Google

if __name__ == "__main__": main()


</code>

E a saída:

<blockquote>
Aqui estão nossos argumentos: 1 12 6 </
blockquote>

Na próxima seção, veremos como as listas de argumentos funcionam em uma função.

Valores de retorno Em

Python, uma função pode retornar qualquer valor. Ele pode retornar qualquer tipo de dado:
string, inteiro, objeto — qualquer coisa. Vamos retornar um objeto.
Considere este código:

<code>
#!/ usr/ bin/ python3 def
main(): for index in
ReturnValues(): print(index, end=" ")
def ReturnValues(): #return
"Retornando string." #return 56 return
range(10) if __name__ == "__main__":
main() </code>

E a saída:

<blockquote> 0 1
2 3 4 5 6 7 8 9 </blockquote>

Retornamos o objeto range() e obtivemos o valor em nossa função main().


Machine Translated by Google

Gerar funções Em
Python podemos gerar funções. Vamos explicar passo a passo.
Considere este código primeiro:

<code>
#!/ usr/ bin/ python3 def
main(): RangeFunctions()
def RangeFunctions():

for i in range(10): print(i,


end=' ') if __name__ ==
"__main__": main() </code>

E a saída é bastante óbvia:

<blockquote> 0 1
2 3 4 5 6 7 8 9 </blockquote>

Você provavelmente descobriu que a função RangeFunctions() tem uma


limitação. Ele para em 9, embora o intervalo seja mencionado como 10. O que posso
fazer para incluir esse número?
Vamos escrever RangeFunctions() desta forma:

<código>
#!/ usr/ bin/ python3 def
main():
for index in RangeFunctions(0, 10, 1): print(index,
end=' ')

def RangeFunctions(start, stop, step):


i = iniciar
enquanto i <= parar:
rendimento ii +=
etapa if
__name__ == "__main__":
Machine Translated by Google

main() </
código>

E aqui está a saída:

<blockquote> 0 1 2
3 4 5 6 7 8 9 10 </blockquote>

Aqui usamos a palavra-chave “yield”. Isso é feito porque imaginamos que o


código progredirá passo a passo, como tocamos uma fita. Depois de ceder um passo,
ele parará e começará a partir daí e novamente começará e dará um passo. Você pode
simplesmente começar de qualquer ponto ou parar em qualquer ponto e progredir em
qualquer etapa.
Se escrevermos assim:

para índice em RangeFunctions(15, 1025, 102):


print(índice, end='')

A saída será:

15 117 219 321 423 525 627 729 831 933.

Como você viu, podemos definir o valor de qualquer argumento como padrão. Então nós
pode escrever esta função assim:

<código>

def AnotherRangeFunctions(start = 0, stop, step = 1):

eu = começo
enquanto i <= parar: ceder
ii += passo

</código>

E podemos tentar obter a saída por:

<code>
para índice em AnotherRangeFunctions(25): print(index, end='
')
Machine Translated by Google

</código>

Mas nos dá uma mensagem de erro:

Arquivo
"/ home/ hagudu/ PycharmProjects/ FirstPythonProject/ function ions/ generate-
[Link]", linha 18 def AnotherRangeFunctions(start = 0, stop, step

= 1):
SyntaxError: argumento não padrão segue o argumento padrão

Python não suporta isso. Podemos resolver este problema para que possamos passar
qualquer número de argumentos e controlá-lo sem ter nenhuma mensagem de erro?
Considere este código:

<código>

def AnotherRangeFunctions(*args):
numberOfArguments = len(args)

if numberOfArguments < 1: raise TypeError('At


menos um argumento é necessário.')
elif numberOfArguments == 1: stop =
args[0] start = 0

passo = 1
elif numberOfArguments == 2:
# start e stop serão tuplas (start, stop) = args
step = 1 elif numberOfArguments == 3: # all
start, stop e step serão tuplas (start, stop,
step) = args

eu = começo
enquanto i <= parar:
ceder ii += passo

</código>
Machine Translated by Google

Anote cada linha e faça anotações lado a lado. Adicione comentários


onde achar que uma explicação é necessária.

Listas de argumentos Em
Python, às vezes, você precisa de um número arbitrário de argumentos e precisa
nomeá-los. Vamos escrever este código:

<código>

#!/ usr/ bin/ python3 def


main():
PassingListsOfArguments(1, 2, 3, 5, 7, 45, 98, 56, 4356, 90876543)

PassingAnotherListsOfArguments(1, 2, 3, 5, 7, 45, 98, 76, 987654,


3245, 2345, 98760)

def PassingListsOfArguments(arg1, arg2, arg3, arg4, *args): print(arg1,


arg2, arg3, arg4, args)

def PassingAnotherListsOfArguments(param1, param2, *params):


print(param1, param2) for index in params: if index == 76: x = 10 y = index
+ x print("Vamos somar 10 com",

índice, "e o novo valor é:", y) continuar

print(índice, end='')

if __name__ == "__main__": main()


</code>

E a saída fica assim:

<blockquote>
Machine Translated by Google

1 2 3 5 (7, 45, 98, 56, 4356, 90876543)


1 2 3 5 7 45 98 Vamos somar 10 com 76 e o novo valor é: 86

987654 3245 2345 98760 </


blockquote>

Em nosso código, *args ou *params significam listas de argumentos. Você pode passar
qualquer número de argumentos por eles. Em código

def PassingListsOfArguments(arg1, arg2, arg3, arg4, *args):

significa que você precisa passar quatro argumentos primeiro. Isso é obrigatório. Depois
isso, o número de argumentos pode variar. Mas o número arbitrário de
argumentos sai como “tupla”. Veja a saída desta função:

1 2 3 5 (7, 45, 98, 56, 4356, 90876543)

A última parte é obviamente uma tupla e você pode iterar por ela.

Argumentos nomeados Às
vezes é importante usar argumentos nomeados em Python. E obtemos esses
argumentos nomeados em um formato de dicionário.
Considere este código:

<código>

#!/ usr/ bin/ python3 def


main():
NamedArguments(nome = 'Sanjib', endereço =
'Plutão', passatempo = "Jardinagem")
def NamedArguments(**kwargs): para
chave em kwargs: print(key, "=",
kwargs[key])
if __name__ == "__main__": main() </
code>

E a saída:
Machine Translated by Google

<blockquote>
passatempo = Jardinagem
nome = Endereço Sanjib
= Plutão </blockquote>

Como é uma saída de dicionário, não é ordenada. Você pode classificá-lo em ordem alfabética.
Vamos considerar um código bastante longo onde podemos usar todo tipo de passagem
argumento.

<código>
#!/ usr/ bin/ python3 def
main():
NamedArguments(nome = 'Sanjib', endereço =
'Plutão', passatempo = "Jardinagem")
DemarcationLine()
AnotherNamedArguments('Hi', 1235, 1,2,3, um =
1, dois = 2, três = 3)

def NamedArguments(**kwargs): para


chave em kwargs: print(key, "=",
kwargs[key])

def OutroNamedArguments(arg1, arg2, *args, **kwargs):


print(arg1, arg2) for index in args: print(index, end=' ')

DemarcationLine() para
chaves em kwargs:
print(keys, "=", kwargs[keys])

def DemarcationLine():
print("********")

if __name__ == "__main__": main() </


code>
Machine Translated by Google

Aqui está a saída:

<blockquote>
passatempo = endereço
de jardinagem = nome
Pluto = Sanjib
********
Oi 1235 1
2 3 ******** três = 3
dois = 2 um = 1 </
blockquote>
Machine Translated by Google

© Sanjib Sinha
2017 Sanjib Sinha, Beginning Ethical Hacking with Python, DOI 10.1007/978-1-4842-2541-7_15

15. Aulas
Sanjib Sinha 1

(1) Howrah, Bengala Ocidental, Índia

Se você é um iniciante completo, provavelmente está ouvindo pela primeira vez sobre
“programação e aulas orientadas a objetos”. Vamos dar uma breve introdução à
programação orientada a objetos (OOP).

Metodologia Orientada a Objetos Baseia-se


na programação do mundo real. Um objeto é uma representação de uma entidade do
mundo real. Se houver um objeto, deve haver uma classe ou projeto por trás dele.
Nessa classe, o comportamento desse objeto é projetado ou descrito em detalhes.
Esses detalhes consistem em todas as propriedades e ações que o objeto executa.
Pode haver muitos tipos de objetos provenientes de diferentes classes e eles podem
ter relacionamentos. Pode ser muito complicado, mas você sempre pode separar
esses objetos um do outro e fazer algumas alterações. A vantagem da orientação a
objetos é que quando você trabalha em uma parte de um projeto grande e complicado,
a outra parte permanece inalterada. Nosso objetivo é simples. Queremos juntar
diferentes objetos para criar um software grande e complicado. Ao mesmo tempo,
queremos tornar as relações desses objetos tão livres quanto possível.
Um objeto carro é construído de muitos outros objetos como pneu, roda, motor,
acelerador, etc. Se você tiver um pneu furado, o motor para? Eles estão inter-relacionados
e dependem um do outro. Mas finalmente você pode trabalhar neles individualmente sem
afetar o outro. Isso é orientação a objetos.
Considere um objeto, “GoodHuman”. Este objeto deve ser diferente de outro objeto,
“BadHuman”. Ambos vêm da classe “Humana”. Agora, esses dois objetos podem ter inter-
. Vocêexistem
relações e interações de dados, imagine quantos tipos de propriedades e métodos pode no
“Human”
Machine Translated by Google

aula? Pode ser muito complexo. Imagine uma situação em que um “BadHuman” faz algo feio. Ao
mesmo tempo, um “GoodHuman” faz algo de bom.
Quem quer que faça qualquer coisa, a vida continua e isso também é orientação a objetos.

A Fundação da Orientação a Objetos A orientação a objetos é um


tipo de metodologia usada para construir aplicativos de software.
Um programa orientado a objetos consiste em classes, objetos e métodos. A
metodologia orientada a objetos no desenvolvimento de software gira em torno de um único conceito
objetos componentes. Esses objetos interagem uns com
chamado
os outros
objeto.
quando
quebrar
todo o aplicativo é
em
montado. Um objeto é uma combinação de mensagens e dados. O objeto recebe e envia mensagens
e essas mensagens contêm dados ou informações.

Você (um objeto) interage com sua televisão (outro objeto) por meio de mensagens
enviado através de um controle remoto (outro objeto).
Considere outro exemplo do mundo real de uma bola de futebol. Uma bola de futebol
tem um limite. Ele tem uma propriedade específica definida como salto. Você pode direcionar ou
aplicar algumas ações específicas chutando ou jogando.
Um objeto tem um estado. Pode exibir comportamento. Tem um ID único.
A diferença entre um objeto e uma classe é sutil, mas importante. Enquanto
uma classe é um conceito abstrato, um objeto é uma entidade concreta. A partir de uma
classe, objetos com propriedades específicas podem ser criados ou instanciados. É por isso que
um objeto costuma ser chamado de instância de uma classe.
Uma das principais características da programação orientada a objetos é o
“polimorfismo”. Polimorfismo é a capacidade de algo assumir diferentes formas. Na programação
orientada a objetos, o polimorfismo é a propriedade de que uma mensagem pode significar
coisas diferentes dependendo dos objetos que a recebem. A mensagem “Acelerar” significa uma
coisa se for enviada para um objeto “Carro Velho”. Mas significa outra coisa se for enviado para o
objeto “NewCar”. É um conceito natural que pode ser aplicado a objetos. Isso também significa que
objetos semelhantes geralmente aceitam a mesma mensagem, mas fazem coisas diferentes.

Considere uma página da web. É um objeto. Existem bilhões desses objetos ao nosso redor.
Quando você envia uma solicitação para um objeto como uma página da Web, na verdade aplica
um verbo “GET” a um substantivo “WebPage”. Agora todo objeto “WebPage” não se comporta da
mesma forma quando o verbo “GET” é aplicado. Alguém abre um arquivo PDF, alguém simplesmente
mostra alguns textos e imagens e alguém pode danificar seu computador. Quando você clica duas
vezes em um arquivo, ele pode ser executado se for um arquivo executável. Ou pode abrir em um
editor de texto se for um arquivo de texto. A mensagem
Machine Translated by Google

é igual. Isso é "Clique Duplo". Mas o comportamento exibido pelo objeto de arquivo depende
do próprio objeto.
Isso é polimorfismo. Você o aprenderá de cor à medida que progredir neste capítulo.

A vantagem das classes Python é que elas fornecem todos os recursos padrão
características da programação orientada a objetos. Ele possui o mecanismo de
. Issoquaisquer
herança de classes métodos
permite várias de sua
classes classe
base. Umaou classes
classe base, pode
derivada e um substituir
método pode chamar o método de uma classe base com o mesmo nome. Os objetos podem
conter quantidades e tipos de dados arbitrários.

Finalmente, lembre-se, em Python tudo é um objeto. Isso significa que há uma abstração
ou encapsulamento por trás dele. Você precisa entender a abstração primeiro e depois criar
sua própria abstração.

Compreendendo classes e objetos Você não pode


entender a teoria a menos que implemente esse conceito no mundo real. Vejamos o que
aprendemos.

1. Classes são quando você cria seu próprio objeto.

2. Uma classe é um projeto de um objeto.

3. Um objeto é uma instância de uma classe.


Vamos ver como podemos construir uma classe e depois criar algumas instâncias a partir dela.
Considere este código:

<código>
#!/ usr/ bin/ python3
Classe Robô:
def __init__(self): pass def
WalkLikeARobot(self):
print("anda como um robô.") def
CareLikeARobot(self): print("cuida como um
robô.") robu1 = Robot()
Machine Translated by Google

print(tipo(robu1))
print(id(robu1)) robu2 =
Robot() print(tipo(robu2))
print(id(robu2)) del robu2
def main(): robu = Robot()
print(tipo(robu ))
print(id(robu)) if __name__
== "__main__":
main() </code>

Neste código, temos a definição de classe “Robot”. Aqui “classe” é a palavra-


chave. Próximo a ele está um sinal “:”, o que significa que uma definição de classe
seguirá um conjunto ou bloco de códigos. Após definirmos a classe “Robô”, temos três
métodos.
E eles são :

def __init__(self): pass def

WalkLikeARobot(self): print("anda
como um robô.") def CareLikeARobot(self):
print("cuida como um robô.")

O primeiro é o método especial. Quando uma classe é instanciada, esse método


será chamado primeiro. “__init__” significa inicialização. A classe é inicializada. Dois
outros métodos o seguem. Esses métodos são autoexplicativos. Métodos são verbos
de ação. Quando criamos um objeto robô e chamamos esses métodos, na verdade
dizemos a eles para fazer alguma coisa. Em nossa aula definimos o que eles farão.
Neste código criamos três objetos robô. E, finalmente, não lhes dissemos para
fazer nada. Acabamos de ver como eles são diferentes um do outro. Testamos seu
tipo e ID. Olha, cada objeto tem um ID diferente. Portanto, este é um ponto importante.
Cada objeto ou instância criada a partir de uma classe, tem sua própria individualidade.

Agora veja a saída:


Machine Translated by Google

<blockquote>
<class '__main__.Robot'>
140445354614624 <class
'__main__.Robot'>
140445354668160
<class '__main__.Robô'>
140445354668160 </
blockquote>

As próximas linhas de código são um pouco mais longas, mas eu sugiro fortemente
que você as escreva em seu próprio editor de texto e execute o programa para ver se
obtém a mesma saída.

<code>
#!/ usr/ bin/ python3 class
Robôs:
def __init__(self): pass
def
WalkLikeARobot(self, style): [Link] =
estilo return [Link] def
CareLikeARobot(self): print("cuida
como um robô.")

class Humans:
def __init__(self, nature = "good"): [Link] =
nature
def GoodHumanBeing(self):
print("não precisa repetir, um bom ser humano
é sempre", [Link]) def
BadHUmanBeing(self): [Link]
= "não precisa repetir, ser humano mau é sempre mau."
print([Link]) def WalkLikeARobot(self, estilo): [Link] = estilo
return [Link] def main(): robu = Robots()
Machine Translated by Google

[Link]()
print([Link]("anda como um robô"))

HomemBom = Humanos()
print([Link])
[Link]()
BadMan = Humanos ()
[Link] = "mau"
print([Link])
[Link]()
print([Link]("ele é humano, mas
anda como um robô")) if
__name__ == "__main __": main() </
code>

No trecho de código acima, temos duas classes. Um é “Robô”, que nós


escreveu anteriormente. A outra classe é “Humano”. Na classe “Human”,
definimos este método especial assim:

def __init__(self, nature = "good"):


[Link] = natureza

O que isto significa? Significa que quando criamos uma instância humana deste
classe, assumimos que a natureza do objeto humano será, por padrão, boa.
Infelizmente, isso não acontece no mundo real. Tendo isso em mente, também
escrevemos esta linha: “[Link] = nature”. Isso significa que a natureza própria
ou a natureza da instância será boa se não mencionarmos explicitamente que é
"Ruim" ou outra coisa.
Nas etapas a seguir, quando criamos uma instância humana ruim, alteramos
explicitamente a natureza. Lembre-se, cada método é a parte da ação desse objeto.
Um objeto é um substantivo e faz alguma coisa. Em qualquer aplicativo de software
segue a mesma regra. Um exemplo de polimorfismo também está lá. Em ambas as
classes, “Robot” e “Human”, definimos um método:

def WalkLikeARobot(self, style): [Link] =


estilo return [Link]
Machine Translated by Google

Quando aplicamos esse mesmo verbo aos diferentes objetos Robô e Humano, ele exibe
um comportamento diferente. Se você executar este código, ele nos dará uma saída como esta:

<blockquote>
cuida como um robô. anda como
um robô bom não precisa repetir,
bom ser humano é sempre bom
mau não precisa repetir, mau ser humano é sempre mau. ele é humano
mas anda como um robô </blockquote>

Quando uma instância de Robot anda como um robô, ela exibe: anda como um
robô; mas quando uma instância de Human anda como um robô, ela exibe: ele é
humano, mas anda como um robô. Isso nada mais é do que um exemplo simples de polimorfismo.
Quando o mesmo verbo se aplica a dois objetos diferentes, dependendo da
natureza do objeto, dá uma saída diferente.
Na verdade, mudamos esse comportamento passando dois argumentos diferentes.
Suponha que, em vez de um único argumento, passemos um dicionário de valores. Veja
como o poder é ampliado. Considere um código simples abaixo:

<code>
print(type([Link](dict(one=1, two=2)))) st =
[Link](dict(one=1, two=2)) for keys in sorted(st):

print(teclas, st[teclas])
ws = [Link]({'one':56, 'two':2}) para chaves em
sorted(ws):
print(chaves, ws[chaves]) </
code>

Aqui está a saída:

<blockquote>
<class 'dict'> um 1
dois 2
Machine Translated by Google

um 56
dois 2 </
blockquote>

Você pode adicionar mais pares de chave e valor a este dicionário e executar este código
para ver o que acontece.

Escreva seu próprio jogo, “Bom Vs Ruim”


Até agora aprendemos muitas coisas. Espero que você tenha escrito os códigos e os
testado e executado perfeitamente. Agora chegou a hora de escrever um jogo simples em
Python. É um jogo chamado “Bom Vs Mau”. O jogo é simples. Mas, como iniciante, você
pode achar esse código um pouco mais longo. Anotá-la. Tente adicionar mais recursos.

Se você estiver em um ambiente Linux, salve este arquivo como “[Link]” e


altere o arquivo executável executando este comando:

Sudo chmod +x [Link]

E, em seguida, execute-o no seu terminal assim:

./ [Link]

Se você estiver no Windows, execute o IDLE e salve o arquivo como “[Link]”.


Pressione F5 e jogue o jogo.
Fica assim na tela do computador:
Machine Translated by Google

Figura 15-1. Jogando o jogo Python no Windows IDE

Em segundo plano, o código é exibido e você pode jogar no Python Shell.

O código é assim:

<código>
#!/ usr/ bin/ python3
Classe Robôs:
def __init__(self): passar

def WalkLikeARobot(self, WalkingStyle): [Link] =


WalkingStyle return [Link]

def CareLikeARobot(self): print("cuida


como um robô.")
class Humans: def
__init__(self, nature = "good"): [Link] = nature

def GoodHumanBeing(self): print("não


precisa repetir, um bom ser humano
é sempre", [Link])
Machine Translated by Google

def BadHUmanBeing(self):
[Link] = "não precisa repetir, ser humano mau é sempre
mau." print([Link])

def WalkLikeARobot(self, WalkingStyle): [Link]


= WalkingStyle return [Link] def main():
robu = Robots() # [Link]() #
print([Link]("Um robô anda como um robô e
nada acontece ."))

GoodMan = Humans() #
print([Link])
# [Link]()
BadMan = Humanos ()
# [Link] = "mau" #
print([Link])
# [Link]() #
print([Link]("ele é humano, mas
anda como um robô"))
# quando um homem mau anda como um robô muitas coisas
acontecem
WhenABadManWalksLikeARobot =
[Link](dict(change = 'ele se torna um monstro por
dentro',
ato = 'ele mata
companheiros',
sentir = 'ele gosta
torturando animais',
cuidado = 'ele cuida de
nenhum',
olhar = 'ele parece um
ser humano normal',
estado = 'finalmente ele
destrói a si mesmo'))
# há muitas ações que acontecem print("O que acontece
quando um Homem Mau anda como um
Machine Translated by Google

Robot?")
change = input("Diga-nos que tipo de mudança pode ocorrer dentro
dele?\n Escolha entre 'monstro' e 'anjo',"

"e digite aqui...>>>>")


WhenABadManWalksLikeARobot['change'] = alterar recompensa
=0
if change == 'monster': print("Você
venceu a primeira rodada:",
mudar)
recompensa = 1000
print("Você ganhou ", recompensa, "pontos.") print("O que
ele faz? :", WhenABadManWalksLikeARobot['act'])

change = input("Agora diga-nos o que o monstro


sente por dentro enquanto mata pessoas?\n Escolha entre 'ótimo' e 'triste',"
"e digite aqui...>>>>")

WhenABadManWalksLikeARobot['change'] =
mudar
se mudar == 'ótimo':
print("Você venceu a segunda rodada:") recompensa =
10000
print("Você ganhou ", recompensa,
"pontos.")
print("O que ele sente por dentro? :",
WhenABadManWalksLikeARobot['feel'])
change = input("Diga-nos se o monstro se
importa com alguém?\n Escolha entre 'sim' e 'não',"

"e digite aqui...>>>>")


WhenABadManWalksLikeARobot['change'] =
mudar
if change == 'no':
print("Você ganhou o terceiro
redondo:")
recompensa = 100000
print("Você ganhou ", recompensa,
Machine Translated by Google

"pontos.")
print("O que ele sente por dentro? :",
WhenABadManWalksLikeARobot['care']) change = input("Diga-nos se o

monstro parece um ser humano normal?\n Escolha entre 'sim' e 'não',"

"e digite aqui...>>>>")


WhenABadManWalksLikeARobot['change'
] = mudar
if change == 'yes':
print("Você venceu o quarto
redondo:")
recompensa = 1000000
print("Você ganhou ", recompensa,
"pontos.")
print("Como ele é?
:", WhenABadManWalksLikeARobot['look']) change =
input("Conte-nos o que acontece com o
monstro finalmente? Ele se destrói\n Escolha entre 'sim' e 'não'," "e digite

aqui...>>>>")
WhenABadManWalksLikeARobot['cha
com'] = mudar
if change == 'yes':
print("Você ganhou o
quinta rodada:")
recompensa = 100000000
print("Você ganhou
Jackpot.", recompensa, "pontos.")
outro:
print("Você mudou o curso do jogo.
Termina aqui. Você perdeu", recompensa - 100000, "pontos.")

outro:
print("Você mudou o
curso de jogo. Termina aqui. Você perdeu", recompensa - 1000, "pontos.")
Machine Translated by Google

outro:
print("Você mudou o curso do jogo. Termina
aqui. Você perdeu", recompensa - 100, "pontos.")

outro:
print("Você mudou o curso do jogo. Termina aqui.
Você perdeu", recompensa - 10, "pontos.") else:

print("Você mudou o curso do jogo.


Termina aqui e você não ganhou nenhum ponto.") if
__name__ == "__main __": main() </code>

E a saída em seu Python Shell se parece com isso:

<blockquote> O
que acontece quando um homem mau anda como um robô?
Diga-nos que tipo de mudança pode ocorrer dentro dele?

Escolha entre 'monstro' e 'anjo' e digite


aqui...>>>>monstro
Você venceu a primeira rodada: monster Você
ganhou 1000 pontos.
O que ele faz? : ele mata companheiros Agora diga-nos o
que o monstro sente por dentro enquanto
Matando pessoas?
Escolha entre 'ótimo' e 'triste' e digite aqui...>>>>ótimo

Você venceu a segunda rodada: Você


ganhou 10.000 pontos.
O que ele sente por dentro? : ele gosta de torturar animais. Diga-nos, o
monstro se importa com alguém?
Escolha entre 'sim' e 'não' e digite aqui...>>>>não
Você venceu a terceira rodada: Você ganhou 100.000
pontos.
Machine Translated by Google

O que ele sente por dentro? : ele não se importa com


ninguém. Diga-nos se o monstro se parece com um ser humano normal?

Escolha entre 'sim' e 'não' e digite aqui...>>>>sim Você


venceu a quarta rodada: Você ganhou 1000000 pontos.

Como ele é? : ele parece um ser humano normal Diga-nos o que


acontece com o monstro finalmente? Faz

ele se destrói Escolha


entre 'sim' e 'não', e digite aqui...>>>>sim

Você ganhou a quinta rodada: Você


ganhou o Jackpot. 100000000 pontos. </blockquote>

Desde que escrevi o código, ganhei o jogo. Mas existem alguns truques. Naqueles
partes complicadas, se você falhasse e fornecesse entradas erradas, você perderia.

Classe primária e objeto Agora, a


classe primária e o objeto não devem mais ser difíceis. Você pode escrever uma
classe Human e passar um argumento padrão como “tipo” na inicialização. Você
humano. sendo
pode defini-lo
você nãocomo
precisa
“bom”.
passar
Agora,
nenhum
se você
argumento
deseja criar
extra.
umNa
bom
próxima
processo
etapa, quando você aplicar um verbo como “BeingHuman()” ao ser humano bom, por
padrão ele é bom.
Se você deseja criar um ser humano mau, pode alterar esse argumento padrão e
torná-lo mau.

<código>

#!/ usr/ bin/ python3 class


Humano:
def __init__(self, kind = "bom"): [Link] = kind

def Ser Humano(auto):


retornar [Link]
def principal():
Machine Translated by Google

bom = Humano()
ruim = Humano("ruim")
print([Link] ())
print([Link] ())
if __name__ == "__main__": main()
</code>

A saída é bastante óbvia:

<blockquote>
bom ruim </
blockquote>

Há algumas coisas que você precisa entender. Por que usamos “self”?
O que isso significa? Considere o código abaixo .

<código>
#!/ usr/ bin/ python3 class
MySelf: def __init__(self,
nome, quantidade): [Link] = nome [Link]
= quantidade def Eat(self): print([Link],
"comes", [Link], "bananas cada dia.")
def main(): hagu = MySelf("Hagu", 2) mutu =
MySelf("Mutu", 3) [Link]() [Link]() if __name__ ==
"__main__": main() </code>

Neste código da classe “MySelf” temos dois métodos. Um é o método


construtor especial “__init__” e o outro é “Eat()”. Você percebe que cada
método tem um argumento especial: “self”. Na verdade, ele faz referência ao objeto que é
Machine Translated by Google

vai ser criado. Quando escrevemos uma classe, assumimos que as instâncias
serão criadas. Neste caso, criamos dois objetos, “hagu” e “mutu”. Quando
aplicamos o verbo “Eat()” ou chamamos o método aos objetos, é como se eles
passassem pelo método. Definimos os nomes e o número de bananas que eles
comem. E a saída desse código é assim:

<blockquote>
Hagu come 2 bananas por dia.
Mutu come 3 bananas por dia. </
blockquote>

Mas precisamos de exemplos mais concretos. Queremos nos conectar aos nossos bancos
de dados de nossos aplicativos. Para isso precisamos de uma classe onde teremos métodos e
propriedades que irão se conectar aos bancos de dados.
Suponha que temos duas configurações diferentes. Temos um banco de dados
MySQL e, além disso, queremos criar uma conexão SQLite. Para fazer isso, podemos
escrever duas classes separadas e definir a conexão na parte do construtor ou método de
inicialização. Assim, quando criamos uma instância, a conexão com o banco de dados é
configurada automaticamente.
Considere o código:

<code>
#!/ usr/ bin/ python3
import sqlite3 import
[Link] from
[Link] import Error class
MySQLiteConnection: def __init__(self): db =
[Link]('[Link]') [Link]()
print ("Conectado ao SqLite3")

class MySQLConnection: def


__init__(self): try: ### você
pode usar um objeto
de dicionário ou pode se conectar diretamente ###

### usando um objeto dictioanry ###


kwargs = dict(host = 'localhost', banco de
dados = 'python_mysql', usuário = 'root', senha =
Machine Translated by Google

'passar')
con =
[Link](**kwargs) ###
conectando diretamente ### connection
=
[Link](host = 'localhost',
datado
se = 'python_mysql',
usuário =

'raiz',
passwo
rd = 'passar')
se connection.is_connected():
print("Conectado ao MySQL de
'conneection' object") # if
conn.is_connected(): #
print("Connected from 'conn'
objeto")
exceto Erro como e:
print(e) finalmente:
[Link]()

def principal():
ConnectToMySQL = MySQLConnection()
ConenctToSqLite = MySQLiteConnection() if __name__
== "__main__": main() </code>

Criamos duas instâncias ou objetos das classes MyMySQLConnection()


e MySQLiteConnection() e os colocamos em duas variáveis separadas.
As conexões estão sendo configuradas e na seção de saída vemos isso:

<blockquote>
Conectado ao MySQL a partir do objeto 'connection'
Conectado ao SqLite3 </
blockquote>
Machine Translated by Google

Mas este é um exemplo extremamente simples e mal escrito. Deveríamos


Desenvolva esse código para que cada instância das classes MySQLConnection
e SQLiteConnection possam não apenas se conectar ao banco de dados, mas também recuperar
dados de uma tabela.
Vamos substituir nosso código antigo por este:

<código>
#!/usr/bin/python3

import sqlite3 import


[Link] from
[Link] import MySQLConnection, Error

classe Conexão MySQL:


def __init__(self, db =
[Link]('[Link]')): [Link] = db

db.row_factory = [Link]
print("Conectado ao SqLite3") def
Retrieve(self): print("Recuperando valores da
tabela test1
de teste de banco de dados SqLite")
read = [Link]('selecionar * de test1
ordem por i1')
for row in read:
print(row['t1']) class
MySQLConnection: def __init__(self,
kwargs = dict(host = 'localhost', database = 'testdb', user
= 'root', password = 'pass') ): tente: ### você pode usar um objeto de
dicionário ou conectar-se diretamente ###

### usando um objeto de dicionário ###


[Link] = kwargs
con =
[Link](**kwargs)
Machine Translated by Google

se conn.is_connected():
print("Conectado ao banco de dados MySql testdb
do objeto 'conn'") exceto Erro como e: print(e) finalmente: [Link]() def
Retrieve(self): print("Recuperando registros do MySql

database testdb.") try:


conn =
MySQLConnection(**[Link]) cursor =
[Link]() [Link]("SELECT * FROM

FUNCIONÁRIO")
rows = [Link]() print('Total
Row(s):', [Link]) for row in rows: print("First
Name = ", row[0]) print("Second Name = ", row[ 1])
print("Idade = ", linha[2]) print("Sexo = ", linha[3])
print("Salário = ", linha[4]) exceto Erro como e:
print(e) finalmente: [Link]() [Link]()

def principal():
ConnectToMySQL = MySQLConnection()
[Link]()
ConenctToSqLite = MySQLiteConnection()
[Link]()
if __name__ == "__main__": main() </
code>
Machine Translated by Google

Nós nos conectamos a cada banco de dados com o processo de inicialização e, em seguida,
aplique um verbo, “Retrieve()”, para cada objeto. Também importamos muitos
módulos de banco de dados que você ainda não aprendeu.
Você os aprenderá no devido processo. Mas o nosso propósito é servido.
Criamos dois objetos de banco de dados separados. Um é um objeto de conexão
MySQL e outro é um objeto de conexão SQLite. Depois disso, com esses objetos
podemos recuperar dados separados de duas tabelas diferentes.
Primeiro, olhe para a saída:

<blockquote>
Conectado ao banco de dados MySql testdb do objeto 'conn'
Recuperando registros do banco de dados MySql testdb.

Total de linhas: 3
Primeiro nome = Mac
Segundo nome = Mohan Idade
= 20 Sexo = M Salário = 2000,0
Primeiro nome = Mac

Segundo nome = Mohan Idade


= 20 Sexo = M Salário = 2000,0
Primeiro nome = Mac Segundo
nome = Mohan Idade = 20
Sexo = M Salário = 2000,0
Conectado ao SqLite3
Recuperando valores da tabela
test1 do teste do banco de
dados SqLite Babu Mana

Papai
Bebê
Anju
Pergunta
Gasa Buda
Machine Translated by Google

Tapas
</blockquote>

A saída diz, o banco de dados MySQL “testdb” tem uma tabela chamada
“Employee” e há várias linhas como nome, sexo, salário, etc. Em segundo lugar, temos
um banco de dados SQLite3 “test1” que tem uma tabela chamada “test1” que tem muitas
linhas que contêm poucos nomes.

Acessando dados de objeto


Quando um objeto é criado a partir de uma classe, é bastante óbvio que ele terá algum
tipo de dado. A questão é como podemos acessar esses dados? Qual é a maneira
correta? Devemos acessar esses dados de uma maneira que possamos acompanhar isso.
Considere este código abaixo:

<código>

#!/ usr/ bin/ python3


classe Humano:
def __init__(self, height = 5.08): [Link] = height
def main(): ramu = Human() print([Link])
[Link] = 5.11 # é chamado de efeito colateral e difícil
de rastrear

print([Link]) if
__name__ == "__main__": main() </
code>

Neste código, vemos a classe Human com uma altura padrão, que é 5,08. Quando
criamos um objeto, essa altura é definida automaticamente, a menos que a alteremos ou
a mencionemos explicitamente. Também podemos definir qualquer propriedade fora desse
objeto. Na próxima linha escrevemos [Link] = 5.11.
Podemos definir qualquer propriedade de objeto como esta. Mas isso é chamado de efeito
é muito difícil de rastrear,. colateral e então precisamos fazer isso de uma maneira mais estruturada. Como
podemos fazer isso? Vamos ver a saída deste código primeiro.

<blockquote>
Machine Translated by Google

5.08
5.11
</blockquote>

Você vê as mudanças de altura e não sabemos qual é a altura adequada de


objeto “ramu”. Para resolver esse problema, o método de acesso é implementado.
Os métodos acessadores são métodos que primeiro definem o valor e, por meio desse
método, você pode obter o valor.

<code>
#!/ usr/ bin/ python3 class
Humano: def __init__(self):

pass
# acessador
def set_height(self, height): [Link] =
height
def get_height(self):
return [Link] def
main(): ramu = Human() # [Link]
= 5.11 # é chamado de efeito
colateral
e difícil de rastrear
ramu.set_height(5.12)
print(ramu.get_height())
if __name__ == "__main__": main()
</code> <blockquote> 5.12 </
blockquote>

Mas ainda estamos perdendo alguma coisa. Queremos adicionar mais flexibilidade para
que, com menos código, possamos realizar mais trabalhos.

<code>
#!/ usr/ bin/ python3 class
Humano:
def __init__(self, **kwargs):
Machine Translated by Google

[Link] = kwargs def


set_manyVariables(self, **kwargs): [Link] =
kwargs def set_variables(self, chave, valor):
[Link][chave] = valor

def get_variables(self, key): return


[Link](key, None) def main(): mana =
Human(name = 'Mana') print("Nome do objeto Mana:",
[Link]['name' ])

ManaName = [Link]['nome']
mana.set_variables('classe', 'dois')
print(ManaName, "lê na aula",
mana.get_variables('turma')) mana.set_manyVariables(escola
= 'balika escola ', altura = 4,54) print(ManaName, "tem
altura de",

[Link]['height'], "e o nome da escola dela é", [Link]['school'])


babu = Human(name = 'Babu', student_of = 'Classe Três', reads_at = ' Escola
Balak', altura = 5,21)

BabuName = [Link]['nome']
print(BabuName, "ele é aluno de",
[Link]['aluno_de'], "e ele lê em", [Link]['lê_em'], "e
seu
altura é", [Link]['height']) if __name__ ==
"__main__": main() </code>

Neste trecho de código, temos muitas opções abertas para nós. Definimos o
variáveis em uma chave de formato de . nosso Depois que podemos obter o valor através do
dicionário.

<blockquote>
Nome do Objeto Mana: Mana
Mana lê na classe dois
Machine Translated by Google

Mana tem altura de 4,54 e o nome da escola dela é balika school

Babu ele é um aluno da Classe Três e ele lê em


Balak School e sua altura é 5,21 </blockquote>

Este não é o único método para lidar com dados de objeto. Conforme você progride, você
veja muitos exemplos diferentes de manipulação de dados.

Polimorfismo O
polimorfismo é um conceito muito importante na programação orientada a objetos.
O básico é quando aplicamos o mesmo verbo em dois objetos diferentes, dependendo
dos objetos, eles reagem de forma diferente. Quando colocamos uma casa velha à venda,
ela atinge um certo valor. Mas quando colocamos uma casa nova à venda, ela alcança um
preço e um valor mais altos. Portanto, neste caso, quando aplicamos o método “sale” ou o
verbo “sale” a objetos diferentes, eles se comportam de maneira diferente.

<code>
#!/ usrbin/ python3 classe
Tabela:
def __init__(self): pass def
ItHolds(self):
print("Uma mesa contém
livros, blocos de escrita em
isto.")
def YouCanWriteOnit(self): print("Você
pode escrever em uma tabela.")

livro escolar:
def __init__(self): pass def
ItHelps(self): print("Um
livro nos ajuda a saber algo

novo.")

def principal():
MinhaTabela = Tabela()
MeuLivro = Livro()
Machine Translated by Google

[Link]()
[Link]()
[Link]() if
__name__ == "__main__": main() </
code>

Estas são classes bastante simples e a saída também é muito simples.

<blockquote>
Uma mesa contém coisas sobre ela.
Você pode escrever em uma mesa.
Um livro nos ajuda a conhecer algo novo. </
blockquote>

Essa saída pode mudar drasticamente quando você aplica os mesmos


verbos ou métodos aos objetos das classes “Table” e “Book”. Considere os
seguintes códigos.

<code>
#!/ usrbin/ python3
class Table: def
__init__(self): pass

def Get(self):
print("Por favor me dê aquela mesa.") def
Put(self): print("Por favor, coloque a mesa no canto
da sala.") def Destroy(self): print("Algumas pessoas
vieram e eles não queriam que nós lêssemos e escrevêssemos. Eles
destruíram a mesa.") livro de classe:

def __init__(self): pass


def Get(self):
print("Por favor me dê
aquele livro.") def Put(self):
Machine Translated by Google

print("Colocamos alguns livros novos no


mesa.")
def Destroy(self):
print("Algumas pessoas vieram e não
querem que leiamos e escrevamos. Eles destruíram o livro.") def main():
MyTable = Table()

MeuLivro = Livro()
InMistake(MyBook)
Intencionalmente(MinhaTabela)
def InMistake(Tabela): [Link]()

[Link]()
[Link]() def
Intencionalmente(Livro): [Link]()

[Link]()
[Link]() if
__name__ == "__main__": main()
<código>

Existem três métodos: Obter, Colocar e Destruir. Você vê como a mesa e


os objetos do livro reagem de maneira diferente a esses métodos.

<blockquote> Por
favor, me dê aquele livro.
Colocamos alguns livros novos na mesa.
Algumas pessoas vieram e não queriam que a gente lesse
e escreva. Eles destruíram o livro.
Por favor, traga-me aquela mesa.
Por favor, coloque a mesa no canto da sala.
Algumas pessoas vieram e não queriam que a gente lesse e escrevesse.
Eles destruíram a mesa. </blockquote>

Usando Geradores
Machine Translated by Google

Em Python, um objeto gerador é usado em um contexto onde a iteração é necessária.


Normalmente, neste caso, contamos com dois métodos: def __init__(self,
*args) e def __iter__(self). Definimos a lógica no método construtor e
iteramos por meio da função def __iter__(self) .
<code>
#!/ usr/ bin/ python3 class
InclusiveRange: def
__init__(self, *args):
numberOfArguments = len(args) if
numberOfArguments < 1: raise
TypeError('Pelo menos um argumento é necessário.')
elif numberOfArguments == 1: [Link]
= args[0] [Link] = 0

[Link] = 1 elif
numberOfArguments == 2:
# start e stop serão tuplas ([Link], stop)
= args [Link] = 1 elif numberOfArguments
== 3: # todos start e stop e step serão

tupla
([Link], [Link], [Link]) =
argumentos

else: raise TypeError("Máximo de três argumentos.


Você deu {}".format(numberOfArguments))

def __iter__(self): i =
[Link]
while i <= [Link]: yield ii +=
[Link]

def principal():
intervalos = InclusiveRange(5, 210, 10) para x em
intervalos: print(x, end=' ')
Machine Translated by Google

if __name__ == "__main__": main()


</code>

Este código significa que você pode controlar o intervalo de iteração. Começamos a partir de 5
e depois terminamos em 210. Em cada etapa, avançamos 10.

<blockquote> 5
15 25 35 45 55 65 75 85 95 105 115 125 135 145
155 165 175 185 195 205 </
blockquote>

Podemos obter o mesmo efeito sem usar esses métodos. Podemos simplesmente
escrever desta forma.

<código>

## a função abaixo está funcionando perfeitamente também, mas


isso não é um gerador ##

def RangeFunctions(self, *args):


numberOfArguments = len(args) if
numberOfArguments < 1: raise TypeError('Pelo
menos um argumento é necessário.') elif numberOfArguments ==
1: [Link] = args[0] [Link] = 0 [Link] = 1 elif
numberOfArguments == 2:

# start e stop serão tuplas ([Link], stop)


= args [Link] = 1 elif numberOfArguments
== 3: # todos start e stop e step serão

tupla
([Link], [Link], [Link]) =
argumentos

else: raise TypeError("Máximo de três argumentos.


Você deu {}".format(numberOfArguments))
Machine Translated by Google

i = [Link] while i <=


[Link]: yield ii += self. etapa

</código>

Herança A
herança é um conceito igualmente importante na programação orientada a objetos.
Existe uma classe pai e uma classe filha. A classe filha geralmente herda todas as
propriedades e métodos da classe pai. Ao mesmo tempo, pode alterar todas as
propriedades e métodos de acordo com a situação.
A maneira como uma classe filha herda é muito simples. Quando declaramos uma classe filha
escrevemos o nome da classe pai dentro da classe filha assim:
ChildClass(ParentClass).

<código>

#!/ usr/ bin/ python3


classe Todos os usuários:
def __init__(self): pass def
Register(self):
print("Por favor, registre-se")
def Login(self): print("Bem-vindo,
membro.")

classe Admin(AllUsers):
def __init__(self): pass def
Register(self):
print("Admins need not
register") def Login(self): print("Welcome Admin")
class Members(AllUsers): def __init__(self):

passe
def main(): admin
= Admin()
Machine Translated by Google

[Link]()
[Link]()
membro = Members()
[Link]()
[Link]() if
__name__ == "__main __": main() </
code>

A classe Parent é “AllUsers()”. Existem duas classes filhas: “Admin” e


"Membros". Por meio das classes filhas, herdamos todas as propriedades
e métodos da classe pai. Na classe pai, mencionamos que todos os usuários
devem se registrar e fazer login. Agora na classe filha “Admin” nós
sobrescrevemos os métodos, mas na classe “Membros” não os alteramos.
Quando criamos uma instância da classe “Admin” , ela possui propriedades e
métodos próprios. Mas na classe “Membros” , decidimos não sobrescrever os
métodos da classe pai. Isso fica evidente na saída a seguir.

<blockquote>
Administradores não precisam
se registrar Bem-vindo Admin
Por favor, registre-se Bem-vindo
Membro. </blockquote>

Decorador

Decoradores são funções especiais que retornam funções. Normalmente, para definir
uma propriedade de objeto, geralmente a obtemos por meio de outra função.

<code>
#!/ usr/ bin/ python3 class
Cachorro:

def __init__(self, **kwargs):


[Link] = kwargs
def get_properties(self):
return [Link] def
set_properties(self, key):
Machine Translated by Google

[Link](chave, nenhum)

def principal():
lucky = Dog(nature = 'obedient')
print([Link]('nature'))

if __name__ == "__main__": main() </


code>

A saída é bastante simples.

<blockquote>
obediente </
blockquote>

Em Python, “Decorator” é simplesmente um método pelo qual decoramos


um método de acesso para uma variável, e a função começa a se comportar
como uma propriedade. A beleza desse decorador é que você pode usar a função como
uma propriedade e, depois de criar o objeto, pode controlar a propriedade — definindo e
obtendo-a. Veja o seguinte código.

<código>

#!/ usr/ bin/ python3 class


Cachorro:

def __init__(self, **kwargs): [Link]


= kwargs @property def Color(self):
return [Link]('color', None)

@[Link] def
Color(self, color):
[Link]['color'] = color @[Link]
def Color(self): del [Link]['color'] def main():
lucky = Dog( )
Machine Translated by Google

# agora vamos usar a função decorator como


uma propriedade normal
[Link] = 'preto e amarelo' print([Link])

if __name__ == "__main__": main() </


code>

A saída é a esperada:

<blockquote> preto
e amarelo </blockquote>

É um exemplo muito simples onde vemos que uma sintaxe usual de função pode
ser escrito como uma sintaxe de propriedade. É mais conveniente quando usamos esse
método decorador para salvar arquivos dentro de um banco de dados.
No último capítulo, veremos a aplicação web “Flask”. veremos como
podemos usar esse decorador para rotear nossas páginas da web.
Machine Translated by Google

© Sanjib Sinha
2017 Sanjib Sinha, Beginning Ethical Hacking with Python, DOI 10.1007/978-1-4842-2541-7_16

16. Métodos de String

Sanjib Sinha 1

(1) Howrah, Bengala Ocidental, Índia

Em Python, uma string é um objeto. Como uma instância de “string de classe” pode chamar
qualquer função ou propriedade. Podemos mudar uma string para letras maiúsculas simplesmente
chamando uma função upper() .
Vamos abrir nosso terminal e digitar isto:

<código>
hagudu@hagudu-H81M-S1: $ python3

Python 3.4.0 (padrão, 19 de junho de 2015, [Link])

[GCC 4.8.2] no Linux

Digite "ajuda", "copyright", "créditos" ou "licença"


Para maiores informações.

>>> 'isto é uma string'

'isso é uma string'

>>> s = 'isto é uma string'

>>> s

'isso é uma string'

>>> [Link]()
Machine Translated by Google

'ISSO É UMA CORDA'

>>> s = 'esta é uma string agora vamos adicionar


um inteiro dentro dele como string {}'

>>> [Link](100)

'esta é uma string agora vamos adicionar um


inteiro nele como string 100'

>>> 'em python2 foi escrito como %d' % 100

'em python2 foi escrito como 100'

>>>

</código>

Acabamos de alterar uma string para letras maiúsculas e também adicionamos um número inteiro
a essa string.
No Python 2 foi feito assim:

'em python2 foi escrito como %d' % 100

Mas no Python 3.4 em diante, não o usaremos mais. Usaremos a função format()
assim:
>>> s = 'esta é uma string agora vamos adicionar um inteiro a ela
como string {}' >>> [Link](100) 'esta é uma string agora vamos
adicionar um inteiro a ela como sequência 100'

<código>
>>> s = 'isto é uma string'

>>> s

'isso é uma string'

>>> [Link]()

'ISSO É UMA CORDA'


Machine Translated by Google

>>> [Link]()

'isso é uma string'

>>> s = 'Isto é uma string'

>>> s

'Isto é uma Corda'

>>> [Link]()

'ESTA É UMA CORDA'

>>> s

'Isto é uma Corda'

>>> s = 'isto é uma string'

>>> [Link]('é')

>>>
</código>

Vamos escrever mais alguns métodos de string. Você pode fazer quase tudo
com esses métodos. Você pode usar upper(), lower(), strip(), replace, find() e muitos
mais .

<code>
#!/ usr/ bin/ python3 s =
'isto é uma string' print([Link]('is'))
newstring = [Link]('this',
'that') print(newstring)

UpperString = [Link]()
print(UpperString) # string é
mutável, então id foi alterado para o
Machine Translated by Google

mesma string
print(id(s))
print(id(UpperString)) a = 'esta é uma
string com muitos espaços em branco no
começo e no fim'
# por padrão, remove o espaço em branco do início e do fim

RemovendoWhiteSpace = [Link]()
print(RemovingWhiteSpace)
print([Link]('this')) </code>

No código acima, primeiro descobrimos a posição de “is” e ele sai como


2. Por quê? Porque a primeira palavra é “this” e a sequência do caractere
começa como 0, 1, 2 e assim por diante. Então na posição 0 está o “t”, depois
na posição 1 está o “h”, e na posição 2 está o “i”, e começa a ler a partir daí.
Lembre-se, string é mutável. Portanto, para o mesmo conteúdo de string,
o “ID” muda. Vimos isso em nosso código.
Finalmente, neste bloco de código vemos uma função importante: strip() . Por
padrão, ele remove os espaços em branco do início e do fim. Caso contrário,
você precisa fornecer o caractere que deseja remover da frase.

<blockquote> 2

isso é uma corda


ESTA É UMA STRING
140141176379480
140141176379768 esta é
uma string com muitos espaços em branco no início e no final

é string com muitos espaços em branco no começo e no final

</blockquote>

Considere este código:

<código>

x, y = 10, 11 f = "este
{} é adicionado e depois adicionamos {}"
Machine Translated by Google

FormattedString = [Link](x, y)
print(FormattedString) # poderíamos ter escrito
no estilo C m, n = 10, 11 f = "este %d é adicionado e
depois adicionamos %d"

FormattedString = f % (x, y)
print(FormattedString) </code>

A saída é a mesma.

</blockquote> este
10 é adicionado e depois adicionamos 11 este 10 é
adicionado e depois adicionamos 11 </blockquote>

Mas a diferença é que, na última parte, usamos o estilo Python 2. Naquilo


estilo, formatamos no estilo “C” e mencionamos que tipo de valor queremos
formatar. Aqui queríamos formatar “decimal”, então escrevemos “%d”.
Do Python 3.1 em diante, esse estilo foi alterado, porque esse wrapper
de duas chaves, “{}”, e a função format() fazem a mágica.
Agora você não precisa mais mencionar o valor. Antes disso, você tinha que mencionar
o valor que queria formatar. Portanto, mais liberdade e poder estão sendo adicionados.
Veja como podemos formatar um valor de dicionário em nossa string:

<código>
a, b = 10, 11 s =
"Este é {} e aquele é {}"
FormattedStirng = [Link](a, b)
print(FormattedStirng) # mudamos a posição
FormattedStirng = [Link](b, a)
print(FormattedStirng) s = "Este é {0}, aquele
é {1} e este também é

{0} e isso também é {1}"


FormattedStirng = [Link](a, b)
print(FormattedStirng) # podemos alterá-lo de
acordo com nosso desejo com o argumento posicional
Machine Translated by Google

s = "Este é {1}, aquele é {1} e este também é


{0} e isso também é {1}"
FormattedStirng = [Link](a, b)
print(FormattedStirng) # podemos usar como
dicionário s = "Este é {meu}, aquele é {seu} e
este
também é {seu} e isso também é {meu}"
FormattedStirng = [Link](mine = a, your = b) print(FormattedStirng)
# mais staff do dicionário s = "Este é o meu desejo: {meu}, e este
é o seu desejo

:{seu} e este também é meu: {meu} e aquele também é meu: {meu}"

FormattedStirng = [Link](mine = "Desejo remover


'Eu'", seu = "Deseja remover 'você mesmo'?") print(FormattedStirng)
</code>

E aqui está a saída:

<blockquote>
Este é 10 e aquele é 11
Este é 11 e aquele é 10
Este é 10, e aquele é 11 e este também é 10 e
isso também é 11
Este é 11, e aquele é 11 e este também é 10 e
isso também é 11
Este é 10, e aquele é 11 e este também é 11 e
isso também é 10
Este é o meu desejo: quero remover 'eu', e esse é o seu desejo: você
deseja remover 'você mesmo'? e isso também é meu: eu quero remover 'eu'
e isso também é
mine: eu quero remover 'eu' </
blockquote>

Como podemos testar se a string é imutável?


<código>

strings = "Isto é uma string"


Machine Translated by Google

print(tipo(strings))
print(id(strings))
AnotherStrings = "Isto é uma string"
print(type(AnotherStrings)) print(id(AnotherStrings))
print([Link]()) words = [Link]()
[Link]("e isso também é uma string." )
print(tipo(palavras)) print(palavras[0])

NovasPalavras = ":".join(palavras)
print(NovasPalavras)
NewWords = ",".join(words)
print(NewWords) words[0] = "Isso"
print(words) </code> <blockquote>
<class 'str'> 139956209543256
<class 'str'> 139956209543256 ['This
', 'is', 'a', 'string'] <class 'list'> This
This:is:a:string:and that ia also a
string.

Esta é uma string e aquela também é uma string.


['Isso', 'é', 'uma', 'string', 'e isso também é uma string.'] </blockquote>
Machine Translated by Google

© Sanjib Sinha
2017 Sanjib Sinha, Beginning Ethical Hacking with Python, DOI 10.1007/978-1-4842-2541-7_17

17. Entrada e saída de arquivos

Sanjib Sinha 1

(1) Howrah, Bengala Ocidental, Índia

Python tem algumas funções internas para lidar com arquivos. Você pode abrir um arquivo e ler o
que está dentro. Você pode escrever um arquivo. Esse arquivo pode ser um arquivo de texto ou
uma imagem.
Cada vez usamos o método open() e passamos o modo como um argumento. Para
lendo um arquivo escrevemos “r” e para escrever usamos “w”. Vamos considerar um código
onde em um objeto lemos um arquivo e o escrevemos em outro arquivo usando outro objeto
na próxima etapa.

<code>
infile = open('[Link]', 'r') outfile = open('[Link]',
'w') for line in infile:

print(line, file=outfile) print("Concluído")


</code>

Se copiarmos desta forma, o tamanho do arquivo é aumentado no novo arquivo de texto.


Agora temos um arquivo relativamente grande. “[Link]” agora é “5,4 KB” e o “[Link]” tem
apenas 134 bytes.
Se copiarmos da maneira antiga, o novo arquivo fica com “5,7 KB”, um pouco maior que o
anterior. Mas o Python tem a técnica de copiar por buffer para que o tamanho do buffer
permaneça intacto.
Agora vamos escrever o conteúdo de “[Link]” em “[Link]”, mas não
pela velha maneira. O novo código é:
Machine Translated by Google

<código>
BufferSize = 500000 infile =
open('[Link]', 'r') outfile = open('[Link]', 'w')
buffer = [Link](BufferSize) while len(buffer):
[Link](buffer ) print("Está copiando, pode
demorar um pouco...por favor aguarde....", end='')

buffer = [Link](BufferSize)
print()
print("Copiando feito.") </code>

A saída é a esperada.

<blockquote> Está
copiando, pode demorar um pouco...por favor
espere....
Copiando feito. </
blockquote>

Ler e escrever arquivo binário é o mesmo. Tudo o que você precisa fazer é mudar
o modo de “r” para “rb” e mudar o modo de “w” para “wb”. É isso.
Seu código fica assim:

BufferSize = 5000000 infile =


open('[Link]', 'rb') outfile =
open('[Link]', 'wb') buffer = [Link](BufferSize)
while len(buffer): [Link](buffer ) print("Está copiando uma
imagem, pode demorar um pouco...por favor aguarde....", end='')

buffer = [Link](BufferSize) print() print("Copiando


feito.") </code>
Machine Translated by Google

© Sanjib Sinha
2017 Sanjib Sinha, Beginning Ethical Hacking with Python, DOI 10.1007/978-1-4842-2541-7_18

18. Contêineres

Sanjib Sinha 1

(1) Howrah, Bengala Ocidental, Índia

Em Python, tuplas e listas são tipos de array. As tuplas são imutáveis, mas as listas
são mutáveis. As tuplas são usadas com o operador vírgula e você pode iterar pela tupla
com bastante facilidade. Como as tuplas são imutáveis, você não pode adicionar ou
atualizar o valor de uma tupla. Nas listas, você pode atualizar ou adicionar novos valores
com bastante facilidade. Abra seu terminal no Linux e IDLE no Windows. Anote o código
.
abaixo e veja você mesmo a saída. Por favor, leia os comentários que acompanham o código

<code>
#!/ usr/ bin/ python3
tuples1 = 1, 2, 3, 4
print(type(tuples1))
print(id(tuples1)) tuples2
= (1, 2, 3, 4)
print(type(tuples2) ))
print(id(tuples2))
print(tuples1[0])
print(tuples2[0]) # dará o
último item print(tuples2[-1])
print(type(tuples1[0]))
print( type(tuples2[0]))
print(id(tuples1[0])) print(id(tuples2[0]))
# tupla é imutável, não podemos
alterar nenhum valor # objeto 'tuple'
não suporta atribuição de item
Machine Translated by Google

# tuples2[0] = 120 #
print(tuples2) # para
fazer uma tupla inteira você precisa adicionar uma vírgula
separadora
IsItTuple = (1)
print(type(IsItTuple))
IsItTuple = (1,)
print(type(IsItTuple)) # vamos
ver como a lista se comporta list1 = [1,
2, 3, 4] print(type(list1)) print(id(list1)) #
primeiro item print( list1[0]) # último
item print(list1[-1]) # podemos alterar o
valor de um item da lista list1[0] = 120
print(list1) # output: [120, 2, 3, 4] </
código>

A saída é assim:

<blockquote>
<class 'tuple'>
139794725901080
<class 'tuple'>
139794725900920 1 1

4 <class 'int'>
<class 'int'>
10455040
10455040 <class
'int'> <class
'tuple'> <class 'list'>
139794725273480
Machine Translated by Google

1 4 [120, 2, 3, 4] </
blockquote>

Operando em tuplas e objetos de lista Vamos abrir


nosso terminal e testar como tuplas e listas funcionam juntas.

<code>
root@kali: # python3 Python
3.4.4 (padrão, 5 de janeiro de 2016, [Link])
[GCC 5.3.1 20160101] no linux Digite
"ajuda", "direitos autorais", "créditos" ou "licença"
Para maiores informações.
>>> t = (1,2,3,4) >>> t

(1, 2, 3, 4) >>>
t[0] 1 >>> t =
tuple(range(25))
>>> type(t) <class 'tuple'> >>> 50
in t

Falso
>>> 10 em t

Verdadeiro >>> para i em t:print(i)


...
0
1
2
3
4
5
6
7

8
9
Machine Translated by Google

10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
>>> l = list(range(20)) >>>
type(l) <class 'list'>

>>> para i em l:
... imprimir(i)
Arquivo "<stdin>", linha 2
print(i)
^

IndentationError: esperava um bloco recuado >>> para i em


l:print(i)
...
0
1
2
3
4
5
6
7
8
9
10
11
12
Machine Translated by Google

13
14
15
16
17
18
19
>>> l[2] 2
>>> 50 em l

Falso
>>> 12 em l

Verdadeiro >>> t[0] = 25


Traceback (última chamada mais recente):
Arquivo "<stdin>", linha 1, em <module>
TypeError: objeto 'tuple' não suporta atribuição de item >>> l[0] = 25
>>> print(l) [25, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,

15, 16, 17, 18, 19] >>>


[Link](50)
Traceback (última chamada mais recente):
Arquivo "<stdin>", linha 1, em <module>
AttributeError: objeto 'tuple' não tem atributo 'append' >>>
[Link](120) >>> print(ll lambda

apenas ( licença(lista( eu

ocais( >>> print(l)


[25, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16, 17, 18, 19, 120] >>> [Link]()

Traceback (última chamada mais recente):


Arquivo "<stdin>", linha 1, em <module>
TypeError: count() recebe exatamente um argumento (0
Machine Translated by Google

dado)
>>> [Link](5) 1
>>> [Link](25)
>>> [Link](25) 2 >>>
[Link](10) 10 >>>
[Link](10) 10 >>>
[Link](range(25))
>>> for i in l:print(i)

...
25
12
34

6
7

8
9
10
11
12
13
14
15
16
17
18
19
120
25 0
12
3
Machine Translated by Google

4
5
6
7

8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 24 >>> [Link](0, 4656) >>>
l[0] 4656 >>> [Link](12, 147)
>>> [Link](12) 14 >>> l[12]
147

>>> [Link](12) >>>


l[12] 147 >>> print(l)
[4656, 25, 1, 2, 3, 4, 5,
6, 7, 8, 9, 10, 147 , 11,
13, 14, 15, 16, 17, 18, 19, 120, 25, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
14 , 15, 16, 17, 18, 19, 20, 21, 22, 23, 24] >>> [Link](12) >>> print(l)
Machine Translated by Google

[4656, 25, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 147, 11, 13, 14, 15, 16, 17, 18, 19, 120,
25, 0, 1 , 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]
>>> l. pop(0) 4656 >>> print(l) [25, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 147, 11, 13, 14, 15,
16, 17, 18 , 19, 120, 25, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22 , 23, 24] >>> [Link]() 24

>>> print(l) [25,


1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 147, 11, 13, 14, 15, 16, 17, 18, 19, 120, 25, 0,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23] >> >

</código>

Anote o mesmo código e veja como funciona na sua máquina. Erros podem
aparecer como aconteceu no código acima. Mas lembre-se, cada erro o ajudará
a aprender algumas coisas novas.

Operando no objeto de dicionário Como você


testou tuplas e listas, pode testar o objeto de dicionário e ver como ele funciona.

<code>
root@kali: # python3 Python
3.4.4 (padrão, 5 de janeiro de 2016, [Link])
[GCC 5.3.1 20160101] no linux Digite
"ajuda", "direitos autorais", "créditos" ou "licença"
Para maiores informações.
>>> x = {'um':1, 'dois':2, 'três':3} >>> type(x) <class
'dict'>
Machine Translated by Google

>>> y = dict(quatro = 4, cinco = 5, seis = 6) >>> type(y)


<class 'dict'> >>> z = dict(sete = 7, oito = 8, nove = 9 , **x,
**y)

Arquivo "<stdin>", linha 1


z = dict(sete = 7, oito = 8, nove = 9, **x,
**e)
^

SyntaxError: sintaxe inválida >>> z =


dict(sete = 7, oito = 8, nove = 9, **x) >>> type(z) <class 'dict'> >>>
print(z) {'oito ': 8, 'dois': 2, 'nove': 9, 'um': 1,

'sete': 7, 'três': 3}
>>> para i em z:print(i)
...
oito
dois
nove
um
Sete
three
>>> for key, value in [Link]():print(key, value)
...
oito 8
dois 2
nove 9
um 1 sete
7 três 3
>>> for
key, value in [Link](): if key == two: print(value)
...
...
...
Traceback (última chamada mais recente):
Arquivo "<stdin>", linha 2, em <module>
Machine Translated by Google

NameError: nome 'dois' não está definido >>> [Link]()

Traceback (última chamada mais recente):


Arquivo "<stdin>", linha 1, em <module>
TypeError: pop esperava pelo menos 1 argumento, obteve 0 >>> [Link](três)

Traceback (última chamada mais recente):


Arquivo "<stdin>", linha 1, em <module> NameError:
nome 'três' não está definido >>> [Link]('três') 3 >>> for
i in z:print(i)

...
oito
dois
nove
um
Sete

>>> para chave, valor em [Link]():


... if chave == 'nove':
... print(valor)
...
9
>>>
</código>

Quanto mais você gasta tempo com tuplas, listas e dicionários, mais aprende sobre
Python. Existem muitas funções internas e você pode usá-las facilmente para obter mais
do seu código. Outro conceito-chave do dicionário é o par "chave=>valor". À medida que
você avança e aprende mais linguagens junto com o Python, você descobrirá que cada
linguagem usa esse conceito, levando-o adiante para resolver os principais problemas.
Os frameworks web, em particular, usam muito esse conceito.
Machine Translated by Google

© Sanjib Sinha
2017 Sanjib Sinha, Beginning Ethical Hacking with Python, DOI 10.1007/978-1-4842-2541-7_19

19. Banco de Dados

Sanjib Sinha 1

(1) Howrah, Bengala Ocidental, Índia

As operações de banco de dados em Python são bastante simples. Para a pequena


quantidade de trabalho, o SQLite3 integrado é bastante competitivo. Você pode mantê-lo
facilmente criando, recuperando, atualizando e excluindo-o.
O termo básico é “CRUD”. “C” significa criar, “R” significa recuperar, “U” para
atualizar e “D” para excluir. Com qualquer banco de dados, você geralmente
executa essas ações.

Vamos começar com SQLite3 .


Há uma grande biblioteca dentro da casa do Python. Todas as funções e
propriedades do SQLite3 são armazenadas lá, para que você possa importá-las
facilmente e usá-las em seu projeto. Considere este código:

<código>
#!/ usr/ bin/ python3 import
sqlite3 def main():

db = [Link]('[Link]') db.row_factory
= [Link] [Link]('eliminar tabela se
existir test1') [Link]('criar tabela test1 (texto t1, i1

int)')
[Link]('insert into test1 (t1, i1) values
(?,?)', ('Nenhuma', 1))
[Link]('insert into test1 (t1, i1) values
Machine Translated by Google

(?,?)', ('Onde', 2))


[Link]('insert into test1 (t1, i1) values (?, ?)', ('Bappa', 3))

[Link]('insert into test1 (t1, i1) values


(?,?)', ('Babua', 4))
[Link]('insert into test1 (t1, i1) values
(?,?)', ('Anju', 5))
[Link]('insert into test1 (t1, i1) values
(?,?)', ('Pergunta', 6))
[Link]('insert into test1 (t1, i1) values (?, ?)', ('GasaBuddhu',
7)) [Link]('insert into test1 (t1, i1) values (?, ?)', ('Tapas', 8)) [Link]()

DatabaseRead = [Link]('select * from test order by i1') for row


in DatabaseRead:

# print(dict(row))
print(row['t1']) #
print(row['t1'], row['i1']) # print(type(row))
if __name__ == "__main__": main() </código>

Se você executar este código, verá uma lista de nomes que acabei de adicionar. Como você vê,
nós nos conectamos com um banco de dados, “teste”. Em seguida, adicionamos
uma tabela com duas colunas. A primeira coluna é o id inteiro e mantemos o ID de cada
nome dentro dela. A segunda coluna é o espaço reservado do texto. Mantemos alguns
nomes lá.
Você pode escrever o mesmo código e testá-lo. Ele lhe dará o mesmo resultado.
Depois de executar o código, você descobrirá que um arquivo “[Link]” foi criado dentro
do seu projeto.

MySQL para Big Project SQLite3 é


bom para uma pequena quantidade de trabalho. Mas para um grande projeto, é melhor
optar por um banco de dados como o MySQL. Para trabalhar com MySQL em Python3
você precisa baixar e instalar o conector MySQL . A parte de download e instalação
Machine Translated by Google

é bem fácil.
No Python2*, você pode, por padrão, importar o MySQL Connector. Mas para
Python3, você precisa baixar o arquivo. Abra [Link] e procure por
MySQL Connector. Baixe o arquivo e execute “[Link]”.
Depois de baixar e instalar o módulo MySQL Connector, é bastante
simples e fácil de conectar a qualquer banco de dados MySQL.
Considere este código em que simplesmente nos conectamos a um banco de dados MySQL e
temos uma impressão “conectada”.
Se o MySQL ou qualquer operação de banco de dados for completamente novo para você, é melhor
aprenda sobre as operações simples do banco de dados e a linguagem de consulta do banco
de dados. No Windows ou no Linux, instalar o PHPMyAdmin é muito fácil. Basta instalá-lo e você não
precisa escrever todo o código SQL para construir um banco de dados e todas as tabelas.
Vamos supor que temos um banco de dados chamado “python-mysql”. Nesse
banco de dados temos algumas tabelas. Agora vamos nos conectar a esse banco de dados
primeiro.

<código>

#!/ usr/ bin/ python3


import [Link] from
[Link] import Error def
ConnectionTest(): ### conectando ao banco
de dados MySQL ###

tente: ### você pode usar um objeto de dicionário ou conectar-


se diretamente ### ### usando um objeto de conexão dictioanry

###
kwargs = dict(host = 'localhost', banco de dados
= 'python_mysql', user = 'root', senha = 'pass') conn =
[Link](**kwargs) ### conectando
diretamente ### connection = [Link](host
=
'localhost',
datado
se = 'python_mysql',
usuário =

'raiz',
passwo
Machine Translated by Google

rd = 'pass') if
conn.is_connected(): print("Conectado
do objeto 'conn'") exceto Erro como e: print(e) finalmente:
[Link]() if __name__ == "__main__": ConnectionTest( ) </
código>

Isso nos dará uma impressão “Connected from a conn object”. Isso significa
que a conexão do banco de dados foi configurada. Agora é hora de recuperar o valor da
tabela.
Neste banco de dados temos duas tabelas. Uma é de “autores” e a outra é de
“livros”. A classe MySQL Connector possui todas as funções necessárias para executar
qualquer tarefa nessas tabelas. Você pode buscar todos os registros. Você pode decidir
quantos livros ou quantos autores gostaria de buscar. O código a seguir mostra ambos.
Mas algumas partes foram comentadas.
Para testar este código você precisa ter um banco de dados primeiro. Nomeie-o como “python-mysql”.
Em seguida, você precisa ter duas tabelas chamadas “autores” e “livros”. Você também
precisa preencher essas tabelas. É sempre melhor pesquisar online e baixar um banco
de dados e tabelas MySQL prontos. Eles estão disponíveis. É altamente recomendável
que você procure por MySQL Connector e veja o que encontra.
No código a seguir, percorra também as seções comentadas. Que
diz muito sobre como você pode recuperar seus registros e mostrá-los ao mundo.

<code>
#!/ usr/ bin/ python3 import
[Link] from
[Link] import Error def RetrieveValues():
try: kwargs = dict(host = 'localhost', database

= 'python_mysql', user = 'root', password = 'pass') conn =


[Link](**kwargs) ### mostra como consultar
dados de um MySQL
Machine Translated by Google

banco de dados em Python usando MySQL Connector/ Python API # como


e
fetchone() , fetchmany() , fetchall() ### if conn.is_connected():

cursors = [Link]()
[Link]('SELECT * FROM
autores')
# row = [Link]() # output
(1, 'Bel and the Dragon ', '123828863494') ###### #
agora tentamos pegar todos os livros # row = [Link]() #
print( type(row)) # saída <class 'list'>, então
podemos usar

para loop
# para livros em linha: #
print(books) # nos dará
uma lista de todos os livros ###### ### agora damos o
tamanho de quantos livros queremos obter ### #
HowManyBooks = 8 # row =
[Link](HowManyBooks) # for books in row: # print(books) #
obtemos a saída de 8 books row = [Link]() for
books in row: print(books) except Error as e: print (e)
finalmente: [Link]() if __name__ == "__main__":
RetrieveValues() </code>

Usamos o método de tentativa e erro para que, se a conexão falhar,


Machine Translated by Google

não mostre uma mensagem feia de “Erro” em seu projeto. Em segundo lugar, este método é
bastante direto. Você também pode usar um arquivo de configuração para fazer a mesma coisa.
É altamente recomendável usar um arquivo de configuração (nós dizemos “arquivo de configuração”).
O arquivo de configuração contém todas as coisas necessárias para se conectar ao banco de dados.
Podemos escrever no arquivo de configuração assim e salvá-lo
como “mysql_config.ini”.

<código>

[mysql]
host = banco de dados
localhost = YourDatabaseName
usuário = root
senha = senha </code>

Vamos ver como esse arquivo “.ini” pode ser analisado através do nosso código Python.
Salvamos este arquivo como “MySQL_Connector.py”.

<code>
#!/ usr/ bin/ python3 from
configparser import ConfigParser def
ReadingMySQLConfig(filemame = 'mysql_config.ini',
section = 'mysql'): parser = ConfigParser() [Link](filemame)
db = dict() if parser.has_section(seção):

itens = [Link](seção) para item em


itens: db[item[0]] = item[1]

outro:
raise Exception('{0} não encontrado no
{1} file'.format(section, filemame)) return db

</código>

Você vê que importamos os módulos necessários para analisar o arquivo de


configuração e, finalmente, usamos esse arquivo de configuração para conectar ao banco
de dados. E no código acima de “MySQL_Connector.py” temos
Machine Translated by Google

incluiu o arquivo “mysql_config.ini” nesta linha—def


ReadingMySQLConfig(filemame = 'mysql_config.ini', section = 'mysql'): —
como um argumento.
Como podemos usar este arquivo de configuração para testar nossa conexão é mostrado
abaixo.

<code>
#!/ usr/ bin/ python3 from
[Link] import MySQLConnection, Error from
MySQL_Connector.mysql_config import ReadingMySQLConfig def
Connect(): kwargs = ReadingMySQLConfig()

MyConnection = MySQLConnection(**kwargs) try: if


MyConnection.is_connected(): print("Connected") except
Error as e: print(e) finalmente: [Link]()
if __name__ == "__main__": Connect() </
código>

Agora desacoplamos mais nosso código. Podemos dividi-lo em pequenos


segmentos para que nosso código de conexão pareça extremamente pequeno e organizado.
Mas você sempre pode se conectar ao seu banco de dados MySQL como abaixo.

<código>
#!/ usr/ bin/ python3 # -*-
codificação: utf-8 -*- import
[Link] from
[Link] import Error def connect(): """
Conectar ao banco de dados MySQL """ tente:

con =
Machine Translated by Google

[Link](host='localhost',
banco de dados='Yo
urDatabase',
user='root',
password='Yo
urPassword') if
conn.is_connected():
print('Conectado ao banco de dados MySQL') exceto
Erro como e: print(e) finalmente: [Link]() if __name__ ==
'__main__': connect() </code>

Agora chegou a hora de recuperar os registros do banco de dados. Somos capazes


para se conectar ao banco de dados. Agora, não deve haver nenhum
problema em buscar registros das tabelas do banco de dados. Temos dois
métodos integrados em nossa biblioteca Python. Os métodos são “fetchmany()”
e “fetchall()”. O primeiro método, “fetchmany()”, dá a você a liberdade de decidir
quantas linhas você vai buscar. Vejamos o código:

//query with fetchmany() <code> #!/


usr/ bin/ python3 from
[Link] import
MySQLConnection, Error from Databases.python_mysql_dbconfig
import read_db_config def iter_row(cursor, size=10): while True:

linhas = [Link](size) se não


for linhas:
quebrar
para linha em linhas:
linha de
rendimento def query_with_fetchmany():
tente:
Machine Translated by Google

dbconfig = read_db_config() conn


= MySQLConnection(**dbconfig) cursor =
[Link]() [Link]("SELECT *
FROM EMPLOYEE")
# EMPLOYEE é o nome da tabela
para linha em iter_row(cursor, 10):
print(row) exceto Error as e: print(e)
finalmente: [Link]() [Link]() if
__name__ == '__main__':
query_with_fetchmany() </code>

O método “fetchall()” traz todos os registros de uma tabela.


<code>
#!/ usr/ bin/ python3
from [Link] import MySQLConnection, Error from
Databases.python_mysql_dbconfig import read_db_config def
query_with_fetchall(): try: dbconfig = read_db_config() conn =
MySQLConnection(**dbconfig) cursor = [Link] ()
[Link]("SELECT * FROM EMPLOYEE") rows =
[Link]() print('Total Row(s):', [Link])
for row in rows: print("First Name = ", row[ 0])
print("Segundo Nome = ", linha[1]) print("Idade = ",
linha[2]) print("Sexo = ", linha[3]) print("Salário = ",
linha[4 ]) exceto Erro como e:
Machine Translated by Google

print(e)
finalmente:
[Link]()
[Link]() if
__name__ == '__main__':
query_with_fetchall() </code>

Você vê como podemos buscar os registros conforme nossos requisitos. Agora


vamos tentar testar o processo de inserção. Em nosso aplicativo
“C” significa
CRUD, o“Criar”.
primeiro
Aqui
a palavra “Criar” significa apenas a inserção de novos registros.
Através do MySQL Connector é bem simples. Tudo que você precisa é que
a conexão esteja ligada. Depois disso, você precisa inserir seus registros.
Aqui está o código. Temos uma tabela “Book” em nosso banco de dados e vamos
para inserir dois registros nele. Um é o título do livro e o outro é o código ISBN do livro.

<code>
#!/ usr/ bin/ python3 from
[Link] import MySQLConnection, Error from MySQL_Connector.mysql_config
import ReadingMySQLConfig def InsertBooks(books): query = "INSERT INTO
books(title, isbn)

VALUES(%s, %s)" tente:


kwargs =
ReadingMySQLConfig()
MyConnection = MySQLConnection(**kwargs) if
MyConnection.is_connected():
cursor = [Link]()
[Link](consulta, livros)
[Link]() exceto
Erro como e: print(e) finalmente:
[Link]() def main():

livros = [("TestBook", 1236547890)]


Machine Translated by Google

InsertBooks(books)
print("Um livro inserido")
if __name__ == "__main__": main()
</code>

Inserimos com sucesso o título de um livro e o código ISBN. O próximo


processo será atualizar esse título e código ISBN. Isso também é muito fácil.
Tudo o que você precisa é o ID exclusivo do livro. Depois de fornecer o ID
exclusivo do livro, você pode atualizá-lo facilmente.

<ocde>
#!/ usr/ bin/ python3 from
[Link] import MySQLConnection, Error from
MySQL_Connector.mysql_config import ReadingMySQLConfig def
UpdateBooks(book_id, title): kwargs = ReadingMySQLConfig() data = (title,
book_id) query = "UPDATE books SET título = %s WHERE id =

%s"

tente: MyConnection = MySQLConnection(**kwargs) cursor =


[Link]() [Link](query, data)

[Link]()
exceto Erro como e: print(e)
finalmente:
[Link]() def main():

for id in range(1, 25): if id == 3:

UpdateBooks(id, "I Have A Dream") print("Um


livro foi atualizado") elif id == 4:

UpdateBooks(id, "Laravel 5 Unfolded") print("Um


livro foi atualizado")
Machine Translated by Google

elif id == 5:
UpdateBooks(id, "Play With Python") print("Um
livro foi atualizado") if __name__ == "__main__":
main() </code>

Atualizamos três livros com IDs exclusivos de 3, 4,


e 5, respectivamente. Por fim, veremos como podemos excluir um registro.
Para excluir um registro, mais uma vez você precisa do ID exclusivo .

<code>
#!/ usr/ bin/ python3 from
[Link] import MySQLConnection, Error from
MySQL_Connector.mysql_config import ReadingMySQLConfig def
DeleteBooks(book_id): kwargs = ReadingMySQLConfig() query = "DELETE
FROM books WHERE id = %s" try: MyConnection =
MySQLConnection(**kwargs) cursor = [Link]()
[Link](query, (book_id,))

[Link]()
exceto Erro como e: print(e)
finalmente:
[Link]() def main():
id = 87 DeleteBooks(id)
print("Deleted ", id, "number of book
from books") if __name__ ==
"__main__": main() </code>

Neste código, esta linha—“[Link](query, (book_id,))”—é extremamente


Machine Translated by Google

importante. Você provavelmente notou que usamos um separador “,” após o


“book_id”. É sua tarefa descobrir por que esse separador de vírgula foi usado.
A única pista é que está relacionado a “tuplas” ou “listas”. É sua tarefa descobrir qual é o
motivo real.
Como toda versão moderna de bancos de dados relacionais, o MySQL também permite
você mantenha um grande objeto binário dentro dele. Normalmente, quando você
escreve números ou strings, eles não ocupam muito espaço. Mas e as imagens? Vamos
supor que temos uma tabela de autores onde precisamos manter imagens para os
autores. Também podemos manter as fotos das capas dos livros em nossa mesa de
livros.
Normalmente esta imagem ou qualquer objeto binário grande é chamado, abreviadamente, “BLOB”
. Vamos atualizar nossa tabela de autores com uma imagem e ver como ela funciona.

<code>
#!/ usr/ bin/ python3 from
[Link] import MySQLConnection, Error from
MySQL_Connector.mysql_config import ReadingMySQLConfig def
ReadFile(filename): with open(filename, 'rb') as f: images = [Link]() imagens de
retorno

def UpdateImage(author_id, filename): kwargs =


ReadingMySQLConfig() data = ReadFile(filename)
query = "UPDATE authors SET photo = %s WHERE
id
= %s"
args = (data, author_id) tente:
MyConnection =
MySQLConnection(**kwargs) cursor = [Link]()
[Link](query, args)

[Link]() exceto
Erro como e: print(e) finalmente:
[Link]() def main():
Machine Translated by Google

id = 47
UpdateImage(id, "/home/hagudu/Pictures/[Link]") print("Imagem da
ID do autor", id, "foi atualizada.") if __name__ == "__main__": main()
< /código>

O código é bastante simples. Pelo menos nesta fase você deve achar simples.
As etapas são assim:

1. Leia o arquivo com a ajuda da palavra-chave “with” e armazene-o em uma


variável e retorne-o. Passamos o parâmetro através da função. Veja a primeira
função: “ReadFile(filename)”.

2. A segunda função é crucial porque passa o mesmo nome de arquivo como um


dos parâmetros. Ele também se conecta ao banco de dados e confirma. Veja a
segunda função: “UpdateImage(author_id, filename)”.

3. Por fim, chamamos a segunda função e passamos o caminho do arquivo de imagem como
um argumento para que nosso código Python chegue lá e recupere a imagem
abrindo-a e finalmente confirmando no banco de dados .
Agora vamos recuperar uma imagem do banco de dados e gravá-la em
nosso disco local. No código anterior, lemos o arquivo. Agora é hora de gravar o
arquivo em nosso disco. O código é quase semelhante, exceto por algumas alterações.

<code>
#!/ usr/ bin/ python3 from
[Link] import MySQLConnection, Error from
MySQL_Connector.mysql_config import ReadingMySQLConfig def
WriteFile(data, filename): with open(filename, 'wb') as files: [Link](data )
def ReadImage(author_id, filename): kwargs = ReadingMySQLConfig()
query = 'SELECT photo FROM authors WHERE id =
Machine Translated by Google

%s'

tente: MyConnection = MySQLConnection(**kwargs) cursor =


[Link]() [Link](query,
(author_id,)) photo = [Link]()[0]

WriteFile(foto, nome do arquivo)


exceto Erro como e: print(e) finalmente:
[Link]() def main(): id
= 47 ReadImage(id, "/home/hagudu/
Pictures/[Link]") if __name__ = =
"__main__": main() </code>
Machine Translated by Google

© Sanjib Sinha
2017 Sanjib Sinha, Beginning Ethical Hacking with Python, DOI 10.1007/978-1-4842-2541-7_20

20. Módulo
Sanjib Sinha 1

(1) Howrah, Bengala Ocidental, Índia

Em Python, quando você sai do shell, do terminal ou do interpretador Python, o script é


perdido. Afinal, você não escreve programas para perder no final do dia. Pode ser um
simples programa de calculadora. Mas você quer usá-lo novamente. Outra coisa
importante é que você precisa usar seu código em outro código. Você pode querer usar
o código de outras pessoas também.
Para resolver esse dilema, entra o conceito de “módulo”.
Você escreve um programa de calculadora simples e salva o arquivo como “[Link]”.
Se você estiver no diretório raiz do seu projeto, poderá facilmente usar sua calculadora
em outro programa. Depois de escrever um código Python e salvá-lo com um nome,
esse nome se torna um módulo.
Neste caso, “cal” torna-se um módulo. Agora você pode “importar” esse módulo
“cal” para qualquer outro código ou módulo. Na grande biblioteca Python, existem
vários módulos. Você sempre pode importá-los e usá-los. Considere o código abaixo.
Neste código importamos três módulos. O primeiro é “sys” ou módulo de módulo
. O segundo
específico do sistema e o terceiro é “urllib”,
é “os”
queou
significa
específico
umado
biblioteca
sistema específica
operacionalde
URL. Você notou que escrevemos "[Link]". A notação “ponto” significa que na
verdade chamamos algo chamado “solicitação” da biblioteca de URL do Python. Na
verdade, a arquitetura da Web depende principalmente de duas coisas: solicitar e
responder .
Aqui vamos solicitar algo de uma URL.

<code>
#!/ usr/ bin/ python3 import
sys, os, [Link] def main():
Machine Translated by Google

print("Esta é a versão do Python: {}.{}.


{}".format(*sys.version_info)) # módulo os print([Link])
print([Link]('PATH')) print(os. getcwd())

módulo #urllib
página =
[Link]('[Link] para linha na página:
print(str(line, encoding='utf-8'), end='')

if __name__ == "__main__": main()


</code>

Você vê que na primeira parte do código usamos o módulo “sys” e queríamos


saber a versão do Python que nosso sistema está usando. A segunda parte é sobre
o sistema operacional. Ele nos dá o nome, o caminho e muitas outras coisas. E na
última parte estamos solicitando uma página da web.
Vamos ver a saída em uma distribuição Linux Debian como o Ubuntu primeiro.
A primeira linha é a versão e a segunda linha é sobre o sistema operacional, que é
“posix”. A terceira linha é o caminho do ambiente e a quarta linha é o caminho real
onde este arquivo está armazenado.
A partir da quinta linha, você vê que o “[Link]” começa a funcionar e
busca toda a página de índice de um site. Eu usei o site do meu amigo. Não
imprimo toda a saída HTML, pois ocuparia muito
veja como espaço. módulos
diferentes Percorra funcionam.
cada linha e

<blockquote>
Esta é a versão do Python: 3.4.3 posix /
usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/
bin:/ sbin:/bin:/usr/games:/usr/ local/games /home/hagudu/
PycharmProjects/FirstPythonProject/mod ules

<!DOCTYPE html>
<html lang="en"> <head>
Machine Translated by Google

<meta charset="UTF-8" /> <meta


name="viewport" content="width=device-width" /> <meta name="viewport"
content="initial-scale=1.0" /> <meta name ="HandheldFriendly" content="true"/>
<link rel="profile" href="[Link] /> <link rel="pingback"
href="[Link] .[Link]/[Link]" /> <title>Arshinagar – Apenas mais
um site WordPress</title> <link rel="alternate" type="application/rss+xml"

title="Arshinagar &raquo; Feed" href="http://


[Link]/feed/" />
<link rel="alternate" type="application/rss+xml"
title="Arshinagar &raquo; Feed de comentários" href="http://
[Link]/comments/feed/" /> //os detalhes foram removidos para
brevidade Processo concluído com código de saída 0 </blockquote>

Agora podemos tentar esse mesmo código no Windows e comparar a saída.

<blockquote> Esta
é a versão do Python: 3.4.4 nt

C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\
Wbem;C:\Arquivos de Programas\Microsoft SQL
Servidor\90\Ferramentas\binn\
D:\pthon-files-fromwindows </blockquote>

Nesta saída, você vê que a versão do Python foi alterada. o funcionamento


sistema não é mais “posix”. É "nt" agora. O caminho do ambiente e o caminho do
arquivo também são opostos. Eu removi a saída do módulo “[Link]” para concisão.

Podemos ver mais exemplos de módulos aqui.


Machine Translated by Google

<code>
#!/ usr/ bin/ python3
import sys, os, [Link], random, datetime def main():

print("Esta é a versão do Python: {}.{}.


{}".format(*sys.version_info))

# módulo aleatório
print([Link](1, 1000)) x =
list(range(25)) print(x) [Link](x)
print(x) [Link](x) print(x)
[Link] (x) imprimir(x)

PresentTime = [Link]()
print(PresentTime) print([Link],
[Link], [Link], [Link],
[Link], [Link], [Link])

if __name__ == "__main__": main()


</code>

Neste código adicionamos mais dois módulos. Eles são “aleatórios” e “data e hora” .
Obtemos a saída abaixo para ver como eles funcionam.

</blockquote> Esta
é a versão Python: 3.4.3 366 [0, 1, 2, 3, 4,
5, 6, 7, 8, 9, 10, 11, 12, 13, 14,

15, 16, 17, 18, 19, 20, 21, 22, 23, 24] [23, 6, 22, 3, 7, 19,
10, 16, 8, 12, 15, 21, 11,
17, 9, 13, 4, 14, 24, 18, 0, 2, 1, 20, 5] [0, 8, 21, 5, 13, 3, 2,
18, 24, 12, 4, 19, 14 , 17,
20, 10, 11, 22, 15, 9, 6, 23, 1, 7, 16]
Machine Translated by Google

[11, 6, 23, 14, 9, 7, 3, 5, 15, 2, 19, 0, 16, 24, 21, 12, 4, 13, 22, 20, 10, 8,
1, 17, 18 ]
//aqui está a saída do módulo de data e hora 2016-03-23
[Link].253888 2016 3 23 8 34 37 253888 </blockquote>

Cada vez que você executa o código, você obtém um novo número, pois o módulo
. a PythonPara
“aleatório” sempre produz novos números. Standard
obter mais
Library
ideias,
no site
você
oficial
precisa
do Python
acessar
ou baixar a documentação do Python 3.4.4 . Está disponível em vários tipos de arquivo,
incluindo arquivo de texto simples ou PDF. A página do módulo “datetime” na Python
Standard Library na documentação se parece com isso:

Figura 20-1. Biblioteca Padrão do Python

Agora você pode voltar aos seus códigos antigos e vê-los novamente sob uma nova luz.
Agora você entenderá facilmente por que usamos o módulo MySQL
.
Connector ou o módulo Configuration Parser
Machine Translated by Google

© Sanjib Sinha
2017 Sanjib Sinha, Beginning Ethical Hacking with Python, DOI 10.1007/978-1-4842-2541-7_21

21. Depuração, Módulo Unittest


Sanjib Sinha 1

(1) Howrah, Bengala Ocidental, Índia

Agora você progrediu muito. No processo de codificação, você deve ter encontrado ou visto
muitos tipos de erros. É bastante óbvio. Os programadores experientes também cometem erros.
Você também aprendeu a detectar seus erros. Mas a situação pode surgir quando você precisar
atualizar seu código. Pode acontecer. Você precisa modificar ou adicionar algumas linhas em
seu código. Pode funcionar ou pode falhar. Em suas novas linhas de código, pode haver erros
. tentaPython
“sintáticos” Podem haver erros de “tempo de execução”. Normalmente, o interpretador orientá-
lo nesses casos. Geralmente indica onde ocorreu o erro. Mas não sempre.

Nesses casos, o módulo “unittest” vem em sua ajuda.


Na biblioteca padrão do Python, você obtém muitas informações sobre este módulo.
Você também pode pesquisar na Internet sobre a ferramenta “nariz”, que faz algo semelhante.
O conceito básico é que você tem um repositório de código em algum lugar e um cronograma
de teste de unidade separado. É um teste automatizado.
Suponha que tenhamos uma pasta chamada “MyTest/BrainAndSoul”. Dentro desta
pasta temos um arquivo Python chamado “[Link]”. É um arquivo muito simples que
nos dirá a versão do Python e a hora e data atuais. Para obter essa saída, precisamos de dois
módulos: “sys” e “datetime”. Temos dois métodos para obter essas saídas. Para obter a saída,
tudo o que precisamos fazer é chamá-los na função “main()”. Nós fazemos exatamente isso.

Ao mesmo tempo, temos dois métodos separados que começam com a palavra “teste”.
Os métodos são “test_PyVar()” e “test_main()”.

<código>

#!/ usr/ bin/ python3 #


codificação=utf-8
Machine Translated by Google

import sys, datetime def


PyVer():
print("Esta é a versão do Python: {}.{}.
{}".format(*sys.version_info)) def PyTime(): PresentTime =
[Link]() print(PresentTime)
print([Link], [Link],
[Link], [Link], [Link],
[Link], [Link]) #print(obj)

def principal():
PyVer()
PyTime()
def test_Pyvar():
PyVer()
def test_Main():
PyTime() if
__name__ == "__main__": main()

<código>

Quando você executa este código, sua função main() chama os dois métodos
definido dentro dela. E a saída abaixo é o que se espera.

</blockquote> Esta
é a versão do Python: 3.4.2 2016-04-22
[Link].435691 2016 4 22 23 30 30 435691
</blockquote>

Agora, em uma pasta completamente separada, gostaríamos de executar o


módulo “unittest” e ver se esse código passa ou falha. Como já executamos o código e
obtivemos uma saída bem-sucedida, podemos dizer com segurança que esse código
passará no teste.
O nome do nosso código de teste de unidade é “[Link]” e o código se parece
com isso:
Machine Translated by Google

<code>
#!/ usr/ bin/ python3 #
coding=utf-8 import
[Link] import unittest class
SayTiemDate([Link]):

def setUP(self):
passar
def test_Version(self):
[Link]([Link] Ver(),
[Link].test_Pyvar())

def test_Time(self):
[Link]([Link] in(),
[Link].test_Main())

if __name__ == "__main__":
[Link]() </code>

O que esse código diz? Como você pode ver, existem dois métodos:
“test_Time()” e “test_Version() ”. Não passamos nenhum argumento. Ambos os
métodos chamam um método padrão do módulo “unittest”. E isso é “assertEqual()”.
Através deste método passamos dois métodos que definimos anteriormente na
pasta “MyTest/BrainAndSoul”. Dentro dessa pasta temos um arquivo Python
chamado “[Link]”. Agora estamos comparando dois métodos através do
nosso módulo “unittest”.
Por fim, ele fornece uma boa saída como esta, se tudo funcionar corretamente.

<blockquote> O
teste começou às 20:58 Esta é a ...
versão do Python: 3.4.2 Esta é a versão do
Python: 3.4.2 Processo concluído com o
código de saída 0 </blockquote>

Quando você executa o código, parece com a seguinte imagem em seu


IDE "PyCharm" .
Machine Translated by Google

Figura 21-1. Unittest no PyCharm IDE

Se executarmos esse código novamente, podemos obter uma saída como esta:

<blockquote> Esta
é a versão do Python: 3.4.2 2016-04-23
[Link].608853 2016 4 23 5 47 23 608853
2016-04-23 [Link].608951 2016 4 23 5 47 23
608951 Esta é a versão do Python: 3.4.2 Esta é
a versão do Python: 3.4.2

..
-------------------------------------------------- -

-------------------
Realizou 2 testes em 0,001s

OK

Processo finalizado com código de saída 0 </


blockquote>

Agora, para fins de teste, alteramos nosso código-fonte e fazemos algumas


Machine Translated by Google

erros intencionalmente para ver se nosso módulo “unittest” falha ou não.


Se houver algum erro, a saída será alterada e fornecerá uma mensagem
de erro como esta:

<blockquote> Esta é
a versão do Python: 3.4.2 2016-04-23
[Link].994547 2016 4 23 5 51 45 994547 Esta é
a versão do Python: 3.4.2 Esta é a versão do
Python: 3.4.2

E.
==================================================== =
===================

ERRO: test_Time (__main__.SayTiemDate)


-------------------------------------------------- -

-------------------

Traceback (última chamada mais recente):


Arquivo

"/home/ss/FirstPythonProjects/PlayWithPython master/MyTest/
[Link]", linha 17, em test_Time [Link]([Link]
[Link](), [Link].test_Main())

Arquivo

"/home/ss/FirstPythonProjects/MyProject/BrainAndSoul/s [Link]", linha 20, no


principal PyTime()

Arquivo

"/home/ss/FirstPythonProjects/MyProject/BrainAndSoul/s [Link]", linha 15, em


PyTime print(obj)

NameError: o nome 'obj' não está definido

-------------------------------------------------- -

-------------------
Realizou 2 testes em 0,001s

FALHA (erros = 1)
Machine Translated by Google

Processo finalizado com código de saída 1 </blockquote>

Agora você pode tentar executar mais módulos de teste de unidade. Aqui está outro exemplo
onde o teste é bem sucedido.
Machine Translated by Google

© Sanjib Sinha
2017 Sanjib Sinha, Beginning Ethical Hacking with Python, DOI 10.1007/978-1-4842-2541-7_22

22. Soquete e Rede


Sanjib Sinha 1

(1) Howrah, Bengala Ocidental, Índia

Este capítulo é uma espécie de introdução aos conceitos avançados de Python.


Como este é o capítulo final, gostaria de falar sobre onde você pode ir a partir daqui.

Você pode criar aplicativos da Web com a ajuda do Python ou fazer algumas coisas de
rede de segurança. Finalmente, como eu, você pode escolher o interessante caminho do
hacking ético. Todas essas coisas e muito mais você pode fazer através do Python.
Vamos ver como podemos aplicar nosso conhecimento básico de Python em socket e
rede. Anote este código em seu IDE e veja qual saída você obtém.

<code> #
coding=utf-8 import
socket
print([Link]("[Link]. com"))
print([Link]("[Link] [Link]"))

</código>

A saída é assim na minha máquina. Você pode testar qualquer outro site para obter
seu endereço. Esta é a ponta do iceberg. Muitas coisas estão dentro. É melhor você ver
tudo o que está dentro do que eu contar, pois acho que você deveria se concentrar em
tentar escrever conceitos básicos de Python cada vez mais.

<blockquote>
[Link]
Machine Translated by Google

[Link]

Processo finalizado com código de saída 0 </


blockquote>

No estudo mais aprofundado da relação entre hacking ético e Python


3 , você achará esses conceitos de soquete e rede extremamente úteis.
Passemos à Parte Três do livro, onde aprenderemos sobre o anonimato.

Um hacker ético deve sempre permanecer anônimo.


Por que? Deixe-nos ver.
Machine Translated by Google

© Sanjib Sinha
2017 Sanjib Sinha, Beginning Ethical Hacking with Python, DOI 10.1007/978-1-4842-2541-7_23

23. Importando Módulo Nmap

Sanjib Sinha 1

(1) Howrah, Bengala Ocidental, Índia

Nmap (Network Mapper) é um scanner de segurança. Foi originalmente escrito por Gordon Lyon
(também conhecido por seu pseudônimo Fyodor Vaskovich). Esta ferramenta é particularmente usada
para descobrir hosts e serviços em uma rede de computadores. Ao encontrar os hosts e serviços, ele cria
um “mapa” da rede. Por esta razão, tem sido amplamente chamado de 'Nmap' ou você também pode
chamá-lo de 'Network Mapper'. É considerado uma ferramenta essencial em sua busca para ser um
hacker ético bom e competente.

Para obter os melhores resultados, o Nmap geralmente envia pacotes especialmente criados para o
host de destino e, em seguida, analisa as respostas e descobre quais portas estão abertas. Também
avalia a vulnerabilidade de uma rede de computadores.
Este software amplamente utilizado pelos hackers possui vários recursos. Na verdade
sonda redes de computadores, descobrindo hosts e serviços. Ele também detecta o sistema
operacional e decide a vulnerabilidade dos sistemas encontrando as portas abertas.

Na verdade, o Python estende esses recursos para que você possa fazer mais facilmente
detecção avançada de serviço, detecção de vulnerabilidade e outras coisas.
Vamos primeiro verificar se o módulo 'Nmap' do python já foi instalado em nosso sistema ou
não, emitindo um simples comando no terminal.

nmap

Isso nos dá uma longa lista que é muito importante. Muitas coisas você pode aprender com
esta listagem, pois diz sobre a versão, usos e no final também diz onde você pode obter o manual para
mais leitura.
Machine Translated by Google

Nmap 6.40 ([Link]


Uso: nmap [Tipo(s) de digitalização] [Opções] {especificação de destino}

ESPECIFICAÇÃO DO ALVO:

Pode passar nomes de host, endereços IP, redes, etc.


Ex: [Link], [Link]/24, [Link];
10.0.0-255.1-254 -iL <inputfilename>: Entrada da lista de hosts/redes
-iR <num hosts>: Escolha alvos aleatórios --exclude <host1[,host2]
[,host3],...>: Excluir

hosts/redes
--excludefile <exclude_file>: Excluir lista do arquivo

DESCOBERTA DO HOSPEDEIRO:

-sL: List Scan - simplesmente liste os alvos para escanear -sn: Ping Scan
- desabilite a varredura de portas
-Pn: trata todos os hosts como online -- ignora a descoberta de host

-PS/PA/PU/PY[lista de portas]: TCP SYN/ACK, UDP ou SCTP


descoberta para determinadas portas
-PE/PP/PM: eco ICMP, timestamp e máscara de rede
sondagens de descoberta de solicitação
-PO[lista de protocolos]: Ping de protocolo IP -n/-R: Nunca
faz resolução de DNS/Sempre resolve [padrão: às vezes] --dns-servers
<serv1[,serv2],...>: Especifica personalizado

servidores DNS
--system-dns: Use o resolvedor de DNS do sistema
operacional --traceroute: Rastreie o caminho do salto para cada host
TÉCNICAS DE
VARREDURA: -sS/sT/sA/sW/sM: TCP
Varreduras SYN/Connect()/ACK/Janela/Maimon
-sU: Varredura UDP
-sN/sF/sX: Varreduras TCP Nulo, FIN e Xmas --scanflags <flags>:
Personalizar flags de varredura TCP -sI <zombie host[:probeport]>:
Varredura ociosa -sY/sZ: SCTP Varreduras INIT/COOKIE-ECHO -sO:
varredura de protocolo IP
Machine Translated by Google

-b <host de retransmissão de FTP>: verificação de devolução de FTP


ESPECIFICAÇÃO DA PORTA E ORDEM DE VARREDURA:

-p <intervalos de portas>: verifica apenas as portas especificadas


Ex: -p22; -p1-65535; -p U:53,111,137,T:21-
25,80,139,8080,S:9
-F: modo rápido - verifica menos portas do que o padrão
Varredura

-r: Varre portas consecutivamente - não randomiza --top-ports <número>: Faz varredura
de <número> portas mais comuns --port-ratio <proporção>: Faz varredura de portas mais
comuns que <proporção>

DETECÇÃO DE SERVIÇO/VERSÃO: -sV: sondar


portas abertas para determinar informações de serviço/versão --
version-intensity <nível>: definir de 0 (leve) a 9 (tentar todas as sondagens)
--version-light: limite para as sondagens mais prováveis

(intensidade 2)
--version-all: Tenta todas as sondas (intensidade
9)
--version-trace: Mostra a verificação de versão detalhada
atividade (para depuração)
VARREDURA DE CRITÉRIO:

-sC: equivalente a --script=default --script=<Lua scripts>: <Lua


scripts> é uma lista separada por vírgulas de diretórios, arquivos de script ou script

categorias --script-
args=<n1=v1,[n2=v2,...]>: fornece argumentos para scripts --script-args-
file=filename: fornece script NSE

argumentos em um arquivo
--script-trace: Mostra todos os dados enviados e recebidos --script-updatedb: Atualiza o
banco de dados do script. --script-help=<Lua scripts>: Mostra ajuda sobre scripts.

<Lua scripts> é uma lista separada por vírgulas de arquivos de script ou


Machine Translated by Google

script-categorias.
DETECÇÃO DO SO:

-O: Ativa a detecção do SO --osscan-


limit: Limita a detecção do SO a alvos promissores --osscan-guess: Adivinha o
SO de forma mais agressiva

TEMPO E DESEMPENHO:
As opções que levam <tempo> estão em segundos ou acrescentam
'ms' (milissegundos),
's' (segundos), 'm' (minutos) ou 'h' (horas) para o valor (por exemplo, 30m).

-T<0-5>: Definir modelo de tempo (maior é mais rápido) --min-hostgroup/max-


hostgroup <size>: Tamanhos de grupo de varredura de host paralelo --min-
parallelism/max-parallelism <numprobes>: Probe paralelização - -min-rtt-timeout/max-
rtt-timeout/inicial-rtt

timeout <time>: especifica o tempo de ida


e volta da sonda.
--max-retries <tries>: Limita o número de retransmissões de sonda de varredura
de porta. --host-timeout <tempo>: Desiste do alvo após esse longo tempo --scan-
delay/--max-scan-delay <tempo>: Ajusta o atraso entre as sondagens --min-
rate <número>: Não envia pacotes mais devagar que <número> por segundo --max-
rate <número>: Envia pacotes não mais rápido que <número> por segundo
FIREWALL/IDS EVASION AND SPOOFING:

-f; --mtu <val>: pacotes de fragmentos (opcionalmente com determinado


MTU)
-D <decoy1,decoy2[,ME],...>: Encobrir uma varredura com iscas -S
<IP_Address>: Falsificar o endereço de origem -e <iface>: Usar a interface
especificada -g/--source-port <portnum> : Use o número de porta fornecido --
data-length <num>: Anexa dados aleatórios aos pacotes enviados
Machine Translated by Google

--ip-options <opções>: Envia pacotes com opções de ip


especificadas --ttl <val>: Define o campo tempo de vida do IP --spoof-mac
<endereço mac/prefixo/nome do fornecedor>:

Falsifique seu endereço MAC --


badsum: envie pacotes com uma soma de verificação TCP/UDP/SCTP falsa

SAÍDA:

-oN/-oX/-oS/-oG <arquivo>: Varredura de saída em normal,


XML, s|<rIpt kIddi3,
e formato Grepable, respectivamente, para o nome de arquivo
fornecido.
-oA <basename>: saída nos três formatos principais
de uma vez só

-v: Aumenta o nível de detalhamento (use -vv ou mais para


maior efeito)
-d: Aumenta o nível de depuração (use -dd ou mais para
maior efeito) --reason:
Exibe a razão pela qual uma porta está em um determinado estado --
open: Mostra apenas portas abertas (ou possivelmente abertas) --packet-
trace: Mostra todos os pacotes enviados e recebidos

--iflist: Imprime interfaces e rotas do host (para depuração) --log-errors:


Registra erros/avisos no arquivo de saída de formato normal --append-output:
Acrescenta em vez de sobrecarregar arquivos de saída especificados

--resume <nome do arquivo>: Retoma uma verificação abortada --


stylesheet <caminho/URL>: folha de estilo XSL para
transformar a saída XML em HTML --webxml:
Folha de estilo de referência do [Link] para XML mais portátil --no-
stylesheet: Impedir a associação de XSL

folha de estilo com saída XML


DIVERSOS:

-6: Ativar verificação de IPv6


-A: Habilita detecção de sistema operacional, detecção de versão,
Machine Translated by Google

varredura de script e traceroute --datadir <dirname>:


Especificar dados personalizados do Nmap
localização de arquivo
--send-eth/--send-ip: Envia usando quadros ethernet brutos ou pacotes IP --
privilegiado: Assume que o usuário é totalmente privilegiado --unprivileged: Assume
que o usuário não tem privilégios de soquete bruto -V: Imprime o número da
versão -h : Imprima esta página de resumo de ajuda.

EXEMPLOS:
nmap -v -A [Link] nmap -v -sn
[Link]/16 [Link]/8 nmap -v -iR 10000 -Pn -p 80

VEJA A PÁGINA MAN ([Link]


PARA MAIS OPÇÕES E EXEMPLOS

Você pode obter mais informações sobre o Network Mapper na internet. Siga
estes links. [Link] [Link] [Link]
[Link] [Link] [Link] https://
[Link]/book/[Link] Se na sua versão 'Linux' do sistema operacional padrão
você não conseguir isso

listando você pode instalar o 'Nmap' emitindo um comando simples.

sudo apt-get install nmap

Em sua máquina virtual, se você executar o kali Linux, verá que o 'Nmap' já foi instalado.

Agora, depois que esta parte da instalação terminar, podemos rapidamente ter um
pequeno script python para ver como nosso módulo 'Nmap' está funcionando.
Você já aprendeu a usar o editor de texto 'nano' em seu terminal. Então abra-o com este
comando:

sudo nano [Link]


Machine Translated by Google

Ele primeiro pedirá sua senha de root e, em seguida, abrirá o editor de texto
nano em seu terminal. Escreva um pequeno script como este:

#!/usr/bin/python import
nmap nm =
[Link]() def
callback_result(host, scan_result):
print ('------------------') print (host, scan_result)
[Link]('[Link]', arguments="-O -v",
callback= callback_result)

while nm.still_scanning(): print("Waiting


>>>") [Link](2) nm1 =
[Link]() a =
nm1.nmap_version() print (a)

Se você executar seu script '[Link]', obterá esta saída:

Esperando >>>
------------------

('[Link]', Nenhum) (6, 40)

É o seu endereço de host local. Mas estamos interessados no alvo remoto.


Execute o kali Linux em sua Caixa Virtual e abra o navegador 'Tor'.
Pesquise 'qual é o meu endereço IP'. Ele lhe dará um endereço IP anônimo o tempo
todo. Cada vez que você pesquisa esse endereço IP muda.
No seu caso pode sair como:

[Link]
ISP: Some Internet LTD

Geralmente é muito longe de sua localização original! De qualquer forma, você


pode testar o IP e ver o resultado. Mas é uma boa prática testar o IP de [Link]
Machine Translated by Google

© Sanjib Sinha
2017 Sanjib Sinha, Beginning Ethical Hacking with Python, DOI 10.1007/978-1-4842-2541-7_24

24. Construindo um Nmap Network Scanner

Sanjib Sinha 1

(1) Howrah, Bengala Ocidental, Índia

Agora estamos prontos para fazer mais testes de rede usando scripts python. E
desta vez vamos tentar construir um scanner mais robusto e também vamos tentar
detectar as portas abertas e ver se há alguma vulnerabilidade.
Vamos escrever o script python primeiro. E depois disso veremos a saída. Deixe-nos
altere o script '[Link]' para este:

#!/usr/bin/python import
nmap nm =
[Link]() print
(nm.nmap_version()) [Link]('[Link]',
'1-1024', '-v') print(nm. scaninfo()) print([Link]())

Aqui '-v' representa a versão e '1-1024' representa o intervalo dos números de


porta.
É um script muito pequeno, mas veja o poder dele na saída.

hagudu@hagudu-H81M-S1: $ ./[Link] (6, 40) {'tcp':


{'services': '1-1024', 'method': 'connect'}}
host;hostname;hostname_type; protocolo;porta;nome;stat

e;produto;informações extras;motivo;versão;conf;cpe
[Link];host3.x0x;PTR;tcp;22;ssh;abrir;;;sin-
Machine Translated by Google

ack;;3;
[Link];host3.x0x;PTR;tcp;25;smtp;abrir;;;syn ack;;3;
[Link];host3.x0x;PTR;tcp;53;domínio;abrir;;;syn ack;;3;

[Link];host3.x0x;PTR;tcp;80;http;abrir;;;syn ack;;3;

[Link];host3.x0x;PTR;tcp;137;netbios ns;filtrado;;;sem
resposta;;3; [Link];host3.x0x;PTR;tcp;138;netbios
dgm;filtrado;;;sem resposta;;3;
[Link];host3.x0x;PTR;tcp;139;netbios ssn;filtrado;;;sem
resposta;;3;

[Link];host3.x0x;PTR;tcp;445;microsoft
ds;filtrado;;;sem resposta;;3;

Isso mostra que todas as quatro portas juntas estão abertas. São eles: 22, 25, 53 e 80.
E os outros são filtrados.
Antes de irmos testar outra porta e dessa vez podemos mostrar o IP como é
de [Link] , vamos ver também
Você alguns fatos
poderápidos sobre
encontrar a terminologia
o lado do porto.
legal da digitalização
explicado aqui: [Link] .

A porta é um local de rede endereçável. É idealmente implementado dentro do sistema


operacional e este sistema operacional nos ajuda a discriminar o tráfego da web. Esse
tráfego é destinado a diferentes aplicativos ou serviços, como alguns para 'mail', alguns
para 'HTTP' e assim por diante.
de Next que nos interessa sobre a varredura de portas.
Emprocesso
uma palavra,
e este
é um
processo
tipo
geralmente tenta se conectar a um número de portas sequenciais, como você acabou
de ver na saída acima. Queremos saber quais portas estão abertas e quais serviços e
sistema operacional estão por trás delas.
Vamos escanear outro endereço IP ( [Link] ) e, ao fazer isso,
mudamos um pouco o script python.

#!/usr/bin/python import
nmap nm =
[Link]() print
(nm.nmap_version())
[Link]('[Link]', '1-1024', '-v') print(nm. scaninfo())
Machine Translated by Google

print([Link]())

A saída é assim:

(6, 40)
{'tcp': {'services': '1-1024', 'method': 'connect'}}
host;hostname;hostname_type;protocol;port;name;stat

e;produto;informações extras;motivo;versão;conf;cpe
[Link];;;tcp;25;smtp;abrir;;;syn-ack;;3;
[Link];;;tcp;53;domínio;abrir;;;syn-ack;;3;
[Link];;;tcp;80;http;open;;;syn-ack;;3;

As portas abertas são 25, 53 e 80. Não há portas filtradas exibidas nesta
máquina.
Vamos obter todos os hosts desse IP com uma pequena alteração em nosso script anterior.
Desta vez, reduzimos o intervalo para que nosso programa não seja executado por muito tempo.

#!/usr/bin/python import
nmap nm =
[Link]() print
(nm.nmap_version())
[Link]('[Link]', '22-455', '-v --version all') print(nm.all_hosts())

Alteramos o número de portas na linha número cinco. Também


removemos as duas últimas linhas e queremos ver se podemos obter mais
dados dessa máquina.
A saída mostra que há apenas um host.

(6, 40)
{'tcp': {'services': '22-455', 'method': 'connect'}} ['[Link]']

Vamos mudar e voltar ao IP anterior e ver a saída.

#!/usr/bin/python import
nmap
Machine Translated by Google

nm = [Link]() print
(nm.nmap_version()) [Link]('[Link]',
'22-455', '-v --version-all') print(nm.all_hosts())

Nada muda. A saída nos informa sobre o único host.


Há mais por vir.
Como queremos mais informações, devemos idealmente alterar nosso código '[Link]'.

#!/usr/bin/python import
nmap nm =
[Link]() print
(nm.nmap_version())
[Link]('[Link]', '22-1024', '-v --version all') print ([Link]()) print
(nm['[Link]'].state()) print (nm['[Link]'].all_protocols()) print
(nm['[Link]'][' tcp'].keys())

Desta vez, a saída é mais detalhada.

(6, 40)
{'uphosts': '1', 'timestr': 'Seg 3 de outubro [Link] 2016', 'downhosts': '0',
'totalhosts': '1', 'elapsed': '5,73'}

para cima
['tcp'] [80, 25, 53]

Você vê que um host está ativo.


Não há downhosts e o número total de hosts é 1 conforme o esperado. Também
vemos a hora exata em que a varredura está sendo executada e o tempo decorrido.
Vamos cavar um pouco mais.
Usamos o intervalo de portas '1-1024'. Normalmente as portas abaixo de 1024 são
associados a serviços do tipo Linux e Unix. Esses sistemas operacionais são
considerados vitais para as funções essenciais da rede. Por esse motivo, você deve ter
privilégios de root para atribuir serviços a esse tipo de sistema operacional.
Se você quiser ir além de 1024, há 'registrado' ou 'privado'
Machine Translated by Google

portos. As portas entre 49152 e 65535 devem ser para uso privado.
Vamos considerar a primeira saída e tentar entender qual porta é usada para
quais propósitos.

[Link];host3.x0x;PTR;tcp;22;ssh;abrir;;;syn
ack;;3;
[Link];host3.x0x;PTR;tcp;25;smtp;abrir;;;syn
ack;;3;
[Link];host3.x0x;PTR;tcp;53;domínio;abrir;;;syn
ack;;3;
[Link];host3.x0x;PTR;tcp;80;http;abrir;;;syn ack;;3;
[Link];host3.x0x;PTR;tcp;137;netbios ns;filtrado;;;sem resposta;;3;
[Link];host3.x0x;PTR;tcp;138;netbios dgm;filtrado;;;sem resposta;;3;
[Link];host3.x0x;PTR;tcp;139;netbios ssn;filtrado;;;sem resposta;;3;

[Link];host3.x0x;PTR;tcp;445;microsoft
ds;filtrado;;;sem resposta;;3;

A porta 22 é usada para 'SSH'. Significa 'Secure Socket Shell'. É um protocolo de rede
com o qual os administradores acessam um computador remoto de forma segura.
A porta 25 é para SMTP ou correio.
A porta 53 significa Serviços DNS.
A porta 80 é para o tráfego da web.

As portas 137, 138 e 139 são capturadas pela Microsoft para transportar seus
Protocolo NetBIOS sobre redes LAN e WAN baseadas em IP.
Por fim, a porta 445 é usada para o Microsoft Directory Services. Para ler mais sobre
esta porta, você pode achar este link interessante: [Link] .
Machine Translated by Google

Parte III
Machine Translated by Google

© Sanjib Sinha
2017 Sanjib Sinha, Beginning Ethical Hacking with Python, DOI 10.1007/978-1-4842-2541-7_25

25. Proteja o anonimato na Internet


Sanjib Sinha 1

(1) Howrah, Bengala Ocidental, Índia

Isso é muito importante para hackers éticos. Você precisa permanecer anônimo e ocultar seu
endereço IP enquanto estiver no mundo do hacking ético. Existem várias maneiras de fazer
isso. Discutiremos neste capítulo como podemos fazer isso.
Existem procuradores. Isso significa que você está roteando através de roteadores diferentes,
mas pode ser muito lento e não estar ao seu alcance. Outra desvantagem de usar proxies é que
você não sabe nada sobre o outro lado. Você está no escuro sobre os servidores através dos
quais seus pacotes estão se movendo. Então isso pode ser muito arriscado. Você pode perguntar
por que isso é perigoso. Eu faria algum tipo de trabalho de “mapeamento da rede”. É inofensivo.
Talvez sim. Mas não se restringe apenas a essa parte. Usando proxy, você pode querer entrar
em algum servidor. Depois de digitar sua senha, ela pode ser invadida.

Como você pode resolver este problema?


Existe um termo: “VPN”. Você provavelmente já ouviu falar de “rede privada virtual
.” O que é aquilo? É basicamente um tipo de serviço que você está usando para
criptografar seu tráfego. E é muito rápido. No futuro, quando você trabalhar como profissional,
precisará contratar um serviço VPN. Não é muito caro. Por enquanto, poderíamos fazê-lo
gratuitamente, apenas para fins educacionais.
Mas depois de criptografar seu tráfego por VPN , é reconhecível. O que
acontece se uma agência solicitar seus dados aos provedores de serviços? Normalmente, para
evitar isso, você precisa ser exigente. Você precisa contratar um serviço de uma determinada
parte do mundo onde a privacidade é estritamente mantida.
Mas depois de dizer isso e esperar pelo melhor, definitivamente não recomendo que você
faça seu hacking ético de chapéu branco usando proxies ou VPNs. Basicamente, você pode
querer fazer isso para ignorar a configuração do firewall ou esse tipo de coisa.
Além disso, alguns serviços VPN não permitem que endereços IP usem seus serviços
Machine Translated by Google

além de um intervalo. Suponha que seu endereço IP esteja fora desse intervalo.
Mas as pessoas costumam usar proxies ou VPNs – nem sempre para fazer algo
malicioso, como derrubar um servidor ou roubar dados. As pessoas podem querer
ocultar sua localização apenas quando estão viajando ou esse tipo de coisa.
Aparentemente esse tipo de atividade fica dentro da lei.
Há outro problema que pode surgir quando você acessa um determinado tipo
de servidor que geralmente permite endereços IP de uma determinada região. Nesse
caso, se você usar um endereço IP da China ou da Rússia, o administrador da rede
certamente irá atrás de você. Portanto, é um problema consistente que continua vindo
e atormentando você de vez em quando e nos próximos capítulos gostaríamos de
abordar esses problemas.
Machine Translated by Google

© Sanjib Sinha
2017 Sanjib Sinha, Beginning Ethical Hacking with Python, DOI 10.1007/978-1-4842-2541-7_26

26. Dark Web e Tor


Sanjib Sinha 1

(1) Howrah, Bengala Ocidental, Índia

Enquanto isso, daremos uma olhada rápida na dark web ou na web oculta.
Não sei se você já ouviu falar sobre isso antes. consiste em uma grande
“deep web” a Internet. É algo como “matéria escura” que parte
consiste
do O
emboato
97 ou
éa98“dark
por cento
web” ou
da
massa do universo. Ainda não se sabe o que é realmente, exceto por algumas coisas.

As pessoas dizem que a dark web está cheia de informações que normalmente não
obtemos. E você não pode acessar a dark web através do seu navegador normal.
Você precisa de um tipo especial de navegador para entrar nesse labirinto de mistérios.
Devo avisá-lo antes de tentar o Tor e entrar na dark web. Existem muitas atividades ilegais,
geralmente acontecendo fora de nossa percepção normal. Pode ser como o tráfico humano.
Pode ser como tráfico ilegal de armas. Pode ser como contratar
assassinos e outros enfeites. Mas neste livro não estamos interessados neles. Nossa principal
preocupação é o conhecimento. Chegamos lá para ter uma ideia do que realmente está
acontecendo na dark web.
Como um hacker ético, você precisa saber tudo para um e apenas um propósito. Você
. você está
precisa lutar contra um ataque malicioso, defender-se, não atacar alguém. Masaprendendo
para se a
defender, você precisa conhecer todas as táticas que seu inimigo costuma usar. Talvez a polícia
peça sua ajuda para rastrear um abusador de crianças. Sem conhecer o caráter adequado da
dark web, você não pode fazer isso. Se você não sabe como ocultar seu endereço IP, como
poderia localizar um criminoso que está escondendo sua localização real?

Além disso, você precisa saber outra coisa importante. A web escura não é
sempre ruim nesse sentido. Você pode encontrar muitos hackers de renome de chapéu
branco ou chapéu cinza em certos fóruns que são mantidos completamente ocultos do vigilante
Machine Translated by Google

olhos dos órgãos governamentais. Você pode encontrar pessoas realmente úteis lá que podem
ajudá-lo a resolver seu problema instantaneamente. Como a Wikipedia, existem wikis ocultos
que veremos em breve, onde você pode encontrar muitas coisas interessantes para aprender.

Wikipédia oculta
Para ler o wiki oculto, precisamos instalar o navegador Tor. O Kali Linux não vem com ele por
padrão, então você precisa instalá-lo.

Figura 26-1. Seção de download do site [Link]

Para fazer isso, primeiro você precisa fazer login como o novo usuário: xman. Em seguida,
abra o navegador normal e procure o navegador Tor. Basta acessar o site oficial e baixar a
versão mais recente do Kali Linux. Tenha cuidado ao verificar se é [Link] não
qualquer outra coisa. Pode vir com “[Link] sem o “s”. Simplesmente evite isso.

Existem duas versões: uma de 32 bits e outra de 64 bits. De acordo com


arquitetura do sistema, é uma boa
, você
prática
precisa
aprender
baixar sobre
a versão
o Tor
exata.
em sua
Antes
documentação.
de baixar a

Existem termos e condições que você deve cumprir. E o termo principal é que você deve
permanecer dentro da lei. Você não pode usar o Tor para nenhum processo ilegal. O Tor
também oculta seu endereço IP. Mas isso é uma questão diferente.
Machine Translated by Google

Após a conclusão do download, você pode acessar o arquivo necessário em seu


"Pasta de download. Basta executá-lo.

Figura 26-2. O navegador Tor está se conectando.

Uma vez conectado, ele abrirá sua primeira página padrão, que você acharia bem diferente
do navegador normal. Em primeiro lugar, você pode digitar “qual é o meu IP” e verificar o que
aparece.
Com certeza será algo diferente da região onde você está. Mas nós
precisamos de páginas da web wiki ocultas originais que nos levarão à dark web.
Lembre-se, existem vários sites que afirmam ser wiki oculto original. Portanto, é preciso
ser criterioso na escolha. Geralmente eles vêm com domínios “.onion” e a URL muda
continuamente. Assim, você pode digitar algo como “url wiki oculto” e ver o que obtém.
Machine Translated by Google

Figura 26-3. A página Wiki oculta original

O principal problema é: você não consegue diferenciar o wiki oculto original do


as outras versões falsas. A imagem acima mostra como pode ficar. A extensão é
sempre “.onion”.
O wiki oculto consiste principalmente em uma grande quantidade de vários links. Muitos
eles são simplesmente ilegais e baratos. Parece um grande mercado onde muitos
produtos contrabandeados são vendidos. Nunca tente comprar nada daqui. Embora seja
tentador comprar algo muito caro por um terço do preço original, não é certo que chegue até
você. Além disso, existe toda a possibilidade de que seu número de débito ou crédito esteja
quebrado.
Mas neste chamado mercado interessante , há muitos realmente úteis
coisas que podem vir em sua ajuda. Um deles é o fórum ou seção de bate-papo onde
hackers de renome geralmente discutem muitas coisas interessantes que você normalmente
não vê em nenhum fórum aberto.
Ao mesmo tempo, você precisa ter cuidado ao usar qualquer código proveniente
desses fóruns ou bate-papos apenas por causa do anonimato. Não é aconselhável usar
esse código em sua máquina original.
Isso pode ser perigoso!
Vamos abrir um site de fórum e ver como fica. Eles geralmente surgem
com um fundo preto, como se representassem a dark web adequadamente.
Machine Translated by Google

Figura 26-4. Uma das páginas ocultas do Wiki - isso pode ser vago

Uma coisa é melhor você ter em mente: o navegador Tor está bem contanto que você queira
para aprender algo novo. Não se destina a fazer algumas coisas duvidosas. Existem muitas
atrações baratas que definitivamente tentariam chamar sua atenção ou até mesmo forçá-lo a ir
até elas. Tenha cuidado ao escolher os sites que você está visitando. Desde que seja um fórum
de hackers, tudo bem. Mas uma vez que você ultrapassa o limite sem cumprir a lei, pode ser
perigoso.
Agora vamos passar para coisas que estão mais diretamente conectadas ao mundo real
hacking ético. Mas antes disso, precisamos ver como as cadeias de proxy e as VPNs
funcionam.
Seu pouco conhecimento dos comandos do Linux será útil. A partir de agora, inicialize seu
tudo o que fizermos será na máquina virtual do terminal Kali Linux e . Kali
abriremos seu terminal. Primeiro aprenderemos sobre cadeias de proxy e, com a ajuda
desta ferramenta, como podemos ocultar nosso endereço IP e obter
acesso a um servidor remoto.
Machine Translated by Google

© Sanjib Sinha
2017 Sanjib Sinha, Beginning Ethical Hacking with Python, DOI 10.1007/978-1-4842-2541-7_27

27. Cadeias de Proxy

Sanjib Sinha 1

(1) Howrah, Bengala Ocidental, Índia

O nome sugere seu verdadeiro significado. Para manter o anonimato, precisamos


de vários proxies. Por trás desses proxies, podemos esconder nossa verdadeira identidade.
Não é bem sucedido o tempo todo. Mas o Kali Linux oferece uma oportunidade especial
de alterar a configuração na raiz para que você possa ocultar sua verdadeira identidade
sua web usando o arquivo
enquanto
Tor “[Link]”.
navega. Na verdade,
Vocêneste
já instalou
caso,ovocê
Tor. precisa configurar

Precisamos abrir o arquivo de configuração usando o editor de texto .


“nano” Abra seu terminal Kali Linux como usuário root e anote este
comando.

root@kali: # nano / etc/ [Link]

Ele abrirá o arquivo “[Link]”. Existem três tipos de proxies que você
pode usar. Mas você não pode usar todos os proxies ao mesmo tempo. Vamos
primeiro ver como este arquivo se parece. Tem 68 linhas. Mas não é muito
complicado se você entender as linhas. As documentações são claras e objetivas.
Aqui estão as primeiras linhas importantes.

# A opção abaixo identifica como o ProxyList é tratado.

# apenas uma opção deve ser descomentada por vez, # caso contrário,
a última opção que aparecer será aceita # dynamic_chain
Machine Translated by Google

#
# Dinâmico - Cada conexão será feita via
proxies encadeados
# todos os proxies encadeados na ordem em que aparecem na lista
# pelo menos um proxy deve estar online para jogar em cadeia

# (os proxies mortos são ignorados) #


caso contrário, o EINTR é retornado ao aplicativo

O que isto significa? Ele diz que a lista de proxy tem várias opções. Você
deve saber como deve tratar essas opções. Se você ler cada linha, terá uma
ideia de como funciona. Existem três tipos de proxies. Você precisa descomentar
qualquer um deles.
O primeiro proxy é “dynamic-chain”. Você vê a linha acima e o vermelho
a cor mostra que eu a descomentei. Existem mais dois proxies:
“strict_chain” e “random_chain”. Eles são comentados. Eles têm suas próprias
descrições. Vamos ler os dois.

#string_chain #

# Estrito - Cada conexão será feita via proxies encadeados # todos os


proxies encadeados na ordem em que aparecem na lista # todos os proxies
devem estar online para jogar em cadeia # caso contrário, o EINTR é
retornado ao aplicativo # #random_chain #

# Random - Cada conexão será feita via random


procurador
# (ou cadeia de proxy, consulte chain_len) da lista. # esta opção é
boa para testar seu IDS :)

Está descrito claramente na documentação que o acompanha. Então eu


não elabore novamente. A vantagem de escolher “dynamic_chain” outros sobre
é claramente indicada. Se a sua conexão não obtiver um “proxy de trabalho”,
ela pula automaticamente para o outro. Os outros dois não te dão isso
Machine Translated by Google

oportunidade de rotear seu tráfego.


Deixe-me explicar melhor. Suponha que você tenha dois proxies no lugar: A e B.
O que acontece no caso de “strict_chain” é que quando você navega em páginas da web,
sua conexão é roteada por A e B estritamente. Isso significa que A e B devem estar em
ordem e vivos. Caso contrário, sua conexão simplesmente falha. No caso de “dynamic_chain”
isso não acontece. Se A cair, ele pula para pegar B. Funciona assim.

Espero que o primeiro passo esteja claro. Vamos considerar alguns outros passos importantes.
No meio, você obtém uma linha como esta:

# Solicitações DNS de proxy - sem vazamento de dados DNS


proxy_dns

É uma linha muito importante a ser considerada com seriedade. Você vê que
eu descomentei o “proxy_dns”. Você não pode permitir que dados de DNS vazem. Em
outras palavras, seu endereço IP real não deve ser vazado por acaso. É por isso que
descomentei esta linha, para que seus proxies estejam no local adequado funcionando sem
problemas.
No final da lista, você encontrará esta linha:

[Lista de proxy] #
adicione proxy aqui ... # média
# padrão definido como "tor"
meias4 [Link] meias5 [Link]
9050
9050

meias5 [Link] meias5 1080


[Link] 45021

Verifique as duas últimas linhas em vermelho. Eu os adicionei. Deixe-me explicar


por que os adicionei. Mas antes de fazer isso, gostaria de explicar as linhas de exemplo
fornecidas anteriormente. Eles lêem assim:

# ProxyList format # type


host port [user pass] separados
(valores # por 'tab' ou 'blank') # #
Machine Translated by Google

# Exemplos:
#
# meias 5 [Link] 1080 eu sou
é segredo # tu
escondido # http [Link] 8080 você
#
meias4 [Link] http 1080
[Link] 8080

Ele indica claramente como sua lista de proxy deve ser formatada. Considere a primeira
linha:

# meias 5 [Link] 1080 eu sou


é segredo

Significa: o primeiro é o “tipo” do proxy. Deve ser "meias5". O segundo é: “host”. A


terceira é “porta” e as duas últimas palavras representam “nome de usuário” e “senha”
caso você pague por isso. Outra coisa importante é: você deve separar as palavras
usando “tab” ou pressionando “em branco”.
Existem vários proxies gratuitos que você encontrará, então não se preocupe com os dois últimos
agora mesmo. Agora podemos voltar novamente às últimas linhas que
discutimos. Nas últimas linhas, foi mencionado que “padrão definido como tor”.
Antes de adicionar as duas últimas linhas, você precisa adicionar esta linha:

meias5 [Link] 9050

Devemos fazer isso porque geralmente seu arquivo “[Link]” aparece


com apenas “socks4”, então você precisa adicionar “socks5”, que suporta a
. Abra seu
tecnologia moderna atual. Agora você pode testar seu status “Tor”
terminal e digite: service tor status Ele falhará se você não iniciá-lo. Então
digite: service tor start Vai iniciar o serviço.
Machine Translated by Google

Figura 27-1. Tor está sendo executado através do terminal

E você pode abrir seu navegador através do terminal. Basta digitar:


proxychains firefox [Link] http://
[Link]/
Esse mecanismo de pesquisa geralmente não rastreia endereços IP. Seu navegador será
aberto e você poderá verificar seu endereço IP. Também gostaríamos de ver o resultado do
teste de vazamento de DNS. Vamos fazer isso digitando “teste de vazamento de DNS” no
mecanismo de pesquisa. Existem vários serviços; você pode clicar em qualquer um deles para
ver o que diz.
Machine Translated by Google

Figura 27-2. teste de vazamento de DNS

Descobri que o “[Link]” está funcionando para descobrir meu IP original


endereço e não consegue descobrir. Ele mostra um IP como “[Link]” e é da
Alemanha. Isso está errado, pois estou escrevendo isso perto de Calcutá.
Você pode testar simultaneamente o mesmo em seu navegador normal e encontrará
seu endereço IP real.
Machine Translated by Google

© Sanjib Sinha
2017 Sanjib Sinha, Beginning Ethical Hacking with Python, DOI 10.1007/978-1-4842-2541-7_28

28. Rede Privada Virtual ou VPN


Sanjib Sinha 1

(1) Howrah, Bengala Ocidental, Índia

Desde o início tento enfatizar uma coisa. O hacking ético começa com um único conceito:
anonimato.
Você primeiro deve garantir que você é anônimo. Você não deixou rastros nas suas costas.
Toda a sua jornada está oculta e ninguém pode traçar sua rota posteriormente.
Discutimos o navegador “Tor” e “cadeias de proxy”. Nós vimos como
podemos usá-los. Outro conceito muito importante a esse respeito é a rede privada
virtual ou VPN, para abreviar.
Ele basicamente lida com as configurações do servidor DNS. Um servidor DNS
normalmente verifica a filtragem de tráfego. Portanto, se você pode alterar a configuração
do servidor DNS em sua raiz, pode desviar essa leitura.
Como podemos fazer isso?
Abra seu terminal Kali Linux e digite:

cat /etc/[Link]

Ele vai mostrar algo assim:

# Gerado pelo servidor de nomes do


NetworkManager [Link]

No seu terminal, existe toda a possibilidade de mostrar outra coisa.


Este é o seu gateway doméstico, que tipo de roteador você está usando; é apenas mostrar
essa informação. Basicamente, vamos mudar isso para que, quando testarmos novamente
nosso endereço IP, o servidor DNS não consiga filtrar o tráfego corretamente.
No meu terminal, quando digito o mesmo comando, fica assim:
Machine Translated by Google

servidor de nomes [Link]


servidor de nomes [Link]

Se você adivinhou que eu realmente mudei isso, você está certo. Eu mudei.
Por que eu mudei isso? Deixe-me explicar.
Você precisa entender o conceito de “nameserver” primeiro. O que isso faz?
O endereço IP da LAN realmente encaminha o tráfego para os servidores DNS, que por
sua vez resolvem as consultas e enviam o tráfego de volta de acordo.
Ao fazer isso, ele também registra a quantidade de tráfego que você está tendo através do
seu gateway doméstico. Não precisamos disso. Por que não precisamos disso? Precisamos ser
anônimos. Portanto, essa é a principal razão por trás da alteração desse servidor de nomes.
Podemos fazer isso através de rede privada virtual ou VPN.
Vamos abrir o terminal novamente e digitar este comando:

nano /etc/dhcp/[Link]

Ele abrirá o arquivo de configuração onde alteraremos o endereço do servidor de


nomes.
Vamos ver como fica.

Figura 28-1. arquivo [Link] no editor de texto nano

Eu abri no meu terminal Ubuntu. Mas você precisa alterá-lo em seu


Machine Translated by Google

Máquina virtual Kali Linux. Você percebe que há muitas coisas escritas ali. Mas estamos
interessados nesta linha intermediária:

anexar servidores de nome de domínio [Link];

Vamos descomentar esta linha primeiro e depois alterá-la. Existem muitos


endereços IP OpenDNS disponíveis na web. Pesquise com o termo “opendns ” e
abrirá várias opções de onde você pode copiar os endereços OpenDNS. Um deles é
“[Link]”. Vamos copiar dois endereços dele e colá-los no lugar de [Link]
assim:

anexar servidores de nome de domínio [Link]


[Link];

Agora tudo que você precisa fazer é uma coisa. Você tem que reiniciar a rede
gerente . Digite este comando em seu terminal Kali Linux: service
network-manager restart Agora você pode verificar seu
servidor de nomes novamente. Ele mostrará dois novos endereços.
Outra coisa é importante aqui. Você precisa verificar se a conexão de mídia
está habilitada ou não. Abra seu navegador Mozilla (no Kali Linux é “Iceweasel”).
Você o encontra no painel superior esquerdo.
Abra o navegador e digite “about:config”. Se parece com isso:
Machine Translated by Google

Figura 28-2. imagem about:config no seu navegador Mozilla

Se você usa Chrome ou Opera, isso mostrará outra coisa. Você precisa clicar e entrar
nele. Entrar nele garantirá um painel de pesquisa na parte superior, onde você digitará o termo
de pesquisa: “[Link] ”.
Vamos ver como fica.

Figura 28-3. Marque “[Link]” verdadeiro ou falso

Na imagem acima, é mostrado “true”. Você precisa clicar duas vezes nele e fazer
o valor booleano “falso”.
Agora você pode procurar a rede privada virtual aberta gratuita. Lembrar,
as pessoas geralmente compram a mesma coisa e pagam um preço alto por isso. Mas eles
não estão seguros o tempo todo. Por que eles não são seguros? É porque, às vezes, quando
a segurança nacional de um país está sob ataque e eles querem as informações, as empresas
de servidores precisam fornecê-las sob pressão. Então, o tempo todo tentei enfatizar uma
coisa: nunca tente ir acima da lei. O hacking ético tem tudo a ver com algo que mantém
estritamente um e único princípio: permanecer dentro da lei.

Você aprende tudo para sua autodefesa, não para qualquer tipo de ataque
antecipadamente. De qualquer forma, neste capítulo, nosso principal objetivo é como
podemos ocultar o servidor DNS de nosso provedor ISP.
Machine Translated by Google

Pesquisamos sobre VPN aberta e encontramos “[Link]”. Nós vamos baixar deste
site. No painel direito, você encontrará o nome dos provedores. Varia de tempos em tempos. De
qual país você fará o download realmente não importa, desde que funcione.

Durante o download, você notará que uma combinação de nome de usuário e senha é
fornecida. Copie-os e salve-os em algum lugar, pois você precisará deles ao executar a rede
privada virtual em sua máquina.
Na seção de download do seu Kali Linux, você tem uma versão compactada da VPN.
Descompacte-o primeiro e depois execute-o. Como você pode fazer isso? Deixe-me abrir minha
seção “Download” do Kali Linux e ver o que vejo.

sanjib@kali: $ cd Downloads/ sanjib@kali: /


Downloads$ ls [Link]
[Link] vpnbook-euro1-
[Link] [Link]

Para obter a mesma saída, você deve descompactar sua versão compactada da VPN. Agora
emita este comando:

openvpn [Link]

Se a máquina dissesse “comando openvpn não encontrado”, você teria que instalá-lo.
Instalar qualquer coisa através do terminal é bastante fácil no Linux. Pesquise na web; há toneladas
de tutoriais que irão guiá-lo sobre isso. Geralmente isso é feito pelo comando “apt-get” Quando
você tenta executar o “openvpn” ele irá pedir o. nome de usuário primeiro. Aí ele vai pedir a senha.
Depois que esse processo estiver concluído,
esperar
ele tentará
algum tempo.
construir
A amenos
conexão.
que Você
você precisa
receba uma
mensagem, “inicialização completa”, você não pode abrir seu navegador. Pode levar vários minutos.
Normalmente leva no mínimo dois minutos.

Se você não tiver sorte, pode levar algum tempo - nem sempre, é claro. Esse
mensagem não aparecerá. Nesse caso, diz "falha na conexão".
Depois de receber a mensagem “inicialização concluída”, você pode abrir o navegador
e pesquisar em “[Link]”. Esse mecanismo de pesquisa geralmente não
rastreia o registro do usuário.
Seu primeiro trabalho será verificar o vazamento de DNS. Vá em frente e você definitivamente
encontrar um endereço IP alterado.
Machine Translated by Google

Isso significa que você se conectou com sucesso através do privado virtual
rede e seu servidor DNS ISP original está completamente oculto.
Machine Translated by Google

© Sanjib Sinha
2017 Sanjib Sinha, Beginning Ethical Hacking with Python, DOI 10.1007/978-1-4842-2541-7_29

29. Endereço MAC

Sanjib Sinha 1

(1) Howrah, Bengala Ocidental, Índia

Aprendemos muitos truques até agora - tudo sobre anonimato. Mas vamos sempre
tentar ir para um nível superior. Alterar o endereço MAC se enquadra nessa categoria.
De forma simples, é o seu endereço de hardware. Basicamente, não é o
endereço de hardware da sua máquina, mas é o endereço de hardware da sua
placa de rede através da qual você está conectado ao mundo externo.
Vamos iniciar nossa máquina virtual Kali Linux e abrir o terminal. Emitir
o comando: ipconfig .
Ele produzirá algo assim:

root@kali: # ifconfig eth0:

flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet


[Link] netmask [Link] broadcast
e80::a00:27ff:fef4:16ec [Link]
prefixlen inet60x20<link>
64 scopeid
ether [Link] :f4:16:ec txqueuelen 1000 (Ethernet)

Pacotes RX 19 bytes 1820 (1,7 KiB) Erros RX


0 descartados 0 saturações 0 quadro 0 Pacotes TX 31 bytes 2427 (2,3 KiB)
erros 0 descartados 0 saturações 0 transportadora 0 colisões 0 Texas

lo:
flags=73<UP,LOOPBACK,RUNNING> mtu
Machine Translated by Google

65536 inet [Link] máscara de rede [Link] inet6


::1 prefixlen 128 scopeid 0x10<host> loop
txqueuelen 0 (Loopback local) Pacotes RX 36 bytes 2160 (2,1 KiB) Erros RX 0 descartados
0 overruns 0 quadro 0 Pacotes TX 36 bytes 2160 (2,1 KiB) Erros TX 0 descartados 0
overruns 0 transportadora 0 colisões 0

No seu caso, a saída pode ser diferente. Estamos preocupados com o


endereço de hardware da nossa rede e queremos alterá-lo.
No meio, você viu a linha vermelha que diz: ether [Link]

Este é o endereço MAC da máquina virtual Kali Linux ou o endereço da placa de rede local
. Agora, em alguns casos, pode ser assim: HWaddr [Link] Em alguns
casos é diferente. São placas de rede. Podem ser placas Ethernet,
adaptadores
placas wireless,
wireless, etc.

Mas esse endereço é extremamente importante, pois é usado para identificá-lo no


vasto mundo web. Os três primeiros dígitos são os símbolos que representam o
fabricante.
Podemos verificar aqui também emitindo este comando:

root@kali: # macchanger -s eth0


MAC atual: [Link] (COMPUTADOR CADMUS
SISTEMAS)
MAC Permanente: [Link] (COMPUTADOR CADMUS
SISTEMAS)

Como você vê, ele mostra dois endereços MAC - um é atual e o outro é permanente.
Você pode perguntar por que estou verificando isso aqui. Eu verifiquei uma vez emitindo o
comando “ifconfig”. Isso não é o suficiente?
É porque o comando “ifconfig” mostrará apenas o endereço MAC atual. Não mostrará
o endereço MAC permanente. Isso significa que quando você alterou o endereço MAC e
emitiu o comando “ifconfig”, ele mostra apenas o endereço alterado, não o permanente.

Agora gostaríamos de mudar nosso endereço MAC. Vamos emitir este comando:

root@kali: # macchanger –h

E produzirá uma saída como esta:


Machine Translated by Google

GNU MAC Changer


Uso: dispositivo macchanger [opções]

-h, --ajuda Imprimir esta ajuda


-V, --versão versão impressa e
saída
-s, --mostrar Imprima o MAC
endereço e sair -e, --finalizar
bytes do fornecedor Não mude o

-a, --another Define o MAC do fornecedor aleatório do mesmo


tipo
-A Definir fornecedor aleatório
MAC de qualquer tipo
-p, --permanent hardware Redefinir para original,
permanente MAC -r, --random
Definir totalmente aleatório
MAC
-l, --list[=palavra-chave] -b, --bia Imprimir fornecedores conhecidos
Fingir ser um
endereço queimado
-m, --mac=XX:XX:XX:XX:XX:XX --mac
XX:XX:XX:XX:XX:XX Definir o MAC
XX:XX:XX:XX:XX:XX

Relate bugs para


[Link]
As três linhas vermelhas são importantes. É explicitamente definido o que eles
significam. A linha de cor verde também é importante.
As duas primeiras linhas — -a, --another Definir MAC de fornecedor aleatório do
mesmo tipo -A Definir MAC de fornecedor aleatório de qualquer tipo — significam que
você pode alterar o endereço MAC, mas não pode alterar o fornecedor.

Nesse caso, existe toda a possibilidade de perder o anonimato. Os três primeiros


conjuntos pertencem ao fabricante do cartão de rede e, como isso não foi alterado,
você pode ser identificado.
A terceira linha vermelha é bastante óbvia e auto-explicativa em sua
significado. Ele diz: você pode voltar ao endereço MAC original.
Machine Translated by Google

Até agora, a melhor opção disponível para nós é a linha verde — -r, -- random
Definir um MAC totalmente aleatório — onde é dito claramente que você pode definir um
MAC totalmente aleatório. Ou seja, os seis conjuntos são completamente aleatórios – o que
preferimos.
O mais importante deles é a última linha de cor azul. Por que isso é
importante? É porque você pode alterar o endereço MAC completamente.
Podemos ter uma lista de todos os fornecedores com um simples comando: l. Se você emitir isso
comando, ele fornecerá uma lista muito longa. Vamos pegar alguns deles.

root@kali: # macchanger -l

Diversos MACs:

Seja MAC Fornecedor

--- --- ------

0000 - [Link] - XEROX CORPORATION

0001 - [Link] - XEROX CORPORATION

0002 - [Link] - XEROX CORPORATION

0003 - [Link] - XEROX CORPORATION

0004 - [Link] - XEROX CORPORATION

0005 - [Link] - XEROX CORPORATION

0006 - [Link] - XEROX CORPORATION

0007 - [Link] - XEROX CORPORATION

0008 - [Link] - XEROX CORPORATION

0009 - [Link] - XEROX CORPORATION

0010 - [Link] - OMRON TATEISI ELECTRONICS CO.

0011 - [Link] - MATRIX CORPORATION


Machine Translated by Google

0012 - [Link] - CISCO SYSTEMS, INC.

0013 - [Link] - FIBRONICS LTDA.

0014 - [Link] - FUJITSU LIMITED

0015 - [Link] - NEXT, INC.

0016 - [Link] - SYTEK INC.

0017 - [Link] - SISTEMAS PADRÃO

0018 - [Link] - TECNOLOGIA DA INFORMAÇÃO LIMITADA

0019 - [Link] – CAMEX

Pegamos as primeiras linhas - dezenove no momento. Mas o último é 19010 - [Link] - Hitachi
Reftechno, Inc. O número vermelho mostra quantos existem no total. A lista não está completa.
Depois disso, existem os endereços MAC sem fio. Ao todo são cerca de trinta e nove.

Você pode perguntar o que eles são realmente. Eles nada mais são do que os
bits do endereço MAC da empresa. Consideremos o último exemplo: 0019 - [Link]
– CAMEX.
O primeiro é o número de série. O segundo é o endereço MAC. Você
pode alterar o endereço do fornecedor e usar este e fingir estar usando esta empresa. Os hackers
éticos às vezes usam esse truque.
Tendo tudo em mente, gostaria de dizer que a última opção - o azul
colorido - é o mais importante.
Nas faculdades, os alunos às vezes usam esse truque para enganar o professor, junto
com toda a classe. Alguém pega o endereço MAC do professor e, fingindo ser o PC do
professor, bloqueia a rede. Uma vez que a rede foi congestionada, o professor não pode mais dar
aula.
Normalmente, há um sistema de filtragem de rede que descobre o endereço MAC
não autorizado e bloqueia esse endereço. Mas isso também é divertido. Quando o
sistema de filtragem de rede bloqueia o endereço MAC, descobre-se que o PC do
professor foi bloqueado inadvertidamente.
Como um hacker ético, você precisa estudar esta parte particularmente, já que os
hackers mal-intencionados geralmente usam o endereço MAC da máquina de outra pessoa e
fingem ser alguém enquanto fazem as coisas erradas.
Machine Translated by Google

# Epílogo — O que vem a seguir

Obrigado por ler este volume de Ethical Hacking with Python 3. Espero
que, como iniciante, você aprendeu os fundamentos do hacking ético . Isso
inclui os termos, o lado legal e a finalidade; rede, o ambiente e uma introdução detalhada
sobre anonimato. Além disso, espero que você tenha um conhecimento prático do
Python 3.
Os próximos volumes de livros sobre Ethical Hacking tratarão de conceitos
mais avançados como “Nmap”, “SQL Injection”, “Denial of Service ou DOS”,
“Método de Força Bruta”, “Bloqueio de Sinal”, “Quebra de Senha”
“Footprinting with Nmap,” “Attacking Wireless Networks,” “WiFi Hacking, Breaking
Encryptions”, “SLl Strips” e muito mais.
Espero encontrá-lo no próximo livro. Até então, boa sorte.
Machine Translated by Google

Epílogo — O que vem a seguir


Obrigado por ler este volume de Ethical Hacking with Python 3 Espero que, como . iniciante,
você tenha aprendido os fundamentos do hacking ético . Isso inclui os
termos, o lado legal e a finalidade; rede, o ambiente e uma introdução detalhada sobre
anonimato. Além disso, espero que você tenha um conhecimento prático do Python 3.

Os próximos volumes de livros sobre Ethical Hacking tratarão de conceitos mais


avançados como “Nmap”, “SQL Injection”, “Denial of Service ou DOS”,
“Método de Força Bruta”, “Bloqueio de Sinal”, “Quebra de Senha”
“Footprinting with Nmap,” “Attacking Wireless Networks,” “WiFi Hacking, Breaking
Encryptions”, “SLl Strips” e muito mais.
Espero encontrá-lo no próximo livro. Até lá, boa sorte .

Índice

A,B
Métodos de acesso
AMD64
Proteção de anonimato, Internet

C
Classe string
format() função
imutável posição
inferior() substituir e
localizar() tira()
superior()

Comunicação
Execuções condicionais
Valores/expressões condicionais
Módulo analisador de configuração
Codificação de

contêineres
Machine Translated by Google

tuplas de saída do objeto


da lista de objetos do
dicionário

Cartão de Crédito / Débito


Criminosos
Criar, recuperar, atualizar e excluir (CRUD)
Lei cibernética

D
Web escura/Deep Web
Datagrama
Debian
decoradores

E
Função enumerate() de comunicação
de ponta a ponta
hacking ético
Exceções

F,G
Entrada e saída de arquivo
Sistema de verificação de quadro (FCS)
Função
Codificação de
AnotherFunction()
DemarcationLine() gera
funções listas de
argumentos nomeados
argumentos passando
valores padrão passando
parâmetros/argumentos
Reutilização dos
valores de retorno
RangeFunctions()
TestFunction()
Machine Translated by Google

H
Ataque de
hackers, métodos de exploração/penetração
computadores número de cartão de crédito/
débito criminosos ambiente

máquina
virtual de linguagem
de programação de sistemas
operacionais anônimos
máquina virtual
Wikipédia oculta
páginas Wiki ocultas
mercado interessante
Arquitetura do sistema
terminal Kali Linux
Navegador Tor site
[Link] Tráfico humano

EU J
Herança
Organização de Padrões da Internet (ISO)
Internetworking

k
Kali LinuxGenericName

eu
Distribuição Linux
terminal Linux comando
adduser anonimato
comando cat cat
[Link] | grep
origem
Machine Translated by Google

comando cd
comando chmod
ferramenta de linha de comando/
terminal comando cp comando cp–
help diretórios e pastas comando
echo hacking ético modo executável
permissão de arquivo comando
grep comando grupo Iceweasel
Kali Linux visualização em tela
cheia sair comando ls comando ls–
la comando mkdir comando mv
editor de texto Nano saída
comando pwd [Link] arquivo
Python comando rf comando rm
root/superusuário comando rx
comando sanjib [Link]
comando sudo endereço da placa
de rede local função loops()

M
Comando de
endereço
MAC hackers éticos
Machine Translated by Google

ifconfig
ipconfig
placa de rede
filtro de rede saída do sistema

ataque malicioso
Controle de acesso à mídia (MAC)
Programa
de calculadora de módulo
Linux Distribuição Debian sistema
operacional/módulo específico do sistema
programe solicitação aleatória e data/hora e
responda sys/módulo específico do sistema urllib

Arquivo de

configuração de codificação do MySQL


conector
Conexão do banco de
dados do aplicativo CRUD
excluir um registro fetchall()
fetchmany() arquivo .ini
PHPMyAdmin python-
mysql bancos de dados
relacionais recuperar
registros [Link] passos
curtos do BLOB método
try e error escrevendo
arquivos Módulo MySQL
Connector

N
Machine Translated by Google

Características da
rede funções de comunicação
interoperabilidade engenharia
modular recursos de
compartilhamento tipos de
soquete

placas de rede

Objeto
Programação orientada a objetos (OOP)
acessando classes de vantagem de dados
de objeto e argumentos de objetos
codificação padrão definição de argumento
inicialização instâncias de processo
métodos MyMySQLConnection() e
MySQLiteConnection()

Banco de dados
MySQL mecanismo
de herança de classe de saída
jogo de descrição do decorador,
geradores bons e ruins herança
de objetivos inter-relações e
interações de dados objeto objeto
vs polimorfismo aplicativos de
software

. aula
Machine Translated by Google

método open()
da página da web
Open Systems Interconnection (OSI) camada de
aplicação camada de enlace de dados camada de
rede camada física camada de apresentação
camada de sessão camada de transporte

P, Q
Filtragem de pacotes
comutação de pacotes
Seleção de caminho
Polimorfismo
Proxies

Arquivo de
configuração de cadeias de proxy
teste de vazamento de DNS

DNS solicita
documentações

dynamic_chain
lista de
endereços IP

random_chain
strict_chain
tor

tipos
Python
atribuindo valores
codificando comentários
condicionais dicionário
para loops indentação e

instaladores de espaço
em branco
Machine Translated by Google

valores lógicos
main() números da
função saída do

objeto

OutsideMainFunction() fora da
função print() função print()
string tuplas e listas tipo e ID
while loops

Página de

documentação

do comando de codificação do Python 3


VAI

Intérprete de

instruções IDLE
Saída de linguagem de

programação de código aberto de distribuição


Linux
Pycharm community edition configuração
do sistema monitoramento do sistema

Plataforma Windows/Macintosh
Biblioteca Padrão do Python

R
função range()
Expressões regulares re
módulo reutilizando

pesquisa

roteadores

S
Machine Translated by Google

Segmento
Efeito colateral
soquete
Instalação de software
SQLite3
Comuta
Erro de sintaxe

T
Protocolo de Controle de Transmissão/Protocolo de Internet (TCP/IP)
tente bloquear
Tuplas
TypeError

EM

ubuntu
centro de software ubuntu
uname-a
Módulo Unittest
mensagem de
erro assertEqual()
MyTest/BrainAndSoul
PyCharm IDE [Link]
erros sintáticos test_PyVar()
e test_main() test_Time() e
test_Version()

[Link]

EM

[Link] Virtual
Box Guest Additions Vantagem do
Virtual Box (VB) apt-get update apt-
get upgrade Arquitetura de 32
bits/64 bits
Machine Translated by Google

seção de download, Linux hospeda


arquivos .exe tamanho de tela inteira
visualização em tela cheia processo de
instalação de teste de ferramenta de
hacking, instalação do Kali Linux
Windows 7 Ultimate conexão com a
Internet imagem ISO Kali Linux em
execução, métodos de tamanho de
memória Oracle VM pacote do sistema
operacional procedimento de ferramenta
de ataques de senha Red Hat/Fedora
códigos de execução seção de
armazenamento auto-explicativo terminal
de comando su e imagem de terminal
tipo x86_64 Rede privada virtual (VPN)
sobre: imagem de configuração,
anonimato do navegador Mozilla apt-get
conexão de comando [Link]
arquivo servidor DNS ISP provedor
[Link]

nome do servidor

gerenciador de rede
opendns princípio
openvpn versão
compactada
Machine Translated by Google

WXYZ
Windows XP

Você também pode gostar