关于创建进程CreateProcessW中lpApplicationName的问题,求教

时间:2023-01-09 19:45:16
我要实现的是通过hook CreateProcessW阻止特定进程比如:abc.exe的创建。其中下面的代码是要替换CreateProcessW的自定义函数。
问题出在判断指定进程那里:LPCWSTR lpApplicationName:指向一个NULL结尾的、用来指定可执行模块的字符串,我通过改写MessageBoxW( NULL, lpApplicationName, L"拦截成功!W", MB_OK )发现输出的lpApplicationName是带路径的,如: E:\360\360Safe\360Safe.exe,这明显和我指定的360safe.exe不能比较。 
于是我想把lpApplicationName截取最后几个有用字符,可是那个LPCWSTR的类型const unsigned short *又让我没法下手。

所以求高手指点:如何进行lpApplicationName和我指定abc.exe的比较?

BOOL Replace_CreateProcessW(
  LPCWSTR lpApplicationName,                 // name of executable module
  LPWSTR lpCommandLine,                      // command line string
  LPSECURITY_ATTRIBUTES lpProcessAttributes, // SD
  LPSECURITY_ATTRIBUTES lpThreadAttributes,  // SD
  BOOL bInheritHandles,                      // handle inheritance option
  DWORD dwCreationFlags,                     // creation flags
  LPVOID lpEnvironment,                      // new environment block
  LPCWSTR lpCurrentDirectory,                // current directory name
  LPSTARTUPINFO lpStartupInfo,               // startup information
  LPPROCESS_INFORMATION lpProcessInformation // process information
)
{
  BOOL ret;
 //在此进行判断,是不是指定的进程。
  if(wcscmp(lpApplicationName,L"abc.exe")==0)
  {
//直接返回false让CreateProcess失败,这样就打不开abc.exe这个进程
    return FALSE;
  }
 //如果不是目标进程。让它正常创建,也就是调用在程序开始时保存好的原始CreateProcess指针指向的函数。
  ret=Real_CreateProcessW  (lpApplicationName,lpCommandLine,lpProcessAttributes,lpThreadAttributes,bInheritHandles,
 dwCreationFlags,lpEnvironment,lpCurrentDirectory,lpStartupInfo,lpProcessInformation);
//把创建结果返回
  return ret;
}

9 个解决方案

#1


从lpApplicationName+wcslen(lpApplicationName)往前找第一个\,然后wcscmp
但是lpApplicationName可以为0,此时从lpCommandLine找

#2


这个用image file execution options很好解决

#3


用wcsstr();

#4


引用 1 楼  的回复:
从lpApplicationName+wcslen(lpApplicationName)往前找第一个\,然后wcscmp
但是lpApplicationName可以为0,此时从lpCommandLine找

能具体说说吗?

#5


引用 3 楼  的回复:
用wcsstr();

if(wcsstr(lpApplicationName,L"360Safe.exe")==NULL)
{
return FALSE;
}
貌似不行啊!

#6


引用 3 楼  的回复:
用wcsstr();

if(wcsstr(lpApplicationName,L"360Safe.exe")!=NULL)
{
return FALSE;
}
倒是有拦截,可是运行拦截的程序时会弹出:未指定的错误...

#7


因为你return 0,说明调用失败,失败原因你又没设置
用SetLastError

#8


return true;反而解决了!~

#9


if(wcsstr(lpApplicationName,L"360Safe.exe")!=NULL)
{
return FALSE;
}
==NULL是没找到,!=是找到了

#1


从lpApplicationName+wcslen(lpApplicationName)往前找第一个\,然后wcscmp
但是lpApplicationName可以为0,此时从lpCommandLine找

#2


这个用image file execution options很好解决

#3


用wcsstr();

#4


引用 1 楼  的回复:
从lpApplicationName+wcslen(lpApplicationName)往前找第一个\,然后wcscmp
但是lpApplicationName可以为0,此时从lpCommandLine找

能具体说说吗?

#5


引用 3 楼  的回复:
用wcsstr();

if(wcsstr(lpApplicationName,L"360Safe.exe")==NULL)
{
return FALSE;
}
貌似不行啊!

#6


引用 3 楼  的回复:
用wcsstr();

if(wcsstr(lpApplicationName,L"360Safe.exe")!=NULL)
{
return FALSE;
}
倒是有拦截,可是运行拦截的程序时会弹出:未指定的错误...

#7


因为你return 0,说明调用失败,失败原因你又没设置
用SetLastError

#8


return true;反而解决了!~

#9


if(wcsstr(lpApplicationName,L"360Safe.exe")!=NULL)
{
return FALSE;
}
==NULL是没找到,!=是找到了