Hook CreateProcess

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hook CreateProcess相关的知识,希望对你有一定的参考价值。

如何在VB或者(注意是或者)C++下hook CreateProcess这个API函数。
主要目的在于控制进程的创建,如果CreateProcess的参数是特定的进程(比如“abc.exe”),那么把这个API的调用吃掉(使调用无效)。
代码怎么写,提供C++或者VB的代码吧。

参考技术A #include "stdafx.h"
#include <io.h>
#include <stdio.h>
#include "detours.h"#pragma data_seg("MySec")
HWND g_hMain=NULL; //主窗体句柄
#pragma data_seg()#pragma comment(linker,"/section:MySec,RWS")
#pragma comment(lib,"detours.lib")HHOOK g_MessageHook=NULL; //消息HOOK
HINSTANCE hInst=NULL; //dll实例
HWND g_hWnd=NULL; //目标句柄void Intercept();
void UnIntercept();DETOUR_TRAMPOLINE(BOOL WINAPI Real_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
),PeekMessage);LRESULT CALLBACK MessageProc(
int code, // hook code
WPARAM wParam, // not used
LPARAM lParam // message data
)

Intercept();
return CallNextHookEx(g_MessageHook,code,wParam,lParam);

BOOL SetAPIHook()
g_MessageHook=SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)MessageProc,hInst,0);

if(g_MessageHook!=NULL)

return true;

else

return false;

void UnAPIHook()

if(g_MessageHook!=NULL)

UnhookWindowsHookEx(g_MessageHook);
g_MessageHook=NULL;


BOOL WINAPI DllMain(
HINSTANCE hinstDLL, // handle to the DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpvReserved // reserved
)


switch(fdwReason)

case DLL_PROCESS_ATTACH:
hInst=hinstDLL;
g_hMain =FindWindowEx(NULL,NULL, NULL,"myexe");
if(g_hMain!=NULL)

SetAPIHook();
break;
case DLL_PROCESS_DETACH:
UnIntercept();
break;

return true;

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)

return FALSE;

ret=Real_CreateProcessW(lpApplicationName,lpCommandLine,lpProcessAttributes,lpThreadAttributes,bInheritHandles,
dwCreationFlags,lpEnvironment,lpCurrentDirectory,lpStartupInfo,lpProcessInformation);
return ret;
void Intercept()

DetourFunctionWithTrampoline((PBYTE)Real_CreateProcessW, (PBYTE)Replace_CreateProcessW);

void UnIntercept()

DetourRemove( (PBYTE)Real_CreateProcessW, (PBYTE)Replace_CreateProcessW);

CreateProcess 和命令行参数

【中文标题】CreateProcess 和命令行参数【英文标题】:CreateProcess and command line arguments 【发布时间】:2012-01-28 18:29:49 【问题描述】:

背景信息: Windows 7、Visual C++ 2010 Express

问题: CreateProcess() 不断返回“无效的命令行参数”

说明:我正在编写一段代码,它使用 Windows API 的 CreateProcess 调用外部程序。到目前为止,我接到了与一个外部程序合作的电话:

if( !CreateProcess( "C:\\Temp\\convert.exe",
    t_str,        // Arguments
    ...

//where t_str is " C:\\img1.jpeg C:\\img1.pgm" (ImageMagick if you're wondering). 

即使我为将所有内容推送到 Windows 字符串和指针中所做的大量数据处理,这也能完美运行。所以我复制了 CreateProcess() 的所有修改,以便再次调用另一个外部程序:

 if( !CreateProcess( "C:\\Temp\\sift.exe",
     t_str2,        // Arguments
     ...
 
 //where t_str2 is ` < C:\\img1.pgm > C:\\img1.key`

基本上,一些非常相似的东西,但是所有变量名都改变了(因为我有这两个调用串行运行)。这就是问题所在;这不会运行,而是打印出“无效的命令行参数:

我将 t_str2 切换到其他稍微不那么复杂的东西(因为我知道 sift.exe 是如何工作的)并且我得到了相同的结果。当我只运行筛选而不转换时,也会发生同样的事情。

问题:什么可能导致这个问题?我能做些什么来进一步调试这个问题?关于我正在使用的方法的替代方案有什么建议吗?任何帮助表示赞赏。我可以提供更多代码,但它非常简单,不会有什么问题。

【问题讨论】:

想一想:如果你运行命令cmd.exe 和参数/c c:\temp\sift.exe &lt; c:\img1.pmg &gt; c:\img1.key 会怎样? 【参考方案1】:

您不能直接将命令行重定向运算符与CreateProcess() 一起使用。您必须生成一个 cmd.exe 实例并将运算符传递给它,例如:

CreateProcess( "C:\\windows\\system32\\cmd.exe", t_str2, ...))

其中t_str2"/C C:\\Temp\\sift.exe &lt; C:\\img1.pgm &gt; C:\\img1.key"。 cmd.exe的实际路径可以通过读取%COMSPEC%环境变量来确定。

【讨论】:

【参考方案2】:

在第二个示例中,您尝试使用标准输入和输出重定向,它们是命令行应用程序的符号。但它们不是有效的程序参数。如果你想使用重定向,你应该打开管道并手动读写输入/输出文件。 Here您可以找到一个示例,如何使用输入/输出重定向实现进程创建。

【讨论】:

我并不是说CreateProcess 是一个命令行处理器。我的意思是它不能接受重定向作为进程的参数。如果有人愿意使用重定向,它应该明确地提供相应的代码。 我同意,我指出为什么它不能接受重定向作为参数...因为这是 Windows 命令行处理器所做的事情。 啊,我明白了。那会更有意义。这是我第一次认真对待 Windows 编程。感谢您的洞察力【参考方案3】:
    CreateProcess 的参数 1 在很大程度上是可选的,这对于第一个参数来说真的很奇怪。如果您不想指定,请使用NULL,否则您应该阅读非常具体documentation,了解如何在不将参数1设置为NULL时使用它。 如果将参数1设置为NULL,应用程序需要是参数2的第一部分。

再次感谢 Remy 澄清了我最初回答中的奇怪行为。


此代码示例仅需要 Windows 上的基本 VC++ 编译器,并且能够在桌面上创建和存储将由记事本打开的文件。

如果这不切实际,请随意使用%temp% 或其他位置来放置测试文件。该应用程序将一直运行,直到您关闭 notepad.exe。这也处理获取和返回退出代码。如果您不希望它在退出之前无限期运行,则需要更新 WaitForSingleObject 行。

#include <Windows.h>

int main()

    STARTUPINFOA startup_info =  0 ;
    LPSTARTUPINFOA p_startup_info = &startup_info;
    PROCESS_INFORMATION proc_info =  0 ;
    LPPROCESS_INFORMATION p_proc_info = &proc_info;
    char command_line[] = 
      "C:\\Windows\\System32\\cmd.exe /C notepad.exe \"%USERPROFILE%\\Desktop\\test.txt\"";

    bool process_created = CreateProcess(
        NULL,
        command_line,
        NULL,
        NULL,
        FALSE,
        DETACHED_PROCESS,
        NULL,
        NULL,
        p_startup_info,
        p_proc_info
    );

    if (!process_created)  return -3; 

    DWORD process_exit;

    WaitForSingleObject(proc_info.hThread, INFINITE);

    GetExitCodeProcess(p_proc_info->hProcess, &process_exit);

    return (int)process_exit;

【讨论】:

"现在,如果你想将它与 CMD.exe 一起使用,你需要在第一个参数中提供完整路径,在第二个参数中,包括第一个参数中的应用程序" - 不要求使用第一个参数。您也可以将第一个参数设置为 NULL,然后CreateProcess() 将解析出 EXE 以从第二个参数运行。这是更容易和更常见的场景,并且有完整的文档记录。 CreateProcess(NULL, "C:\\Windows\\System32\\cmd.exe &lt;params&gt;", ...); 您的 (char*) 类型转换在为 ANSI/MBCS 编译时是多余的,并且在为 Unicode 编译时是一个隐藏的运行时错误。最好完全摆脱它。在后一种情况下,无论如何您都不能将文字传递给参数(运行时崩溃),因此您应该先将路径复制到本地 char[]/wchar_t[] 数组,然后再传递它。 哇!多么令人讨厌的小陷阱:(现在更新了!^_^ Tyvm,@RemyLebeau!

以上是关于Hook CreateProcess的主要内容,如果未能解决你的问题,请参考以下文章

app检测到hook打不开

linux内核有没有hook机制

hook ssdt 内核方面的大神来解答下疑惑

iOS安全:防注入hook

Pytest官方教程-20-编写钩子(hook)方法

Windows Hook链机制详解