我的进样器和dll中都有2个数据结构:
struct SubData_t
{
int SubTest;
};
struct DataHolder_t
{
int Test;
SubData_t SubData;
};
这是我分配数据结构值的方式:
DataHolder_t *DataHolder = new DataHolder_t();
DataHolder->Test = 123;
DataHolder->SubData.SubTest = 456;
int ResponseCode = Inject(4321, "test.dll", DataHolder);
这是一个自定义的LoadLibrary函数,它将数据传递给dll export:
int Inject(DWORD ProcessId, char *DLLFile, DataHolder_t *Data)
{
// ...
LoadRemoteLibraryR(hProcess, lpBuffer, dwLength, NULL, 0xd13f5171 /* dllexport EntryPoint hash */, (LPVOID)Data, (DWORD)(sizeof(struct DataHolder_t) + 1));
// ...
}
然后我在dll导出中获取数据并将lpUserdata中的值分配给数据结构:
DLLEXPORT BOOL EntryPoint(LPVOID lpUserdata, DWORD nUserdataLen)
{
DataHolder_t *DataHolder = (struct DataHolder_t *)lpUserdata;
char buffer[100];
sprintf(buffer, "%d | %d", DataHolder->Test, DataHolder->SubData.SubTest);
MessageBox(NULL, buffer, "Test", MB_OK);
return TRUE;
}
然而,我是lambdas的新手,并且无法弄清楚如何(如果它甚至可能)将lambda(函数)以相同的方式传递给dll导出。或者是否有其他方法将函数/逻辑传递给dll导出,以便可以从注入dll的目标进程调用它们?
答案 0 :(得分:0)
使用类型擦除,如std::function
或合理的传真,并将类型擦除的参数作为参考传递,而不是传递值,以获得最佳效果。