Como hacer un hook con una dll?

Aquí puedes preguntar o compartir tus dudas y conocimientos acerca del programa
Buenas gente de AmsSpecialist tengo una duda como inyecto una dll
en el foro encontre este tema

viewtopic.php?f=20&t=2584&hilit=hook

y un usuario tiene la misma duda que yo sobre como cambiar un codigo o en este caso injectar una dll
el lo hace con cheat engine
pero quiero saber si se puede con ams

Disculpen la pregunta :sorry: soy nuevo en esto de dll

Me gusta tratar con hooks y todas estas cosas, pero requieren un nivel minimo de asm, por lo menos conocer como funciona.

Luego existen muchos metodos para hookear entre ellos:

DLL Hooking: el mas sencillo, se trata de sustituir una dll (normalmente del sistema) por otra nueva y que todas sus funciones apuntan a la dll original, pero se pueden realizar cambios en los argumentos y retorno de las funciones. Es el mejor para operaciones que realiza winapi o para programas basados en direct3d. Nivel noob requerido

VirtualProtect: este metodo usa la funcion VirtualProtect de windows para desproteger una zona de la memoria donde se almacenan las direcciones donde estan las funciones, y las redireccionas hacia una funcion que tu hayas creado. Nivel informatica de universidad requerido

Detours: Es basicamente lo anterior, pero llevado a un nivel infernal en el que el asm pro es necesario, permite ademas de hookear funciones, parametros en la memoria, y un sin fin de cosas que dan para mucho rato. Nivel dios requerido.

Voy a hacer un pequeño tutorial de dll hooking y lo publicare en un rato.

Entre tanto, os dejo por aqui las funciones que suelo utilizar para hookear mediante VirtualProtect

static long long redirectBackup;

void Redirect(void* source, void* destination)
{
DWORD dwOld;
VirtualProtect(source, 5, PAGE_EXECUTE_READWRITE, &dwOld);
redirectBackup = *(long long*)source;
*((unsigned char*)source) = 0xE9;
*(DWORD*)(((char*)source) + 1) = (DWORD)((DWORD)destination - (DWORD)source) - 5;
}

void Restore(void* source)
{
*(long long*)source = redirectBackup;
}


ejemplo de uso para CreateFileA

void* CreateFileAAddr = NULL;
CreateFileAAddr = GetProcAddress(GetModuleHandle("kernel32.dll"), "CreateFileA");
Redirect(CreateFileAAddr, CreateFileAHooked);


y por supuesto la funcion CreateFileAHooked:

HANDLE WINAPI CreateFileAHooked(
_In_ LPCTSTR lpFileName,
_In_ DWORD dwDesiredAccess,
_In_ DWORD dwShareMode,
_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
_In_ DWORD dwCreationDisposition,
_In_ DWORD dwFlagsAndAttributes,
_In_opt_ HANDLE hTemplateFile
)
{
//DO SOMETHING WITH ARGUMENTS

Restore(CreateFileAAddr); //RESTAURAMOS A LA FUNCION ORIGINAL

hFile = CreateFileA(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); //EJECUTAMOS FUNCION ORIGINAL

Redirect(CreateFileAAddr, CreateFileAHooked); //VOLVEMOS A HOOKEAR, PARA LA PROXIMA

//DO SOMETHING WITH RETURN VALUE

return hFile;
}


Obviamente para ejecutar este codigo, ya tienes que tener acceso mediante alguna dll inyectada, este metodo es bueno porque inyectando una dll comun, como user32.dll puedes acceder a todas las otras dll cargadas.

La cosa se va complicando cuando las funciones no estan exportadas en la dll, o se quiere hookear una funcion interna en un exe, a partir de ahi se va complicando, y segun los niveles de ingenieria inversa que apliques podras o no conseguir reemplazar una funcion determinada.

En un rato esta el tutorial.
:O Gracias. veo que hay que tener conocimientos de ingenieria inversa pero ya veo que es posible. estuve leyendo un inyector en c# express y es muy parecido a tu code.
Esperando el Tutorial
:num1: