segunda-feira, 28 de maio de 2007

Indo a fundo - assembly e engenharia reversa

Aprender assembly e engenharia reversa. Eis o galho. Difícil de encontrar material, e principalmente códigos para ler.

Nem tanto. Um ótimo livro, The Art of Assembly Programming, de Randall Hyde. Abrange desde o que é um sistema de numeração binária, até HLA (High-Level Assembly). Referência em tantas outras obras, este livro só falta pegar no colo.

O site Numa Boa, também tem um tutorial em português, além de uma referência bem completa sobre as API's do Win32. Ah sim, o pessoal do Linux também tem um site de referência sobre assembly bem aqui.

Se você acha que precisa de mais códigos para entender o que se passa, há um comando no Linux que pode ajudar muito (inclusive no que diz respeito a engenharia reversa): o objdump.

Você pode usá-lo para disassemblar qualquer programa nos formatos PE (Portable Executable, que é o padrão do Win32), no formato ELF (Executable and Linking Format, que é o padrão atual dos UNIX-like), ou ainda em alguns outros formatos.

Criar códigos "hello world" em C, e depois disassemblá-los com o objdump é uma boa forma de se aprender.

Para a engenharia reversa e debbuging ainda há outros comandos no Linux que são muito úteis e que já vêm inclusos na maioria das distribuições, entre eles:
readelf que "disseca" o executável;
od que retorna byte a byte o conteúdo do arquivo;
ar que serve para alterar/criar/modificar arquivos de uma forma bem seleta.

Utilize-os com moderação!
-----------
keepReading

sexta-feira, 27 de abril de 2007

O modo texto

O pessoal que entra no mundo linux logo descobre que as coisas mais animais que dá pra se fazer é através da linha de comando. Porém para a maioria das atividades rotineiras, acaba-se usando ferramentas gráficas para isso.

Usar o OpenOffice.org, navegar com o Firefox, usar o K3B para gravar um CD,.... tarefas comuns, rotineiras e que têm uma solução de interface gráfica, que praticamente dispensa prática ou muitos conhecimentos.

Nos ultimos dias também andei experimentando soluções em modo texto para tarefas comuns. Descobri que o shell por si só é muito mais poderoso do que imaginava. Também experimentei os editores nano e VI Improved (VIM), que são demais.

Têm recusos incomuns à primeira vista, e podem até parecer complicados de se usar, mas depois de mais ou menos uma hora trabalhando com eles já se nota a diferença na velocidade com que se pode realizar as tarefas comuns. E ainda por cima pode-se customizar funcionalidades e recursos de forma a tornar o trabalho mais ágil.

Navegadores de modo texto também são um barato. Experimentei dois: o lynx e o w3m. O Lynx é um clássico, muito bom e com vários recursos. Mas o w3m me surpreendeu. Ele tem suporte a navegação em abas, suporte a várias codificações diferentes, gerenciamento de cookies, recursos de segurança, gerenciador de downloads, 'favoritos' e histórico. Em outras palavras: completo.

Outras coisas que quero experimentar no modo texto são: gravar CD direto pela linha de comando (dizem que é absurdamente mais rápido, e eu não duvido, basta ver a diferença entre o Nero e o K3B); usar o talk para mensagens instantâneas; e o ffmpeg para converter arquivos, como .avi para .mpg.

Talvez esse mundo só fique proibido dos designers, que dependem do GIMP, Inkscape, Blender e Cia, para trabalhar. Mesmo assim, quem sabe realmente usar estes programas afirma que eles são as ferramentas de produção mais eficazes do mercado.

Té+
-----------
keepReading

Uma referência da linguagem C

Eu sempre gostei de referências completas. O problema sempre foi achá-las. E nos últimos dias procurei algo sobre linguagem C.

A idéia surgiu depois de eu ter lido um código-fonte cheio de includes. Me perguntei se era necessário tudo aquilo, e mais importante, quais funções são fornecidas por cada um dos header files.

Ao conferir os próprios arquivos, vi que apesar de bem documentados, eram numerosos e extensos demais. O que eu queria era apenas uma lista. Decidi criar algum algoritmo ou script que criasse essa lista para mim. No entanto, cada arquivo tem um formato interno diferente, o que dificultou (e ainda está dificultando no presente momento) meu trabalho.

Achei algumas referências na internet e gostaria de compartilhá-las, ainda que nenhuma delas me atenda por completo.

Site de Eric Huss

Site da GNU

O site da GNU é mais que um curso completo, porém não aborda todas as bibliotecas, a informação não está organizada da forma que eu queria (como no site de Eric Huss). O site de Eric Huss, por sua vez apresenta-se com uma organização mais agradável, porém a quantidade de informação é muito menor, assim como as bibliotecas abordadas.

Mas, enquanto estudo e crio uma solução (desejo criar um tarball de arquivos html ou xml), as referências acima dão conta da maioria das dúvidas.

PS: Se quiser entender o por quê da linguagem C, leia este texto de Eric S. Raymond.
-----------
keepReading

quinta-feira, 19 de abril de 2007

Conhecendo o linux um pouco mais a fundo

O GNU/Linux tem uma infinidade de comandos e utilitários. Não conheço uma pessoa sequer que conheça todos os comandos. Digitando:
$ echo $PATH;

num console você vê os caminhos onde o sistema busca os programas para executar (geralmente /bin/, /sbin/, /usr/bin/,...). Fui conferir o que existia nestes diretórios e me deparei com uma quantidade muito maior de programas do que eu imaginava.

Digitar man nome_do_comando exibe o conteúdo do manual, mas isso era impensável para milhares de programas. Daí surgiu a idéia de criar um script em shell que fizesse isso por mim. Só que lendo o manual do comando man, vi que ele podia mandar a saída para um navegador. Não conseguia mandar para o firefox, apenas para o w3m, um navegador de modo texto, similar ao lynx.

Após googladas e algumas tentativas frustradas, instalei o pacote groff e o pacote man2html pelo synaptic.

Mais algumas tentativas e voilá. Tinha um script que lia o conteúdo de um diretório e mandava as man pages para um outro diretório, salvando cada uma em um arquivo já no formato html.

Mas como nem tudo são flores, algumas entradas não tinham manual, e resultaram em arquivos vazio.
Dá-lhe outra rodada de shell script para criar uma rotina que verificasse quais arquivos estavam vazio e os deletassem.

Ótimo. Bastou criar um index.php dentro dos diretórios que gerasse os links. Agora posso ler tranquilamente as várias man pages pelo firefox, da mesma forma com a qual eu leio os manuais do PHP, Java, MySQL, PostgreSQL, Python, Ruby, Guia Foca Linux,... com direito a um lugar no favoritos e tudo mais.

Abaixo seguem os códigos de shell script que usei.


exporta_manual
#!/bin/bash
#
#autor: Davis Leandro P. Peixoto
#data: 19-04-2007
#script para exportação de manuais

for i in *;
do {
echo Tentando exportar o manual de $i;
man -Thtml $i > /home/user_dir/manual_folder/$i.html;
echo Manual de $i exportado;
};
done;

///////////////////


limpa_vazios
#!/bin/bash
#
#autor: Davis Leandro P. Peixoto
#data: 19-04-2007
#script limpeza de arquivos vazios

count=0;
for i in *;
do {
a=`head -n 1 $i`;
b='';
if [ "$a" = "$b" ];
then
echo apagando $i;
rm -r $i;
echo arquivo apagado com sucesso!;
count=`expr $count + 1`;
else
echo O arquivo $i está cheio e não será apagado;
fi;
};
done;

echo Foram apagados $count arquivos que estavam vazios;
echo Limpeza finalizada com sucesso;

/////////////////////////////////////////


index.php
/* criando um manipulador de diretórios */
$handle = opendir('.');

/* listando o diretório */
while (false !== ($file = readdir($handle))) {

/* e escrevendo os links */
echo "<a href=\"$file\">$file</a>";
}

/* fechando o diretório */
closedir($handle);
?>

////////////////
Nota: os scripts precisam ser executados de dentro dos diretórios (/bin/, /sbin/, etc...)

Té+
-----------
keepReading

quarta-feira, 28 de março de 2007

De tirar o chapéu

Foi divulgada a segunda falha de segurança remota no sistema operacional OpenBSD... em 10 anos!

Tá certo que ele é um sistema projeto para ser o mais seguro quanto possível, mas assim é demais. Duas falhas em 10 anos de existência não é pra qualquer um.

E aliás a falha já foi corrigida rapidamente, como é quase regra no mundo dos Unix-Like.


Ah, se meu banco usasse esse sistema...

-----------
keepReading

quinta-feira, 15 de março de 2007

Novidades sobre este blog

Pessoal, logo um amigo meu, o Júlio, estará contribuindo com seu conhecimento e experiência aqui também.

E a partir desta semana seremos bilingues! Traduziremos os posts antigos e artigos. E os novos posts serão publicados nas duas línguas.

Té+

--edit--
Eu conheço o Júlio e sei que ele aprecia uma boa leitura, boa mesmo. E se for para publicar algo que não contenha um conteúdo rico ele prefere não publicar. Devido à falta de tempo ele não quis se comprometer a escrever nada.

Ele até iniciou o esboço de um artigo sobre acessibilidade e encodings (em particular UTF-8), mas eu darei continuidade ao seu trabalho.

Outra coisa, devido à minha falta de tempo voltei a publicar apenas em português. Deixei de publicar muita coisa legal porque não dava tempo de fazer uma tradução ou pensando na tradução nem cheguei a escrever alguns artigos.

Também passo por um racionamento de tempo, mas pretendo atualizar muitas publicações de gaveta.
-----------
keepReading

segunda-feira, 12 de março de 2007

Uso inteligente de recursos

Uma das vantagens do software livre é a possibilidade de exploração e reaproveitamento de recursos.

Recentemente publiquei dois artigos no meu outro blog, com características menos técnicas. Os links estão aqui e aqui.

Mas voltando à parte mais técnica, encontrei alguns artigos no site Viva o Linux que cobrem com uma riqueza maior de detalhes algumas dessas possibilidades.

Os links dos artigos na Viva o Linux estão aqui, aqui, aqui. Há mais artigos interessantes por lá.

Té+
-----------
keepReading

terça-feira, 6 de março de 2007

Enfim meu site saiu do forno

Depois de bastante tempo coloquei meu site no ar. Ainda não está no ponto em que eu queria, mas já está bom o bastante (do meu ponto de vista) para ir ao ar.

Inicialmente havia uma seção de matérias, mas como já mantenho dois blogs pessoais e o serviço de hospedagem fornece mais um, desisti (pelo menos por enquanto), de manter uma seção assim.

Uma outra seção, a de enquetes, será incluída após o site obter um certo volume de movimento diário. Não faz sentido colocar agora.

No momento vou me focar em terminar a parte do projeto de um software. É uma seção ainda incompleta, mas que merece um grande destaque.

Este é o link para a página e também esta na seção de links desse blog.

Té+
-----------
keepReading

quinta-feira, 1 de março de 2007

Logs no celular

Após ver este artigo no site Viva o Linux, fiquei pensando em como seria montar uma linha de defesa (firewall+IDS) e mandar os logs para o celular. Já pensou poder monitorar as tentativas de invasão pelo celular? E o melhor mesmo alguém invadindo e apagando os logs, você conta com um backup para fazer auditoria.

Té+
-----------
keepReading

segunda-feira, 26 de fevereiro de 2007

Testando o indexador do Google

Duas ferramentas google das quais faço uso são:
- Google Analytics
- Ferramentas Google para Webmasters

Sem muito mais comentários sobre elas. Se você nunca viu, recomendo fortemente experimentar.

Mas o galho é que as páginas do keepLearning não apareciam como sendo rastreadas nas Ferramentas Google para Webmasters.

No google, ao procurar por keeplearningblog, apareciam apenas duas páginas, meus dois primeiros posts aqui.

O engraçado é que ele continuava a indexar normalmente as páginas do meu outro blog. Troquei o layout por um dia, revisei as as tags de confirmação, tudo.

Olhando melhor depois vi que o outro blog não tinha marcadores e esse tinha. Um detalhe bobo, mas que poderia ser o que estivesse fazendo toda a diferença.

Coloquei marcadores em todos os posts do outro blog, e voilá! No outro dia ele já não aparecia como indexados completamente no google. Mãos à obra: retirar todos os marcadores.

Pass um dia, passa dois, três... Nada agora os dois blogs aparecem timidamente no google. E o pior é que não há estatísticas do keepLearning no "Ferramentas Google para Webmasters".

Parece que o serviço não é tão inteligente assim, ainda mais se tratando de serviços relacionados intimamente na fonte (blogger e o sitemaps).

Mas ainda bem que o Google Analytics continua funcionando firme e forte. A única pena é ele não informar os pages rankings. Se ele contasse com isso, com algum tipo de relatório de rastreio indicando se houve algum erro como um timeout, e quais as páginas da net que fazem referência para nosso site, não seria necessário usar o sitemaps.

Té+
-----------
keepReading

sábado, 24 de fevereiro de 2007

Errata - artigo sobre Transações

No artigo sobre Transações que publiquei, havia dito que o Python não suportava diretamente os commits e rollbacks da vida.

Na verdade o módulo MySQLdb têm os métodos de suporte commit() e rollback(), assim como o PHP.

[retirado do manual do módulo MySQLdb versão revisada 1.1, por Andy Dustman]
-----------
keepReading

Aventuras e soluções - Javascript

Ainda estou muito longe de programar de forma eficiente e levando em conta todas as exigências de um site eficiente e politicamente correto: regras de acessibilidade, normas, etc... Mas faço o possível para chegar cada vez mais próximo disso.

O caso é que o famigerado Ajax NÃO é um padrão, e por isso mesmo nunca fiz questão de ir muito atrás para aprender. Porém resolvi usá-lo num site meu, como um mimo pra mim mesmo (nada que fosse ficar exposto à navegação).

Dá-lhe eu a correr atrás de um tutorial. Encontrei alguns, mas mesmo assim ainda incompletos, sem muita informação técnica como por exemplo manipulação de headers, mas dava pro gasto.

Não conheço um programador que não tenha uma pasta "experiências" ou "laboratório" destinada a fazer testes básicos com a tecnologia que se quer implementar, para depois mandar ver em sua aplicação principal. Comigo não é diferente. Criei uma página apenas com fins de teste, e pra variar deu errado.

Tentava daqui e de lá, trancrevi os exemplos dos tutoriais, googlei, e nada. Os exemplos dos tutoriais dava certo, mas o meu não. Why?

Mandei os códigos para um amigo mais experiente, o Júlio, dar uma olhada. Tenho que agradecer a ele por ter gasto seu tempo ajudando esta pobre mula cósmica que esta escrevendo este artigo.

O galho estava na declaração do objeto XMLHttpRequest. A declaração estava dentro de uma função, e quando chegava no trecho
myvar.onreadystatechange = umaOutraFunçãoDeclaradaAbaixo();
dava galho.

Coloquei vários alerts para fazer o debug e chegamos a uma solução: fazer a instanciação do objeto XMLHttpRequest ANTES de iniciar as funções.

O erro que aparecia era que as propriedades myObject.status e myObject.readyState não estavam definidas ("undefined").

Foi interessante notar que nos exemplo que transcrevi dos tutoriais estes erros também apareciam quando se colocava um alert para debug.

Javascript nunca foi meu forte, mas depois de dar uma lida mais aprofundada vi que há uma outra possibilidade mais interessante, eficiente e correta do que o Ajax, o E4X.

Não vou me ater a detalhes aqui, mas o E4X é um acrônimo para ECMAScript For XML. ECMAScript é o nome oficial do Javascript.

Pois bem, a possibilidade interessante é trabalhar com a biblioteca DOM do PHP, já citada aqui, e usar os métodos do E4X. Além de ser um padrão (o que o Ajax não é), o código fica muito mais limpo e inteligível.

A biblioteca DOM permite salvar em um arquivo ou retornar uma string tanto em XML quanto em HTML. E o E4X dá o tratamento à informação, com as mesmas possibilidades do Ajax e de quebra fica mais fácil manter um código acessível (sem aqueles links que não mandam pra lugar nenhum) e dentro das normas.

A infelicidade, como sempre, fica por conta da Microsoft que até o IE 6 não dava suporte ao E4X. Não sei se o IE 7 o suporta.

Enfim, pra finalizar, aí está o link da ECMA (European Computers Manufacturers Association) que detem normas de um porrilhão de coisas (quer saber quais são as normas e regras de como se grava um CD ou uma fita K7? Eles tem isso) e a promessa de logo publicar um tutozinho de como trabalhar com o E4X.
-----------
keepReading

terça-feira, 20 de fevereiro de 2007

Trabalhando com a classe DOM do PHP

No artigo que publiquei há uma chamada de uma função, a addToLog.

Bem, ela trabalha basicamente com a classe DOM do PHP. Esta classe tem muitas aplicações, podendo ser amplamente usada com arquivos XML (e SGML em geral), como, por exemplo, RSS.

Vou descrever aqui seu funcionamento. Primeiro vamos supor uma estrutura inicial para o arquivo. Algo assim:
<log>
<entrada>
<data></data>
<ip></ip>
</entrada>
</log>
Onde cada novo registro será um novo nó . E vamos batizar este arquivo de log.xml (nada mais justo).

Agora no PHP:
function addToLog($arquivo,$data,$ip) {
// instanciando a classe
$entry = new DOMDocument();

// isso é para manter a saída indentada
$entry->preserveWhiteSpace = false;
$entry->formatOutput = true;

// carregando o arquivo
$entry->load($arquivo);

//selecionando o nó log
$log = $entry->getElementsByTagName('log');
$log = $log->item(0);

// criando a nova entrada
$entrada = $entry->createElement('entrada');
$entrada = $log->appendChild($entrada);

// criando os nós ip e data
$ip_entry = $entry->createElement('ip', $ip);
$ip_entry = $entrada->appendChild($ip_entry);
$data_entry = $entry->createElement('data', $data);
$data_entry = $entrada->appendChild($data_entry);

// salvando o arquivo
$x = $entry->save($arquivo);

// dando a saída
if ($x) {
return true;
} else {
return false;
}

}

Dúvidas? Deixa um comentário.

Té+
-----------
keepReading

Artigo - Transações

O artigo sobre transações em bancos de dados está concluído e pronto para download.

Para baixar basta ir aqui.

Os próximos artigos que pretendo publicar nesta linha sobre bancos de dados são sobre:

Stored Procedures e Funções;
Triggers;
Scheduled Events;
Views;
e talvez sobre Replicação e Otimização.

Sugestões de temas para artigos são bem-vindas.

Té+
-----------
keepReading

terça-feira, 13 de fevereiro de 2007

Destrinchando

Tem algumas ferramentas que são indispensáveis para um webmaster. Não estou falando de editores WYSIWYG, ou criadores de animação. Estou falando de add-ons do Mozilla Firefox e serviços web-based como o google analytics. Resolvi conhecer o google analytics faz pouco tempo, depois de ler uma matéria no site Info Western.

Realmente ele é uma ferramenta e tanto para webmasters e seus clientes. Mas o galho foi que percebi que muitas informações não apareciam direito. Faltava muita informação nos gráficos (as legendas!).

Aí descobri qual era o galho: o plugin do flash player.

Eu tinha a versão 7 do plugin instalada, e a atual recomendação é que se instalasse o 9, que além de corrigir muitos erros, era mais seguro.

