自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(41)
  • 收藏
  • 关注

原创 Windows的回调机制

Windows系统内核提供了一系列的事件通知(Notify)机制以及回调(Callback)机制。

2024-05-21 15:13:44 702

原创 【驱动开发】文件系统微过滤驱动(Minifilter)

【驱动开发】文件系统微过滤驱动(Minifilter)

2023-04-13 14:45:53 809 1

原创 【驱动开发】Windows过滤平台(WFP,Windows Filtering Platform)

TDI:Transport Driver Interface,传输层接口。TDI在Windows Vista之后就不再支持了,之后的版本中被WFP取代。socket可以指定某种方式开始传输用户的数据(比如TCP或UDP),这就是传输层。传输层的特点是:用户只需要关心实际需要传输的用户数据,而不用担心数据实际的发送次数、如何封装、如何确定发送正确性、出错何重发等。Windows过滤平台(Windows Filter Platform),是从Vista系统后新增的一套系统API和服务,为网络数据包过滤。

2023-04-13 14:29:55 2805

原创 【数据结构】二叉树 上篇

二叉树一般都选择用链式存储方式。int val;// 节点值 TreeNode * left;// 左子树 TreeNode * right;// 右子树 TreeNode(int x) : val(x) , left(NULL) , right(NULL) {} }二叉树节点的深度:从根节点到该节点的最长简单路径边的条数;(以节点为一度)二叉树节点的高度:从该节点到叶子节点的最长简单路径边的条数。(以节点为一度)

2023-03-20 15:18:54 463

原创 【数据结构】哈希表

哈希表是根据关键码的值而直接进行访问的数据结构。给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希表,函数f(key)为哈希函数。哈希表通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。它牺牲了空间换取了时间,因为要使用额外的数组、set或map来存放数据,才能实现快速的查找。当我们要快速判断一个元素是否出现在集合里时,就要考虑哈希法。

2023-03-09 17:05:51 235

原创 【数据结构】数组

数组是存放在连续内存空间上的相同类型数据的集合。数组的元素是不能删的,只能覆盖。区间的定义就是不变量,在循环中坚持根据查找区间的定义来做边界处理,就是循环不变量规则。给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

2023-03-09 11:38:09 304

原创 【数据结构】链表

链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,数据域及指针域。链表的入口节点称为链表的头节点,也就是head。链表在内存中不是连续分布的,它通过指针域的指针链接在内存中的各个节点。

2023-03-01 15:27:22 490

原创 【数据结构】时间复杂度

时间复杂度是一个函数,它定性描述该算法的运行时间。我们默认CPU的每个单元运行消耗的时间都是相同的,因此算法的运行时间可以用算法的操作单元数量来表示。假设算法的问题规模为n,其操作单元数量用函数f(n)来表示,那么随着n的增大,算法运行时间的增长率和f(n)的增长率相同,这称为算法的渐进时间复杂度,简称时间复杂度,记为O(f(n))。

2023-02-23 14:50:35 1060

原创 rundll32.exe和regsvr32.exe

众所周知,DLL文件是不能独自运行的,需要被进程加载到其地址空间后才能执行。那怎么运行一个DLL呢?答案:可以借助Windows所提供的rundll32.exe或regsvr32.exe。rundll32.exe通过rundll32.exe可以直接调用DLL的导出函数来执行功能。命令行:rundll32.exe DllName,FuncName [Arguments]但被指定的导出函数有格式要求,导出函数的格式如下,函数参数列表中的pCommand就是通过[Arguments]传入的。void

2022-03-28 10:23:41 3808

原创 [样本分析] 海莲花CS样本

文章目录样本信息样本行为详细分析DllMain挂起其他线程劫持宿主进程,覆盖.text节ShellCode1Resource365_100019D0ShellCode3创建傀儡进程注入ShellCode4ShellCode4Sleep调用内置DLL,回连C2_executeDllEntryPoint总结分析样本信息MD5:3c0533706f1f2f9ce1d46658bbc2aa16样本类型:DLL32分析工具:DIE、OD、IDA样本行为该样本是个loader类型的DLL,其运行后回挟持宿主

2022-01-26 17:22:10 525

原创 [样本分析] TelsaCrypt勒索病毒

