[Source - Download] Hosts Blocker

Started by Dark_Side, 14 de October , 2006, 02:07:30 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Dark_Side

Hi,
Posto a seguir, um simples programa que bloqueia Hosts especificados pelo usuário, através do arquivo de mapeamento de DNS e IP's.

Source:

MAIN.C

#include <windows.h> // Constantes e Funções da API
#include <commctrl.h> // Controles comuns -> XP Visual Style
#include <stdio.h> // Standard IO
#include "recurso.h" // Constantes -> ID dos objetos

// Caminho do arquivo de hosts
#define HOSTS_FILE "C:\\WINDOWS\\SYSTEM32\\drivers\\etc\\hosts"

LRESULT CALLBACK MainProc (HWND, UINT, WPARAM, LPARAM); // Função de eventos -> Form Principal
LRESULT CALLBACK AddHostProc (HWND, UINT, WPARAM, LPARAM); // Função de eventos -> Form Adicionar Hosts

void listar_hosts(void);// Obtém lista de hosts
void deleta_hosts(void);
void showaddr(void); // Chama pelo form -> Adicionar Host
void salvar(void); // Salvar alterações
int conf(void); // Confirmar alterações


HWND main_dlg = 0; // HWND principal
int pos = -1; // Posição selecionada no ListBox -> nenhuma
FILE *fp = NULL; // Ponteiro para o arquivo
BOOL alt = FALSE; // Controla se houve alterações ou não
HICON icone = NULL;


// Entrada do programa
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
icone = LoadIcon(hInstance,icon1); // Carrega ícone
    DialogBox(hInstance,MAKEINTRESOURCE(IDD_DLG1),0,(DLGPROC)MainProc); // Chama Form principal
return 0;
}

// Função do Form Principal
LRESULT CALLBACK MainProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)   // Verifica mensagem (evento)
    {
       case WM_INITDIALOG: // Ao inicializar
            InitCommonControls(); // Habilita controles comuns -> XP Manifest
            main_dlg = hwnd; // Define o HWND principal -> utilizar em funções externas
            listar_hosts(); // Lista hosts
           
            // Mostra os ícones: Topo do programa e ALT+TAB
            SendMessage(hwnd,WM_SETICON,ICON_BIG,(LPARAM)icone);
            SendMessage(hwnd,WM_SETICON,ICON_SMALL,(LPARAM)icone);
           
            return 0;
             break;
           
        case WM_CLOSE: // Fechar
            if(alt == TRUE) // Verifica se houve alteração
            {
                if(conf()) // Pede confirmação para salvar alterações
                    salvar(); // Salva se confirmado
                    }
 
                      PostQuitMessage(0); // Encerra
                       break;
                       
                       
        case WM_COMMAND: // Clique em objetos
             {
         switch(wParam) // Verfica ID do objeto
                    {
                    case block: // Botão bloquear host
                         showaddr(); // Chama pelo Form Adicionar Host
                    break;
                       
                    case desblock: // Botão desbloquear
                       deleta_hosts();
                       break;
                   
                    case desblock_all: // Botão desbloquear todos
                          SendDlgItemMessage(hwnd,hosts,LB_RESETCONTENT,0,0); // Deleta todos os itens
                          alt = TRUE; // Marca que houve alteração
                   break;
                           
                              }
                        }
       
           
            }

    return 0;
}



// Função do form Adicionar Host
LRESULT CALLBACK AddHostProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{

        switch(msg){ // Verifica evento (mensagem)
       
        case WM_CLOSE: // Fechar
             EndDialog(hwnd,0); // Encerra apenas o form
             break;
             
        case WM_COMMAND: // Clique em objetos
            if(wParam == go){ // Se o objeto for o botão OK
        char buffer[0x100]; // Buffer para obter o host digitado
        GetDlgItemText(hwnd,host_txt,buffer,0x100); // Obtém o host digitado
       
        if(strcmp(buffer,"")==0) // Se estiver vazio
        MessageBox(hwnd,"Digite um hostname ou IP Válido!","Erro",0x10); // Erro
        else{ // Se não

           // Adiciona ao form principal o host digitado
             SendDlgItemMessage(main_dlg,hosts,LB_ADDSTRING,0,(LPARAM)buffer);
             SetDlgItemText(hwnd,host_txt,""); // Limpa o TextBox para adicionar outros hosts
             SetFocus(GetDlgItem(hwnd,host_txt)); // Muda o focus para o TextBox
             alt = TRUE; // Define alteração
             }
        break;
              }       
       
        }
        return 0;
        }


int conf()
{
    // Mostra aviso de alteração e pede confirmação para salvá-las.
    int i = MessageBox(main_dlg,"Os hosts forão modificados.\nSe você continuar TODOS os HOSTS não editados pelo programa"
     "serão apagados.Salvar as alterações?","o.O?", 0x34);
if(i == IDYES) // Se houve confirmação
return 1; // Retorna código 1 -> salvar
else // Se não
return 0; // Retorna código 0 -> não salvar

}
void salvar()
{
       
             fp = fopen(HOSTS_FILE,"w"); // Tenta abrir o arquivo de hosts para escrita -> Apaga dados prévios
             if(fp == NULL){ // Em caso de erro, mostra alerta e encerra
              MessageBox(main_dlg,"Erro ao salvar as configuracoes!","Erro",0x10);
              PostQuitMessage(1);
                 }

        // Verifica número de itens no ListBox
        int num = SendDlgItemMessage(main_dlg,hosts,LB_GETCOUNT,0,0);
        if(num  == 0){ // Se o ListBox não tiver itens
              fclose(fp); // Apenas fecha o arquivo 
              }
              else // Se existirem itens
              {
     
             
                 int i; // Auxiliar loop
                 char buf[0x100]; // Buffer para obter os hosts na lista
                 
                 for(i=0;i<num;i++){ // Percorre todos os índices na lista de 0 até NUM-1
                  SendDlgItemMessage(main_dlg,hosts,LB_GETTEXT,(WPARAM)i,(LPARAM)buf); // Obtém texto do respectivo item
                  fprintf(fp,"0.0.0.0 %s\n",buf); // Imprime no arquivo de host: "0.0.0.0 HOST_DA_LISTA"
                  }
                  }   
                  // Mostra confirmação de êxito
                  MessageBox(main_dlg,"As configurações foram salvas com sucesso!","^^",0x40);
                  PostQuitMessage(0); // Encerra
 }
 
 
void showaddr()
{
   
    // Chama pelo form Adicionar Host
 DialogBox(GetModuleHandle(NULL),MAKEINTRESOURCE(IDD_ADDHOST),0,(DLGPROC)AddHostProc);
     }

void listar_hosts(){
     
     fp = fopen(HOSTS_FILE,"r"); // Tenta abrir o arquivo de hosts para leitura
     if(fp == NULL) // Em caso de erro
     {
           // Mostra alerta e encerra
           MessageBox(main_dlg,"Ocorreu um erro ao abrir o arquivo de hosts","Erro",0x10);
           PostQuitMessage(1);
           }
     
     char buffer[0x100]; // Buffer para armazenar hosts no arquivo
     while(!feof(fp)) // Enquanto existirem hosts no arquivo
     {
                   
     memset(buffer,0x0,0x100); // Limpa o buffer
     fgets(buffer,0x100,fp); // Obtém host do arquivo
     buffer[strlen(buffer)-1]='\0'; // Finaliza a string
     
     char * nome_host = strstr(buffer,"0.0.0.0 "); // Separa apenas hosts que tenham "0.0.0.0 " precedindo-os
     if(nome_host !=NULL) // Apenas se o host tiver passado pelo filtro
      SendDlgItemMessage(main_dlg,hosts,LB_ADDSTRING,0,(LPARAM)nome_host+8); // Adiciona-o na lista
     }
                     }
     

void deleta_hosts()
{

int num_sel = SendDlgItemMessage(main_dlg,hosts,LB_GETSELCOUNT,pos,0); // Obtém número de itens selecionados
int num_total = SendDlgItemMessage(main_dlg,hosts,LB_GETCOUNT,0,0); // Obtém número total de itens
if(num_sel == 0)// Se não houver item selecionado
  MessageBox(main_dlg,"Escolha um host para desbloquear!","Erro",0x10); // Erro

     else{ // Do contrário

 int i,j = num_total; // Loops: i = índice do elemento em questão; j =  número de loops
 
  for(;j>0;j--) // Loop -> número de elementos
   for(i=0;i<num_total;i++){ // Pecorre cada índice da lista
   pos =  SendDlgItemMessage(main_dlg,hosts,LB_GETSEL,i,0); // Verifica se está selecionado
   if(pos == 1){ // Se afirmativo
     SendDlgItemMessage(main_dlg,hosts,LB_DELETESTRING,i,0);} // Deleta o item

}
   alt = TRUE; // Define que houve alteração
        }
        }

