修改SSDT做简单的进程保护

SSDT Hook实现内核级的进程保护 SSDT Hook效果图 加载驱动并成功Hook  NtTerminateProcess函数: 当对 指定的进程进行保护后,尝试使用“任务管理器”结束进程的时候,会弹出“拒绝访问”的窗口,说明,我们的目的已经达到: SSDT简介 SSDT 的全称是 System Services Descriptor Table,系统服务描述符表。 这个表 阅读详情
*By 炉子[0GiNr]
http://atleast.blog.cfan.com.cn
http://0ginr.com*/

M$真是照顾菜鸟 居然会给个SSDT,而且居然还把KSDT(KeServiceDescrīptorTable)导出了(当然,不排除这是M$的无奈之举,因为M$是不推荐programmer Hook他的API的,但是如果不对API做hook,那么许多事情都很难完成,这使得M$不得不提供一个“接口”,这就好比过滤驱动的提供是一样一样的)
//由于大多数看这篇文章的人都是没有写过驱动的,所以我会尽可能的将提到的函数/结构等做详细的描述。
SSDT其实就是一张表。先dump出来瞧瞧
我之前说过,导出的是KeServiceDescrīptorTable。用WinDBG来dump。


Quote:
lkd> dd KeServiceDescrīptorTable
8055a680   804e36a8 00000000 0000011c 80513eb8
8055a690   00000000 00000000 00000000 00000000
8055a6a0   00000000 00000000 00000000 00000000
8055a6b0   00000000 00000000 00000000 00000000
8055a6c0   00002730 bf80c247 00000000 00000000
8055a6d0   fa86aa80 faad83c0 80def5e0 faad83e0
8055a6e0   00000000 00000000 00000000 00000000
8055a6f0   e8f01240 01c7c671 00000000 00000000

再看看KSDT是怎么被定义的:


Copy code
typedef struct _SERVICE_DEscrīptOR_TABLE
{
   PVOID   ServiceTableBase;
   PULONG   ServiceCounterTableBase;
   ULONG   NumberOfService;
   ULONG   ParamTableBase;
}SERVICE_DEscrīptOR_TABLE,*PSERVICE_DEscrīptOR_TABLE;
extern PSERVICE_DEscrīptOR_TABLE KeServiceDescrīptorTable;

第一个是指向表基址(表头)的一个指针,第二个是服务调用数的基值(也就是服务号的起始值),第三个是服务数量,第四个是参数表的基址(参数表中每1个字节代表一个参数长度,各个参数长度的顺序和服务调用的顺序的对应的。
//虽然SSDT指向的都是一些Native API,但是在这儿,他们更多的被称为系统服务调用。
其他三个先不用管,先看ServiceTableBase——因为在大多数情况下,我们修改SSDT之前我们都是已经知道要修改的服务调用的服务调用号(索引号),并且,我们所了解到的服务调用号总是不会超过服务总数,而参数表对于我们来说也应当是已知的。
再用WinDBG把ServuceTableBase dump出来。


Quote:
lkd> dd 804e36a8
804e36a8   80580302 80579b8c 8058b7ae 805907e4
804e36b8   805905fe 806377a0 80639931 8063997a
804e36c8   8057560b 806481cf 80636f5f 8058fb85
804e36d8   8062f0a4 8057be31 8058cc26 806261bd
804e36e8   805dcf20 80568f9d 805d9ac1 805a2bb0
804e36f8   804e3cb4 806481bb 805ca22c 804f0e28
804e3708   80569649 80567d49 8058fff3 8064e1c1
804e3718   8058f8f5 80581225 8064e42f 8058b800

正如你所看到的,在ServiceTableBase中,由多个ULONG型数值排列成了一个表——这也就是前面所说的SSDT,而其中的数值就是各个服务调用的地址,我们可以修改这个表中的地址来对这些服务调用进行重定向。
//注:并非所有的服务调用都会查这张表,比如在驱动中直接调用被导出的函数,这张表就会被忽略——换句话说,这张表只能用于对r3的进程所做的防护,而且,在2k,xp以及未打sp1的2k3系统下,这也不是绝对的。
通过分析服务地址的长度以及得到ServiceTableBase的方法,我们不难得出一个结论:
服务调用的函数地址在内存中存放的地址 = ServiceTableBase + 服务函数调用号 * 4 //sizeof(ULONG)=4
换句话说,我们可以修改【ServiceTableBase + 服务函数调用号 * 4】所指向的内存数据来使得表中的函数重定位到我们自己的函数中。
由于内存中的某些部分是有写保护的,所以我们得先置cr0寄存器去掉这些地方的内存保护(不然等着PAGE_FAULT吧……)


Copy code
VOID DisableWriteProtect( PULONG pOldAttr)
{
     ULONG uAttr;
     _asm
     {
         push eax;
         mov   eax, cr0;
         mov   uAttr, eax;
         and   eax, 0FFFEFFFFh; // CR0 16 BIT = 0
         mov   cr0, eax;
         pop   eax;
     };
     *pOldAttr = uAttr; //保存原有的 CRO 属性
}

VOID EnableWriteProtect( ULONG uOldAttr )
{
     _asm
     {
         push eax;
         mov   eax, uOldAttr; //恢复原有 CR0 属性
         mov   cr0, eax;
         pop   eax;
     };
}

//注:以下代码中使用的均为usigned型,因为在ntddk中只有ULONG,UINT,UCHAR的定义,当然,如果你愿意,也可以自己定义DWORD,WORD,这只是个人习惯而已。


Copy code

void RedirectServiceAddr(ULONG ulServiceID, ULONG ulNewServiceProc)
{
     ULONG ulAddress=(ULONG)KeServiceDescrīptorTable->ServiceTableBase + ulServiceID * 4;
     ULONG uAttr;
     DisableWriteProtect(&uAttr);
     *((ULONG*)ulAddress) = ulNewServiceProc;
     EnableWriteProtect(&uAttr);
}


废话半天了,给NtOpenProcess做个钩子吧。


Copy code
NTSYSCALLAPI
NTSTATUS
NTAPI
ZwOpenProcess (
     OUT PHANDLE ProcessHandle,
     IN ACCESS_MASK DesiredAccess,
     IN POBJECT_ATTRIBUTES ObjectAttributes,
     IN PCLIENT_ID ClientId OPTIONAL
     );
typedef
NTSTATUS (__stdcall *pfnNtOpenProcess)
(
       OUT PHANDLE ProcessHandle,
       IN ACCESS_MASK DesiredAccess,
       IN POBJECT_ATTRIBUTES ObjectAttributes,
       IN PCLIENT_ID ClientId OPTIONAL
       );
pfnNtOpenProcess old_NtOpenProcess;
NTSTATUS new_NtOpenProcess(
       OUT PHANDLE ProcessHandle,
       IN ACCESS_MASK DesiredAccess,
       IN POBJECT_ATTRIBUTES ObjectAttributes,
       IN PCLIENT_ID ClientId OPTIONAL
       )
{   
     NTSTATUS status = STATUS_SUCCESS;
     //判断PID
     if   ( (long)ClientId->UniqueProcess==(long)procProcessId) )
     return STATUS_ACCESS_DENIED;
   
     //剩下的交给我们的替换程序
     status=old_NtOpenProcess(
         ProcessHandle,
         DesiredAccess,
         ObjectAttributes,
         ClientId
         );
   
     return status;
}
RedirectServiceAddr(*((UCHAR *)(ZwOpenProcess)+1),(ULONG)new_NtOpenProcess);


在r3下可以用过nativeAPI函数地址+1来获取函数的服务号,在r0为什么呢?
用WinDBG deasm一下ZwOpenProcess看看吧 。


Quote:

