¿Es posible llamar a una función no exportada que reside en un exe?

4 minutos de lectura

avatar de usuario
BlueRaja – Danny Pflughoeft

Me gustaría llamar a una función que reside en un .exe de terceros y obtener su resultado. parece que hay deberían ser una forma, siempre que sepa la dirección de la función, la convención de llamada, etc., pero no sé cómo.

¿Alguien sabe cómo haría esto?

Me doy cuenta de que cualquier solución sería un truco no estándar, pero hay deber ¡estar fuera!


Mi caso de uso no nefasto: estoy aplicando ingeniería inversa a un formato de archivo para mi software. Los cálculos en esta función son demasiado complejos para que mi pequeño cerebro los descubra; Pude extraer el código ensamblador directamente a mi propia DLL para probarlo, pero, por supuesto, no puedo liberarlo, ya que sería un robo. Asumiré que los usuarios ya tienen esta aplicación en particular preinstalada, por lo que mi software se ejecutará.

  • Desde el documentos: “LoadLibrary también se puede usar para cargar otros módulos ejecutables. Por ejemplo, la función puede especificar un archivo .exe para obtener un identificador que se puede usar en FindResource o LoadResource”. Pero tenga cuidado con el código dependiente de la posición.

    – Adam Rosenfield

    7 mayo 2012 a las 18:44


  • Vas a tener problemas cada vez que ese otro programa sea parcheado o actualizado. O si el otro proveedor se entera e intencionalmente modifica su programa para evitar que el suyo funcione. Lo que describe es teóricamente posible, pero no es una buena práctica de ingeniería.

    –Raymond Chen

    7 mayo 2012 a las 18:47

  • @Goz: eso supone que el código es independiente de la posiciónque muy probablemente no lo es.

    – Adam Rosenfield

    7 mayo 2012 a las 19:01

  • En términos generales, las prácticas de ingeniería poco sólidas tienden a no estar bien documentadas precisamente porque no lo son.

    –Raymond Chen

    7 mayo 2012 a las 19:50

  • @BlueRaja: en este caso, la “buena práctica” sería pedirle al desarrollador del software que está tratando de usar que proporcione una biblioteca que pueda analizar el formato de archivo que le interesa o alguna documentación sobre el formato de archivo . Tal vez ofrecerles algo de $$$ para licenciarlo si no lo regalan. Por supuesto, si el desarrollador ya no está en el negocio, es posible que no tenga mejores opciones.

    – Adam Rosenfield

    7 mayo 2012 a las 21:20

  • Sin embargo, la función no debe basarse en variables preiniciadas en tiempo de ejecución (p. ej., CRT styff). Si lo hace, va a ser más difícil hacer que funcione. Además, creo que mediante el uso de algunas API de depuración se puede controlar completamente la ejecución de un proceso, por ejemplo, alterar su memoria y registros y ejecutar instrucciones. Esto puede permitirle evitar la reubicación de código/datos.

    – Alexei Frunze

    8 de mayo de 2012 a las 8:21

  • Eso lo hace confiar en un valor inicializado, pero el valor se inicializa directamente en la sección .data (es decir, está incrustado en el .exe). ¿Será eso un problema? No se realizan llamadas de Windows o biblioteca C.

    – Blue Raja – Danny Pflughoeft

    8 mayo 2012 a las 15:16

  • @BlueRaja-DannyPflughoeft, puede establecer el valor usted mismo de todos modos. Además, si sabe exactamente dónde se encuentra la función en el EXE, puede cargar el EXE usted mismo y reescribir las direcciones de las llamadas para que coincidan con la base de su propio programa. Entonces, lo que está tratando de hacer es muy posible, solo inconveniente.

    – Profesor Falken

    16 mayo 2012 a las 11:36

  • @Amigable: Es bueno escuchar eso 🙂 Pero todavía no lo sé cómo Yo haría todo eso. ¿Tienes algún código de ejemplo?

    – Blue Raja – Danny Pflughoeft

    16 mayo 2012 a las 17:20


  • No, lo siento, no sé cómo hacerlo yo mismo. Sería algo así como un desensamblador imagino.

    – Profesor Falken

    17 mayo 2012 a las 15:55

  • No veo nada allí que requiera privilegios de administrador. ¿Tenía algo específico en mente o simplemente quiso decir que no lo ha probado desde una cuenta que no es de administrador?

    – Harry Johnston

    18 mayo 2012 a las 23:30

  • @HarryJohnston: No lo probé desde una cuenta que no sea de administrador y, sí, hay algo específico a lo que me refiero también. MSDN dice que en varios lugares del código anterior deben estar disponibles derechos de acceso específicos: PROCESS_VM_OPERATION, PROCESS_VM_READ, PROCESS_VM_WRITE, THREAD_GET_CONTEXT, THREAD_SET_CONTEXT, THREAD_QUERY_INFORMATION. Todavía no sé todo sobre ellos. OTOH, parece que “SeDebugPrivilege” no es necesario en este caso.

    – Alexei Frunze

    19 de mayo de 2012 a las 3:12


  • AFAIK, incluso las cuentas de usuario estándar tienen derechos de acceso sin restricciones a sus propios procesos e hilos, por lo que no creo que ninguno de ellos sea un problema. SeDebugPrivilege solo se requiere para depurar los procesos de otros usuarios. OTOH, existe el riesgo de que el software antivirus marque o bloquee este tipo de cosas, pero eso sucederá ya sea que sea un administrador o no. Si tengo la oportunidad, probaré esto como usuario estándar cuando regrese al trabajo el lunes.

    – Harry Johnston

    19 mayo 2012 a las 23:02

  • @HarryJohnston: acabo de crear un usuario estándar y ejecuté el código anterior debajo de él y funcionó.

    – Alexei Frunze

    19 mayo 2012 a las 23:18

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad