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

2023-11-11 11:41:57 +08:00
 TimeNewRome
“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 这个结构体。请问这个函数该如何劫持呢?
1365 次点击
所在节点    CUDA
1 条回复
hexdecode
2023-11-11 13:40:31 +08:00
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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/990897

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX