在前面的文章中LyShark一直在重复的实现对系统底层模块的枚举,今天我们将展开一个新的话题,内核监控,我们以监控进程线程创建为例,在Win10系统中监控进程与线程可以使用微软提供给我们的两个新函数来实现...,此类函数的原理是创建一个回调事件,当有进程或线程被创建或者注销时,系统会通过回调机制将该进程相关信息优先返回给我们自己的函数待处理结束后再转向系统层。...进程回调默认会设置CreateProcess通知,而线程回调则会设置CreateThread通知,我们来看ARK工具中的枚举效果。...来创建回调,当新进程创建时会优先执行回调,我们看下微软是如何定义的结构。...创建回调函数,之后就可监控系统所有线程的创建,具体实现代码如下。
在笔者上一篇文章《驱动开发:内核枚举Registry注册表回调》中我们通过特征码定位实现了对注册表回调的枚举,本篇文章LyShark将教大家如何枚举系统中的ProcessObCall进程回调以及ThreadObCall...线程回调,之所以放在一起来讲解是因为这两中回调在枚举是都需要使用通用结构体_OB_CALLBACK以及_OBJECT_TYPE所以放在一起来讲解最好不过。...= (PLIST_ENTRY)pObCallback); return status; } 运行这段驱动程序,即可得到进程句柄回调: 当然了如上是进程句柄的枚举,如果是想要输出线程句柄,则只需要替换代码中的...PVOID ObTypeAddr; PVOID PreCall; PVOID PostCall; }OB_CALLBACK, *POB_CALLBACK; #pragma pack() // 移除回调...= (PLIST_ENTRY)pObCallback); return status; } 运行这段驱动程序,即可得到线程句柄回调:
在笔者上一篇文章《驱动开发:内核枚举Registry注册表回调》中我们通过特征码定位实现了对注册表回调的枚举,本篇文章LyShark将教大家如何枚举系统中的ProcessObCall进程回调以及ThreadObCall...线程回调,之所以放在一起来讲解是因为这两中回调在枚举是都需要使用通用结构体_OB_CALLBACK以及_OBJECT_TYPE所以放在一起来讲解最好不过。...= (PLIST_ENTRY)pObCallback);return status;}运行这段驱动程序,即可得到进程句柄回调:图片当然了如上是进程句柄的枚举,如果是想要输出线程句柄,则只需要替换代码中的...ObHandle;PVOID ObTypeAddr;PVOID PreCall;PVOID PostCall;}OB_CALLBACK, *POB_CALLBACK;#pragma pack()// 移除回调...= (PLIST_ENTRY)pObCallback);return status;}运行这段驱动程序,即可得到线程句柄回调:图片
,此类函数的原理是创建一个回调事件,当有进程或线程被创建或者注销时,系统会通过回调机制将该进程相关信息优先返回给我们自己的函数待处理结束后再转向系统层。...PsSetCreateProcessNotifyRoutineEx和PsSetCreateThreadNotifyRoutine是Windows操作系统提供的两个内核回调函数,它们允许开发者在进程或线程发生创建事件时拦截并处理这些事件...这两个函数提供的回调机制是操作系统提供的最基本、最常用的内核监控进程与线程的方式。...这个回调函数需要满足一定的约束条件,例如不能阻塞或挂起进程或线程的创建或访问,不能调用一些内核API函数等。...进程回调默认会设置CreateProcess通知,而线程回调则会设置CreateThread通知,我们来看ARK工具中的枚举效果。
为了让系统能够支持更大的并发,除了必须安装event扩展之外,优化linux内核也是重中之重,以下优化每一项都非常非常重要,请务必按逐一完成。...net.core.somaxconn = 65535#对于还未获得对方确认的连接请求,可保存在队列中的最大数目net.ipv4.tcp_max_syn_backlog = 262144#在每个网络接口接收数据包的速率比内核处理这些包的速率快时...Linux从4.12内核开始移除了 tcp_tw_recycle 配置,如果报错"No such file or directory"请忽略net.ipv4.tcp_tw_recycle = 0#系统所有进程一共可以打开的文件数量...Soft open files 是Linux系统参数,影响系统单个进程能够打开最大的文件句柄数量,这个值会影响到长连接应用如聊天中单个进程能够维持的用户连接数, 运行ulimit -n能看到这个参数值,
net.core.wmem_max = 16777216 TCP socket 预留用于发送缓冲的内存最大值(单位:字节) net.core.netdev_max_backlog = 262144 每个网络接口接收数据包的速率比内核处理这些包的速率快时...listen(函数)的默认参数,挂起请求的最大数量限制 kernel.msgmnb = 65536 所有在消息队列中的消息总和的最大值(msgmnb=64k) kernel.msgmax = 65536 指定内核中消息队列中消息的最大值...(msgmax=64k) kernel.shmmax = 68719476736 是核心参数中最重要的参数之一,用于定义单个共享内存段的最大值,64 位 linux 系统:可取的最大值为物理内存值-1byte...Linux 共享内存页大小为 4KB,共享内存段的大小都是共享内存页大小的整数倍。
在笔者上一篇文章《驱动开发:内核注册并监控对象回调》介绍了如何运用ObRegisterCallbacks注册进程与线程回调,并通过该回调实现了拦截指定进行运行的效果,本章LyShark将带大家继续探索一个新的回调注册函数...监视模块加载与卸载需要费别使用两个函数,这两个函数的参数传递都是自己的回调地址。...PsSetLoadImageNotifyRoutine 设置回调PsRemoveLoadImageNotifyRoutine 移除回调此处MyLySharkLoadImageNotifyRoutine回调地址必须有三个参数传递组成..., HANDLE ModuleStyle, PIMAGE_INFO ImageInfo)那么如何实现监视映像加载呢,来看如下完整代码片段,首先PsSetLoadImageNotifyRoutine注册回调...,当有模块被加载则自动执行MyLySharkLoadImageNotifyRoutine回调函数,其内部首先判断ModuleStyle得出是什么类型的模块,然后再通过GetDriverEntryByImageBase
在笔者之前的文章《驱动开发:内核特征码搜索函数封装》中我们封装实现了特征码定位功能,本章将继续使用该功能,本次我们需要枚举内核LoadImage映像回调,在Win64环境下我们可以设置一个LoadImage...映像加载通告回调,当有新驱动或者DLL被加载时,回调函数就会被调用从而执行我们自己的回调例程,映像回调也存储在数组里,枚举时从数组中读取值之后,需要进行位运算解密得到地址。...我们来看一款闭源ARK工具是如何实现的:图片如上所述,如果我们需要拿到回调数组那么首先要得到该数组,数组的符号名是PspLoadImageNotifyRoutine我们可以在PsSetLoadImageNotifyRoutineEx...);DbgPrint("[LyShark] PspLoadImageNotifyRoutine = 0x%p \n", pPspLoadImageNotifyRoutineAddress);// 遍历回调...pNotifyRoutineAddress);}}Driver->DriverUnload = UnDriver;return STATUS_SUCCESS;}运行这段完整的程序代码,输出如下效果:图片目前系统中只有两个回调
目录 windows内核下的回调钩子整理 一丶钩子 1.1 重新初始化钩子 1.2 进程钩子 1.3 线程钩子 1.4 模块回调监控 1.5 注册表的回调 1.6 进程保护 1.7 关机回调 二丶未完待续...windows内核下的回调钩子整理 一丶钩子 1.1 重新初始化钩子 void IoRegisterDriverReinitialization( [in] PDRIVER_OBJECT...可以监控关键回调.在关机的时候做一些处理....后者关机回调里面可以设置注册表(注册表也可以说是文件,没刷新) 可以读写注册表的值. 而前者因为 文件系统刷新(可能处理了文件) 在回调里面操作注册表则不可以操作了....二丶未完待续 如果遇到新的回调则继续整理.目前已知是这些.
本篇文章与上一篇文章《驱动开发:内核注册并监控对象回调》所使用的方式是一样的都是使用ObRegisterCallbacks注册回调事件,只不过上一篇博文中LyShark将回调结构体OB_OPERATION_REGISTRATION...与进程线程回调有少许的不同,文件回调需要开启驱动的TypeInfo.SupportsObjectCallbacks开关,并定义一些微软结构,如下是我们所需要的公开结构体,可在微软官方或WinDBG中获取到最新的...LyShark// Email: me@lyshark.com#include "lyshark.h"PVOID obHandle;DRIVER_INITIALIZE DriverEntry;// 文件回调...);// bypass MmVerifyCallbackFunctionldr = (PLDR_DATA)Driver->DriverSection;ldr->Flags |= 0x20;// 初始化回调...图片至于如何阻止打开一个文件其实与《驱动开发:内核注册并监控对象回调》文章中使用的方法是一致的,首先判断OperationInformation->Operation是不是OB_OPERATION_HANDLE_CREATE
关于调优的建议: 1、出错时,可以查看操作系统日志,可能会找到一些有用的信息 2、尽量不要“批量”修改内核参数,笔者就曾这么干过,结果“调优”后,性能反而下降,事务出错数反而增加,所以,调优的时候可以考虑逐个参数进行调优...net.core.rmem_max=124928 接收套接字缓冲区大小的最大值(以字节为单位),参考值873200 net.ipv4.tcp_wmem=4096 16384 4194304 为自动调优定义...如果probe 9次(每次75秒)不成功,内核才彻底放弃,认为该连接已失效,对服务器而言,显然上述值太大....net.ipv4.tcp_syn_retries=2 对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。...这里决定内核在放弃连接之前所送出的 SYN+ACK 数目。
如果要通过不同参数并发地执行func函数,必须从不同线程调用p.apply()函数或者使用p.apply_async() p.apply_async(func [, args [, kwargs]]):...1024) print(msg.decode('utf-8')) 发现:并发开启多个客户端,服务端同一时间只有4个不同的pid,干掉一个客户端,另外一个客户端才会进来,被4个进程之一处理 二 回调函数...主进程则调用一个函数去处理该结果,该函数即回调函数 我们可以把耗时间(阻塞)的任务放到进程池中,然后指定回调函数(主进程负责执行),这样主进程在执行回调函数时就省去了I/O的过程,直接拿到的是任务的结果...p.close() p.join() print([res.get() for res in res_l]) #拿到的是get_page的结果,其实完全没必要拿该结果,该结果已经传给回调函数处理了...//maoyan.com/board/7') # print(re.findall(pattern,res.text)) 如果在主进程中等待进程池中所有任务都执行完毕后,再统一处理结果,则无需回调函数
再来看看linux内核常用的参数优化: Linux内核参数优化可以根据不同的应用场景进行调整,以提高系统性能和稳定性。...以下是一些常见的Linux内核参数优化: 文件系统缓存参数:文件系统缓存是Linux系统中的重要性能因素之一,可以通过调整以下参数进行优化: vm.dirty_background_ratio:设置脏页...kernel.threads-max:设置系统中最大线程数,建议设置为65536或更高。...这里附上一个调优的脚本,我来简单翻译一下: 地址: https://github.com/nyist-mirror/kernel_tuning # !...自动调优TCP缓冲区限制 Echo "4096 87380 16777216" > /proc/sys/net/ipv4/tcp_rmem Echo "4096 87380 16777216" > /proc
net.core.netdev_max_backlog = 400000 #该参数决定了,网络设备接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。...net.ipv4.tcp_rmem #与 tcp_wmem 类似,不过它表示的是为自动调优所使用的接收缓冲区的值。...net.ipv4.tcp_wmem = 30000000 30000000 30000000 #为自动调优定义每个 socket 使用的内存。...net.ipv4.tcp_syn_retries = 1 #在内核放弃建立连接之前发送SYN包的数量。...#在充当网关的linux主机上缺省值为1,在一般的linux主机上缺省值为0。 #从安全性角度出发,建议你关闭该功能。
在笔者上一篇文章《驱动开发:内核枚举进程与线程ObCall回调》简单介绍了如何枚举系统中已经存在的进程与线程回调,本章LyShark将通过对象回调实现对进程线程的句柄监控,在内核中提供了ObRegisterCallbacks...回调,使用这个内核回调函数,可注册一个对象回调,不过目前该函数只能监控进程与线程句柄操作,通过监控进程或线程句柄,可实现保护指定进程线程不被终止的目的。...由于目前对象回调只能监控进程与线程,而这个监控是通过ObjectType这么一个成员控制的,如果成员是PsProcessType则代表监控进程,反之PsThreadType则是监控线程,无论监控进程还是线程都调用...则是传入的回调函数,也是最重要的,其次是ObjectType指定成进程回调。...图片如上所示只是演示基本的回调申请流程,回调函数通常需要包含两个值,其一RegistrationContext用于标注上下文,其二POB_PRE_OPERATION_INFORMATION则用于标注进程或者线程创建的信息结构体
由于用户模式回调需要一个位置存储例如陷阱帧等线程状态信息,Windows XP 和 2003 会扩大内核栈以确保足够的空间可用。...然而,因为通过递归调用回调栈空间会被很快耗尽,Vista 和 Windows 7 转而在每个用户模式回调中创建新的内核线程栈。...在跳转到其先前弃用的位置之前,内核回调栈将被删除。...(XP)或创建任意数目的栈,内核会为每个运行中的线程在线程对象结构体(KTHREAD->CallbackDepth)中追踪回调的深度(内核栈空间被用户模式回调完全使用)。...在每个回调中,线程栈已使用的字节数(栈的基地址 - 栈指针)被加到 CallbackDepth 变量中。每当内核尝试迁移至新栈时,nt!
在笔者之前的文章《内核特征码搜索函数封装》中我们封装实现了特征码定位功能,本章将继续使用该功能,本次我们需要枚举内核LoadImage映像回调,在Win64环境下我们可以设置一个LoadImage映像加载通告回调...,当有新驱动或者DLL被加载时,回调函数就会被调用从而执行我们自己的回调例程,映像回调也存储在数组里,枚举时从数组中读取值之后,需要进行位运算解密得到地址。...开发者可以在LoadImage映像回调函数中执行自定义的逻辑,例如修改映像文件的内容,或者阻止映像文件的加载。...LoadImage映像回调可以通过Win32 API函数SetImageLoadCallback或者操作系统提供的驱动程序回调函数PsSetLoadImageNotifyRoutine来进行注册。...同时,LoadImage映像回调函数需要遵守一定的约束条件,例如必须是非分页代码,不能调用一些内核API函数等。
在笔者上一篇文章《内核注册并监控对象回调》介绍了如何运用ObRegisterCallbacks注册进程与线程回调,并通过该回调实现了拦截指定进行运行的效果,本章LyShark将带大家继续探索一个新的回调注册函数...映像的回调函数。...LoadImage映像回调函数是一种内核回调函数,它可以用于监视和拦截系统中的模块加载事件,例如进程启动时加载的DLL、驱动程序等。...需要注意的是,LoadImage映像回调函数的注册和取消注册必须在内核模式下进行,并且需要开发者有一定的内核开发经验。...同时,LoadImage映像回调函数也需要遵守一些约束条件,例如不能阻塞或挂起进程或线程的创建或访问,不能调用一些内核API函数等。
在笔者上一篇文章《驱动开发:内核枚举LoadImage映像回调》中LyShark教大家实现了枚举系统回调中的LoadImage通知消息,本章将实现对Registry注册表通知消息的枚举,与LoadImage...我们来看一款闭源ARK工具是如何实现的: 注册表系统回调的枚举需要通过特征码搜索来实现,首先我们可以定位到uf CmUnRegisterCallback内核函数上,在该内核函数下方存在一个CallbackListHead...LoadImage映像回调》文章中已经介绍了定位方式此处跳过介绍,具体实现代码如下。...,输出效果如下所示: 得到了注册表回调入口地址,接着直接循环遍历输出这个链表即可得到所有的注册表回调。...if (MmIsAddressValid(pNotifyEntry->Function)) { DbgPrint("[LyShark.com] 回调函数地址: 0x%p | 回调函数Cookie
在笔者前一篇文章《驱动开发:内核枚举Registry注册表回调》中实现了对注册表的枚举,本章将实现对注册表的监控,不同于32位系统在64位系统中,微软为我们提供了两个针对注册表的专用内核监控函数,通过这两个函数可以在不劫持内核...API的前提下实现对注册表增加,删除,创建等事件的有效监控,注册表监视通常会通过CmRegisterCallback创建监控事件并传入自己的回调函数,与该创建对应的是CmUnRegisterCallback...CmRegisterCallback 设置注册表回调CmUnRegisterCallback 注销注册表回调默认情况下CmRegisterCallback需传入三个参数,参数一回调函数地址,参数二空余,...参数三回调句柄,微软定义如下。...// 参数2:无作用// 参数3:回调句柄NTSTATUS CmRegisterCallback( [in] PEX_CALLBACK_FUNCTION Function, [in
领取专属 10元无门槛券
手把手带您无忧上云