modificar valor de X variable de un proceso mediante un programa creado en c++

Iniciado por razormta, 3 Febrero 2014, 23:16 PM

0 Miembros y 1 Visitante están viendo este tema.

razormta

Amm, soy nuevo ._. me vi en la necesidad de unirme a un foro de programacion porque hay algo que realmente no logro comprender, me explicare...

Llevo varias horas estudiando sobre como inyectar fracciones de codigo en un programa, desde otro programa creado por mi en c++ ( alrededor de 50 horas en los ultimos 3 dias ), y hasta ahora he logrado modificar el valor del dinero en counter strike xd y el valor de una variable de un programa "victima.exe" que yo mismo cree para iniciarme.

si, tuve exito, pero si reinicio el programa la posicion de la memoria de la variable es distinta, ya se que eso es normal xd lo que no logro es encontrar la posicion de memoria estatica, me es dificil explicarme pero supongo que mas de uno paso por esto.

"Address=Base+offset+offset+offset"

ok .. intente con el cheat engine 6.2 pero solo logre conseguir una posicion de memoria dinamica y de ahi no logro por mas que lo intento conseguir la estatica

les muestro mi codigo y les explico:

main.cpp

Código (cpp) [Seleccionar]



#include "stdafx.h"
#include "util.h"
#include <tlhelp32.h> 
#include <shlwapi.h> 

#define PROCESS_NAME "victima.exe"

int readMemory(DWORD pId);
DWORD getProcessId(IN PCHAR szExeName);


int main()
{
DWORD pId=getProcessId(PROCESS_NAME);
if(!pId)
return(0);

int result=readMemory(pId);

std::cout<<result<<std::endl;
system("pause");

return 0;
}

int readMemory(DWORD pId)
{
int hex=0x0016FAC8, // esto lo obtengo con cheat engine
int offset = -8; // esto lo obtengo con cheat engine
int memory,pointerBase,result;
HANDLE hProc = OpenProcess(PROCESS_VM_READ, FALSE, pId);
ReadProcessMemory(hProc, (LPVOID)hex, &memory, 4, NULL);
pointerBase = memory-offset;
ReadProcessMemory(hProc, (LPVOID)pointerBase, &result,4, NULL);
return(result);
}

DWORD getProcessId(IN PCHAR szExeName)
{
    DWORD dwRet = 0;
    DWORD dwCount = 0;

    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    if (hSnapshot != INVALID_HANDLE_VALUE)
    {
        PROCESSENTRY32 pe = {0};
        pe.dwSize = sizeof(PROCESSENTRY32);

        BOOL bRet = Process32First(hSnapshot, &pe);

        while (bRet)
        {
            if (!_stricmp(cw(pe.szExeFile), szExeName))
            {
                dwCount++;
                dwRet = pe.th32ProcessID;
            }
            bRet = Process32Next(hSnapshot, &pe);
        }

        if (dwCount > 1)
            dwRet = 0xFFFFFFFF;

        CloseHandle(hSnapshot);
    }

    return dwRet;
}



util.h , tenia unos errores con el stricmp y logre crearme esta funcion xd

Código (cpp) [Seleccionar]
wchar_t * wc(const char* word)
{
    size_t newsize = strlen(word) + 1;
    wchar_t * wcs = new wchar_t[newsize];

    size_t convertedChars = 0;
    mbstowcs_s(&convertedChars, wcs, newsize, word, _TRUNCATE);
   
return( wcs );
}

char * cw(const wchar_t* word)
{
    size_t newsize = wcslen(word) + 1;
    char * wcs = new char[newsize];

    size_t convertedChars = 0;
    wcstombs_s(&convertedChars, wcs, newsize, word, _TRUNCATE);
   
return( wcs );
}




aca el link del programa victima.exe:
http://www.mediafire.com/download/4iwb35swrh4o8ei/victima.exe

victima.cpp

Código (cpp) [Seleccionar]
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>

int _tmain(int argc, _TCHAR* argv[])
{
int num=1000;
while(num>0)
{
std::cout<<num<<std::endl;
num-=10;
system("pause");
}
return 0;
}



me gustaria que si alguno tiene alguna idea de como hacerlo me explicara, señores solo necesito eso xd la ***** posicion de la variable X xd pero .. una posicion que no cambie al reiniciar el programa, me gustaria una explicacion de lo que neceisto hacer y del error que estoy cometiendo xd

espero no haber publicado en la sección incorrecta y espero que alguien me responda al menos un "hola" xd

Gracias de antemano.

razormta

nadie me respondio xd mmm hoy pase 12 horas mas programando, estoy teniendo hormigueos en la cabeza, debo ir al neurologo de nuevo xd pero bueno .... aca esta el codigo

Código (cpp) [Seleccionar]


#include "stdafx.h"
#include "util.h"
#include <tlhelp32.h> 
#include <shlwapi.h> 

#define PROCESS_NAME "victima.exe"

int readMemory(DWORD pId);
DWORD getModuleBase(DWORD pId, char[64]);
DWORD getProcessId(IN PCHAR szExeName);



int main()
{
DWORD pId=getProcessId(PROCESS_NAME);
if(!pId)
return(0);

int result=readMemory(pId);

std::cout<<result<<std::endl;
system("pause");

return 0;
}

int readMemory(DWORD pId)
{
int memory;
int memory1;
int memory2;
int memory3;
int memory4;
int memory5;

int result;

HANDLE hProc = OpenProcess(PROCESS_VM_READ, FALSE, pId);
DWORD baseAddress  = getModuleBase( pId, PROCESS_NAME )+0x00017154;

ReadProcessMemory(hProc, (LPVOID)(baseAddress),(LPVOID)&memory,4, NULL);
ReadProcessMemory(hProc,(LPCVOID)(memory+0x180),(LPVOID) &memory1, 4, NULL);
ReadProcessMemory(hProc,(LPCVOID)(memory1+0x4fC),(LPVOID) &memory2, 4, NULL);
ReadProcessMemory(hProc,(LPCVOID)(memory2+0x624),(LPVOID) &memory3, 4, NULL);
ReadProcessMemory(hProc,(LPCVOID)(memory3+0x51C),(LPVOID) &memory4, 4, NULL);
ReadProcessMemory(hProc,(LPCVOID)(memory4+0x8),(LPVOID) &memory5, 4, NULL);

std::cout<<memory5<<std::endl; // Fuck yeah xd

return(0);
}

DWORD getProcessId(IN PCHAR szExeName)
{
    DWORD dwRet = 0;
    DWORD dwCount = 0;

    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    if (hSnapshot != INVALID_HANDLE_VALUE)
    {
        PROCESSENTRY32 pe = {0};
        pe.dwSize = sizeof(PROCESSENTRY32);

        BOOL bRet = Process32First(hSnapshot, &pe);

        while (bRet)
        {
            if (!_stricmp(cw(pe.szExeFile), szExeName))
            {
                dwCount++;
                dwRet = pe.th32ProcessID;
            }
            bRet = Process32Next(hSnapshot, &pe);
        }

        if (dwCount > 1)
            dwRet = 0xFFFFFFFF;

        CloseHandle(hSnapshot);
    }

    return dwRet;
}


DWORD getModuleBase(DWORD pId,char ModuleName[64])
{
char mModuleName[36];
MODULEENTRY32 mModule;
HANDLE hTool = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pId);
mModule.dwSize = sizeof( MODULEENTRY32 );
BOOL bModule = Module32First(hTool, &mModule);
BOOL founded = false;
strcpy(mModuleName,cw(mModule.szModule));

while(bModule)
{
if(!strcmp(ModuleName,mModuleName))
{
founded = true;
break;
}
strcpy(mModuleName,cw(mModule.szModule));
bModule = Module32Next(hTool, &mModule);
}
CloseHandle( hTool );
if(!founded)
return(0);
return((DWORD)mModule.modBaseAddr);
}




