Foro de elhacker.net

Programación => Ingeniería Inversa => Mensaje iniciado por: Eleкtro en 27 Diciembre 2014, 21:09 pm



Título: Dudas sobre el opcode 'ldc.i4'
Publicado por: Eleкtro en 27 Diciembre 2014, 21:09 pm
Buenas!

Quizás esta pregunta sea algo absurda porque no entiendo mucho de este tema... no tengais contemplaciones conmigo :P

Recientemente descubrí que para que una función devolviese siempre True (1) era suficiente con modificar el opcode que guarda el valor False (0) en la pila para convertirlo en True (No 0), eso es algo obvio, pero no sabía como hacerlo, y ahí descubrí que dicho valor es igual al índice del opcode ldc.i4, es decir, el opcode ldc.i4.0 almacena un 0 a la pila (False), y el opcode ldc.i4.1 almacena un 1 en la pila (True)

Eso es lo que nos cuenta la MSDN:
Ldc_I4_0 (http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.ldc_i4_0%28v=vs.110%29.aspx)
Ldc_I4_1 (http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.ldc_i4_1%28v=vs.110%29.aspx)

Cita de: http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.ldc_i4%28v=vs.110%29.aspx
Ldc_I4:
Pushes a supplied value of type int32 onto the evaluation stack as an int32.

Mi pregunta es, ¿por que el rango solo va desde ldc.i4.0 hasta ldc.i4.8?, quiero decir, ¿por que no hay un 9, y así hasta el máximo valor Int32?, ¿porque y con que finalidad solo hay 8 índices/valores pre-establecidos de este opcode?.

Saludos!


Título: Re: Dudas sobre el opcode 'ldc.i4'
Publicado por: MCKSys Argentina en 27 Diciembre 2014, 22:01 pm
Hola!

Mi pregunta es, ¿por que el rango solo va desde ldc.i4.0 hasta ldc.i4.8?, quiero decir, ¿por que no hay un 9, y así hasta el máximo valor Int32?, ¿porque y con que finalidad solo hay 8 índices/valores pre-establecidos de este opcode?.

La verdad, creo que esta es una pregunta para los desarrolladores del CIL  :P. De todas formas, si miras el listado (http://en.wikipedia.org/wiki/List_of_CIL_instructions) de opcodes (en la parte de ldc.i4) verás que no solo hay constantes de 0 a 8, sinó que también está el -1. Incluso hay una forma corta (short form) de pushear valores de 32 bits al stack de la VM (ldc.i4.s, opcode 0x1F).

Con respecto al ldc.i4, si miraras la secuencia (en bytes) de opcodes para pushear, por ej., el valor 0X000F1ACA, verías algo como:

20 00 0F 1A CA

O bien

20 CA 1A 0F 00

No recuerdo si los numeros se almacenan como bigendian o no.  ;D


Saludos!