文章目录样本信息样本行为详细分析线程1线程2六个功能函数线程3样本信息MD5:72CCC18F3038E19273010D45AC2142CE样本类型:exe32分析工具:DIE、OD、IDA样本行为详细分析拿到样本后,老规矩,先拖到DIE中看一下,32位的exe,C/C++写的,无壳。可以直接用IDA和OD开始分析。样本在WinMain函数中首先进行反沙箱检测,通过检测音频设备是否存在或API是否可用。然后做一系列的准备工作,其中比较重要的就是解密并释放数据。然后进行自拷贝,将自身拷贝到

2022-01-21 17:20:01 3569

原创 [样本分析] Ramnit感染型病毒

文章目录样本信息样本行为详细分析样本行为样本信息MD5:ff5e1f27193ce51eec318714ef038bef类型:exe32分析工具:DIE、火绒剑、OD、x32dbg、IDA样本行为详细分析拿到样本之后,先拖到DIE中看一下,发现有UPX壳。直接脱壳:脱壳成功后,用IDA打开,发现入口处是无意义的函数调用:阅读其他分析文章发现是需要先解密然后再脱一次壳,暂时搞不太懂。直接根据参考的分析文章上的EP脱壳,竟然成功了。之后有时间再看解密,先继续分析。样本行为入口处主

2022-01-14 11:51:49 4219

原创 GetLogicalDriveStringsA和GetDriveTypeA

