Declarar varios campos de estructura

Cuando una estructura está malloc, es obvio cuán grande es esa estructura. Sin embargo, es muy tedioso declarar 64 campos dword ficticios para una estructura de 256 bytes. Declarar que la estructura tiene una matriz de tamaño fijo no ayuda mucho, porque no puede nombrar los elementos individualmente. Actualmente estoy usando un script AutoHotKey para agregar los campos, que dejó de funcionar hoy por cualquier motivo.

Entonces: ¿hay alguna manera de agregar varios campos en una declaración de estructura a la vez? ¿Quizás a través de alguna API de idc?

preguntado el 08 de marzo de 13 a las 21:03

2 Respuestas

Hay un truco ingenioso, pero poco intuitivo, para hacer esto en IDA que uso todo el tiempo: defina una matriz, pero en el cuadro de diálogo de la matriz desmarque "Crear como matriz" casilla de verificación. Lo que esto hace es crear tantos elementos como desee en la estructura, pero no los convierte en una matriz.

El flujo de trabajo es este:

  • Cree un solo elemento del tipo que desee (por ejemplo, un dword) en el desplazamiento donde desea su lista de elementos. (Esto a menudo será cero cuando solo está creando una estructura vacía de la que conoce el tamaño, pero nada sobre la estructura interna).
  • Presione la tecla * con el cursor en el elemento que acaba de crear.
  • Ingrese la cantidad de elementos que desea en el cuadro de diálogo de matriz.
  • Desmarque la casilla de verificación 'Crear como matriz' en la esquina inferior izquierda del cuadro de diálogo.
  • Presiona OK.

IDA creará tantos elementos como haya solicitado, pero no como una matriz. Es posible que deba volver a escribir cosas más tarde a medida que aprende qué es todo, pero esto le da un buen esqueleto para comenzar.

Respondido el 06 de enero de 18 a las 21:01

Te daré dos soluciones. El primero puede no ser exactamente lo que desea, dependiendo de la situación. Puedo dar más detalles sobre cualquiera de los métodos si lo desea.

El método barato: usar arreglos de relleno

Si tiene una estructura grande y solo hay unos pocos miembros cuyo propósito o tamaño se conocen, a menudo es útil llenar los vacíos de la estructura creando matrices ficticias temporales. Esto hace que la definición de la estructura sea más fácil de leer y mantener en IDA, y también le permite dar forma a la estructura a un tamaño específico sin definir más miembros de los que necesita.

Supongamos que tiene una estructura que se sabe que tiene un tamaño de 0x400 bytes y conoce las definiciones de los miembros en los desplazamientos +0x0 y +0x384. Supongamos también que sabe que hay palabras en +0x4 y +0x6, pero aún no sabe lo que representan. Entonces podrías definir la estructura para que sea algo como esto:

00000000 MY_STRUCT       struc ; (sizeof=0x400)
00000000 ProcessID       dd
00000004 field_4         dw
00000006 field_6         dw
00000008 __filler1       db 892 dup(?)
00000384 ProcessObject   dd ?
00000388 __filler2       db 116 dup(?)
000003FC __filler3       dd ?
00000400 MY_STRUCT       ends

Esto es mucho más legible de lo que sería si no tuviera la __fillerX elementos allí. También podría decirse que es más correcto, porque no tiene forma de saber de antemano si todos los miembros de la estructura son realmente qwords.

La razón por la que tengo __filler3 en la parte inferior es porque si alguna vez quiero definir un elemento en la región de __filler2, puedo limpiar __filler2 (y luego agregue nuevos miembros de relleno en ese espacio) sin reducir el tamaño total de la estructura. De hecho, si el tamaño es lo único que se conoce en el momento de la definición de la estructura, lo primero que debe hacer probablemente sea definir un elemento final. Entonces nunca necesitará averiguar los tamaños de las matrices de relleno usted mismo; el tamaño de matriz predeterminado que le proporciona IDA siempre será correcto. Para hacer eso rápidamente, generalmente solo creo una matriz de tamaño N-4 y agrego una dword al final.

pero en realidad quieres 32 qpalabras!

No puedo pensar en ninguna situación práctica en la que esto sería útil, ¡pero tal vez tú puedas!

En cualquier caso, de hecho, puede hacerlo a través de la API de IDA. Las funciones que desea son AddStrucEx y AddStrucMember. Debería poder obtener la mayor parte de la información que desea de los documentos de ayuda de IDA.

Si desea un ejemplo funcional de un script IDC para generar estructuras, puede generar uno usted mismo. Cree algunas estructuras, luego vaya a File > Produce File > Dump typeinfo to IDC file....

O esto también debería funcionar (usa IDAPython):

id = AddStrucEx(-1, "EXAMPLE_STRUCT", 0)
for i in xrange(0,256,8):
    AddStrucMember(id, "field_%x"%i, i, FF_DATA|FF_QWRD, -1, 8)

respondido 10 mar '13, 19:03

Gracias. Iré por la versión 2, ya que no planeo usar esta estructura para ningún otro propósito para dar nombres a las ofertas. La versión 1 es un poco tediosa: debe averiguar el lugar exacto para dividir la matriz y luego cambiar a la ventana de estructuras para definir un nuevo campo y realizar la división. - Sebastián Graf

Me siento un poco volcado por no haber accedido a las funciones de la API. Probablemente buscado struct como en MakeStructEx y supuse que no había equivalente... - Sebastián Graf

¡No hay problema! Prefiero el primer método, pero eso se debe principalmente a que a menudo hago referencia directa a la subvista de estructuras y quiero que las definiciones sean legibles. Supongo que si no usa esa subvista con mucha frecuencia, sería un problema menor. - user1354557

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.