Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Fucko en 4 Abril 2014, 10:09 am



Título: Ayudita con un pequeño FOR anidado por favor
Publicado por: Fucko en 4 Abril 2014, 10:09 am
Buenas, estoy estudiando el comportamiento de un soft, usé el ida pro para decompilarlo y ver que es lo que hace...

voy bastante bien....

solo que ahora, me encuentro con esto, y estoy atorado jejejejeje

probé verlo en assembler, que más o menos lo entiendo para reversing, pero se hace un choclo terrible....


Código:
//----- (00401C6F) --------------------------------------------------------
int __cdecl sub_401C6F(unsigned int a1, const void *a2)
{
  int v3; // eax@16
  int v4; // eax@16
  int v5; // eax@16
  int v6; // eax@16
  int v7; // eax@16
  char v8; // [sp+27h] [bp-51h]@3
  signed int j; // [sp+28h] [bp-50h]@3
  signed int i; // [sp+2Ch] [bp-4Ch]@1
  signed int k; // [sp+2Ch] [bp-4Ch]@10
  signed int l; // [sp+2Ch] [bp-4Ch]@13
  char v13[8]; // [sp+70h] [bp-8h]@6

  memset(byte_4164C0, 0, 0x48u);
  memcpy(byte_4164C0, a2, 8u);
  for ( i = 0; i <= 7; ++i )
  {
    v8 = byte_4164C0[i];
    for ( j = 0; j <= 7; ++j )
    {
      *(&v13[8 * i - 64] + j) = v8 < 0;
      v8 *= 2;
    }
  }

se que se llenan 48 bytes de 0, luego copia desde una dirección de memoria del programa, lo que sería a2, que es B1 C2 52 33 AF 8B 33 49

Y eso lo copia a 4164c0

pero no entiendo que hace en el for, en esta parte

Código:
*(&v13[8 * i - 64] + j) = v8 < 0;
      v8 *= 2;

si alguien me puede orientar, se lo agradezco :)
gracias


Título: Re: Ayudita con un pequeño FOR anidado por favor
Publicado por: eferion en 4 Abril 2014, 10:21 am
&v13[8 * i - 64] obtiene un puntero a la posición 8*i-64 del array v13

&v13[8 * i - 64] + j suma "j" a la posición calculada anteriormente

*(&v13[8 * i - 64] + j) = v8 < 0; almacena en la posición calculada en el paso anterior un 1 si v8 es menor que cero y un cero en caso contrario.

v8 *= 2; multiplica por dos el valor almacenado en v8 ( almacenando el resultado en v8, por supuesto)