GetLogicalDriveStringsA获得所有驱动器根目录的字符串。DWORD GetLogicalDriveStringsA( [in] DWORD nBufferLength, // lpBuffer缓冲区的最大大小 [out] LPSTR lpBuffer // 缓冲区,用于接收根目录字符串);返回值是缓冲区字符串的长度。GetDriveTypeA获得磁盘驱动器的类型。UINT GetDriveTypeA( [in, optional] LPCSTR lpRo

2022-01-11 18:11:22 590

原创 [样本分析初体验] Parite家族感染型病毒

样本信息MD5:b4964c8ac85b1e428c9eefe572237b21类型:exe32样本行为该样本是感染性极强的病毒,属于Parite家族,运行后会释放DLL并将其注入explorer进程,感染本地磁盘和网络磁盘中的exe文件和scr文件。

2022-01-06 14:55:29 3271

原创 PE文件结构小结

文章目录DOS头NT头文件头判断一个文件是不是PE文件判断一个PE文件是不是dll判断一个PE文件是不是exe判断一个PE文件是32位还是64位(方法1,2)可选头判断一个PE文件是32位还是64位(方法3)数据目录导出表三个数组根据函数名称获得函数地址导入表双桥结构判断一个PE文件是不是sys节表通过RVA获得FOAPE文件结构图:DOS头Dos头一共64个字节typedef struct _IMAGE_DOS_HEADER{ WORD e_magic; // DOS头

2021-12-05 15:30:55 667

原创 线程局部存储(TLS)

TLSTLS:Thread Local Storage,线程局部存储,是一种存储变量的方法。这个变量在它所在的线程内是全局访问的,但是不能被其他线程访问,因而实现了变量的线程独立性,适用于多线程编程。通过TLS机制,可以让程序拥有全局变量,但该变量在不同的线程中有不同的值。TLS的分类根据线程局部存储的数据所用空间在程序运行期,操作系统完成的是动态申请还是静态分配,TLS技术分为两种:动态TLS:通过四个Win32 API实现对线程局部数据的存储;静态TLS:通过预先在PE文件中声明数据存储

2021-12-03 17:24:48 1171

原创 OD调试初体验—关闭x86版winrar广告弹窗

在虚拟机里用winrar作为解压缩软件时,它的广告弹窗很烦人的,做个小实验关掉它!在winrar官网下载x86安装包:https://www.winrar.com.cn/下载完成后,在win7 x86虚拟机中安装。随意双击一个rar文件,都会有弹窗广告。这个怎么破解呢?找到winrar的安装目录,用OD调试器打开WinRAR.exe,开始调试之旅。我们知道,Windows创建新窗口的函数是CreateWindowExW或CreateWindowExA,所以我们Ctrl + G分别对其下断点。然

2021-12-01 20:15:35 1313

原创 Windows中的未处理异常

上一篇文章Windows对异常的管理详细介绍了Windows中对异常的分发和处理过程。我们知道,Windows会给每个异常最多两轮被处理的机会:第一轮:先尝试发给调试器,如果调试器没有处理,则遍历并依次调用异常处理器。如果一个处理器返回EXCEPTION_CONTINUE_EXECUTION,则表示它已经处理了异常,并让系统恢复执行因为异常而中断的代码;如果返回EXCEPTION_CONTINUE_SEARCH,则表示它不能处理该异常,并让系统继续寻找其他的异常处理器。第二轮:再次发给调试器,如果还

2021-11-19 22:44:06 2535

原创 Windows对异常的管理(描述、分发和处理)及源码剖析

异常Windows中异常处理分为两种:硬件异常:CPU产生的异常。软件异常:通过软件方式模拟出的异常,RaiseException 或 throw。先来介绍一下软件异常,throw抛出异常底层也是通过RaiseException实现的,因此我们从throw开始!C++异常处理C++中的异常处理机制由try、throw、catch组成。try语句块负责监视异常;throw语句用于异常信息的发送,也称为抛出异常;catch语句用于异常的捕获,并作出相应的处理。代码结构如下:try{ /

2021-11-17 17:16:49 1042

原创 通过命令行运行java文件(jar、class),以及生成一个简单的jar包

最近在开发中涉及到了java文件的运行,踩了一些坑,简单记录一下。jar文件在装有java的计算机中,要直接运行jar文件,可以用命令:java -jar jarpath若要指定运行类名,则用:java -cp jarpath classname注意:若不在jar文件目录下运行,则jarpath需要用全路径若类有包名,则classname要用特定的格式class文件在class文件所在目录下运行:java classname若在其他目录下运行,则需要通过classpath指

2021-11-15 17:32:16 1570

原创 Windows的异常处理

文章目录Windows的异常处理SEHSEH的终结处理SEH的异常处理过滤表达式嵌套使用异常处理和终结处理SEH的实现机制局部展开全局展开VEHSEH和VEH的区别Windows的异常处理Windows系统的异常处理有两种:结构化异常处理(SEH,Structured Exception Handling)向量化异常处理(VEH,Vectored Exception Handling)SEHWindows定义了SEH机制来规范异常处理代码的设计(对程序员)和编译(对编译器)。SEH 提供了

2021-11-14 15:50:57 1618

原创 C++的异常处理

C++的异常处理C++中的异常处理机制由try、throw、catch组成。try 语句块负责监视异常;throw 语句用于异常信息的发送,也称为抛出异常;catch 语句用于异常的捕获,并作出相应的处理。代码结构如下:try{ // 执行代码 throw 表达式;}catch(异常类型){ // 处理代码}catch(异常类型){ // 处理代码}throw语句抛出一个异常,异常是一个表达式,其值的类型可以是基本类型,也可以是类。catch可以有多个,但至少要有一

2021-11-13 21:59:24 509

原创 Windows的消息机制

Windows消息机制Windows是一个消息驱动的操作系统。什么是消息消息是一种手段,可以帮助应用程序和操作系统、应用程序之间 进行通信。操作系统可以发给应用程序一个消息,告诉应用程序某个特定的事件发生了。比如:当用户点击鼠标或键盘都会引发Windows发送相应的消息。应用程序也可以产生一个消息,使窗口执行特定的任务,或与其它应用程序通信。从数据结构的角度来看,消息是一个结构体,包含了消息的类型标识符和其他附加信息。typedef struct tagMSG { HWND hwnd; //

2021-11-11 20:59:59 976

原创 MFC分析工具—Resource Hacker

分享一个很好用的工具:Resource Hacker附上下载链接:http://angusj.com/resourcehacker/用Resource Hacker打开样本,可以清晰的看到样本的各个资源文件。对于MFC程序,尤其方便,可直接看到对话框,菜单等信息,并获得对应的资源ID。...

2021-11-11 10:55:00 995

原创 Office文件结构解析

文章目录Office文件Office2007之前的版本Office2007及之后的版本OOXML = OPC + \*MLOPC*MLdocx文件的解析流程Office文件之前在项目开发过程中,进行文件类型判断时,发现doc和docx文件的结构是不同的,很是好奇,特来深究一番。doc和docx、xls和xlsx、ppt和pptx的不同,其原理都是一样的。doc是Office 2007之前的版本;docx是Office 2007之后的版本。下面详细介绍一下:参考文档:Office恶意文件解析与混淆

2021-11-02 17:45:55 5672 1

原创 计算文件MD5值

MD5.h#pragma once#include <Windows.h>#include <stdio.h>// 例程 Md5Transform() 使用的常量值.#define S11 7#define S12 12#define S13 17#define S14 22#define S21 5#define S22 9#define S23 14#define S24 20#define S31 4#define S32 11#define S

2021-11-02 14:58:53 227

原创 C++操作剪贴板

设置剪贴板 std::string TempBin = "123"; HGLOBAL hMemBin = NULL; PCHAR LockBin = NULL; OpenClipboard(NULL); EmptyClipboard(); hMemBin = GlobalAlloc(GMEM_MOVEABLE, TempBin.size() + 1); LockBin = (PCHAR)GlobalLock(hMemBin); RtlMoveM

2021-11-01 17:45:22 2288

原创 驱动开发笔记5—驱动对象、设备对象、IRP和派遣函数

驱动对象每个驱动程序都会有唯一的驱动对象与之对应,并且这个驱动对象是在驱动加载的时候,被内核中的对象管理程序所创建的。0: kd> dt _DRIVER_OBJECTnt!_DRIVER_OBJECT +0x000 Type : Int2B +0x002 Size : Int2B +0x004 DeviceObject : Ptr32 _DEVICE_OBJECT //驱动程序创建的第一个设备对象,通过它可以遍历驱动对象里

2021-10-28 10:39:46 1020

原创 驱动开发笔记4—串口的过滤

文章目录串口过滤生成过滤设备对象获得目标设备对象绑定设备串口的过滤串口串口是Windows中的一种设备,它比较简单,且有固定名字。第一个串口名为"\Device\Serial0",第二个为"\Device\Serial1",以此类推。过滤**过滤:**在不影响上层和下层接口的情况下,在Windows系统内核中加入新的层,从而不需要修改上层的软件或者下层的真实驱动程序,就加入了新的功能。实现过滤:首先生成一个过滤设备(虚拟的设备对象),将其绑定在一个真实的设备上。一旦绑定,则原本操作系统要发送给真实

2021-10-27 23:20:50 1048

原创 内核函数前缀总结

内核函数前缀Windows内核会调用一些内核层的函数,这些函数都以固定的前缀开始,分别属于内核中不同的管理模块。通过这些前缀,根据函数名就可以大致知道这个函数所属的层次和模块了。Ex:管理层(Executive)Ke:核心层(Kernel)Hal:硬件抽象层(Hardware Abstraction Layer)Ob:对象管理(Object)Mm:内存管理(Memory Manager)Ps:进程管理(Process)Se:安全管理(Security)Io:I/O管理Fs:文件系统(

2021-10-27 16:47:45 378

原创 ProbeForRead/Write和MmIsAddressValid

ProbeForRead/Write在开发驱动模块时,有时候需要处理来自用户态进程发送的IOCTL请求。在解析参数的时候,如果有用户地址空间的内存,要检测是否可以读(ProbeForRead)写(ProbeForWrite)。看一下这两个函数的具体实现:ProbeForRead函数就是简单的检查了一下对齐粒度,然后看这块地址是否属于用户层**(地址末尾要小于MmUserProbeAddress)**3: kd> dd MmUserProbeAddress849ac850 7fff0000

2021-10-21 17:38:19 869

原创 64位和32位驱动开发的差异

64位系统新增机制1. WOW64子系统WOW64子系统是64位系统为了兼容32位应用程序而新增的子系统。相当于一个轻量级的兼容层,主要在应用层工作,由三个DLL实现,Wow64.dll、Wow64Win.dll、Wow64Cpu.dll。当一个32位应用程序发起系统调用时,WOW64子系统会拦截到这个系统调用,如果其中包含指针,它会先把这些指针的长度转换成合适的长度,然后再把系统调用提交给内核。通常把这个拦截—转换的过程称为thunking,它是32位应用程序能运行在64位系统下的关键。WOW6

2021-10-21 11:03:29 1352

原创 保护内核对象—对象挂钩(Object Hook)

内核对象每个内核对象实际上都是一个内存块,它是由操作系统内核分配的,并且只能由操作系统内核访问。这个内存块是一个数据结构,它的成员维护着和这个对象相关的信息。但是应用程序不能直接访问和修改这些数据结构,它们需要通过句柄。先通过系统调用打开/创建内核对象,让当前进程与目标对象之间建立起连接,此时就会返回一个句柄。然后调用Windows提供的一系列API函数就能访问这些内核对象。所以句柄其实相当于一个接口,Ring3层通过它来访问Ring0层的一些数据结构。内核对象由对象头和对象体组成。当应用程序打开内

2021-10-17 14:05:23 1474

原创 Windows的事件通知机制

Windows系统内核提供了一系列的事件通知(Notify)机制以及回调(Callback)机制。事件通知机制:用于监控系统内某一事件的操作。回调机制:用来反映系统内某一个部件的状态,也可以被用来实现多个内核模块之间的通信。本文主要介绍一下事件通知机制!事件通知机制常见的事件通知有:创建进程通知(CreateProcessNotify)创建线程通知(CreateThreadNotify)加载模块通知(LoadImageNotify)注册表操作通知注意:一旦事件通知被成

2021-10-14 23:27:32 1640

原创 Windows内存管理—内存映射、PAE、MmPfnDatabase

Windows内存管理内存有两种,一种是由内存条构成的所谓的物理内存,这种内存读取速度快;还有一种是虚拟内存,由硬盘构成,也就是把硬盘的一部分容量拿来当作内存用,但是速度没有内存条那么快。两者的关系:每个进程都有4GB的虚拟内存,但不是所有的虚拟内存都有对应的物理内存,它其实是在物理内存和磁盘之间进行倒换的。虚拟内存在用的时候,会从磁盘倒入物理内存,不用的时候就还是存在磁盘上。因此,同一个物理内存在不同的时间可以被用于不同进程的不同虚拟内存。基于页面映射的虚拟内存机制:在硬件上:由CPU芯片内

2021-10-14 11:26:07 2596

原创 Interlocked系列函数

Interlocked系列函数Interlocked函数是以原子方式访问资源,保证同一时刻只有一个线程访问它,常用于多线程编程。因为从汇编的角度看,哪怕很简单的一条高级语言都可以被编译成多条机器指令。在多线程环境下,这条语句的执行就可能被打断。而在打断期间,其中间结果可能己经被其他线程更改过,从而导致错误的结果。有一个很经典的面试题:现在有一个进程中存在一个全局变量a,初值为0。两个线程同时对变量a执行a++操作,通过循环各累加1000次,最终a的值会是多少?答案是不确定,a++的过程在汇编层面有

2021-10-12 18:57:12 714

原创 驱动开发笔记3—SSDT表详解

SSDT表SSDT的全称是"System Services Descriptor Table",即系统服务描述表,在内核中的实际名称是KeServiceDescriptorTable,这个表由ntoskrnl.exe导出(在x64里不导出)。SSDT用于处理应用层通过Kernel32.dll下发的各个API操作请求。ntdll.dll中的API是一个简单的包装函数,当Kernel32.dll中的API通过Ntdll.dll时,会先完成对参数的检查,再调用一个中断(int 2Eh 或者 SysEnter指

2021-10-09 22:39:02 3219

原创 驱动开发笔记2—PAGED_CODE(),IRQL,分页内存

PAGED_CODEPAGED_CODE()是DDK提供的宏,它会检验当前程序的IRQL。如果IRQL >= DISPATCH_LEVEL, PAGED_CODE()会导致系统断言。IRQ 和 IRQL中断请求(IRQ)分为硬件中断(外部中断)和软件中断(内部中断,int n指令产生的中断)。硬件中断分为不可屏蔽中断(NMI)和可屏蔽中断(INTR),其中,可屏蔽中断是通过可编程中断控制器(PIC)8259A芯片向CPU发出请求的。高级可编程控制器(APIC)定义的IRQ的数量有24个。

2021-10-09 18:16:46 861

原创 驱动开发笔记1—内核中的事件、进程、线程、自旋锁

内核模式下的等待KeWaitForSingleObject() 和 KeWaitForMultipleObjects()NTSTATUS KeWaitForSingleObject( IN PVOID Object, //同步对象的指针 IN KWAIT_REASON WaitReason, //等待的原因,一般为Executive IN KPROCESSOR_MODE WaitMode, //等待模式,说明是在用户模式还是在内核模式下等待,一般为KernelMode IN B

2021-10-09 16:33:07 579

原创 字符串相关总结

字符串相关总结str系列函数字符串的搜索,返回的都是第一次出现的位置,找不到则返回NULL// 搜索单个字符char *strchr(const char *s, int c); // 从前往后char *strrchr(const char *s, int c); // 从后往前// 在s1中搜索s2中任一字符,不包括"\0"char *strpbrk(const char *s1,const char *s2); // 搜索子串,不包括"\0"char *strstr(const

2021-09-29 19:19:14 175

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除