lkd> u ZwOpenProcess
nt!ZwOpenProcess:
804de044 b87a000000       mov     eax,7Ah
804de049 8d542404         lea     edx,[esp+4]
804de04d 9c               pushfd
804de04e 6a08             push     8
804de050 e8dc150000       call     nt!KiSystemService (804df631)
804de055 c21000           ret     10h


正如你所看到的,与r3下几乎没有什么区别,都是先把服务调用号存放的eax中,所以我们在r0下也可以用r3下那套方法,不过我们必须是对Zw系列的+1,而不是Nt系列的(Nt系列的是什么样子?别问我,问WinDBG,这算是课后作业……)
上面那份代码只做了函数重定位,对函数原始地址的获取(也就是old_NtOpenProcess的地址的获取)没有将,不过如果你从头看到这儿还没搞清楚改之前怎么获取服务调用的地址………… 我…………
把PID传入驱动的方法可以用IoCtl,简单,方便
那个pid判断其实还是有点小漏洞的,因为一个process有4个pid(这4个pid都能打开这个进程),具体什么自己查查吧,留作课后作业。 
SSDT Hook底层原理介绍以及如何实现进程保护 目录 SSDT Hook效果图 SSDT简介 SSDT结构 SSDT HOOK原理 Hook前准备 如何获得SSDT中函数的地址呢 SSDT Hook流程 SSDT Hook实现进程保护 SSDT Hook效果图 加载驱动并成功Hook NtTerminateProcess函数: 当对 指定的进程进行保护后,尝试使用“任务管理器”结束进程的时候,会弹出“拒绝访问”的窗口,说明,我们的目的已经达到: SSDT简介 SSDT 的全称是 System Services Descr. 阅读详情

相关推荐

挂钩SSDT隐藏进程

(本文发表于黑访11期上,请勿转载) 新学期又开始了,一来到学校我口袋的资金剧烈减少,我估计因该和现在轻微的通货膨胀有关(其实是我开学乱花钱花的),没有办法只好也来黑防算是“骗”点钱花了。嘿嘿。最近大家对于ring0级的研究正如当年的注入一样越来越火,认识的朋友似乎张口闭口都是内核,看来这有可能是以后的趋势了,在下不才在此献上一篇文章,算是抛砖引玉。希望以后有更好的文章发表出来。^_^

小麒麟的书桌 1659

【转帖】驱动编写与windbg调试

 一.驱动编写随着对windows系统的深入研究,越来越多的内核方面的知识被挖掘出来了,今天我们讨论下如何写一个简单的驱动,并使用现在比较新的windbg调试器进行调试。首先写驱动要对驱动有一个比较全面的认识。一个简单的驱动一般有以下几个部分组成:1,一个入口点(DriverEntry):用于创建设备对象及符号连接,以及其它初使化操作,如分配池内存等.2,一个出口(DriverUnload):删除

floweronwarmbed的专栏 707

vc++实现内核级进程保护

保护核心代码 #include "ntddk.h" #define NT_DEVICE_NAME      L"//Device//ProtectProcess" #define DOS_DEVICE_NAME     L"//DosDevices//ProtectProcess" #define IOCTL_PROTECT_CONTROL CTL_CODE(FILE_DEVICE

天涯专栏 2060

【驱动之四】Nt和Zw

Ring3中的NATIVE API,和Ring0的系统调用,都有同名的Zw和Nt系列函数,一度让初学者感到迷糊。现在就以ZwOpenProcess和NtOpenProcess函数为例,详细阐述下他们的分别和联系。  ntdll.dll导出了NtOpenProcess和ZwOpenProcess两个函数,我们记为ntdll!NtOpenProcess和ntdll!ZwOpenProcess。仔细看

seedluo815的专栏 1412

CE+OD无法附加游戏进程的破解方法

CE+OD无法附加游戏进程的破解方法 来吧 别在为这烦恼了 其实看过 windows 核心编程那本书的人都知道 计算机编程领域 那些所谓的游戏保护 真的只是为难菜鸟而已,对于大鸟基本不起作用. 游戏无法就是采用 线程 进程 SSDT等等这些东西来限制一些如:CEOD ASM32这些工具调试而已 比如OD要调试一个程序进程 首先做的是2步操作 ...

