【发布时间】:2023-01-16 03:01:58
【问题描述】:
我用 C++ 制作了一个 DLL,它被注入到另一个程序中。 当多次注入程序崩溃时,所以我希望 DLL 首先检查它是否已经被注入,如果是,它将执行一些代码,比如显示消息框或只是退出
【问题讨论】:
-
查看您在 dll 附加代码中所做的事情。除非你即时生成 dll 的模块名称,否则只会加载一个实际图像。
我用 C++ 制作了一个 DLL,它被注入到另一个程序中。 当多次注入程序崩溃时,所以我希望 DLL 首先检查它是否已经被注入,如果是,它将执行一些代码,比如显示消息框或只是退出
【问题讨论】:
这可以使用 EnumProcessModules 来完成
BOOL isInjected() {
const char ProcessName = "Process.exe";
std::string DllName = "MyDll.dll";
DWORD dwProcessId = NULL;
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapshot == INVALID_HANDLE_VALUE)
return false;
PROCESSENTRY32 pe{};
pe.dwSize = sizeof(PROCESSENTRY32);
if (Process32First(hSnapshot, &pe))
{
do
{
if (_tcsicmp(pe.szExeFile, _T(ProcessName)) == 0)
{
dwProcessId = pe.th32ProcessID;
break;
}
} while (Process32Next(hSnapshot, &pe));
}
CloseHandle(hSnapshot);
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcessId);
if (hProcess == NULL)
{
return false;
}
HMODULE hMods[1024];
DWORD cbNeeded;
if (EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded))
{
int amount = 0;
for (unsigned int i = 0; i < (cbNeeded / sizeof(HMODULE)); i++)
{
TCHAR szModName[MAX_PATH];
if (GetModuleFileNameEx(hProcess, hMods[i], szModName, sizeof(szModName) / sizeof(TCHAR)))
{
std::string str1 = szModName;
if (str1.find(DllName) != std::string::npos) amount++;
}
}
if (amount >= 2) return true;
}
return false;
}
【讨论】: