Самомодифицирующийся код [C ++]

Я читал статью журнала взломщиков кодов о самомодифицирующемся коде, и там был этот фрагмент кода:

void Demo(int (*_printf) (const char *,...))
{ 
      _printf("Hello, OSIX!n"); 
      return; 
} 
int main(int argc, char* argv[]) 
{ 
  char buff[1000]; 
  int (*_printf) (const char *,...); 
  int (*_main) (int, char **); 
  void (*_Demo) (int (*) (const char *,...)); 
  _printf=printf; 
  int func_len = (unsigned int) _main ­- (unsigned int) _Demo; 
  for (int a=0; a<func_len; a++) 
    buff[a] = ((char *) _Demo)[a]; 
  _Demo = (void (*) (int (*) (const char *,...))) &buff[0]; 
  _Demo(_printf); 
  return 0; 
}

Этот код предположительно выполнил Demo () в стеке. Я понимаю большую часть кода, но меня смущает та часть, в которой они назначают func_len. Насколько я могу судить, они вычитают один случайный адрес указателя из другого случайного адреса указателя.

Кто-то хочет объяснить?

5
задан jalf 26 April 2011 в 06:26
поделиться