Alright, download, instalação... e nada. E ao digitar "about:plugins" na barra de endereços do Firefox, vi que as duas versões estavam instaladas, a 7 (antiga) e a 9. Aí é onde a briga toda começa.

Apaguei os arquivos de /home//.mozilla/plugins/ e o arquivo /home//.mozilla/firefox/pluginreg.dat com o browser fechado e iniciei novamente o firefox.

De novo a versão estava lá. Apaga de novo, instala a versão 9. E a coisa volta.

Nada. Que raios. Dá-lhe google, mozillaZine, fóruns, página da Adobe.... FAQ's, blogs, technical reports, bug fixes.... E NADA.

Vasculhando... /etc/... nada, /home//... nada. Resolvi ler o arquivo mozver.dat mais uma vez com $cat mozver.dat

A saída era meio ilegível, mas num dos trechos deu para ler: /usr/lib/firefox/

Fui dar uma conferida neste diretório. E não é que a versão 7 estava instalada lá dentro do diretório plugins. Apaguei os dois arquivos, apaguei os arquivos dentro de .mozilla dentro do meu diretório. Reinstalei a versão 9 e aí... Deu certo!

Quanto sofrimento... mas vale a pena. Vale muito a pena. Conhecer melhor o Linux (e os sistemas UNIX-like em geral), e não abrir mão de um navegador como o firefox.

Té+
-----------
keepReading

segunda-feira, 12 de fevereiro de 2007

Bancos de dados - Transações

Muita gente conhece por vários nomes: Integridade Referencial, Consistência de dados, Transação... O importante é que os dados e as operações fiquem em seus devidos lugares, contornando os erros.

O exemplo clássico do uso das transações é numa transferência bancária. Uma transferência constitui-se basicamente de duas operações:
- se tira dinheiro de uma conta
- e se deposita em outra

Mas e se uma operação é realizada com sucesso e outra não? Uma conta ficaria com menos dinheiro e na outra não se acrescentaria nada?

Pode acontecer algum erro na comunicação entre os servidores, não estamos livres disso. E justamente para isso se usam os recursos de transação.

Como a parte técnica é longa demais para postar num blog (e creio eu que tudo o que eu publicar passe pelo mesmo problema), logo colocarei o material disponível para download num site, em formato PDF (posto um aviso aqui, assim você poderá acompanhar por leitores de feeds RSS).

Mas só para dar uma prévia cobrirei o assunto de duas formas diferentes:
- o PHP tem uma biblioteca, a MySQL Melhorada, que dá suporte a este tipo de operação [também na forma orientada a objeto, através da classe mysqli];
- através do manual do MySQL 5.1 (filtrarei o que segue a norma SQL para o artigo ter aplicação a outros servidores como o PostgreSQL). Isso é para o caso de se usar diretamente o servidor ou outra linguagem como Python ou Ruby, que não dão suporte a transações.

Té+
-----------
keepReading

sábado, 10 de fevereiro de 2007

Início

Sabem como é iniciar um blog... (se não sabe inicie um). Aqui vou compartilhar dicas rápidas, tutoriais, artigos, matérias, sugerir leituras e fontes de pesquisa, tudo relacionado à computação.

Sou apenas um programador, insatisfeito com os fóruns e portais da vida, onde geralmente se cobre tópicos repetidos, conteúdo be-a-bá, etc... Se você é curioso como eu e o basicão já não te agrada tanto (com excessão de novas normas, protocolos, linguagens, etc), sugiro assinar o feed desse blog e até mesmo entrar em contato, podemos trocar experiências.

Tenho interesses em sistemas UNIX-like, software open source, bancos de dados, protocolos, normas (de tudo), registro do Rwindows (por que não? a enorme maioria dos linuxers não sabe mexer direito nele), linguagens, e por aí vai.

Então, conforme eu for garimpando, experimentando, descobrindo e digerindo coisas novas (pra mim), vou publicando aqui.

-----------
keepReading