[VIDEOTUTORIAL] Obtener Indetificador de Proceso(PID) y la dirección base de cualquier módulo Tutorial

  • Hola Invitado, hemos creado un grupo de telegram para GamerzHacking Latino, para mas informacion ingresa al siguiente enlace AQUI


18
Me Gusta
15
Temas

Mstik

Moderador
Registrado
4 May 2021
Temas
15
Mensajes
30
Mejores respuestas
0
Este tutorial le mostrará cómo encontrar la dirección base del módulo en Cheat Engine, y luego cómo encontrarla usando C ++. ¿Por qué necesitaría saber la dirección base de un módulo? Bueno, todo lo que hagas en la piratería del juego implicará compensaciones relativas, el módulo no siempre se cargará en la misma dirección base. Por lo tanto, debe encontrar la dirección base del módulo en tiempo de ejecución. Esto es relativamente simple de hacer y en C ++ se usa la biblioteca ToolHelp32 Snapshot para recorrer los módulos.

TUTORIAL - Obteniendo el pID y la direccion de entrada de un modulo:​


Todos los archivos .exe y .dll cuando se cargan en la memoria se denominan "módulos".

Cuando agregue direcciones a su tabla de Cheat Engine, y especialmente cuando use punteros, a menudo encontrará la dirección listada así:

JSySTtH.png

O tal vez así:
server.dll + 004EE83

Esto está usando un desplazamiento relativo de la dirección de un módulo. Para ver si una dirección está desplazada de un módulo determinado, asegúrese de habilitar esto:

qhJlMyH.png

Luego, en el visor de memoria, use "Ir a dirección" para la dirección. Independientemente de si se trata de datos o código, esto le dirá de qué módulo está desplazado.

Para ver todos los módulos cargados por el proceso en Cheat Engine y ver sus direcciones, haga esto:

RF6AHf4.png

También puede utilizar Dissect PE Headers para ver información relativa:

sXyVAlH.png

MZ-Start es la dirección del módulo tal como está actualmente cargado en la memoria. Preferred ImageBase se analiza directamente desde el encabezado PE y es la ubicación en la que prefiere que se cargue. Si esta dirección de memoria ya está ocupada, se reubicará.

Cuando se ejecuta un .exe, el cargador de Windows crea un proceso para él y le da su propio espacio de memoria virtual. El cargador carga el ejecutable en la memoria y luego cualquier archivo .dll llamado por el proceso. El encabezado PE para .dll define una dirección ImageBase. El cargador de Windows intentará cargar el .dll en el espacio de memoria virtual del proceso que lo requiere. Si ese espacio ya está ocupado, se cargará en una ubicación diferente. Si esto sucede, las direcciones de códigos rígidos en nuestros hacks no funcionarán.

Ahora digamos que tenemos un puntero:
ac_client.exe + 109B74

Ahora, el ImageBase extraído del encabezado PE de ac_client.exe es "00400000".
Solo podemos tener un ejecutable para cada proceso, que es un espacio de memoria vacío hasta que se cargue ac_client.exe. No hay nada que impida que ac_client.exe se cargue en su ImageBase. Entonces, la dirección base de un .exe es siempre la misma.

El ÚNICO momento en que un .exe no se carga en la base de imágenes almacenada en los encabezados PE es cuando ASLR (Address Space Layout Randomization) está habilitado en el sistema operativo y el indicador DynamicBase está configurado para permitir que el sistema operativo aleatorice la dirección virtual del módulo. .

Podemos evaluar esto antes de colocarlo en el código.
ac_client.exe + 109B74
00400000 + 109B74
509B74

Esta es la definición de una dirección estática, puede ser relativa a la dirección base de un ejecutable en el binario en el disco, pero siempre es estática en la memoria después de que ocurran las reubicaciones.

Pero para .DLL que se pueden reubicar:

"server.dll + 004EE83" funciona en Cheat Engine porque Cheat Engine evalúa la dirección de server.dll. CE obtendrá la dirección de server.dll y la reemplazará con la dirección en la que está cargado el módulo.
Entonces, digamos que la dirección del módulo server.dll es 0x10000000, cheat Engine evaluará:

server.dll + 004EE83
0x10000000 + 004EE83
1004EE83

La evaluación anterior se realiza mediante cheat engine mientras el programa se está ejecutando.

Pero cuando intente usar esto en un entrenador externo, debe evaluar "server.dll" + 004EE83 usted mismo. Hay varias formas de hacer esto y discutiremos una de ellas ahora.

Para hacer esto externamente, puede usar esta función que ha sido ampliamente utilizada llamada dwGetModuleBaseAddress.

Básicamente, utiliza la API de Windows CreateToolhelp32Snapshot para obtener una instantánea de todos los módulos cargados para el proceso dado, luego recorre todos los módulos cargados y encuentra el módulo con el nombre del módulo que le dio. Devuelve un uintptr_t a la dirección del módulo. Ingresa el ProcessID y el nombre del módulo y da como resultado la dirección del módulo.
Debe configurar su proyecto en UNICODE para que esto funcione, si no es un novato, puede cambiarlo fácilmente para que funcione con MBCS.

Función:

C++:
uintptr_t GetModBaseAddr(DWORD procID, const char * modName)
{
    uintptr_t modbase;

    HANDLE hMods = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, procID);
    if (hMods != INVALID_HANDLE_VALUE)
    {
        MODULEENTRY32 modEntry;
        modEntry.dwSize = sizeof(MODULEENTRY32);

        if (Module32First(hMods, &modEntry))
        {
            do
            {
                if (!strcmp((char*)modEntry.szModule, (char*)modName))
                {
                    modbase = (uintptr_t)modEntry.modBaseAddr;
                    break;
                }
            } while (Module32Next(hMods, &modEntry));
        }
        CloseHandle(hMods);
    }

    return modbase;
}

La llamada de función:

C++:
uintptr_t modbase = GetModBaseAddr(targetPID, "ac_client.exe");

Puede obtener más información sobre ToolHelp32Snapshot:
Tomar una instantánea y ver los procesos (Windows)
Recorrer la lista de módulos (Windows)

¿Desea hacerlo internamente?
No te preocupes, la tenemos
C++:
uintptr_t pAC_client= (uintptr_t)GetModuleHandle("ac_client.exe");
 
Última edición: