gpt4 book ai didi

c++ - 确定调用者是从 EXE 还是 DLL 调用

转载 作者:可可西里 更新时间:2023-11-01 14:14:07 25 4
gpt4 key购买 nike

我需要确定调用者代码是来自 EXE 还是 DLL。

动态链接库

#ifdef DLL_EXPORTS
__declspec(dllexport) void say_hello();
__declspec(dllexport) void getCurrentModuleName();
#else
__declspec(dllimport) void say_hello();
__declspec(dllexport) void getCurrentModuleName();
#endif

#include <cstdio>
#include <windows.h>
#include <Dbghelp.h>
#include <iostream>
#include <tchar.h>
#include "dll.h"
#include "Psapi.h"

__declspec(naked) void *GetStackPointer()
{
__asm
{
mov eax, esp
ret
}
}

void getCurrentModuleName()
{
BOOL result = SymInitialize(GetCurrentProcess(), NULL , TRUE);
DWORD64 dwBaseAddress = SymGetModuleBase64(GetCurrentProcess(), (DWORD64)GetStackPointer());
TCHAR szBuffer[50];
GetModuleBaseName(GetCurrentProcess(), (HMODULE) dwBaseAddress, szBuffer, sizeof(szBuffer));
std::wcout << _T("--->") << szBuffer << std::endl;
}

void say_hello() {
getCurrentModuleName();
}

执行

#include <windows.h>
#include <cstdio>
#include "dll.h"

int main() {
printf ("ENTERING EXE CODE...\n");

getCurrentModuleName();

printf ("ENTERING DLL CODE...\n");

say_hello();

getchar();
}

这是输出。

ENTERING EXE CODE...
--->exe.exe
ENTERING DLL CODE...
--->exe.exe

我希望我能得到

ENTERING EXE CODE...
--->exe.exe
ENTERING DLL CODE...
--->dll.dll

因为最后的调用者代码来自 DLL 本身(DLL 中的 say_hello)

有什么办法可以实现吗?

最佳答案

GetStackAddress 正在返回 ESP 的值,这是对堆栈的引用。堆栈是按线程分配的,独立于进程中加载​​的任何模块。您需要做的是从堆栈中提取返回地址的值——这将是调用模块中的一个地址。

鉴于函数中通常的前缀代码是:

push ebp
mov ebp,esp
sub esp, bytes_of_local_variables

esp 会有点随机,但是 [ebp] 应该指向前一个 ebp,而 [ebp+4] 应该指向当前帧返回地址。

所以,你可以试试这个:

__declspec(naked) void *GetReturnAddressAssumingStandardFramePointers()
{
__asm
{
mov eax, [ebp+4]
ret
}
}

只需确保调用的函数未使用 /Oy 编译

关于c++ - 确定调用者是从 EXE 还是 DLL 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4343576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com