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

C++ 如何从DLL中确定调用过程?,c++,dll,scheduled-tasks,C++,Dll,Scheduled Tasks,有时,当你安装免费软件时,你可以选择安装你不想要的程序的试用版。如果您粗心且急于安装免费软件,您将单击“确定”进入安装过程的面板,而不注意您同意的内容 某个地方的玻璃塔里的无灵魂套装会将一些程序称为“激进的营销应用程序”,而其他人则称之为广告软件甚至病毒。其中一些程序重定向web浏览器主页,甚至试图伪装成搜索引擎。它们深入到您的操作系统中,有些非常聪明,可以在恼怒的用户发现并删除它们后重新安装 沮丧的用户可能会发现自己陷入混乱,难以追踪隐藏和伪装的应用程序。在不同时间和不同事件启动的系统级任务进

有时,当你安装免费软件时,你可以选择安装你不想要的程序的试用版。如果您粗心且急于安装免费软件,您将单击“确定”进入安装过程的面板,而不注意您同意的内容

某个地方的玻璃塔里的无灵魂套装会将一些程序称为“激进的营销应用程序”,而其他人则称之为广告软件甚至病毒。其中一些程序重定向web浏览器主页,甚至试图伪装成搜索引擎。它们深入到您的操作系统中,有些非常聪明,可以在恼怒的用户发现并删除它们后重新安装

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

在几次尝试清理我的计算机之后,我仍然被一个弹出的消息困扰着,它说有一个DLL,CATHEL~1.DLL正在被访问,而它不在那里

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

  • 试图查明导致此问题的任务,并将其删除或停止
  • 正在尝试运行广告软件删除软件 这两种方法都失败了

    接下来,我尝试了一些更鬼鬼祟祟的东西。我在这里所传达的信息与以往完全不同。错误消息最初表示它根本找不到DLL。因此,我所做的只是在VisualStudio中创建一个DLL,并将其放置在“RunDll”查找它的位置。但是,由于存储过程或任务试图调用DLL中的方法,因此会弹出一条新的错误消息:

    所以我的问题是。如何对DLL进行编码,使其能够确定调用应用程序的名称?我在VisualStudio 2008 C++中编写了一个非常简单的空DLL,它产生了“Casel~ 1 .dll”,并且我将DLL的发布版本放在系统期望找到的地方。如何创建“Start”方法,以及如何修改它以输出调用它的任务或过程的名称?

    这很简单(假设您知道如何查询进程的父级):为DLL指定一个
    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,然后再给出下面更面向项目的建议。自动运行看起来很有希望。