博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hook exe 和 file
阅读量:4493 次
发布时间:2019-06-08

本文共 10719 字,大约阅读时间需要 35 分钟。

 

 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

 

 

 

 

 

CreateProcessAsUser

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

 

官方文档 msdn

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

 

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 CreateProcess(),200分请教 [问题点数:100分,结帖人superban]

 
Bbs1
 
结帖率 100%
Bbs1
Bbs1
Bbs1
Bbs1

 

 

 

 

 

 

HOOK CreateProcessW例子

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

//VC-DLL#include 
#include
unsigned long LUW;char path[4096];char title[128];BOOLWINAPIMyCreateProcessW( 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;}BOOLWINAPIMyCreateProcessW( 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

 

 

 

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

 

 

转载于:https://www.cnblogs.com/code1992/p/11364240.html

你可能感兴趣的文章
2018年暑假第七周
查看>>
【OpenCV入门指南】第一篇 安装OpenCV
查看>>
每日一小练——高速Fibonacci数算法
查看>>
Windows下Subversion配置管理员指南
查看>>
垂直居中及容器内图片垂直居中的CSS解决方法
查看>>
26 THINGS I LEARNED IN THE DEEP LEARNING SUMMER SCHOOL
查看>>
.Net C# 与 非托管C++互操作性
查看>>
Ubuntu16.04 安装 caffe python 接口
查看>>
【转】由浅入深表达式树(完结篇)重磅打造 Linq To 博客园
查看>>
Java反射-reflect
查看>>
IDEA常用快捷键
查看>>
oracle定时任务
查看>>
[LeetCode] Symmetric Tree
查看>>
《钟馗伏魔:雪妖魔灵》另类解读
查看>>
Centos7.3_64位安装Apache2.4_mysql5.7_php5.4(阿里云LAMP php环境搭建图文教程)
查看>>
关于android@home的一点想法
查看>>
智能查寝第一次迭代心得
查看>>
如何选购PLC产品
查看>>
WordPress页脚添加运行时间显示
查看>>
PowerDesigner 逆向工程 Could not Initialize JavaVM!
查看>>