qq_41792038的博客 1万+

利用Ghidra与SVD插件实现STM32固件深度逆向分析

本文详细介绍了如何利用Ghidra逆向工程框架结合SVD插件,实现对STM32固件(.bin文件)的深度逆向分析。通过加载描述芯片外设寄存器的SVD文件,Ghidra能将晦涩的硬件地址操作转换为可读的寄存器符号,极大提升了对嵌入式固件中通信协议、安全校验等关键逻辑的分析效率。文章涵盖了从Java环境搭建、工具配置到实战逆向解析的完整流程。

peach的博客 943

用驱动实现自己的 ZwOpenProcess ZwReadVirtualMemory ZwWriteVirtualMemory

懒得自己写了,就转一个帖子吧。用驱动实现自己的 ZwOpenProcess ZwReadVirtualMemory ZwWriteVirtualMemory/* jhxxs.C Author: Last Updated: 2006-03-23 This framework is generated by EasySYS 0.3.0 This te

Tommy(凌飞)的专栏 5897

C# 操作Excel的时候,出现"被呼叫方拒绝接受呼叫的异常"的解决方案(参考官方给出的解决方案)

首先官方有对这个错误给出解释和解决方案,连接如下: https://docs.microsoft.com/zh-cn/previous-versions/ms228772(v=vs.120)#%E5%8F%AF%E9%9D%A0%E7%BC%96%E7%A8%8B 简单来说,貌似是线程问题,我猜。。。 之前我尝试着在代码中添加 Thread.Sleep(1000); 来进行解决,这种办...

Ck_Max的博客 5768

Zw函数与Nt函数的分别与联系

Ring3中的NATIVE API,和Ring0的系统调用,都有同名的Zw和Nt系列函数,一度让初学者感到迷糊。N久前的我,也是相当的迷糊。现在就以ZwOpenProcess和NtOpenProcess函数为例,详细阐述下他们的分别和联系。 ntdll.dll导出了NtOpenProcess和ZwOpenProcess两个函数,我们记为ntdll!NtOpenProcess和ntdll!ZwOpe

Tommy(凌飞)的专栏 1380

Qwen3-VL、Qwen3-Next与Qwen3.5多模态架构深度解剖

多模态大模型的核心不在参数规模,而在于视觉与文本如何协同建模。本文从基础概念切入,解析视觉语言模型中视觉编码器、跨模态注意力、特征对齐与token压缩等关键原理;阐述ViT、CLIP-ViT及动态压缩模块(HDTC)在语义表征、空间感知与计算效率上的技术权衡;强调结构设计如何决定模型在医学影像、工业质检、遥感分析等高要求场景中的真实能力边界;最终聚焦通义千问最新三套VL架构——Qwen3-VL、Qwen3-Next与Qwen3.5——揭示其背后迥异的融合哲学与工程取舍,为选型、微调与推理优化提供底层依据。

weixin_33778544的博客 818

分子模拟入门教程 | 低调使用 建议收藏

该方法只需要原子的核电荷和少数模拟的环境参数作为输入,所有的性质都是通过求解薛定谔方程得到的,不需要使用任何经验参数。经典的原子水平的分子模拟已经成为提高我们对材料科学和生命系统中分子过程理解的最流行的方法之一。全原子模拟是一种非常强大的以原子分辨率呈现信息的方法,因为在原子模拟中,一个粒子代表一个特定的原子。随着计算机硬件和模拟技术的快速发展,分子模拟不仅可以解决基本的、常规的化学问题,还可以应用于各种复杂体系。然而,由于问题的复杂性以及严重依赖于现象的现实情况,最好是逐案确定合适的模拟方法。

pysonger的博客 783

了解Zw*与Nt*的区别

某些Zw*和Nt*函数既在ntdll.dll中导出又在ntoskrnl.exe中导出,他们有什么区别呢? 我们分三部分比较: step 1: ntdll.dll中的Zw*和Nt*有什么区别? step 2: ntoskrnl.exe中的Zw*和Nt*有什么区别? step 3: ntdll.dll中的Zw*与ntoskrnl.exe中的Zw*有什么区别? ntdll.dll中的Nt...

移动开发记录 408

STM32H7多通道ADC数据采集实战:CubeMX配置ADC1/2/3+DMA/BDMA+Cache避坑全记录

本文详细解析了STM32H7多通道ADC数据采集的实战配置,涵盖CubeMX中ADC1/2/3与DMA/BDMA的协同设置及Cache一致性处理。通过硬件架构分析、DMA优化技巧和Cache避坑指南,帮助开发者实现高精度数据采集,适用于电机控制、环境监测等嵌入式系统。

weixin_28744613的博客 292

HOOK SSDT 实现内核级的进程保护

SSDT Hook效果图 加载驱动并成功Hook NtTerminateProcess函数: 当对 指定的进程进行保护后,尝试使用“任务管理器”结束进程的时候,会弹出“拒绝访问”的窗口,说明,我们的目的已经达到: SSDT简介 SSDT 的全称是 System Services Descriptor Table,系统服务描述符表。 这个表就是一个把 Ring3 的 Win32 API 和 Ring0 的内核 API 联系起来。 SSDT 并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息

Windows内核学习笔记 898

YOLOv13添加WDBB模块,map提升5.34!!,召回率提升6.55,准确率提升3.23

本文提出了一种基于YOLOv13改进的目标检测模型,通过引入WDBB模块显著提升了检测性能。实验结果表明,添加WDBB模块后,mAP提升11.34,召回率提升14.55,准确率提升3.23。文章详细介绍了模型移植方法,包括创建新的yaml配置文件、修改tasks.py和__init__.py文件,以及实现rep_block.py中的核心转换函数。改进后的模型通过深度卷积、通道注意力等模块优化了特征提取能力,同时保持了轻量化的特点。该工作为YOLO系列模型的性能提升提供了新的思路和技术实现。

FJN110的博客 2623

学Simulink——基于直流电机的建模与控制场景实例:他励直流电机的起动与制动过程仿真

直流电机在工业控制、电动车辆、自动化设备中广泛应用。其中,他励直流电机(Separately Excited DC Motor)因其励磁绕组与电枢绕组分别供电,具有良好的调速性能和启动特性,常用于需要平稳启动和精确控制的场合。在实际应用中,电机的启动过程和制动过程对电网、机械系统以及电机本身都具有重要影响。因此,仿真分析他励直流电机的启动与制动特性,是电机控制设计的重要环节。本文将详细介绍如何使用构建一个他励直流电机的启动与制动过程仿真模型,并通过仿真分析其动态响应。本文详细介绍了如何使用构建一个。

xiaoheshang_123的博客 227

读保护_SSDT Hook底层原理介绍以及如何实现进程保护

目录SSDT Hook效果图SSDT简介SSDT结构SSDT HOOK原理Hook前准备如何获得SSDT中函数的地址呢SSDT Hook流程SSDT Hook实现进程保护SSDT Hook效果图加载驱动并成功Hook NtTerminateProcess函数:当对 指定的进程进行保护后,尝试使用“任务管理器”结束进程的时候,会弹出“拒绝访问”的窗口,说明,我们的目的已经达到:SSDT简介SSDT...

weixin_36059856的博客 299

Qt/C++音视频开发1-vlc解码播放

一、前言 最开始接触视频监控这块的时候,用的就是vlc作为解码的内核,主要是因为vlc使用简单方便,直接传入一个句柄即可,简单几行代码就可以实现一个视频流播放,很适合初学者使用,也推荐初学者用qt+vlc来做播放器,提供的接口还是非常友好的,而且门类特别多,想要获取媒体文件的各种信息比如宽高,设置宽高比等,直接调用接口函数传入参数就能设置。 所有用vlc做视频监控解码的人都会遇到一个问题,那就是鼠标事件被接管拦截了,不能识别鼠标事件,比如双击最大化等,这就很憋屈了,明明很好用的一个东西,怎么突然之间鼠标事件

Qt/C++视频监控/推流/物联网/大屏系统/自定义控件/UI定制/输入法 4939

简单易懂的SSDT学习心得

在这篇心得开始,说点其他的。之前参加百度校园招聘的时候,面试官问我什么是SSDT,已经HOOK SSDT的实现过程。自己明明知道,可是我一下答上来,所以我找出来以前学习的心得,贴出来,好备份吧!我这篇心得呢!是代码与文字一起加载在一起的,学习就想读书的时候一样,书看到哪里笔记就做到哪里。这样方便理解。如果代价复制黏贴来学,不会影响的,一边看代码一边看笔记哟!其实我平时写代码不是这样的……都是规范化

fsjaky的专栏 3189

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

学习笔记-SSDT_HOOK

0x00SSDT:   SSDT 的全称是 System Services Descriptor Table,系统服务描述符表。   内核中有两个系统服务描述符表,一个是KeServiceDescriptorTable,另一个是KeServieDescriptorTableShadow。   KeServiceDescriptorTable 主要是处理来自 Ring3 层得 Ke...

a2a_66666的博客 336

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

[转](51)SSDT HOOK 实现进程保护

一、回顾 在前面的课程里,我们逆向分析了 KiSystemService / KiFastCallEntry 的部分代码,我们发现这两个函数找系统服务表 SystemServiceTable 的方法是通过 _KTHREAD + 0xE0 来找。 今天我们来学习另一种方法,即通过 SSDT 表找系统服务表。 二、SSDT SSDT是内核模块的导出变量,可通过 dd KeServiceDescriptorTable 查看: kd> dd KeSer...

weixin_41875267的博客 310

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【SSDT】SSDT hook技术

通过修改此表的函数地址可以对常用Windows函数及API进行Hook,从而实现对一些关心的系统动作进行过滤、监控等目的。在NT4.0 以上的Windpws 操作系统中,默认存在两个系统服务描述表,两个调度表对应两类不同的系统服务。要Hook SSDT表,首选需要这个表是可写的,但是在XP之后的系统都是只读的,有三种方式修改内存保护机制。其中第1位叫做保护属性位,控制着页的读或写属性。如果为0,则只能读/执行。SSDT,IDT(中断描述符表)的页属性在默认情况下只读,可执行,但不能写。例如进程保护(驱动)

dr0op's blog 2784

hook工具_SSDT-HOOK保护进程

实验环境:win7虚拟机示例是对内核层进行SSDT-HOOK实现保护进程的功能一会儿会用到的API是OpenProcess,在3环也就是用户层调用此API它保存一些信息传入到0环内核层后实际调用的是ZwOpenProcess函数,所以先使用OD随意打开一个.exe可执行程序,然后在kernel32模块里面查找OpenProcess函数,经过2个jmp后进入下一层,找到一个call进入其中便是ZwO...

weixin_39928106的博客 426

SSDT-HOOK

SSDT-HOOK

qq_31507523的博客 620

api hook监听文件变化_SSDT-HOOK保护进程

实验环境:win7虚拟机示例是对内核层进行SSDT-HOOK实现保护进程的功能一会儿会用到的API是OpenProcess,在3环也就是用户层调用此API它保存一些信息传入到0环内核层后实际调用的是ZwOpenProcess函数,所以先使用OD随意打开一个.exe可执行程序,然后在kernel32模块里面查找OpenProcess函数,经过2个jmp后进入下一层,找到一个call进入其中便是ZwO...

weixin_39630466的博客 139
上一篇: 打造VC++伪装器
下一篇: PE 添加新节 执行指定程序
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值