RECURSO.H

// Constantes -> Nome dos objetos, inclusive forms

#define icon1 0
#define IDD_DLG1 1000
#define IDC_GRP1 1001
#define hosts 1002
#define block 1003
#define desblock 1004
#define desblock_all 1005
#define IDD_ADDHOST 1006
#define IDC_STC1 1007
#define host_txt 1008
#define go 1009

RECURSO.RC

#include "recurso.h"
IDD_DLG1 DIALOGEX 6,6,232,233
CAPTION "Hosts Blocker"
FONT 8,"MS Sans Serif",0,0
STYLE 0x10C80800
EXSTYLE 0x00000008
BEGIN
  CONTROL "Hosts bloqueados...",IDC_GRP1,"Button",0x50000007,6,7,220,200
  CONTROL "",hosts,"ListBox",0x50010949,10,18,210,182,0x00000200
  CONTROL "&Bloquear host...",block,"Button",0x50010001,6,210,67,16
  CONTROL "&Desbloquear host",desblock,"Button",0x50010000,78,210,66,16
  CONTROL "Desbloquear &todos",desblock_all,"Button",0x50010000,148,210,78,16
END
IDD_ADDHOST DIALOGEX 6,6,217,52
CAPTION "Adicionar host..."
FONT 8,"MS Sans Serif",0,0
STYLE 0x92C80800
EXSTYLE 0x00000008
BEGIN
  CONTROL "Digite o Host Name ou IP do host:",IDC_STC1,"Static",0x50000000,52,3,112,11
  CONTROL "",host_txt,"Edit",0x50010080,6,20,204,12,0x00000200
  CONTROL "&OK",go,"Button",0x50010001,84,36,48,13
END
icon1 ICON DISCARDABLE "icone.ico"
1 24 "manifest.xml"

Download do source + executável: http://three.fsphost.com/darkside/hosts.rar

Bye ;)

insanity

Muito bom dark..
mais poderia explicar o RECURSO.RC ?


//insanity

Dark_Side

Hi,
O arquivo recurso.rc contém informações sobre os objetos gráficos do programa que formam a GUI - Graphical User Interface ou simplesmente "interface gráfica", como é vulgarmente conhecida.

O script .RC é escrito em RSL - Resource Script Language.

Um exemplo:

IDD_DLG1 DIALOGEX 6,6,232,233
CAPTION "Hosts Blocker"
FONT 8,"MS Sans Serif",0,0
STYLE 0x10C80800
EXSTYLE 0x00000008
BEGIN
  CONTROL "Hosts bloqueados...",IDC_GRP1,"Button",0x50000007,6,7,220,200
  CONTROL "",hosts,"ListBox",0x50010949,10,18,210,182,0x00000200
  CONTROL "&Bloquear host...",block,"Button",0x50010001,6,210,67,16
  CONTROL "&Desbloquear host",desblock,"Button",0x50010000,78,210,66,16
  CONTROL "Desbloquear &todos",desblock_all,"Button",0x50010000,148,210,78,16
END

Temos a estrutura gráfica do form principal:

IDD_DLG1 DIALOGEX 6,6,232,233 // Identificação, altura, largura e posição do form
CAPTION "Hosts Blocker" // Título
FONT 8,"MS Sans Serif",0,0 // Fonte
STYLE 0x10C80800 // Estilos
EXSTYLE 0x00000008 // Estilos extendidos

BEGIN // Início dos objetos do form
  CONTROL "Hosts bloqueados...",IDC_GRP1,"Button",0x50000007,6,7,220,200 // Frame
  CONTROL "",hosts,"ListBox",0x50010949,10,18,210,182,0x00000200 // Lista
  CONTROL "&Bloquear host...",block,"Button",0x50010001,6,210,67,16 // Botão bloquear
  CONTROL "&Desbloquear host",desblock,"Button",0x50010000,78,210,66,16 // Botão desbloquear
  CONTROL "Desbloquear &todos",desblock_all,"Button",0x50010000,148,210,78,16 // Desbloquear todos
END // Fim dos objetos

Pode-se criar estes objetos manualmente (lolz, tem que ter paciência) ou utilizar editores visuais. No Microsoft Visual C++, já existe um editor embutido. Para o DEV C++, pode-se utilizar o ResEd (ótima opção gratuita, que inclusive usei para criar a GUI do programa).

Link:  http://www.radasm.com/projects/ResEd.zip

Bem, acho que é isso...
Bye.