Autor
|
Tema: modificar valor de X variable de un proceso mediante un programa creado en c++ (Leído 3,516 veces)
|
razormta
Desconectado
Mensajes: 18
|
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 #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 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.exevictima.cpp #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.
|
|
|
En línea
|
|
|
|
razormta
Desconectado
Mensajes: 18
|
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 #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.
|
|
|
En línea
|
|
|
|
NikNitro!
Desconectado
Mensajes: 1.309
Galletaaa!!!
|
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;)
|
|
|
En línea
|
|
|
|
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?
|
|
« Última modificación: 25 Abril 2014, 14:46 pm por Mad Antrax »
|
En línea
|
No hago hacks/cheats para juegos Online. Tampoco ayudo a nadie a realizar hacks/cheats para juegos Online.
|
|
|
x64core
Desconectado
Mensajes: 1.908
|
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
|
|
|
En línea
|
|
|
|
NikNitro!
Desconectado
Mensajes: 1.309
Galletaaa!!!
|
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 
|
|
|
En línea
|
|
|
|
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 +4cA parte he encontrado la instrucción que modifica la dirección de memoria: victima.exe+256E - 83 E9 0A - sub ecx,0AHaciendo 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!!
|
|
|
En línea
|
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 
|
|
|
En línea
|
No hago hacks/cheats para juegos Online. Tampoco ayudo a nadie a realizar hacks/cheats para juegos Online.
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Como imprimir el valor de una variable definida en una variable...
Scripting
|
nhaalclkiemr
|
5
|
5,917
|
3 Mayo 2007, 17:58 pm
por sirdarckcat
|
|
|
Asignar un valor a una variable(ScriptA)Obtener esa variable (ScriptB)-UNITY c#
Programación General
|
USLO
|
1
|
3,889
|
8 Octubre 2013, 17:51 pm
por Eleкtro
|
|
|
MOVIDO: Asignar un valor a una variable(ScriptA)Obtener esa variable (ScriptB)-UNITY c#
Scripting
|
Eleкtro
|
0
|
2,099
|
8 Octubre 2013, 17:49 pm
por Eleкtro
|
|
|
Porque para asignarle valor a un vector mediante for tiene que ser una variable
Programación C/C++
|
Naimaderis
|
4
|
2,055
|
14 Diciembre 2016, 18:33 pm
por Naimaderis
|
|
|
Funcion de modificar archivos copia el valor de variable a todos los registros
Programación C/C++
|
lifegame
|
2
|
1,625
|
28 Mayo 2017, 18:30 pm
por lifegame
|
|