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.

IDA Cómo establecer variables con tipo con nombre que contengan corchetes angulares en el nombre de los tipos locales.

IDA local types tiene un tipo local como:

struct DEMOTYPE<int>
{
_DWORD dw1;
_DWORD dw2;
};

¿Cómo usar “DEMOTYPE” (tipo de C++) como un tipo normal de C? No se puede lograr el objetivo presionando Y ya que contiene los caracteres “<>”.

Sé que si el objetivo es una función, podemos cambiar la declaración de la función con su nombre codificado.

En resumen, ¿cómo podemos usar la declaración de tipo de C++ en los tipos locales para cambiar el tipo de la variable local?

A continuación se muestra el código que intenté, pero no se puede cambiar la vista pseudocódigo F5.

def setVarType(lvname, lti, isptr=False):
    addr = idc.here()
    c = idaapi.decompile(addr)
    for v in c.lvars:
        if v.name == lvname:
            print("encontrar variable objetivo:", v.name)
            idati = ida_typeinf.get_idati()
            ti = ida_typeinf.tinfo_t()
            if ti.get_numbered_type(idati, lti):
                print("encontrar tipo local:", lti, ":", ti)
                if isptr:
                    ti_ptr = ida_typeinf.tinfo_t()
                    ti_ptr.create_ptr(ti)  # ti_ptr = ti *
                    bret = v.set_final_lvar_type(ti_ptr)
                else:
                    bret = v.set_final_lvar_type(ti)
                print(bret)

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para usar la declaración de tipo C++ en los tipos locales y cambiar el tipo de la variable local, puedes seguir estos pasos:

    1. Define el tipo C++ utilizando la sintaxis del template correcta, por ejemplo:

    “`c++
    struct DEMOTYPE
    {
    _DWORD dw1;
    _DWORD dw2;
    };


    2. Utiliza el Sistema de Tipos de IDA para crear un nuevo tipo de datos para esta definición de tipo. Puedes ir a la ventana de "Tipos Locales", hacer clic derecho y seleccionar "Nuevo Tipo", luego ingresa la definición del tipo C++ y dale un nombre, por ejemplo "DEMOTYPE". 3. Utiliza la API de Python de IDA para obtener este nuevo tipo de datos basado en su nombre, y úsalo para establecer el tipo de tu variable local. Puedes definir una función que tome el nombre de la variable local, el nombre del tipo de datos C++ y opcionalmente un indicador que señale si la variable local es de tipo puntero: ```python import idaapi import idc import ida_typeinf def setVarType(lvname, ctypename, isptr=False): # Obtiene la dirección actual y descompila la función addr = idc.here() c = idaapi.decompile(addr) # Encuentra la variable local objetivo for v in c.lvars: if v.name == lvname: print("Encontrada variable local:", v.name) # Encuentra el tipo de datos C++ basado en su nombre idati = ida_typeinf.get_idati() ctti = ida_typeinf.tinfo_t() if not ctti.get_named_type(idati, ctypename): print("No se pudo encontrar el tipo C++:", ctypename) return False # Opcionalmente crea un tipo de datos puntero basado en el tipo C++ lvti = ctti if isptr: ptrti = ida_typeinf.tinfo_t() ptrti.create_ptr(lvti) lvti = ptrti # Establece el tipo de datos de la variable local bret = v.set_final_lvar_type(lvti) print("Tipo establecido:", bret) return True print("No se pudo encontrar la variable local:", lvname) return False
    1. Llama a esta función con el nombre de la variable local y el nombre del tipo de datos C++. Por ejemplo:
    setVarType("myvar", "DEMOTYPE<int>")
    

    Esto debería establecer el tipo de la variable local “myvar” como el tipo de datos “DEMOTYPE“.

Comments are closed.