Esto es una invocación de un puntero de función almacenado en una estructura.
Esta primera línea obtiene un puntero almacenado en la dirección DS:xxxxxxxx
. Los corchetes indican desreferenciando de la dirección, muy similar a *
en C. El valor de la memoria está a punto de usarse como un puntero; se coloca en el registro ecx
.
MOV ECX,DWORD PTR DS:[xxxxxxxx] ; xxxxxxxx is an address
La segunda línea desreferencia el puntero obtenido anteriormente. Ese valor de ecx
ahora se usa como la dirección, que se desreferencia. El valor encontrado en la memoria es otro puntero. Este segundo puntero se coloca en el registro edx
.
MOV EDX,DWORD PTR DS:[ECX]
La tercera línea vuelve a desviar la memoria; esta vez, el acceso se produce a una dirección offset desde el puntero obtenido anteriormente por 0x116 bytes. Esto no es divisible de manera uniforme por cuatro, por lo que este puntero a la función no parece provenir de una tabla de C++. El valor obtenido de la memoria se almacena esta vez en el registro eax
.
MOV EAX,DWORD PTR DS:[EDX+116]
Finalmente, la función a la que apunta eax
se ejecuta. Esto simplemente invoca la función a través de un puntero de función. La función parece tomar cero argumentos, pero tengo una pregunta sobre la revisión de mi respuesta: ¿hay instrucciones PUSH
que preceden a este fragmento? Esos serían los argumentos de la función. Los signos de interrogación indican que esta función puede devolver un valor, no podemos decir desde nuestro punto de vista.
CALL EAX
En general, el fragmento de código se ve como una invocación de una función de extensión de un plug-in biblioteca para OllyDbg. El OllyDbg ABI especifica varios struct
que contienen algunos punteros a las funciones. También hay matrices de indicadores de función, pero el doble indirecto para llegar al edx
-puntero sostenido (también el desplazamiento no alineado por el múltiplo par) me hace pensar que esto es un struct
y no una matriz de punteros de función o un vtable de la clase C++.
En otras palabras, xxxxxxxx
es un puntero a un puntero a struct
que contiene un puntero de función.
En el archivo fuente OllyDbg PlugIn.h hay algunas definiciones candidatas struct
. He aquí un ejemplo:
typedef struct t_sorted { // Descriptor of sorted table
char name[MAX_PATH]; // Name of table, as appears in error
int n; // Actual number of entries
int nmax; // Maximal number of entries
int selected; // Index of selected entry or -1
ulong seladdr; // Base address of selected entry
int itemsize; // Size of single entry
ulong version; // Unique version of table
void *data; // Entries, sorted by address
SORTFUNC *sortfunc; // Function which sorts data or NULL
DESTFUNC *destfunc; // Destructor function or NULL
int sort; // Sorting criterium (column)
int sorted; // Whether indexes are sorted
int *index; // Indexes, sorted by criterium
int suppresserr; // Suppress multiple overflow errors
} t_sorted;
se permiten esos ejemplos para ser NULL
, y el fragmento asm no comprueba NULL
puntero en el puntero de función. Por lo tanto, debería ser DRAWFUNC
de t_table
o SPECFUNC
de t_dump
.
Puede crear un proyecto pequeño que incluya el archivo de encabezado y use printf()
y offsetof()
para determinar si alguno de ellos tiene un desplazamiento de 0x116.
De lo contrario, me imagino que el interior de OllyDbg está escrito en este mismo estilo. Por lo tanto, es probable que haya definiciones privadas struct
(no publicadas en el archivo Plugin.h) utilizadas para diversos fines dentro de OllyDbg.
Me gustaría agregar, creo que es una pena que las fuentes de OllyDbg no estén disponibles. Tenía la impresión de que el desensamblador estático que contiene estaba bajo algún tipo de licencia GPL, pero no he tenido suerte en conseguir las fuentes para OllyDbg.
@ x0n - ¿De dónde viene la etiqueta de la tarea? –
Esto no es tarea, simplemente no soy bueno para el montaje. – Iron
etiqueta de tarea eliminada. – x0n