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_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows键下修改键值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\r\n\r\n进程的创建被取消由于:\r\n\r\n   -该文件位于不被信任的区域",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

 

 

posted @ 2019-08-16 15:33  quanzhan  阅读(1237)  评论(0编辑  收藏  举报