V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NVIDIA CUDA
PyCUDA
Caffe
TimeNewRome
V2EX  ›  CUDA

[cuda 函数劫持] cuda12.2 版本新增了一个函数 cuGetProcAddress_v2,请问如何进行劫持?

  •  
  •   TimeNewRome · 171 天前 · 581 次点击
    这是一个创建于 171 天前的主题,其中的信息可能已经有所发展或是发生改变。
    “static inline CUresult cuGetProcAddress_v2_ptsz(const char *symbol, void **funcPtr, int driverVersion, cuuint64_t flags, CUdriverProcAddressQueryResult *symbolStatus) {
    const int procAddressMask = (CU_GET_PROC_ADDRESS_LEGACY_STREAM|
    CU_GET_PROC_ADDRESS_PER_THREAD_DEFAULT_STREAM);
    if ((flags & procAddressMask) == 0) {
    flags |= CU_GET_PROC_ADDRESS_PER_THREAD_DEFAULT_STREAM;
    }
    return cuGetPr”

    这个就是新增的函数结构。似乎跟之前的 cuGetProcAddress 函数差不多,只是新增了 CUdriverProcAddressQueryResult 这个结构体。请问这个函数该如何劫持呢?
    1 条回复    2023-11-11 13:40:31 +08:00
    hexdecode
        1
    hexdecode  
       171 天前
    1. 函数签名复制:
    首先,复制 cuGetProcAddress_v2_ptsz 的函数签名。这意味着你需要创建一个具有相同参数和返回类型的函数。
    2. 创建自定义函数:

    static inline CUresult custom_cuGetProcAddress_v2_ptsz(const char *symbol, void **funcPtr, int driverVersion, cuuint64_t flags, CUdriverProcAddressQueryResult *symbolStatus) {
    // 在这里添加你的自定义逻辑,例如日志记录、参数修改等

    // 调用原始函数
    return cuGetProcAddress_v2_ptsz(symbol, funcPtr, driverVersion, flags, symbolStatus);
    }


    3. 替换函数调用:
    现在,你需要在运行时将对原 cuGetProcAddress_v2_ptsz 的调用替换为对 custom_cuGetProcAddress_v2_ptsz 的调用。这通常可以通过以下方法之一实现:
    • 修改动态链接库:如果是在 Windows 上,可能涉及到替换或修改 DLL 。
    • 使用 LD_PRELOAD:在 Linux 上,可以使用 LD_PRELOAD 来劫持库函数。
    • 直接修改函数指针:如果有机会修改指向 cuGetProcAddress_v2_ptsz 的函数指针,可以直接将其指向你的函数。
    4. 测试和调试:
    劫持后,需要在你的目标环境中进行充分测试,确保劫持成功且不会引入其他问题。


    爱来自 GPTS
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1729 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 16:21 · PVG 00:21 · LAX 09:21 · JFK 12:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.