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

  • 相关阅读:
    JS LeetCode 1423. 可获得的最大点数简单题解
    SpringBoot 学集 (第六章) Docker
    Linux 学记 (第三章)
    Linux 学记 (第二章)
    Linux 学记 (第一章)
    SpringBoot 学集 (第五章) Web开发续
    SpringBoot 学集 (第四章)Web开发
    SpringBoot 学集 (第三章) 日志框架
    SpringBoot 学集 (第二章) 配置文件
    SpringBoot 学集 (第一章)
  • 原文地址:https://www.cnblogs.com/code1992/p/11364240.html
Copyright © 2011-2022 走看看