如何将应用程序作为新创建的资源管理器进程的子进程启动

How to start an application as a child of a newly created explorer process?

本文关键字:创建 资源管理器 进程 启动 子进程 应用程序 新创建      更新时间:2023-10-16

我正在开发一个类似于kiosk的应用程序。应用程序启动后,它会创建一个功能有限的新桌面。使用组合键我可以在桌面之间来回移动。为了通知用户当前正在使用的桌面,或任何其他信息,我已经创建了一个应用程序,它显示气球消息是系统托盘区域。

在新创建的桌面中,我使用CreateProcess函数启动explorer.exe,并通过STARTUPINFO结构提供新的桌面,并且我在PROCESS_INFORMATION结构中返回进程的句柄。

使用相同的技术,我试图在新桌面中启动图标托盘应用程序,提供STARTUPINFO结构的新桌面。问题是,根据任务管理器,应用程序正在运行,但是没有显示托盘图标。

我的直觉告诉我,在新的桌面中,图标没有显示,因为它不是新的explorer.exe进程的子进程,即procexp应用程序。systemals以树的形式在同一层次上显示这两个过程。

是否有办法为CreateProcess提供一个参数,也许是资源管理器进程句柄,以便图标托盘应用程序作为该进程的子进程启动?

L.E.以下是我用来创建启动explorer.exe图标托盘进程的代码:

STARTUPINFO sInfoNT; /// startupinfo for the explorer.exe
PROCESS_INFORMATION pInfoNT; /// process infromation for the explorer.exe
ZeroMemory(&sInfoNT, sizeof(sInfoNT));
sInfoNT.lpDesktop = L"threadDesktop"; /// setting the desktop for the process
pInfoNT = startProcess(sInfoNT, L"C:\Windows\explorer.exe"); /// starting the process 
if (!pInfoNT.hProcess)
    LOG(ERROR) << "Unable to start the new explorer process";
else
    LOG(INFO) << "Started the new explorer process";
STARTUPINFO sInfoTITD; /// doing the same thing for the tray icon application
PROCESS_INFORMATION pInfoTITD;
ZeroMemory(&sInfoTITD, sizeof(sInfoTITD));
sInfoTITD.lpDesktop = L"threadDesktop";
pInfoTITD = startProcess(sInfoTITD, L"DesktopTrayIcon.exe");
if (!pInfoTITD.hProcess)
    LOG(ERROR) << "Unable to start the tray icon for the new desktop";
else
    LOG(INFO) << "Started the tray icon for the new desktop";

这是startProcess函数:

PROCESS_INFORMATION KioskLauncher::startProcess(STARTUPINFO startUpInfo, LPCTSTR lpApplicationName)
{
    PROCESS_INFORMATION processInformation;
    ZeroMemory(&processInformation, sizeof(processInformation));
    if (!CreateProcess(lpApplicationName, NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &startUpInfo, &processInformation))
        MessageBox(0, L"Unable to start the process!nThe path is broken!", L"Path Error!", MB_ICONERROR);
    return processInformation;
}

如果您真的想让新进程成为另一个进程的子进程,您必须使用代码注入。搜索CreateRemoteThread会给你提供大量的阅读材料。最大的问题是,您的过程必须与目标具有相同的位。有三种方法可以使用它:

  • Dll注入(标准)
  • 注入实际的shellcode:将解析所有依赖项本身的汇编代码。
  • 从应用程序中复制一段代码并修复导入(Tricky)