C++ 如何从DLL中确定调用过程?
有时,当你安装免费软件时,你可以选择安装你不想要的程序的试用版。如果您粗心且急于安装免费软件,您将单击“确定”进入安装过程的面板,而不注意您同意的内容 某个地方的玻璃塔里的无灵魂套装会将一些程序称为“激进的营销应用程序”,而其他人则称之为广告软件甚至病毒。其中一些程序重定向web浏览器主页,甚至试图伪装成搜索引擎。它们深入到您的操作系统中,有些非常聪明,可以在恼怒的用户发现并删除它们后重新安装 沮丧的用户可能会发现自己陷入混乱,难以追踪隐藏和伪装的应用程序。在不同时间和不同事件启动的系统级任务进一步掩盖了用户跟踪和删除恶意软件的能力 在几次尝试清理我的计算机之后,我仍然被一个弹出的消息困扰着,它说有一个DLL,CATHEL~1.DLL正在被访问,而它不在那里 我所知道的是,一个计划任务正在尝试启动一个不再存在的DLL。我们试图通过以下方式阻止这种烦恼:C++ 如何从DLL中确定调用过程?,c++,dll,scheduled-tasks,C++,Dll,Scheduled Tasks,有时,当你安装免费软件时,你可以选择安装你不想要的程序的试用版。如果您粗心且急于安装免费软件,您将单击“确定”进入安装过程的面板,而不注意您同意的内容 某个地方的玻璃塔里的无灵魂套装会将一些程序称为“激进的营销应用程序”,而其他人则称之为广告软件甚至病毒。其中一些程序重定向web浏览器主页,甚至试图伪装成搜索引擎。它们深入到您的操作系统中,有些非常聪明,可以在恼怒的用户发现并删除它们后重新安装 沮丧的用户可能会发现自己陷入混乱,难以追踪隐藏和伪装的应用程序。在不同时间和不同事件启动的系统级任务进
DllMain
。要查询进程父级,我们需要一个小的助手函数(可以通过谷歌搜索“windows get process parent”找到)。我们对其进行了一些修改,以基于进程句柄进行查询,并返回句柄而不是ID
HANDLE GetParentProcessHandle(HANDLE hParent) // Modified from Napalm @ NetCore2K
{
ULONG_PTR pbi[6];
ULONG ulSize = 0;
LONG (WINAPI *NtQueryInformationProcess)(HANDLE ProcessHandle, ULONG ProcessInformationClass,
PVOID ProcessInformation, ULONG ProcessInformationLength, PULONG ReturnLength);
*(FARPROC *)&NtQueryInformationProcess =
GetProcAddress(LoadLibraryA("NTDLL.DLL"), "NtQueryInformationProcess");
if(NtQueryInformationProcess){
if(NtQueryInformationProcess(hProcess, 0,
&pbi, sizeof(pbi), &ulSize) >= 0 && ulSize == sizeof(pbi))
return OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pbi[5]);
}
return NULL;
}
我们现在可以使用它来查询调用进程链并发出它们的图像名称:
char exename[512];
DWORD len = 512;
HANDLE hProcess = GetCurrentProcess();
do {
memset(exename, 0, len);
QueryFullProcessImageName(hProcess, 0, exename, &len);
MessageBox(NULL, exename, "EXE name", MB_OK);
hProcess = GetParentProcessHandle(hProcess);
} while(hProcess);
注意,我没有测试上面的代码;这只是给你一个想法。我建议你从MSDN TechNet获得
自动运行
,并用它来寻找开始时所做的任何事情。您可以获取加载DLL的进程及其所有父进程的名称。但很可能是某个系统进程被某种自动运行方法欺骗加载DLL。实际上,该DLL加载可能会被另一个恶意软件DLL调用。这不是您要寻找的答案,但您是否尝试过使用SysInternals Process Explorer或Process Monitor来调查此问题?他们已经提供了你所需要的一切来弄清这类事情的真相。我会尝试一下你的建议,datenwolf和Gunter,然后再给出下面更面向项目的建议。自动运行看起来很有希望。