FORUM DARKERS

Administração => Darkers Project => Topic started by: Dark_Side on 16 de August , 2006, 12:24:43 AM

Title: [Source] Simples Memory Searcher - C
Post by: Dark_Side on 16 de August , 2006, 12:24:43 AM
Hi,
Um programa oriundo de uma curiosidade minha. O programa obtém o nome de um processo, tenta abrí-lo, e procura por um determinada string em uma faixa de endereços de memória. Caso encontre algum resultado, chama por uma função que filtra os endereços encontrados previamente, de acordo com uma nova string.

searcher.c

/*
By Dark_Side
16/08/2006
00:07
*/

#include <windows.h>
#include <tlhelp32.h> // Funções para obter lista de processo
#include <stdio.h>
#include <string.h>
#include <conio.h>

//Funções definidas
int init(),abrir(DWORD pid);
void procurar(),filtrar();

//Struct que contém variáveis que controlam o processo da busca
struct s1{
DWORD inicio,fim;
int total,addr;
HANDLE p;
char texto[0x20];
}busca;


DWORD *end; //Array com os endereços encontrados
char * buffer; //Buffer

int main()
{
if(!init()){ //Verifica se o processo especificado foi encontrado
puts("Processo nao encontrado!");
getch();
return 1;
}


}

int init()
{
char nome[0x20];
PROCESSENTRY32 proc;
HANDLE snapshot;
     
     // Obtém o nome do processo
puts("Nome do processo:");
    scanf("%32s",nome);

//Obtém a lista de processos
proc.dwSize=sizeof(proc);
snapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
while(Process32Next(snapshot,&proc))
{
if(strcmp(proc.szExeFile,nome)==0) //Caso encontre o processo digitado
{
switch(abrir(proc.th32ProcessID)) //Tenta abrí-lo
{
case 0: //Se aberto inicia busca
procurar();
break;
case 1: //Em caso de erro
puts("Erro ao abrir o processo");
getch();
break;


}
return 1;
}

}



return 0;
}

int abrir(DWORD pid)
{

busca.p = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid); //Tenta abrir o processo
if(busca.p==0)
return 1;
else
return 0;
}

void procurar(){

busca.inicio=0; //Endereço inicial
busca.fim=0x100000; //Endereço final
busca.total=0; //Total de endereços encontrados

//Procura por algo
puts("Procurar por:");
scanf("%32s",busca.texto);

//Aloca espaço nas variáveis
end = malloc(busca.fim-busca.total);
buffer = malloc(strlen(busca.texto));
memset(buffer,0,sizeof(buffer));

puts("Procurando...");

for(busca.addr=busca.inicio ;busca.addr<busca.fim;busca.addr++) //Percorre os endereços fornecidos
{
ReadProcessMemory(busca.p,(LPVOID)busca.addr,buffer,strlen(busca.texto),0); //Lêr o conteúdo do endereço e armazena-o no buffer
if(strcmp(buffer,busca.texto)==0){ //Verifica se o buffer contém o texto digitado
printf("0x%x\t",busca.addr); //Se sim, mostra o endereço
end[busca.total]=busca.addr; //Coloca-o no array
busca.total++;
}
}
printf("\nResultados: %d\n",busca.total); //Mostra resultados
getch();
system("cls");
if(busca.total >0) //Caso haja algum resultado, inicia filtro.
filtrar();
}

void filtrar()
{
int t;
go:
t = busca.total ; //Obtém o número total de elementos no array a serem filtrados (número de endereços encontrados)

//Obtém string de filtro
puts("Filtrar: ");
scanf("%32s",busca.texto);
busca.total=0; //Zera número de endereços

for(busca.addr=0;busca.addr < t;busca.addr++){ //Percore todos os endereços do array
ReadProcessMemory(busca.p,(LPVOID)end[busca.addr],buffer,strlen(busca.texto),0); //Verifica pela string de filtro
if(strcmp(buffer,busca.texto)==0){ //Caso encontre
printf("0x%x\t",end[busca.addr]); //Mostra o endereço
end[busca.total]=end[busca.addr]; //O mantém no array
busca.total++; //Incrementa número total => No próximo filtro, serão filtrados, apenas os endereços até este número total
} }
printf("\nResultados: %d\n",busca.total); //Monstra resultados
getch();
system("cls");

if(busca.total > 0) //Verifica se há resultados
goto go; //Volta ao filtro
}
Bye.
Title: Re: [Source] Simples Memory Searcher - C
Post by: Anonymous on 16 de August , 2006, 09:15:28 PM
Achei seu code meio dificultado xD
O code esse programa tem um memory injection muito bao pra estudos.
http://tibiamovie.sourceforge.net/ (//http://tibiamovie.sourceforge.net/)