Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Caster en 9 Noviembre 2013, 22:22 pm



Título: Ofuscación
Publicado por: Caster en 9 Noviembre 2013, 22:22 pm
Buenas, he estado leyendo sobre ofuscación del código y lo único que he leído es lo que viene en la wikipedia, que supongo que será lo más básico sobre esto, según la wikipedia:
Código
  1. int int_;

Estaríamos definiendo una variable entera, hasta ahí bien.

Código
  1. _int-_int;

Esto sería = 0

Código
  1. (_int-_int)!;
Y esto sería = 1, y aqui llega lo que no entiendo, por qué el resultado de la siguiente línea es 10:
Código
  1. (((!(int_-int_)<<!(int_-int_))<<(!(int_-int_)<<!(int_-int_)))|(!(int_-int_)<<!(int_-int_)));

Saludos.


Título: Re: Ofuscación
Publicado por: $trunk en 9 Noviembre 2013, 22:31 pm
Porque el operador << lo que hace es desplazar bits a la izquierda. Tiene la siguiente sintaxis:
Código:
variable << num_bits_a_desplazar
Es decir, que si haces, 1 << 1 lo que estás haciendo es desplazar un bit a la izquierda, es decir que pasarias de 0001 a 0010. El resultado sería 2 (0010).

Esa sentencia en primer lugar lo que hace es desplazar 4 bits a la izquierda: 1 << 1 << 1 << 1. O sea que lo que está haciendo es: 0001 -> 0010 -> 0100 -> 1000. El resultado es 8 (1000).

Luego, a ese resultado le aplica un OR (|). 1000 | 0010 sería 1010.

En resumen, hace lo siguiente:

(1 << 1 << 1 << 1) | (1 << 1)

(1000) | (0010) = 8 | 2

1010 = 10


Título: Re: Ofuscación
Publicado por: Caster en 9 Noviembre 2013, 22:41 pm
Vale, el desplazamiento de bits lo entiendo, y por lógica supongo que el operador que utiliza OR (|) no tendrá nada que ver con el operador de comparación sino que este será a nivel de bits, ¿qué función tiene?

Saludos y gracias.


Título: Re: Ofuscación
Publicado por: rir3760 en 10 Noviembre 2013, 02:44 am
Es un operador de bits donde el bit resultante es 1 si los bits son distintos y 0 si son iguales. Una pagina con una explicación a detalle de esos operadores (en general, no especifico de C) es Wikipedia: Bitwise operation (http://en.wikipedia.org/wiki/Bitwise_operation).

Un saludo


Título: Re: Ofuscación
Publicado por: csp en 10 Noviembre 2013, 08:57 am
Buenas,

Te explico según lo entiendo. La primera parte del código (antes del OR), lo que hace es desplazar 3 bits a la derecha.

Entonces, la parte de la línea (Puede que esté mal la cantidad de paréntesis):
Código
  1. (((!(int_-int_)<<!(int_-int_))<<(!(int_-int_)<<!(int_-int_)))

Sería lo mismo que poner:
Código
  1. 1<<1<<1<<1;

Código:
1
10 --> Primer desplazamiento.
100 --> Segundo desplazamiento.
1000 --> Tercer desplazamiento.
La segunda parte del código:
Código
  1. (!(int_-int_)<<!(int_-int_)));
Sería:
Código
  1. 1<<1;
Código:
  1
10 --> Primer desplazamiento.

Y ahora realiza la operación OR. Está es una operación lógica que devuelve verdadero (en este caso 1) cuando uno de los operandos o ambos, sean verdaderos (o 1). Entonces:

Código
  1. 1000 | 10

Hace la siguiente comparación (bit a bit):

1 OR 1 = 1
0 OR 0 = 0
0 OR 1 = 1
0 OR 0 = 0

Dando como resultado 1010. 10 en decimal.

Un saludo.


Título: Re: Ofuscación
Publicado por: Caster en 10 Noviembre 2013, 11:22 am
Es un operador de bits donde el bit resultante es 1 si los bits son distintos y 0 si son iguales. Una pagina con una explicación a detalle de esos operadores (en general, no especifico de C) es Wikipedia: Bitwise operation (http://en.wikipedia.org/wiki/Bitwise_operation).

Un saludo

Según la explicación que ha dado csp el resultado es 1 si alguno de los dos bits es 1, no tienen porque ser los dos, y asi si que ya tiene sentido la operación, ya lo he entendido todo.

Gracias.


Título: Re: Ofuscación
Publicado por: rir3760 en 10 Noviembre 2013, 15:16 pm
Cierto, la definición que di fue la del operador XOR '^'. Mea culpa.

Un saludo