Pregunta

Estoy en el proceso de ingeniería inversa de un ejecutable de Windows. Encontré una clase que quiero usar de algún código que inyecte en el ejecutable (hilo diferente, pila propia). ¿Cómo podría declarar dicha clase, dadas las direcciones de métodos y la estructura de variables de miembros?

Por ejemplo, supongamos que encontré una clase llamada Foo, con su constructor @ 0x4012d30 y una función dothemario @ 40125d4. También sé que posee tres DWORDS de datos privados. Dado que ambos métodos son _thiscalls, declaro una clase como en mi código:

class GuessedFoo {
    private:
        int bar;
        char *cafebabe;
        float deadbeef;
    public:
        GuessedFoo(int a, int b);
        void doTheMario();
};

Ahora, esta es una clase perfectamente elegante, pero ¿ahora hay alguna forma de hacer que el compilador / enlazador vincule los métodos de clase a las dos direcciones anteriores que dije? Por supuesto, puedo escribir un envoltorio ASM para convertir un stdcall en un thesscall para cada método que necesito usar, y luego usar estructuras en lugar de clases, pero tiene que haber una mejor manera.

Uso GCC/G ++ en este momento, pero puedo cambiar a VC ++ (ya que el ASM en línea de GCC me da dolores de cabeza de todos modos).

¿Fue útil?

Solución

Si la clase no tiene VTable, podría, en principio, crear dicha clase en su propio código, donde todas las llamadas a la función invocan las implementaciones reales apropiadas. Puede hacer esto retirando las funciones de los miembros como Funciones desnudas que contiene una instrucción de salto de ensamblaje a la implementación real.

Si la clase tiene un VTable, es probable que las cosas se vuelvan mucho más complejas; Es probable que necesite crear explícitamente el VTable como una estructura de punteros de funciones, y hacer que sus trozos de función llamen a ellos. Esto significa funciones de cuña más complejas; Una función desnuda simple con un salto puede no ser suficiente, y puede ser mejor ir con una función real. Sin embargo, recuerde que las funciones de los miembros en Win32 usan un Convención de llamadas diferentes; Esto significa que una llamada de función de miembro ordinario no funcionará. Tú mayo Poder salirse con la suya construyendo punteros a los miembros de los miembros, pero tenga en cuenta que tienen un Estructura bastante extraña Para ellos, y necesitará igualarlo con algo que tenga la misma representación que los punteros VTABLE. ¡Buena suerte!

Otros consejos

Estás de ingeniería inversa aquí, por lo tanto, (casi, probablemente) obligado a bajar cuando se trata de interactuar con el código existente.

Llamaría a esta función usando el código de ensamblaje puro.
Si la dirección base del EXE se fija, es aún más fácil.
Código de ejemplo:

void main()
{
    int bar = 5;
    int * cafebabe = &bar;
    __asm
    {
        push [bar];
        push [cafebabe];
        mov eax, 123456; // address of the function
        call eax;
    }
}

Simplemente verifique cómo se llama a esta función por código original para ver en qué orden necesita impulsar los argumentos. ¡No olvides que algunos argumentos pueden pasar por registros!

No estoy completamente seguro de que lo entiendo correctamente, pero de todos modos: creo que la ruta más fácil para "ubicar a mano" los métodos es mediante el uso de funciones de funciones.

C ++ no define ningún tipo de interfaz binaria, lo que hace que sea todo menos imposible implementar ningún tipo de vinculación dinámica para las clases de C ++.

Lo mejor que puede hacer es declarar dos estructuras: una que contiene la función C typedefs para cada método, el otro refleja el diseño de datos de la clase.

Por supuesto, debido a que __THIscall en un método de clase pasa 'esto' a través del registro de ECS, no creo que pueda hacer una declaración de función C explícita que tendrá el mismo efecto, por lo que es posible que deba realizar todas las llamadas a través de una costumbre "CallThiscallMethodwithParameters" que había escribido en la Asamblea.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top