zoukankan      html  css  js  c++  java
  • Hook exe 和 file

    c#拦截程序的运行

     

     EasyHook  + win7 64位

     LocalHook.GetProcAddress("Kernel32.dll", "CreateProcess")  报异常找不到method

     LocalHook.GetProcAddress("Kernel32.dll", "CreateProcessW") 可以hook到部分程序的启动

     

    CreateProcess函数C#引用

    [DllImport("Kernel32.dll", CharSet = CharSet.Ansi)]
    static extern bool CreateProcess(
        StringBuilder lpApplicationName, StringBuilder lpCommandLine,
        SECURITY_ATTRIBUTES lpProcessAttributes,
        SECURITY_ATTRIBUTES lpThreadAttributes,
        bool bInheritHandles,
        int dwCreationFlags,
        StringBuilder lpEnvironment,
        StringBuilder lpCurrentDirectory,
        ref STARTUPINFO lpStartupInfow,
        ref PROCESS_INFORMATION lpProcessInformation
        );
    
    public class SECURITY_ATTRIBUTES
    {
        public int nLength;
        public string lpSecurityDescriptor;
        public bool bInheritHandle;
    }
    
    [StructLayout(LayoutKind.Sequential)]
        internal struct STARTUPINFO
        {
            internal int cb;
            [MarshalAs(UnmanagedType.LPTStr)]
            internal string lpReserved;
            [MarshalAs(UnmanagedType.LPTStr)]
            internal string lpDesktop;
            [MarshalAs(UnmanagedType.LPTStr)]
            internal string lpTitle;
            internal int dwX;
            internal int dwY;
            internal int dwXSize;
            internal int dwYSize;
            internal int dwXCountChars;
            internal int dwYCountChars;
            internal int dwFillAttribute;
            internal int dwFlags;
            internal short wShowWindow;
            internal short cbReserved2;
            internal IntPtr lpReserved2;
            internal IntPtr hStdInput;
            internal IntPtr hStdOutput;
            internal IntPtr hStdError;
        }
    
    [StructLayout(LayoutKind.Sequential)]
    internal struct PROCESS_INFORMATION
    {
        internal IntPtr hProcess;
        internal IntPtr hThread;
        internal int dwProcessId;
        internal int dwThreadId;
    }
    CreateProcess

     AppLocker

     

     

     

    有几种方法:

    一.Ring3Hook: 可以写个驱动程序, 只需要在初始化代码中用PsSetCreateProcessNotifyRoutine注册一个回调函数就可以在接下去任何process创建时获得通知。 然后只要想办法通知ring3的前端程序就可以了。 如果想在ring3通过api hook实现, 那么需要至少hook所有已存在process的创建进程的api, 据我所知, 至少需要hook各进程内kernel32.dll中的CreateProcessInternalW和advapi32.dll中的CreateProcessWithLogonW,CreateProcessWithTokenW (也许还有漏掉的, 不过hook这几个api后普通程序的创建都能抓住了)

    二.使用普通的HOOK,HOOK WH_SHELL消息.但是有遗漏的.只能HOOK到通过ShellExecute启动的程序.象QQ就HOOK不到.

    三.做一个dll,在注册表HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionWindows键下修改键值AppInit_DLLs,把你的dll及路径加上。每个程序启动后都会Load你的dll

    HOOK CreateProcessInternalW这个没什么用,终究也就是你本进程而已。进r0,HOOK NtCreateProcess

    NtCreateProcess  创建空白进程
    NtCreateRemoteThread  创建主线程
    NtResumeThread 开始运行

    CreateProcess

     通过HookNtCreateSection 动态监控驱动sys、动态链接库dll、可执行文件exe加载

    CreateProcessAsUser

    win7 win10 64 hook "advapi32.dll"下的 "CreateProcessAsUser" ,报异常找不到method

    官方文档 msdn

    https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessw

    C#启动一个外部程序(3)-CreateProcess

    CreateProcess_创建进程函数——C#

    http://www.doc88.com/p-898572238360.html

    XP时代,文件目录操作以一个个独立的API函数形式存在于kernel32.dll中,如CopyFile、CreateDirectory、DeleteFile等。WIN7之后,微软改了这一层的实现,改用IFileOperation囊括原有的API集。当然,这一信息来自baidu、msdn。然后就是确定IFileOperation的接口虚函数表。

    Hook NtCreateProcess在用户态下是可以的,在内核态不行。
    用户态HOOK NtCreateProcess,得到EIP后可以获得的信息太少,一般不这样做。

    可以有以下几个内核态的方法:
    1.建立PsSetCreateProcessNotifyRoutine,具体用法网上有介绍(《安全稳定的进线程监控》),但是只能得到进程创建的通知,不能阻止进程创建。
    2.Hook NtCreateProcessEx 注意WINDOWS创建进程在内核态时不是NtCreateProcess而是NtCreateProcessEx。
    3.Hook Mm/NtCreateSection 这个网上也有介绍,要比Hook NtCreateProcessEx好一点,不过条件判断要麻烦一些

    写个全局hook(dll),拦截程序的WM_CREATE消息,然后想怎么办看你了
    这类技术也可以称作subclassing(子类一个窗口)

    如果你需要截获WM_CREATE消息,必需配合使用WH_CBT钩子。

    http://www.microsoft.com/msj/0699/c/c0699.aspx

    你去看看MFC的源代码,因为Windows上WM_CREATE是由CreateWindow触发,截获WM_CREATE的时候还没有有效的窗口句柄,函数CreateWindow还没有完全完成

    自己定义的消息不能跨进程发送,用RegisterWindowMessage注册自定义消息才行。
    WH_GETMESSAGE类型Hook的是PostMessage发送的消息;SendMessage发送的消息要用WH_CALLWNDPROC类型才能Hook到。

    同上。WM_CREATE消息是Hook不到的,应该用WH_CBT,判断HCBT_CREATEWND。

    自己定义的消息不能跨进程发送,用RegisterWindowMessage注册自定义消息才行。
    WH_GETMESSAGE类型Hook的是PostMessage发送的消息;SendMessage发送的消息要用WH_CALLWNDPROC类型才能Hook到。

    WH_CBT

    hook explorer.exe

    想hook CreateProcess(),200分请教 [问题点数:100分,结帖人superban]

     
    结帖率 100%

    HOOK CreateProcessW例子

    HOOK了CreateProcessW这个API,对进程的创建进行控制。

    //VC-DLL
    #include <windows.h>
    #include <stdio.h>
    
    unsigned long LUW;
    char path[4096];
    char title[128];
    
    BOOL
    WINAPI
    MyCreateProcessW(
        LPCWSTR lpApplicationName,
        LPWSTR lpCommandLine,
        LPSECURITY_ATTRIBUTES lpProcessAttributes,
        LPSECURITY_ATTRIBUTES lpThreadAttributes,
        BOOL bInheritHandles,
        DWORD dwCreationFlags,
        LPVOID lpEnvironment,
        LPCWSTR lpCurrentDirectory,
        LPSTARTUPINFOW lpStartupInfo,
        LPPROCESS_INFORMATION lpProcessInformation
        );
    
        
        
    HINSTANCE hInstance;
    
    int WINAPI DllMain (HINSTANCE hInst, DWORD fdwReason, PVOID pvReserved)
    { unsigned char m;
       unsigned long i,t,s;
       //char tt[128];
       LUW=(unsigned long)CreateProcessW;
    LUW+=5;
    sprintf(title,"%s","进程创建被取消!");
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
         hInstance=hInst;
         m=0xe9;
          s=(unsigned long)CreateProcessW;
        t=(unsigned long)MyCreateProcessW-s-5;
         WriteProcessMemory(GetCurrentProcess(),(void *)s,&m,1,&i);
         //sprintf(tt,"%d",i);
         //MessageBox(0,tt,tt,32);
    
    
         s++;
         WriteProcessMemory(GetCurrentProcess(),(void *)s,&t,4,&i);
         //sprintf(tt,"%d",i);
         //MessageBox(0,tt,tt,32);
         break;
    };
    return TRUE;
    }
    
    BOOL
    WINAPI
    MyCreateProcessW(
        LPCWSTR lpApplicationName,
        LPWSTR lpCommandLine,
        LPSECURITY_ATTRIBUTES lpProcessAttributes,
        LPSECURITY_ATTRIBUTES lpThreadAttributes,
        BOOL bInheritHandles,
        DWORD dwCreationFlags,
        LPVOID lpEnvironment,
        LPCWSTR lpCurrentDirectory,
        LPSTARTUPINFOW lpStartupInfo,
        LPPROCESS_INFORMATION lpProcessInformation
        ){
          sprintf(path,"%ws
    
    进程的创建被取消由于:
    
       -该文件位于不被信任的区域",lpApplicationName);
          if(check(path[0])){
                                                                                                                                 MessageBox(0,path,title,16);
                                                                                                                                return 0;
                                                                                                                               }
          //MessageBox(0,"CreateProcess被拦截!",path,32);
          
          _asm{
                pop edi
                pop esi
                pop ebx
                jmp LUW
               }
         }
    
    bool check(char d){       //位于G盘到z盘点程序都禁止运行,防u盘病毒。
    
    char t;
    
    for(t='g';t<='z';t++)
    
       if(d==t) return false;
    
    for(t='G';t<='Z';t++)
    
       if(d==t) return false;
    
    return true;
    
    }

    给kernel32.dll的CreateProcessInternalW下钩子,不能钩到由cmd启动的程序!为什么?

    要注入到cmd

    钩子不行就用Process控制

    https://www.cnblogs.com/sofire/archive/2010/11/19/1881392.html

    https://wenku.baidu.com/view/cb73e502cc17552707220896.html

    https://www.cnblogs.com/cdo/archive/2008/06/29/1232133.html

    http://bbs.eyuyan.com/simple/?t220629.html

     小试X64 inline HOOK,hook explorer.exe--->CreateProcessInternalW监视进程创建

    https://blog.csdn.net/zwfgdlc/article/details/16918565

    编译成DLL后,在运行里执行rundll32.exe X64Dll.dll,Setup,DLL会自动注入到explorer.exe进程.

    windows创建进程的3种方式下各API调用层次

    https://my.oschina.net/u/1777508/blog/1795240

    今天对创建进程的3种方式进行了跟踪:

    调用api,createprocess

    createprocess-createprocessinternala-createprocessinternalw

    调用api,shell:

    shellexecute- createprocessw-createprocessinternalw,

    创建com方式(脚本病毒常用手法):

    createobject("wscript.shell").run- createprocessw-createprocessinternalw

    Win10x64上HOOK创建进程函数CreateProcessInternalW已无效

    此问题已经解决了,原来是Unicode没有转换好的原因。


    CreateProcessInternalW,之前花了点时间来HOOK它,也成功了,并且成功修改了它的参数,比如劫持新启动的进程命令行、通过添加匿名管道来改写新进程(控制台程序)的输入与输出方式(已成功)、将新进程加入到作业(限制某些东西,比如进程资源占用、界面访问权限等等)、调试新进程(DLL本身就变成一个调试器,可以做很多事)。

    今天发现Win10x64上HOOK创建进程函数CreateProcessInternalW已无效,通过监控API得知,用易语言”运行“命令创建进程时,调用CreateProcesA后直接调用到了内核函数“RtlCreateProcessParametersEx”,通过HOOK这个函数即可控制进程能否运行,或者改写进程运行参数。HOOK部分我已经完成,可以拦截进程启动,可是取“RtlCreateProcessParametersEx”的参数(比如命令行)转换为文本,以及修改其参数一直没能成功,按照API的参数说明,有些参数为Unicode指针,用指针到字节集,然后W2A,依然无法取到文本型,理论上来说,读取和修改参数的方法和“CreateProcessInternalW”是一样的,但实际上就是不行,奇了怪了,希望有共同爱好的易友联系下我。


    易语言不能编译x64程序实在是一大遗憾,否则有很多人能制作出了易语言版的杀毒软件与360等鼠类抗衡,主要是无法编译64位的驱动和64位DLL文件。

    纯 .net DLL 注入并执行 - 通过CLR实现DllMain

    https://jingyan.baidu.com/article/20095761c1434acb0721b4bb.html

    C# DLL注入技术

    https://blog.csdn.net/hyy829903/article/details/12272475

    纯C#实现注入任意DLL(托管/非托管),无需额外DLL,AnyCPU编译支持x64/x86 win10/win8/win7/xp

    https://blog.csdn.net/wwh1004/article/details/79190596

    通用 C# DLL 注入器injector(注入dll不限)

    https://www.cnblogs.com/meyon/p/4009248.html

    c#加载dll注入进程

    https://tieba.baidu.com/p/4942255052?red_tag=1538811474

    ReactOS:

    BOOL
    STDCALL
    CreateProcessInternalW(HANDLE hToken,
                            LPCWSTR lpApplicationName,
                            LPWSTR lpCommandLine,
                            LPSECURITY_ATTRIBUTES lpProcessAttributes,
                            LPSECURITY_ATTRIBUTES lpThreadAttributes,
                            BOOL bInheritHandles,
                            DWORD dwCreationFlags,
                            LPVOID lpEnvironment,
                            LPCWSTR lpCurrentDirectory,
                            LPSTARTUPINFOW lpStartupInfo,
                            LPPROCESS_INFORMATION lpProcessInformation,
                            PHANDLE hNewToken)

    https://doxygen.reactos.org/d9/dd7/dll_2win32_2kernel32_2client_2proc_8c.html

    ReactOS 是开源、免费的 Windows NT 系列克隆操作系统,保持了与 Windows 的系统级兼容性。
     
     
    https://www.cnblogs.com/vcerror/p/4289156.html
     

    API Hook完全手册

    https://blog.csdn.net/kelsel/article/details/52758830
     
     

    VB拦截windows删除文件(API HOOK)

    https://download.csdn.net/download/gouyue/3767083
     
     
     

    win7及以上系统C++实现Hook explorer文件级监控复制、剪切和删除操作

    https://blog.csdn.net/BruceAYG/article/details/81456107

    基于EasyHook实现监控explorer资源管理器文件复制、删除、剪切等操作

    https://blog.csdn.net/weixin_42011520/article/details/84193237

    如何分析解决COM接口IFileOperation的hook去支持vista、win7、win8、win10 x86 x64系统

    https://blog.csdn.net/basketwill/article/details/52102560

  • 相关阅读:
    netty 服务端 启动阻塞主线程
    idea踩过的坑
    bat批量重命名
    图片上传
    TCP/IP入门指导
    CPU governor调节器汇总
    IT咨询顾问:一次吐血的项目救火
    python 数组
    Python字符串
    基于Python实现对各种数据文件的操作
  • 原文地址:https://www.cnblogs.com/code1992/p/11364240.html
Copyright © 2011-2022 走看看