Как использовать хук для захвата cudaSetDevice и изменения идентификатора устройства?

Я хочу перехватить cudaSetDevice с помощью хука (LD_PRELOAD) и изменить идентификатор устройства. После успешного угона отправка задачи GPU будет неправильной.

Я попытался перехватить функцию cuCtxCreate в API-интерфейсе драйвера, но не смог. Тот же метод перехватывает функцию cuDevicePrimaryCtxRetain, которую можно перехватить, и при изменении идентификатора устройства возникнет ошибка.

// cuda 9.0 cuda runtime api   
typedef int(*cuda_set_device_fp)(int);

// define dynamic library same name function
int cudaSetDevice(int device)
{
  static void *handle = NULL;
  static cuda_set_device_fp orig_cuda_set_device = NULL;

  if( !handle )
  {
    handle = dlopen("libcuda.so", RTLD_LAZY);
    orig_cuda_set_device = (cuda_set_device_fp)dlsym(handle, "cudaSetDevice");
  }
  device = 1;
  printf("oops!!! hack function invoked. device = %d\n", device);
  return cudaSetDevice(device);
}

Взлом выполняется успешно, пользователь сопоставляется с задачей GPU на устройстве 0 и повторно сопоставляется с устройством 1.


person ZixCao    schedule 10.04.2019    source источник
comment
Попробуйте предоставить MVCE.   -  person yugr    schedule 10.04.2019


Ответы (1)


В предоставленном исходном коде в конце вашей функции вы снова рекурсивно вызываете свою функцию вместо вызова orig_cuda_set_device с измененным идентификатором устройства. Это вызывает бесконечную рекурсию.

person Abator Abetor    schedule 10.04.2019
comment
Спасибо за ваш ответ. Я пытался не изменять идентификатор устройства, захват прошел успешно. Однако моя цель — перехватить cudaSetDevice и изменить идентификатор устройства. Можно ли понять, что параметры функции, захваченные динамической библиотекой, не могут быть изменены? - person ZixCao; 12.04.2019