resulto ser un pointer con offset1+offset2+offset3+offset4+offset5
lo dejo por si algun novato se siente interesado, esta un poco desordenado pero es que debo ir a comer xd, mmm consegui la memoria estatica y no recordaba que debia añadir el getModuleHandle, al olvidar eso el primer codigo no tenia sentido alguno xd bueno, tema cerrado.

NikNitro!

Buenas, tengo un par te preguntas...

Cómo conseguistes saber que eran 4 offsets?

Y cómo consigues saber en cada ejecucion cual es el valor de cada uno?

Salud;)

Mad Antrax

Me encanta éste tema!!

Bueno, tienes varias formas de resolver tu problema:

Con un Pointer (con CheatEngine o programa externo)
Con un AoB Scan (con Cheat Engine o programa externo)
Con un Auto-Assemble script (solo con Cheat Engine)

Voy a bajar tu programa para ver como lo has realizado, a ver si logro encontrar un pointer estatico y te explico como...


*** EDIT *** He bajado tu programa victima.exe y no logro ejecutarlo :( como lo has compilado?
No hago hacks/cheats para juegos Online.
Tampoco ayudo a nadie a realizar hacks/cheats para juegos Online.

x64core

Cita de: Mad Antrax en 25 Abril 2014, 14:44 PM
Me encanta éste tema!!

Bueno, tienes varias formas de resolver tu problema:

Con un Pointer (con CheatEngine o programa externo)
Con un AoB Scan (con Cheat Engine o programa externo)
Con un Auto-Assemble script (solo con Cheat Engine)

Voy a bajar tu programa para ver como lo has realizado, a ver si logro encontrar un pointer estatico y te explico como...


*** EDIT *** He bajado tu programa victima.exe y no logro ejecutarlo :( como lo has compilado?
Incorrecta compilación para liberación.
victima.exe  http://www.sendspace.com/file/tv20f1

NikNitro!

Cita de: Mad Antrax en 25 Abril 2014, 14:44 PM
Bueno, tienes varias formas de resolver tu problema:

Con un Pointer (con CheatEngine o programa externo)
Con un AoB Scan (con Cheat Engine o programa externo)
Con un Auto-Assemble script (solo con Cheat Engine)


Quisiera resolver la ambigüedad, esas son respuestas para mi o para el creador del hilo?

Salud ;)

EDITO: Vale si, he visto tu otro post y son para mi. Gracias Mad Antrax ;)

Mad Antrax

Gracias x64Core he podido debuggear el programa.

He encontrado muchos pointers estáticos válidos:



El que más me ha gustado es: "victima.exe"+00027B1C +7d0 +4c

A parte he encontrado la instrucción que modifica la dirección de memoria:

victima.exe+256E - 83 E9 0A              - sub ecx,0A

Haciendo una pequeña inyección de código a través de un Auto-Assemble script:



Se pueden conseguir cosas como éstas:



Dejo adjunta la tabla de CheatEngine por si alguien quiere estudiarla.

http://pastebin.com/MdNEdQ4C (guardar el contenido en un fichero con extención *.CT)

Saludos!!
No hago hacks/cheats para juegos Online.
Tampoco ayudo a nadie a realizar hacks/cheats para juegos Online.

Mad Antrax

Perdón el double-post.

Además he encontrado un patrón que se corresponde a la instrucción que modifica la variable dinámica:



Simplemente habría que montar un Auto-Assemble script del tipo AoB Scan(83 E9 0A 89 4D FC) y luego mover con contenido del registro [ebp-04] a una variable local, ejemplo:

alloc(mivariable,4)
mov [mivariable],ebp-04

Así, el registro mivariable contendría la dirección dinámica en todo momento :)
No hago hacks/cheats para juegos Online.
Tampoco ayudo a nadie a realizar hacks/cheats para juegos Online.