es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Redireccionamiento de funciones alteradas mediante proxy DLL.

Estoy jugueteando con un juego antiguo y estoy tratando de aprender cómo funciona. Mis experimentos actuales incluyen intentar hacer de proxy una de las DLL del juego.

Así que renombré la DLL original, llamándola “trueDLL.dll”, volqué las exports de la DLL con “dumpbin” y creé las pragma (por ahora están bien, investigaré los archivos .def más tarde) para generar un proxy “vacío”. Esto funcionó como se esperaba.

Ahora, me gustaría redirigir algunas de las funciones a mis implementaciones de ingeniería inversa para probar si funcionan. Aquí es donde me quedé atascado. Aquí tienes un ejemplo: la función “LogDebug”. La pragma “vacía” en la DLL proxy se ve así:

#pragma comment(linker, "/export:?LogDebug@@YAXPBDZZ=trueDLL.?LogDebug@@YAXPBDZZ,@504")

Pensé que podría cambiar la pragma de esta manera para redirigir la llamada a mi implementación:

#pragma comment(linker, "/export:?LogDebug@@YAXPBDZZ=LogInfo,@504")

Al ejecutar el programa, no puede iniciarse porque no encuentra “?LogDebug@@YAXPBDZZ”. Al investigar un poco, descubrí que la parte “@@YAXPBDZZ” no se exporta en mi DLL. Parece ser algún tipo de información representada en el nombre codificado, pero no pude averiguar exactamente qué significa. Ghidra y este demangler no me están ayudando, y los únicos resultados de búsqueda están en ruso.

Estoy usando VS 2019 y no se ha modificado ninguna configuración del proyecto.

¿Cuál es el problema aquí y cómo puedo hacer que funcione? ¿O hay una forma más fácil/mejor de lograr esto? Por ahora, me gustaría evitar el enlace de llamadas en el ejecutable del programa, pero si es necesario, lo haré.

EDITAR – Esquema de codificación y compilador

No sé exactamente qué se usó para crear “DLL.dll”, pero según Ghidra, fue “visualstudio:unknown”. Lo interpretaría como una versión 1998 (fechas de los archivos del juego) de MSVC. Estoy usando el compilador MSVC actual (CL ver. 19).

Tendría sentido que un CL actual use el esquema de codificación de C++. Al mirar esta página y compararla con las exports, parece que “DLL.dll” también está usando el esquema de C++, pero podría equivocarme. ¿Cómo puedo averiguar esto con certeza?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema aquí es que el nombre manipulado en el DLL.dll original no coincide con el nombre manipulado que estás tratando de exportar en tu DLL de proxy. La parte @@YAXPBDZZ es una codificación de símbolos utilizada por el compilador de C++ de Microsoft para codificar información sobre los tipos de argumentos de la función y la convención de llamada.

    Según tu edición, es probable que el DLL.dll original haya sido compilado con una versión anterior de MSVC que utilizaba un esquema de manipulación diferente. Necesitarás usar el nombre manipulado correcto para la función LogDebug en tu DLL de proxy.

    Para encontrar el nombre manipulado correcto, podrías intentar usar una herramienta como dumpbin para volcar las exportaciones del DLL.dll original y ver los nombres manipulados de las funciones que deseas redirigir. Alternativamente, podrías utilizar una herramienta como IDA Pro o Ghidra para desensamblar el DLL original y ver los nombres de las funciones en el desensamblado.

    Una vez que tengas el nombre manipulado correcto, deberías poder modificar tu pragma para redirigir la función a tu implementación. Si sigues teniendo problemas, podrías intentar usar una herramienta como Dependency Walker para ver si hay alguna otra dependencia que tu DLL de proxy pueda estar perdiendo.

Comments are closed.