如何从DLL中确定调用过程?

时间:2015-06-26 20:12:58

标签: c++ dll scheduled-tasks

有时,当您安装免费软件时,您会看到安装您不想要的程序试用版的选项。如果您不小心并且急于安装免费软件,您将点击" OK"在没有注意到您同意的情况下安装过程的小组。

在某个地方的玻璃塔中无忧无虑的西装会称之为一些程序和积极的营销应用程序"其他人会称广告甚至病毒。其中一些程序重定向Web浏览器主页,甚至试图将自己伪装成搜索引擎。它们深入到您的操作系统中,有些人足够聪明,在烦恼的用户找到并删除它们之后重新安装。

沮丧的用户可能会发现自己陷入混乱,隐藏和伪装的应用程序难以追踪。在不同时间和不同事件发起的系统级任务进一步掩盖了用户追踪和删除恶意软件的能力。

经过多次尝试清理我的计算机后,我仍然受到弹出式漏洞的困扰,该漏洞表示正在访问DLL,CATHEL~1.DLL,而不是那里。

enter image description here

我所知道的是,计划任务正在尝试启动不再存在的DLL。我们试图通过以下方式来阻止这种烦恼:

  1. 尝试查明导致此问题的任务并将其删除或停止。
  2. 尝试运行广告软件删除软件。
  3. 这两种方法都失败了。

    接下来,我尝试了一些偷偷摸摸的东西。我在这里提出的信息原来是不同的。该错误消息原始说它根本找不到DLL。所以我所做的只是在visual studio中创建一个DLL并将其放在" RunDll"正在寻找它。但是,由于存储过程或任务试图调用DLL中的方法,因此出现了一个新的错误消息:enter image description here

    所以我的问题是这个。我如何编写DLL,以便它可以确定调用应用程序的名称?我在Visual Studio 2008 C ++中编写了一个非常简单和空的DLL,它生成了" CATHEL~1.DLL"我把DLL的发布版本放在系统期望的地方。如何创建"开始"方法,以及如何修改它以输出调用它的任务或过程的名称?

1 个答案:

答案 0 :(得分:0)

这很简单(假设您知道如何查询进程的父级):为DLL DllMain。要查询进程父级,我们需要一个小辅助函数(可以通过Google搜索“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);

请注意,我没有测试上面的代码;这只是为了给你一个想法。