Hi,
Escrevi outro pequeno aplicativo =)
Este é um DLL Injector. Como o próprio nome sugere, trata-se de um programa cuja função é forçar o carregamento de uma DLL por um processo, injetando-a, assim, no mesmo.
Os passos tomados para fazer a injeção foram os seguintes:
1) Obter o ProcessID (PID) do executável alvo e o caminho completo da DLL a ser injetada;
2) Adicionar ao DLL Injector privilégios de Debug;
3) Obter o endereço da função LoadLibraryA();
4) Abrir o processo com permissões de leitura/escrita;
5) Utilizar VirtualAllocEx() para alocar, no espaço de memória do alvo, a quantidade de bytes correspondente ao tamanho da string que contém o caminho da DLL;
6) Utilizar WriteProcessMemory() para armazenar, no endereço de memória retornado pela função VirtualAllocEx(), o valor da string utilizada no passo anterior;
7) Criar uma thread remota no processo com a função CreateRemoteThread, passando como endereço de função e argumento, o endereço da função LoadLibrarA() e o endereço de memória que armazena a localização da DLL, respectivamente;

Aguardar o término da thread e obter seu código de retorno, verificando, posteriormente, a existência de erros;
9) Fechar o handle do processo e liberar a memória alocada.
De forma resumida, o que o programa faz é forçar o processo alvo a executar a função LoadLibraryA() passando, como parâmetro, a DLL que será injetada.
A sintaxe da função é a seguinte:
HINSTANCE LoadLibraryA(LPCTSTR NomeDLL);Na ausência de erros, a função retorna um ponteiro para o módulo da DLL, caso contrário, retorna ZERO.
Com base no valor de retorno, podemos determinar se a DLL foi injetada com sucesso ou não.
Exemplo:
LoadLibraryA('C:\MinhaDLL.dll');O trecho acima faz com que o programa carregue a DLL 'C:\MinhaDLL.dll'. Após isso, o espaço de memória do processo será compartilhado com as funções e variáveis desta DLL, podendo-se, assim, executar instruções no mesmo de forma direta. Por exemplo, uma vez injetada, o seguinte trecho de código existente na DLL seria válido para alterar o valor de um endereço de memória:
DWORD * valor = (DWORD*)0x123456; // Endereço fictício
*valor = 1000; // Altera o valor para 1000
A técnica de injetar DLL's em processos está muito vinculada a outras técnicas, como API Hooking, por exemplo - assunto que pretendendo falar um pouco sobre posteriormente.
Abaixo segue uma imagem do programa:
(//http://one.xthost.info/darkside17/projetos/delphi/dll_injector/screen1.gif)
O código da DLL utilizada como teste:
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
char NomeArquivo[MAX_PATH];
BOOL APIENTRY DllMain(HANDLE hModule, DWORD call_reason, LPVOID lpReserved)
{
if(call_reason == DLL_PROCESS_ATTACH)
{
GetModuleFileName(GetModuleHandle(NULL),NomeArquivo,sizeof(NomeArquivo));
MessageBox(GetForegroundWindow(),NomeArquivo,"Processo anexado: ",0x40);
}
return TRUE;
}
Download do source + executável:
http://one.xthost.info/darkside17/proje ... jector.rar (http://one.xthost.info/darkside17/projetos/delphi/dll_injector/dll_injector.rar)
Bye.
Aêeee, tava demorando pra continuar com seus textos velho, tinha sumido... Vou ter q pegar pra dar uma olhada no source, to enferrujado d+, quem sabe eu não animo de aprender algumas coisas do tipo.. DLL Injection é interessante pra caramba.
Ponto Positivo
(Só de sacanagem, pra vc ficar com o número do viado)
[]s
cara ... tenho grande interece em aprender isso, mas nao estou conssiguindo baixar o source e o execultaver pelo host que vc hospedou. Você pode explicar como se baxa daquele host ou intao upar em otro host por favor ? vlw ae grande post cara .