Keylogger em C#

Eu sempre tive curiosidade de saber como funcionava um keylogger. Para quem não sabe, como descrito na Wikipedia, um keylogger é:

Keystroke logging , muitas vezes referida como keylogging ou captura de teclado , é a ação de gravar (ou registrar) as informações escritas em um teclado, normalmente de uma forma encoberta de modo que a pessoa que usa o teclado não tem conhecimento de que suas ações estão sendo monitoradas. Ela tem usos no estudo da interação humano-computador. Existem vários métodos keylogging, que vão desde hardwares e abordagens baseadas em software até análises de acústica.

Comecei a procurar no google sobre keyloggers e acabei descobrindo que é realmente muito fácil capturar o que está sendo digitado no teclado. Partindo do princípio que estamos no Windows, nós temos duas dlls a nossa disposição, sendo elas a user32 e a kernel32. Com isso, nós podemos receber um evento sempre que uma tecla for pressionada no teclado.

Continuar lendo

Entity Framework 6 Code First

Resolvi escrever esse post sobre code first com o Entity Framework pois faz um tempo que trabalho com o EF, porém nunca dei a atenção devida a ele. Em meus projetos pessoais ou estudos, sempre dei prioridade ao NHibernate, porém, como praticamente em todos os projetos que tenho trabalhado utilizam o EF, resolvi falar um pouco sobre ele.

O Entity Framework Code First é uma maneira de você se preocupar primeiramente com o seu domínio, modelando as suas classes, etc. e depois delegar ao EF que monte o banco de dados para você. Para isso você poderá seguir por dois caminhos. O primeiro é o Data Annotation, onde dentro da sua classe, você irá anotar a sua classe e suas propriedades através de Annotations indicando nomes de tabela, nomes das colunas, índices, FK, PK, etc. Eu particularmente não gosto muito de trabalhar desta maneira pois eu acho que ele deixa a classe menos legível. A partir dai vamos para a segunda opção, que é utilizarmos o fluent api para realizar nossos mapeamentos (quando necessário). Vamos ver um exemplo da diferença entre utilizar dataannotation e fluent api.

Continuar lendo

Design Patterns, fugindo dos ifs com o padrão Strategy

Bom, faz um bom tempo que eu não posto algo por aqui. Desta vez resolvi falar um pouco sobre padrões de projeto, ou design patterns. Bom, eu não vou falar sobre o que são os padrões de projetos, ou muito menos ficar defendendo a sua utilização. Nesses posts eu vou criar uma situação em que poderíamos utilizar um ou mais padrões para simplificar e/ou deixar mais elegante a nossa solução.

O Criador de Hello World

 
Vamos criar um programa simples que dado uma linguagem de programação, ele nos apresenta como fica um Hello World nesta linguagem. Vamos definir que poderemos escolher entre as linguagens Java, C#, Ruby, Python e Go!. Vamos ao código? A primeira vista, poderíamos ter um método que recebe a linguagem como parâmetro e nos mostra como ficaria o hello world na linguagem em questão, certo?
Continuar lendo

Exemplo utilizando AutoMapper e ASP.NET MVC

Como a própria página do AutoMapper fala, o automapper é um “mapeador” de objeto para objeto. Ou seja, ele facilita a sua vida quando você precisa mapear um objeto em outro.
Mas pq alguém iria querer mapear e converter um objeto em outro? Pq normalmente há conflitos entre o seu domínio e a sua view, ou do seu domínio para o seu serviço. Imagina que você possui uma viewmodel Usuário que possui os atributos necessários para a sua view, contendo todas as validações, etc. Ao enviar para o seu serviço, provavelmente você passará o objeto Usuário do seu domínio, e não o seu viewmodel, certo? Sem o automapper, você não teria muito o que fazer, além de provavelmente ter um método dentro da sua viewmodel que retorna o objeto de domínio, fazendo toda a conversão, teste, etc.
O AutoMapper entra ai para facilitar a sua vida, uma vez que você precisará praticamente de uma única linha de código para realizar o mapeamento.
Continuar lendo

NHibernate – One Session Per Request

Ao trabalhar com NHibernate, um dos principais desafios é gerenciar a Session. Podemos abrir a Session a cada consulta, mas isso seria bem custoso, pois em muitos casos precisamos recorrer ao banco de dados diversas vezes, além de perder uma das grandes vantagens do NHibernate que é utilizar o Lazy Load.
Uma maneira comum de se trabalhar com a session seria da maneira que eu mostro neste post, que ficaria mais ou menos assim:

        using (ISession session = NHibernateHelper.OpenSession()) { }

Porém, se trabalhamos desta maneira, e buscamos uma lista de usuários por exemplo. O código ficaria assim:

    public IList<User> GetAll()
    {
        using (ISession session = NHibernateHelper.OpenSession())
        {
            var users = session.CreateCriteria<User>().List<User>();
            return users;
        }
    }

Continuar lendo

IoC em ASP.NET MVC com Unity Application Block

Uma prática muito comum e bem aceita em projetos de software é a utilização do pattern “Injeção de Dependências” (Dependency Injection). Este post não pretende explicar o que é a inversão de controle e a injeção de dependências. Para isso você pode procurar excelentes posts, como este do Martin Fowler. O que veremos aqui é como preparar o seu projeto para começar utilizar o Unity Application Block
Continuar lendo

[code snippet] Abrir e fechar o drive de cd - C#

Por que? Porque é divertido!

[DllImport("winmm.dll", EntryPoint="mciSendString")]
public static extern void mciSendString(String command, StringBuilder buffer, Int32 bufferSize, IntPtr hwndCallback);

static void Main(string[] args)
{
    mciSendString("set CDAudio door open", null, 0, IntPtr.Zero);
    mciSendString("set CDAudio door closed", null, 0, IntPtr.Zero);
}

see yah 😉