WDF框架学习
WDF框架学习WDF是什么?Windows Driver Framework (WDF) 是微软提供的一套用于开发Windows设备驱动程序的框架。WDF分为两个子框架:
KMDF (Kernel-Mode Driver Framework):用于开发内核模式的驱动程序。UMDF (User-Mode Driver Framework):用于开发用户模式的驱动程序。WDF框架简化了驱动程序开发的复杂性,提供了丰富的API和工具,使得开发者能够更专注于业务逻辑的实现,而不是底层驱动的细节。
总之,将WDF理解为对WDM做了封装,类似于SDK和MFC之间的关系
第一节:第一个WFP驱动程序:12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455#include <ntddk.h>#include <wdf.h>#define DebugPrint(...) DbgPrintEx(DPFLTR_IHVDRIVER_ID, ...
NDIS/TDI网络过滤
NDIS网络过滤驱动为什么选择NDIS驱动过滤?如果是绑定在协议驱动,那比较麻烦,可能说要各个协议驱动都加上一个过滤驱动设备,才能监视到。协议驱动能截获接收到的包,但无法截获所有发送的包
仅拦截特定协议: 协议驱动只能拦截特定协议的数据包,例如 TCP 或 UDP 数据包。 它无法拦截其它协议的数据包,例如 ICMP 数据包。 这使得它无法实现对所有网络流量的全面监控和过滤。
但是这些协议驱动最终都要把数据发送到NDIS中间层驱动,所以我们在这里拦截能够拦截到所有的
NDIS组成小端口(Miniport)是 NDIS 驱动架构中的一个关键组件。它是一个底层驱动,负责与具体的硬件设备(如网卡)交互,同时为上层协议驱动提供服务。
协议部分用于与上层协议驱动交互,接收上层数据并传递给小端口。
小端口部分则与底层驱动交互,负责将数据发送到网络或从网络接收数据。
为了让协议部分和小端口部分协同工作,必须通过 关联 的方式将它们绑定在一起。
通过调用 NdisIMAssociateMiniport 函数将协议部分(由 ProtHandle 标识)与小端口部分(由 DriverHandle 标识) ...
病毒分析
病毒分析常用工具:
PCHunter.exe:看Hook挺方便
API Monitor.exe :可以用来监控三环API的调用
ProcessMonitor.exe:这个比火绒安全软件强在查看调用堆栈上,火绒做的似乎有点bug
软件系统安全赛——钓鱼邮件题目:生日礼物.exe 生日礼物.bin
要求是找到通信的IP和端口
不过事实上直接丢到沙箱就跑出来了
但是还是想抱着完全分析的角度,所以我对这个程序进行了一次比较久的分析
沙箱说这是一个UPX的壳子,那我们就手动脱一下吧
这是OEP入口点,开局就是四个push
一般的start函数都是长这样,那确实是加壳了
我们猜测它是一个压缩壳(虽然沙箱明说了是压缩壳),那么我们就直接用大名鼎鼎的ESP定律法即可
单步执行完四个push,然后在内存转到rsp,然后在这里下一个硬件访问断点
然后发现有一个大跳,猜测是真正的OEP
感觉确实像,有个0x28的特征
然后直接dump,找到导入表,修复导入表等等常规操作
应该确实没毛病了,直接能搜到main函数
但是奇怪,脱了壳跑不起来,留个坑,后续解决了来唠唠
因为题目是去找 ...
TDI网络防火墙技术
网络防火墙技术TDIxp是有TDI的,但是win vista之后就没有了
应用层使用 TCP 协议通信的流程以下是应用层通过 TCP 协议通信时的典型流程:
用户模式应用程序调用 WinSock API
应用程序使用 WinSock API(如 socket、connect、send、recv)进行通信。
这些 API 调用会通过 ws2_32.dll 和 mswsock.dll 进入用户模式的网络子系统。
进入内核模式(afd.sys)
afd.sys
用于将用户模式的网络请求转换为内核模式的 IRP(I/O 请求包)。
TDI 层与协议栈交互
TDI.sys
afd.sys 与 TDI 驱动交互,由TDI接口将数据传递给tcpip.sys
TDI 负责将高级协议请求(如打开连接、发送数据)转化为底层协议栈能够理解的操作。
然后TDI过滤驱动会将这个IRP包接着往下传递,根据协议,传递到不同设备,例如Tcp是/Device/tcp
/Device/Tcp 是 tcpip.sys 暴露的设备对象名称,因此实际上这些 I ...
ByPassUAC方法研究(持续更新)
ByPassUAC方法研究一:利用com组件漏洞绕过UACcom组件和Dll的一些区别
特性
COM组件
Dll
实例化
CoCreateInstance
LoadLibrary 和 GetProcAddress
依赖注册表
是
否
使用场景
面向对象、多语言支持、跨进程通信
底层函数调用、API 提供
开发复杂度
较高(需要接口定义、注册等)
较低(直接提供函数导出)
反正咱没研究那么深,理解为全局Dll得了
从网上公开的方法,我们知道
在CMSTPLUA组件的ICMLuaUtil接口 ,有一个漏洞
用OleViewDotNet.exe可以查到这个接口对应的dll
这个组件是有自动提升权限的能力的
发现其中ICMLuaTuil接口对应的dll叫cmlua.dll
打开IDA,载入cmlua.dll,直接选择微软服务器进行加载PDB
然后去看这个类的虚函数
可以看到里面有一个叫ShellExec的
这里能弹一个Shell
当然,如果执行COM提升名称代码的程序身份是不可信的,还是会触发UAC弹窗;若是可信程序,则不会触发UAC弹窗。因此,必须使这 ...
从零开始做一个远控
从零开始做一个远控已完结,项目地址: 0xcc12138/Ez_Spy: 从零开始做一个远控工具,持续更新
想做病毒分析,但是无奈好像连远控开发都不太会,所以开一个专题,记录下远控开发的过程
主要参考文章: 从零开始做远控 簡介篇 做一个属于你自己的远控_zeronet qt-CSDN博客
这是16年的项目,有一些是无法正常直接编译的,我只参考这位大佬文章的内容,具体他发布的不在文章的源码我并未参照
第一节:用QT搭一个初始界面有点拙劣,先随便看看
用UI搓的
右键可以弹出菜单:
第二节:搭建服务端网络通讯要先添加一个Network的模块才可以是用网络库
因为想要移植UI,所以特地研究了一下如何移植别人的项目的UI文件到自己
移植Qt Ui文件
我在写QT项目的时候,想拿之前一个项目的UI文件直接使用,但是当我直接把其他项目的UI文件导入我的项目的时候,发现并不能直接使用
求助ChatGPT,发现QT已经为我们想到了这一切
在QT的bin目录下,有一个叫uic.exe的应用程序,这个负责将ui文件转为头文件.h,直接导入这个头文件,我们就可以使用原来的ui界面了
...
Git的使用
Git提交代码到Github远程仓库小记一下,之前都是直接在github网页提交我的代码的,但是文件一多,github网页就会报错,不给干活,这下只好用git来提交了
1.在你的与远程仓库同步的文件打开 git bash (吐槽一点,如果用git提交,必须保持远程和本地文件是一致的,否则不让提交….)
例如这里,右键点开git bash
2.如果你还没有初始化本地 Git 仓库,可以在项目根目录下运行以下命令来初始化 Git 仓库:
运行指令:
1git init
3.连接远程仓库
如果你还没有关联远程仓库,需要将远程仓库(GitHub)添加为远程地址。使用 git remote add 来关联远程仓库:
1git remote add origin <远程仓库的URL>
URL具体可以在网页看
4.检查文件状态
查看当前 Git 状态,查看哪些文件有更改或未跟踪:
主要用来查看 本地工作区 和 暂存区 的状态
1git status
5.添加文件到暂存区
使用 git add 命令将更改添加到暂存区:
git add . 是添加当前目录 ...
ETW (Event Tracing for Windows)
关于ETW (Event Tracing for Windows)ETW介绍事件追踪 Event Tracing for Windows (ETW) 是Windows系统内置的强大事件跟踪机制。它可以收集在系统上不同事件和活动的详细信息。这些事件可以是由系统本身发起的(例如加载一个DLL)或者由用户发起的(例如打开一个文件)。
无论是用户的程序,还是内核驱动生成的事件都会被ETW记录在日志里面,我们就可以去分析日志知道系统发生了什么。所以对防守方(杀软,EDR啥的),ETW是一个非常实用的工具
ETW的组成提供程序 (Providers) - 提供程序是最上级组件,他们负责生成事件。提供程序可以是用户模式应用、内核模式驱动程序,或 Windows 内核本身。每个提供程序由一个独有的 GUID 作为标识。
(跟踪)会话 (Tracing session) - “ETW 会话基础结构充当中间代理,将事件从一个或多个提供程序中继给使用者。 会话是一个内核对象,它将事件收集到内核缓冲区中,并将其发送到指定的文件或实时使用者进程。 可以将多个提供程序映射到单个会话,让用户能够从多个源收集数 ...
院赛PWN方向WP
PWN方向WP快两年不打Pwn,限时回归一下,但是不得不说真的生疏了,泪目….
what??-mid
上来就给那么大的一个栈溢出,泪目,以为会很简单
看了下,栈不可执行,而且,在函数表里也没有发现后门函数
嘶,难搞,那咋整
问了下是SROP /(ㄒoㄒ)/~~
死去的记忆突然攻击
总之就是看这个文章
SROP - CTF Wiki
原理如下
sigreturn 是一个系统调用,它会在进程处理完信号时被调用,具体来说,sigreturn 用于恢复在信号处理程序中保存的上下文并返回到信号触发之前的程序执行状态。
执行这个系统调用,就会把栈上保存的之前状态的寄存器的值恢复
所以如果我们能够溢出足够多,并且能给 rax 赋值为 15,并且进行syscall
就能给所有寄存器赋值到我们想要的值
顺序参考这个,先恢复r8然后再r9,r10….
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051struct _fpstate ...
网络编程
网络编程Visual Studio跨平台因为我是一个Windows选手,VS用惯了,叫我去用别的IDE确实比吃了xx还难受,所以研究了一下如何在Windows桌面端用Visual Studio编译,运行,调试,附加调试Linux的程序
首先要按照 Visual Studio IDE跨平台编写和调试Linux C/C++程序_visual studio跨平台编译-CSDN博客 这篇博客的内容,用ssh协议,让虚拟机和Visual Studio建立连接
其次,会遇到一个问题,Visual Studio大规模遇到不认识的库,疯狂报错,飘红,但是可以编译成功,这是因为VS还没把库全部拷贝过来,具体要在这里设置,点击更新或者下载即可
还有,记得要以root帐户登录,这样才有足够的权限附加调试
但是ubuntu默认不能以root帐户登录,具体看这一篇文章 Ubuntu 系统直接使用 root 用户登录实例 - 知乎
然后就可以快乐地附加调试了
Linux前置知识主要是为了网络编程的考试
因为我是一个Windows选手,所以Linux的恶补了下
Linux下的编译和链接Linux下的 ...