Hook exe 和 file

2019/08/16 15:33
阅读数 605

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 CreateProcess(),在win2000中限制应用程序的执行。
做法参照Jeffrey Richter的CAPIHook类,加入了KERNEL32.dll的CreateProcessA和CreateProcessW,但HOOK不住,这个类应该是全局钩子,为何不行?
我试过HOOK WH_CBT和WH_GETMESSAGE消息都不行。

请有经验的战友指教。
给分100,再送100。
 
0 2005-02-13 17:51:23
回复数 25 查看全部楼层 引用 举报 楼主
HOOK特定的线程,已成功修改MessageBox()(按照windows核心编程的第22章例子)
win2000+ vs.net 2003
请做过类似功能的同志赐教。
 
0 2005-02-14 00:46:59
查看全部楼层 引用 举报 #3    得分 0
我的目的是当用户通过双击我的电脑或通过资源管理器执行应用程序时,HOOK住createprocess,禁止或允许程序执行。
采用的方法是参照Jeffrey Richter的CAPIHook类,修改IAT,(按照windows核心编程的第22章例子22LastMsgBoxInfoLib),w2000p, vc++ 2003

目前成功的部分是:
设置了全局钩子hook了 messagebox和createprocess,所有的应用程序调用messagebox都被hook了。
打开应用程序后该程序调用的createprocess也全被hook了,如ie工具栏上的flashget,excel的帮助,全局hook  createprocess都生效了

问题是:
为什么用户通过双击我的电脑或通过资源管理器执行应用程序时hook不住createprocess,而当程序执行后该程序调用的createprocess就被hook住了?

 
0 2005-02-14 19:12:38
查看全部楼层 引用 举报 #7    得分 0
我正是windows2000 SP4,为何不行
 
0 2005-02-17 14:02:48
查看全部楼层 引用 举报 #13    得分 0
已用jump搞定

 

 

 

 

 

 

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

 

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部