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[];
char title[]; 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+=;
sprintf(title,"%s","进程创建被取消!");
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
hInstance=hInst;
m=0xe9;
s=(unsigned long)CreateProcessW;
t=(unsigned long)MyCreateProcessW-s-;
WriteProcessMemory(GetCurrentProcess(),(void *)s,&m,,&i);
//sprintf(tt,"%d",i);
//MessageBox(0,tt,tt,32); s++;
WriteProcessMemory(GetCurrentProcess(),(void *)s,&t,,&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[])){
MessageBox(,path,title,);
return ;
}
//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

EasyHook-重塑的WindowsAPI挂接

https://www.orcode.com/article/DLLs_20129883.html

实例

EasyHook试用

https://my.oschina.net/propagator/blog/1546263

C# Hook原理及EasyHook简易教程

C# EasyHook MessageBox 示例(极简而全)

C# Hook原理及EasyHook简易教程

[.Net] C#使用easyHook笔记一

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

c++

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

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

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

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

调试调用的什么api

Win7、win8、win10下实现精准截获Explorer拷贝行为

 
 
dll注入技术
 

.net dll注入技术

https://bbs.csdn.net/topics/391958344

https://github.com/bigbaldy1128/DotNetInjector

[C#] - 注入DLL

[转载]使用C#完成DLL注入

http://blog.sina.com.cn/s/blog_4bd471210100s8qa.html

[32/64]关于DLL注入与Hook(minihook)的简单介绍与使用

https://blog.csdn.net/chenzy945/article/details/51931761

Hook和DLL 注入有什么联系和区别

 

Hook exe 和 file的更多相关文章

  1. pyinstaller使用-python项目转换成exe可执行文件

    http://blog.csdn.net/pipisorry/article/details/50620122 Python不是每个人的计算机里面都有安装,当您写了一个好用的工具,需要一个standa ...

  2. HOOK钩子教程

    [转载]HOOK钩子教程 http://blog.sina.com.cn/s/blog_675049f701019ka9.html(原贴) 先留着,好好学一学! 原文地址:HOOK钩子教程作者:X_T ...

  3. 将 Python 程序打包成 .exe 文件

    1.简介 做了一个excel的风控模板,里面含有宏,我用python的第三方xlwings部署到linux后发现,linux环境并不支持xlwings. Python 程序都是脚本的方式,一般是在解析 ...

  4. c#+handle.exe实现升级程序在运行时自动解除文件被占用的问题

    我公司最近升级程序经常报出更新失败问题,究其原因,原来是更新时,他们可能又打开了正在被更新的文件,导致更新文件时,文件被其它进程占用,无法正常更新而报错,为了解决这个问题,我花了一周时间查询多方资料及 ...

  5. C#:向exe传值

    一.需求:在不同的exe程序中,提示消息框样式一致,内容不同. 二.实现: 1.提示消息框program.cs static class Program { /// <summary> / ...

  6. Linux File System Change Monitoring Technology、Notifier Technology

    catalog . 为什么要监控文件系统 : hotplug . udev . fanotify(fscking all notification system) . inotify . code e ...

  7. Delphi中如何将 Exe 程序或其他资料打包在内,使用时再释放使用(转)

    1.生成一个rc文件,文件格式如下: rname exefile "test.exe" //rname是资源名称 //exefile是资源类型 //text.exe是资源 资源类型 ...

  8. File Checksum Integrity Verifier

    Microsoft (R) File Checksum Integrity Verifier V2.05 README file =================================== ...

  9. 编译LOADCEPC.EXE程序

    1.安装编译工具 安装MSVC152路径C:/MSVC; 安装MASM611可以自己指定E:/MASM611; 命令行编译 相关文件配置 修改setupen2.bat 如下: :PATH_DONE s ...

随机推荐

  1. 【二】Django 视图和url配置

    在新建的Django项目下,新建一个views的python文件,编辑如下代码 from django.http import HttpResponse def hello(request): ret ...

  2. vue中使用stylus编写css

    安装步骤 cnpm install stylus --save-dev cnpm install stylus-loader --save-dev 写法如下: <style lang=" ...

  3. 利用ios safari浏览器生成桌面快捷方式并唤醒app的示例代码

    html 内容: //通过a链接唤醒app  <a href="app约定好的scheme" id="qbt" style="display:n ...

  4. python cv2展示网络图片、图片编解码、及与base64转换

    从网络读取图像数据并展示 需要使用cv2.imdecode()函数,从指定的内存缓存中读取数据,并把数据转换(解码)成图像格式:主要用于从网络传输数据中恢复出图像. # -*- coding: utf ...

  5. 2019-11-29-dotnet-判断特定进程存在方法

    title author date CreateTime categories dotnet 判断特定进程存在方法 lindexi 2019-11-29 08:34:18 +0800 2019-09- ...

  6. 从安装 centos 到运行 laravel 的配置

    # 安装 centos cd /etc/sysconfig/network-scripts/ vi ifcfg-xxx # 修改 ONBOOT="no" 为 "yes&q ...

  7. oracle的sql 记录

    ----1.分组函数--select max(tfi.expected_scale) max1,min(tfi.expected_scale) min1,to_char(avg(tfi.expecte ...

  8. boost多线程编译出错

    添加 -lpthread CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/tools/boost/includeexport CPLUS_INCLUDE_PATH LI ...

  9. Vue分割音乐歌词数据函数

    parseLyric(lyric) {       var lines = lyric.split(/\n/); //使用/n换行,将数据切成一个数组       var getLtricTime = ...

  10. LaunchScreen 设置启动图片出现的问题

    更换启动图片的时候出现了一系列的小问题,让人头疼,怀疑人生. 1.更换了图片,显示还是老的图片!  -->重启手机,clean Xcode 2.设置布局的时候,请务必要这么布局,很完美! 如果你 ...