Ofuscación

Iniciado por Caster, 9 Noviembre 2013, 22:22 PM

0 Miembros y 1 Visitante están viendo este tema.

Caster

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:
int int_;

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

_int-_int;

Esto sería = 0

(_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:
(((!(int_-int_)<<!(int_-int_))<<(!(int_-int_)<<!(int_-int_)))|(!(int_-int_)<<!(int_-int_)));

Saludos.

$trunk

Porque el operador << lo que hace es desplazar bits a la izquierda. Tiene la siguiente sintaxis:
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



"A la persona no se le conoce por lo que sabe, sino por lo que hace con lo que sabe" - Martin Luther King

Caster

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.

rir3760

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.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

csp

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):
(((!(int_-int_)<<!(int_-int_))<<(!(int_-int_)<<!(int_-int_)))

Sería lo mismo que poner:
1<<1<<1<<1;

1
10 --> Primer desplazamiento.
100 --> Segundo desplazamiento.
1000 --> Tercer desplazamiento.

La segunda parte del código:
(!(int_-int_)<<!(int_-int_)));
Sería:
1<<1;
  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:

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.

Caster

Cita de: 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.

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.

rir3760

Cierto, la definición que di fue la del operador XOR '^'. Mea culpa.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language