Ir ao conteúdo
  • Cadastre-se
Entre para seguir isso  
Rafaelbvj

[Resolvido] Dll infuncional quando injetada em processo?

Recommended Posts

é o seguinte eu queria injetar uma dll em um programa simples , o notepad ou a calculadora do windows , baixei um injetor na internet e criei minha dll simples para ver se ela funciona mas quando injetada nao acontece nada cod da dll:


#include <stdio.h>

BOOL APIENTRY DllMain (HINSTANCE hInst ,
DWORD reason ,
LPVOID reserved )
{
if (reason== DLL_PROCESS_ATTACH){
MessageBox(HWND_DESKTOP,"NMDKJASND","DAKSLJDNA",MB_OK|MB_ICONINFORMATION);}


return TRUE;
}





Compilador Dev-c++
Eu até peguei um codigo de um injetor simples em c++ para testar porque pensei que o injetor que baixei nao funcionava, cod :





#include <stdio.h> // Stardard I/O
#include <stdlib.h> // malloc(), exit()
#include <string.h> // Manipulação de strings
#include <windows.h> // API do Windows
#include <tlhelp32.h> // Listar processos

// Declaração de funções
void injetar(DWORD pid, char*);
void erro(const char*);


char dll_nome[0x100]; // Caminho da DLL a injetar
char processo_nome[0x30]; // Nome do processo

// As variíveis abaixo estão relacionadas à lista de processos

PROCESSENTRY32 processo; // Informações do processo
HANDLE SnapShot; // Handle SnapShot -> listar processos
DWORD PID = 0; // Número ID do processo


// As variíveis abaixo estão relecionadas à injeção da DLL

DWORD tam; // Tamanho (em bytes) a alocar remotamente no processo
DWORD bytes = 0; // Retorno -> bytes alocados
HANDLE proc; // HANDLE do processo
HMODULE kernel; // Módulo -> kernel que serí carregado
LPVOID addr; // Endereço no qual foi alocado um espaço
FARPROC pFunc; // Ponteiro para a função LoadLibrary() dentro de Kernel32
HANDLE thread; // Handle para a thread remota


int main(int argn, char * arg[])
{

snprintf(dll_nome,0x100,"Projeto1.dll"); // Armazena o caminho da DLL

HINSTANCE dll = LoadLibrary(dll_nome); // Verifica se a DLL pode ser acessada
if(!dll)
{
printf("Erro ao acessar a DLL \"%s\".",dll_nome);
return 1;
}
FreeLibrary(dll); // Fecha a DLL

snprintf(processo_nome,0x30,"vlc.exe"); // Armazena o nome do processo


// Tenta iniciar a listagem de processos
if(!(SnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0)))
return 1;

processo.dwSize=sizeof(PROCESSENTRY32); // Define tamanho da estrutura

if(!Process32First(SnapShot,&processo)) // Tenta obter o primeiro processo
return 1;

while(Process32Next(SnapShot,&processo)) // Enquanto houverem processos
{
if(!strcmp(strlwr(processo.szExeFile),strlwr(processo_nome))){ // Compara com o argumento
PID = processo.th32ProcessID; // Armazena o PID do processo, se encontrado
break; // Encerra LOOP
}
}
CloseHandle(SnapShot); // Fecha handle

if(!PID) // Verifica se o PID foi obtido
printf("O processo \"%s\" nao foi encontrado!\n",processo_nome);
else
injetar(PID,dll_nome); // Injeta no processo a DLL
system("pause");
return 0;
}


void injetar(DWORD pid, char * DLL)
{
tam = strlen(DLL)+1; // Espaço a ser alocado remotamente

kernel = GetModuleHandle ("KERNEL32"); // Carrega módulo KERNEL
if(!kernel)
erro(DLL);

proc = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid); // Tenta abrir o processo
if(!proc)
erro(DLL);

// Tenta alocar um espaço no processo e obtém o endereço
addr = VirtualAllocEx(proc,0,tam,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
if(!addr)
erro(DLL);

// Escreve o nome da DLL neste endereço
WriteProcessMemory(proc,addr,(LPCVOID)DLL,tam,&bytes);


// Tenta obter endereço da função LoadLibrary()
pFunc = GetProcAddress(kernel,"LoadLibraryA");
if(!pFunc)
erro(DLL);


// Tenta criar Thread remota -> fazer com que o processo carregue a DLL
thread = CreateRemoteThread(proc,NULL,0,(LPTHREAD_START_ROUTINE)pFunc,addr,0,NULL);
if(!thread)
erro(DLL);

printf("A DLL \"%s\" foi injetada com sucesso no processo \"%s\".",DLL,processo_nome);

VirtualFreeEx(proc,addr,tam,MEM_RELEASE); // Libera espaço alocado no processo
CloseHandle(proc); // Fecha handle do processo


}


void erro(const char* DLL) // Mostra erro e encerra
{
printf("Ocorreu um erro ao tentar injetar a DLL \"%s\".",DLL);
exit(1); // Encerra o programa
}
#include <windows.h>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em primeiro lugar me parece que o injetor que voce pegou esconde o PID de determinado processo (no caso "vlc.exe"). Para que você faça um hooking na API MessageBox, você deve pegar o Handle da dll onde está a API e logo com GetProcAdress pegar o endereço da API.... do jeito que está no seu código não irá acontecer nada mesmo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela resposta mas já resolvi : no lugar de BOOL APIENTRY deveria ser extern "C" bool _stdcall , agora está funcionando perfeitamente

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caso o autor do tópico necessite, o mesmo será reaberto, para isso deverá entrar em contato com a moderação solicitando o desbloqueio.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante
Este tópico está impedido de receber novos posts.
Entre para seguir isso  





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×