刘收获

导航

08 2017 档案

浅议APC
摘要:0x01 APC中断请求级别 在Intel x86体系结构中,外部硬件中断是通过处理器上的"中断管脚"或者一个称为"本地APIC(local APIC)"的内置模块来发生的。本地APIC可以接收的中断源包括: 1处理器管脚(LINT0和LINT1) 2本地APIC定时器(timer) 3性能监视计数 阅读全文

posted @ 2017-08-31 23:12 沉疴 阅读(854) 评论(0) 推荐(0) 编辑

fastIO
摘要:文件系统除了处理正常的IRP 之外,还要处理所谓的FastIo.FastIo是Cache Manager 调用所引发的一种没有irp 的请求。换句话说,除了正常的Dispatch Functions 之外,你还得为DriverObject 撰写另一组Fast Io Functions.这组函数的指针 阅读全文

posted @ 2017-08-30 23:42 沉疴 阅读(1855) 评论(0) 推荐(0) 编辑

设备对象 驱动对象
摘要:0x01 驱动对象: 一个驱动对象代表了一个驱动程序。或者说一个内核模块。下面有一些域用省略号代替。 这里可以看到三个重要的成员:设备对象,快速IO分发函数,以及普通分发函数 typedef struct _DRIVER_OBJECT { // 结构的类型和大小。 CSHORT Type; CSHO 阅读全文

posted @ 2017-08-30 23:12 沉疴 阅读(1137) 评论(0) 推荐(1) 编辑

PostMessage和SendMessage的区别
摘要:1.返回值 其中 函数4 个参数的意义是一样的,返回值类型不同(其实从数据上看他们一样是一个 32 位的数,只是意义不一样),LRESULT 表示的是消息被处理后的返回值,BOOL 表示的是消息是不是 Post 成功。 2、PostMessage 是异步的,SendMessage 是同步的。 Pos 阅读全文

posted @ 2017-08-29 20:32 沉疴 阅读(1653) 评论(0) 推荐(0) 编辑

使用DLL在进程间共享数据
摘要:0x01 DLL在进程间共享数据理论 1.可以在Dll中使用#pragma data_seg建立共享类型的数据段将需要共享的数据分离出来,放置在一个独立的数据段里,并把该段的属性设置为共享,从而实现不同进程的数据共享。并且必须给这些变量赋初值,否则编译器会把没有赋初始值的变量放在一个叫未被初始化的数 阅读全文

posted @ 2017-08-28 21:10 沉疴 阅读(720) 评论(0) 推荐(0) 编辑

32位程序读写64位程序内存
摘要:32位程序可以通过NtWow64ReadVirtualMemory64,NtWow64WriteVirtualMemory64读写64程序内存。 步骤: 1.自定义函数参数结构,获取模块中的函数指针: 2.获取进程ID和64进程中想要读写处的地址,调用函数读写目标进程内存 阅读全文

posted @ 2017-08-28 18:49 沉疴 阅读(4749) 评论(0) 推荐(0) 编辑

windows文件映射
摘要:0x01 使用文件映射实现共享内存。 用内存映射文件实现进程间的通讯:Windows中的内存映射文件的机制为我们高效地操作文件提供了一种途径,它允许我们在进程中保留一段内存区域,把硬盘或页文件上的目标文件映射到这段虚拟内存中。注意:在程序实现中必须考虑各进程之间的同步问题。 FileMapping用 阅读全文

posted @ 2017-08-27 23:47 沉疴 阅读(996) 评论(0) 推荐(0) 编辑

windows消息传送(自定义消息和WM_COPYDATA)
摘要:通过SendMessge实现的进程间通信。 0x01 自定义消息 1,WINDOWS中自定义消息的定义和使用; (1)在WNDOWS中消息分系统消息和自定义消息。系统消息定义从0到0x3FF,使用0x400到0x7FFF定义自己的消息。Windows把0x400定义为WM_USER。如果想定义自己的 阅读全文

posted @ 2017-08-27 20:33 沉疴 阅读(3490) 评论(0) 推荐(0) 编辑

windows剪贴板
摘要:0x01 Windows剪贴板 Windows剪贴板是一种比较简单同时也是开销比较小的IPC(InterProcess Communication,进程间通讯)机制。Windows系统支持剪贴板IPC的基本机制是由系统预留的一块全局共享内存,用来暂存在各进程间进行交换的数据:提供数据的进程创建一个全 阅读全文

posted @ 2017-08-27 13:22 沉疴 阅读(1491) 评论(0) 推荐(0) 编辑

windows命名管道
摘要:命名管道是通过网络来完成进程间的通信,它屏蔽了底层的网络协议细节。 将命名管道作为一种网络编程方案时,它实际上建立了一个C/S通信体系,并在其中可靠的传输数据。命名管道服务器和客户机的区别在于:服务器是唯一一个有权创建命名管道的进程,也只有它能接受管道客户机的连接请求。而客户机只能同一个现成的命名管 阅读全文

posted @ 2017-08-26 15:13 沉疴 阅读(5707) 评论(0) 推荐(0) 编辑

虚表和虚表指针2.0
摘要:继续从汇编内存层次上对虚表和虚表指针进行分析 (任何妄图使用父类指针想调用子类中的未覆盖父类的成员函数的行为都会被编译器视为非法) 0x01 对象调用自身虚函数 反汇编: 虚函数SetNumber()反汇编分析:、 可以看到,虚函数与普通函数的实现流程并无差别,并没有看到虚表指针之类的操作。 也就是 阅读全文

posted @ 2017-08-26 00:23 沉疴 阅读(287) 评论(0) 推荐(0) 编辑

虚表和虚表指针
摘要:编译器:VS2015 0x01 基础概念 首先还是简单重复一下基础概念。 C++的多态性可以简单地概括为“一个接口,多种方法”,程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念。 1、多态性 指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作。C++支持两种多态性:编译时多 阅读全文

posted @ 2017-08-25 19:46 沉疴 阅读(2331) 评论(0) 推荐(2) 编辑

动态绑定和静态绑定
摘要:0x01 对象的静态类型和动态类型 静态绑定和动态绑定 对象的静态类型:对象在声明时采用的类型。是在编译期确定的 对象的动态类型:目前所指对象的类型。是在运行期决定的。对象的动态类型可以更改,但是静态类型无法更改 静态绑定:绑定的是对象的静态类型,某特性(比如函数)依赖于对象的静态类型,发生在编译期 阅读全文

posted @ 2017-08-25 13:11 沉疴 阅读(263) 评论(0) 推荐(0) 编辑

32位程序中获取64位函数地址
摘要:总结一下之前学习过的在blackbone中的一个x86程序中获取x64位进程函数地址的方法,之前就已经系统地梳理了一遍,今天贴出来分享一下。 这个程序的目的说白了就是要让让运行在Wow64环境中的x86应用程序可以获取到x64下ntdll.dll中的Native API的地址,从而能够直接调用x64 阅读全文

posted @ 2017-08-24 13:10 沉疴 阅读(1764) 评论(0) 推荐(0) 编辑

白驹过隙 ,忽然而已
该文被密码保护。

posted @ 2017-08-24 00:29 沉疴 阅读(9) 评论(0) 推荐(0) 编辑

日志类库框架
摘要:一个错误报告日志的框架,编译成动态库,不过功能还不够完善。 利用C++输出文件流的类ofstream 来实现日志记录功能: 使用ios::out和ios::app的方式打开(文件以输出方式打开(内存数据输出到文件);以追加方式打开文件) 效果: 源代码: 1 #pragma once 2 #incl 阅读全文

posted @ 2017-08-23 11:35 沉疴 阅读(208) 评论(0) 推荐(0) 编辑

离散事件模型
摘要:0x01 代码框架逻辑 模拟内容: 1.离散事件模拟,模拟银行营业时的排队情况 2.不考虑顾客中途离开,顾客到达事件随机,业务办理时间 3.长度随机,选择最短的队排队,不再换队 代码逻辑: 1.一个事件链表,四个窗口排队队列 2.事件驱动:每有一个新的顾客到达,将产生下一个新顾客到达的新事件按时间顺 阅读全文

posted @ 2017-08-22 22:00 沉疴 阅读(978) 评论(0) 推荐(0) 编辑

minifilter
摘要:暑假刚开始的时候,参照《寒江独钓》这本书,用VS2015写过的一个minifilter的框架,今天在博客上分享出来。 VS2015已经有了minifilter的框架模板,直接生成了minifilter的基本结构,使用非常方便: 另外需要一提的是,直接生成的inf文件中,需要把inf文件中的 Inst 阅读全文

posted @ 2017-08-22 21:34 沉疴 阅读(5747) 评论(0) 推荐(2) 编辑

CreateThread和_beginthread区别及使用
摘要:CreateThread 是一个Win 32API 函数, _beginthread 是一个CRT(C Run-Time)函数, 他们都是实现多线城的创建的函数,而且他们拥有相同的使用方法,相同的参数列表。 CreateThread()和_beginthreadex()在Jeffrey的《Windo 阅读全文

posted @ 2017-08-22 20:53 沉疴 阅读(418) 评论(0) 推荐(0) 编辑

自定义消息队列
摘要:参考周伟明前辈的《多任务下的数据结构与算法》实现的自定义的消息队列。 0x01 消息队列机制 消息队列是 一 种 可 以 有 多 个 任 务 同 时 问 队 列 里 发 送 和 接收 数 据 的 队 列 。 要 实 现 多个 任 务 同 时 向 队 列 里 收 发 数 据 , 那 么 必 须 在 收 阅读全文

posted @ 2017-08-22 15:59 沉疴 阅读(568) 评论(0) 推荐(0) 编辑

进程创建过程详解 CreateProcess
摘要:转载请您注明出处:http://www.cnblogs.com/lsh123/p/7405796.html 0x01 CreateProcessW CreateProcess的使用有ANSI版本的CreateProcessA和UNICODE版本的CreateProcessW: 不过查看源码就可以发现 阅读全文

posted @ 2017-08-21 17:47 沉疴 阅读(10393) 评论(1) 推荐(0) 编辑

spin lock自旋锁 双链表操作(多线程安全)(Ring0)
摘要:通过spin lock自旋锁 ,为每个链表都定义并初始化一个锁,在需要向该链表插入或移除节点时不使用前面介绍的普通函数,而是使用如下方法: ExInterlockedInsertHeadList(&linkListHead, &pData->ListEntry, &spin_lock); //ExI 阅读全文

posted @ 2017-08-20 21:48 沉疴 阅读(991) 评论(0) 推荐(0) 编辑

Interlocked单向链式栈
摘要:线程同步一大部分与原子访问(atomic access)有关, 所谓原子访问, 指的是一个线程在访问某个资源的同时能够保证没有其他线程会在同一时刻访问同一资源. Interlocked单向链式栈的操作函数: InitializeSListHead,创建一个空栈 InterlockedPushEntr 阅读全文

posted @ 2017-08-20 20:48 沉疴 阅读(339) 评论(0) 推荐(0) 编辑

自旋锁(Spin Lock)
摘要:转载请您注明出处: http://www.cnblogs.com/lsh123/p/7400625.html 0x01 自旋锁简介 自旋锁也是一种同步机制,它能保证某个资源只能被一个线程所拥有,这种保护被形象地称做“上锁”。它可以用于驱动程序中的同步处理。初始化自旋锁时,处理解锁状态,这时它可以被程 阅读全文

posted @ 2017-08-20 17:17 沉疴 阅读(1240) 评论(0) 推荐(0) 编辑

可等待定时器(获取系统时间)
摘要:可等待定时器这种内核对象,它们会在某个指定的时间触发,或每隔一段时间触发一次。它们通常用来在某个时间执行一些操作。 0x01 创建一个可等待定时器 CreateWaitableTimer (在创建的时候,可等待的计时器对象总是处于未触发状态) HANDLE WINAPI CreateWaitable 阅读全文

posted @ 2017-08-20 14:57 沉疴 阅读(614) 评论(0) 推荐(0) 编辑

APC注入(Ring3)
摘要:首先简单介绍一下APC队列和Alertable. 看看MSDN上的一段介绍(https://msdn.microsoft.com/en-us/library/ms810047.aspx): The system delivers most user-mode APCs when a thread u 阅读全文

posted @ 2017-08-20 14:03 沉疴 阅读(375) 评论(0) 推荐(0) 编辑

IOCP IO完成端口
摘要:一. IO完成端口概念 IO完成端口的出现是为了解决并发模型中可运行线程上下文切换开销过大而出现的。 在《Windows核心编程》的描述中,IO完成端口是Wnidows系统提供的最复杂的内核对象,是一种解决并发IO请求的最佳模型,是用来实现高容量网路服务器的最佳方法。既然是一个对象,那么就直接分析一 阅读全文

posted @ 2017-08-20 00:31 沉疴 阅读(875) 评论(0) 推荐(0) 编辑

异步设备IO OVERLAPPED结构(设备内核对象 事件内核对象 可提醒IO)
摘要:同步IO是指:线程在发起IO请求后会被挂起,IO完成后继续执行。 异步IO是指:线程发起IO请求后并不会挂起而是继续执行。IO完毕后会得到设备驱动程序的通知。 一.异步准备与OVERLAPPED结构 (1).为了以异步的方式来访问设备,必须先调用CreateFile,并在dwFlagsAndAttr 阅读全文

posted @ 2017-08-18 00:11 沉疴 阅读(972) 评论(0) 推荐(0) 编辑

读写锁 SRWLOCK
摘要:读写锁在对资源进行保护的同时,还能区分想要读取资源值的线程(读取者线程)和想要更新资源的线程(写入者线程)。 对于读取者线程,读写锁会允许他们并发的执行。当有写入者线程在占有资源时,读写锁会让其它写入者线程和读取者线程等待。 用读写锁来解决读者写者问题会使代码非常清晰和简洁。 阅读全文

posted @ 2017-08-16 21:39 沉疴 阅读(437) 评论(0) 推荐(0) 编辑

线程优先级
摘要:通过SetThreadPriority可以设置线程优先级别: WINBASEAPIBOOLWINAPISetThreadPriority( _In_ HANDLE hThread, //线程句柄 _In_ int nPriority //设置的权限级别 ); MSDN: Begin backgrou 阅读全文

posted @ 2017-08-16 19:43 沉疴 阅读(298) 评论(0) 推荐(0) 编辑

Lookaside
摘要:频繁申请和回收内存,会导致在内存上产生大量的内存碎片,从而导致最终无法申请内存。DDK提供了Lookaside结构来解决这个问题。可以将Lookaside结构想象成一个内存容器。在初始的时候,它先向Windows申请了比较大的内存。以后每次申请内存的时候,不是直接向Windows申请内存,而是向Lo 阅读全文

posted @ 2017-08-16 13:34 沉疴 阅读(418) 评论(0) 推荐(1) 编辑

驱动链表(LIST_ENTRY)
摘要:DDK提供了两种链表的数据结构,双向链表和单向链表,其定义如下: typedef struct _LIST_ENTRY { struct _LIST_ENTRY *Flink; struct _LIST_ENTRY *Blink; } LIST_ENTRY,*PLIST_ENTRY; typedef 阅读全文

posted @ 2017-08-16 12:49 沉疴 阅读(1038) 评论(0) 推荐(0) 编辑

UNICODE_STRING(用户模式 内核模式)
摘要:UNICODE_STRING结构: typedef struct _UNICODE_STRING { USHORT Length; //字节长度,不包括终止符“NULL” USHORT MaximumLength; //字符串所能占的最大字节数字符串的指针 PWCH Buffer; //字符串的地址 阅读全文

posted @ 2017-08-16 10:21 沉疴 阅读(2152) 评论(0) 推荐(0) 编辑

信号灯(用户模式 内核模式)
摘要:一.用户模式的信号灯 信号灯内部有个计数器,可以理解信号灯内部有N个灯泡,如果有一个灯泡亮着,就代表信号灯处于激发状态,如果全部熄灭,就代表信号灯处于未激发状态。 创建信号灯: HANDLE CreateSemaphore( LPSECURITY_ATTRIBUTES lpSemaphoreAttr 阅读全文

posted @ 2017-08-15 19:26 沉疴 阅读(233) 评论(0) 推荐(0) 编辑

互斥体(用户模式 内核模式 快速互斥体)
摘要:一.用户模式互斥体 创建互斥体: HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes, // pointer to security attributes BOOL bInitialOwner, //始化时是否被占有 LPCTSTR 阅读全文

posted @ 2017-08-15 13:45 沉疴 阅读(694) 评论(0) 推荐(0) 编辑

内核事件KEVENT(同步)
摘要:转载请您注明出处:http://www.cnblogs.com/lsh123/p/7358702.html 一.驱动程序与驱动程序的事件交互 IoCreateNotificationEvent ———> IoCreateNotificationEvent 在内核驱动中可以通过给某个内核对象创建一个命 阅读全文

posted @ 2017-08-14 16:49 沉疴 阅读(4553) 评论(0) 推荐(0) 编辑

驱动程序多线程 PsCreateSystemThread
摘要:内核函数PsCreateSystemThread负责创建新线程。该函数可以创建两种线程,一种是用户线程,它属于当前进程中的线程。另一种是系统线程,系统线程不属于当前用户进程,而是属于系统进程,一般PID为4,名字为“System”的进程。 在内核模式下创建的线程是无法自动退出的,必须使用PsTerm 阅读全文

posted @ 2017-08-14 14:02 沉疴 阅读(7828) 评论(2) 推荐(2) 编辑

应用程序与驱动程序通信 DeviceIoControl
摘要:之前写过一篇关于通过DeviceIoControl函数来使应用程序与驱动程序通信的博客,这次再通过这个完整的代码来简要疏通总结一下。 这种通信方式,就是驱动程序和应用程序自定义一种IO控制码,然后调用DeviceIoControl函数,IO管理器会产生一个MajorFunction 为IRP_MJ_ 阅读全文

posted @ 2017-08-13 20:03 沉疴 阅读(21567) 评论(0) 推荐(4) 编辑

伪句柄转换为真正的句柄
摘要:HANDLE GetCurrentProcess(); 返回值 0XFFFFFFFF -1 HANDLE GetCurrentThread(); 返回值 0XFFFFFFFE -2 这两个函数都返回到主调线程的进程或线程内核对象的一个伪句柄(pseudohandle )。GetCurrentProc 阅读全文

posted @ 2017-08-12 15:44 沉疴 阅读(2349) 评论(0) 推荐(0) 编辑

线程局部存储TLS
摘要:1 .使用线程局部存储的理由 当我们希望这个进程的全局变量变为线程私有时,而不是所有线程共享的,也就是每个线程拥有一份副本时,这时候就可以用到线程局部存储(TLS,Thread Local Storage)这个机制了。 2.动态TLS(1)调用TlsAlloc函数 两种方式: 1>全局调用一次: g 阅读全文

posted @ 2017-08-12 00:09 沉疴 阅读(722) 评论(0) 推荐(0) 编辑

作业通知
摘要:一.作业(job)内核对象概念 1.为什么要有作业job 便于管理进程:进程的父子关系只存在于创建的子进程的那一刻,Windows并不一直维护着这种父子关系,这使得管理进程并不是件容易的事。 2.作业的功能 作业对象是用于将一组进程作为一个管理单元的内核对象,本质上可以理解为其实就是进程池对象,可将 阅读全文

posted @ 2017-08-09 14:34 沉疴 阅读(799) 评论(0) 推荐(0) 编辑

扫描系统句柄表(WIN7 x86)(附录源码)
摘要:PspCidTable存放着系统中所有的进程和线程对象,其索引也就是进程ID(PID)或线程ID(TID).先通过它来看看windbg里的HANDLE_TABLE结构: 可以看到地址 0x83f41bc4中存放的内容是 0x 8da010a8,这是系统的_HANDLE_TABLE的结构。 好了,现在 阅读全文

posted @ 2017-08-06 23:13 沉疴 阅读(1897) 评论(0) 推荐(0) 编辑