- 博客(251)
- 资源 (3)
- 收藏
- 关注
原创 VS 配置代码片段快捷键
路径:D:\software\VisualStudio2017\path\Common7\IDE\VC\Snippets\2052\Visual C++vs2017 code片段快捷键配置。驱动代码:DriverEntry。后缀名字:.snippet。
2025-01-20 17:49:00
130
原创 10 内存管理
我们以32位的PTE为例,属性位P位标识当前页面是否有效,当CPU访问一个地址,其PTE的P位为0,此时就会产生缺页异常。缺页异常并非总是不利的,实际上,在Windows系统中,每秒都会发生缺页异常。正是通过这种异常机制,Windows才能够更有效地利用物理页资源。
2025-01-08 10:04:07
943
原创 12 软件调试
_try//终止线程//终止进程如果UnhandledExceptionFilter函数返回为0,即EXCEPTION_CONTINUE_SEARCH,那就真的是找不到对应的异常处理程序了,这种情况下只有在程序被调试时才会存在。因此我可以将除零异常代码中的_except(1)修改为_except(0),表示没有对应的异常处理程序,也不去注册。我们再通过OD来调试会发现,即使我们忽略了除零异常,也仍然会在异常处断点。
2025-01-08 09:40:08
623
原创 11 消息机制
DWORDred;DWORDblue;}Color;DWORDx;DWORDy;HWNDhwnd;HDChdc;;;;;;;;;;;;case'b':;;;;getchar();return0;编译运行这段代码,我们输入a或者b进行回车,一开始创建的窗口就会随着不同的指令进行颜色的切换。
2025-01-08 09:39:00
773
原创 9 异常调用
如果RtlDispatchException函数返回0,我们可以看见它又会去判断当前是否有内核调试器,和上面的流程一样,发现没有内核调试器,或者内核调试器函数返回结果为0的情况下,跳转至同一代码段,该代码段的作用就是蓝屏(KeBugCheckEx就是Windows执行崩溃的函数,作用就是。
2025-01-08 09:37:37
1100
原创 8 事件等待
这两种同步方案在线程无法进入临界区时都会让当前线程进入等待状态。一种是通过Sleep函数实现的,一种是通过让当前的CPU”空转“实现的,但这两种等待方式都有局限性:通过Sleep函数进行等待,并没有办法确定具体等待的时间,有可能出现。
2025-01-08 09:36:11
899
原创 6 多核同步
从本质上来说并不需要所谓的“重载内核”,只要了解PE基础,对于我们来说一切都是“重载模块”,我们需要就是通过自己的代码来实现Windows加载模块的过程。虽然通过重载内核我们可以绕过内核上的Hook,但改动太大,即使抹去PE指纹也无法完全隐形,最好的办法不是重载内核,而是需要什么函数自己来实现。
2025-01-08 09:32:04
910
原创 5 句柄表
当一个进程创建或者打开一个内核对象,都会获得一个句柄,通过句柄我们可以访问到内核对象,,并不是我们之前所了解的窗口之类的3环句柄。句柄的存在是为了避免在应用层直接修改内核对象,如果你创建一个线程,随之返回给你内核对象的地址,你就可以通过这个地址去修改内核对象,。为了规避以上所述的情况,微软将内核对象的地址隐藏起来,但为了让3环可以使用,又设计了一张表(即句柄表),在这个表中存储着内核对象的地址,,这样在3环中就可以通过句柄来使用内核对象。
2025-01-08 09:31:14
872
原创 3 进程与线程
每个进程或线程都一个结构体来描述本身,同样CPU也有这样一个结构体来描述自己,即_KPCR。当线程进入0环时,FS:[0]指向的就不再是TEB了,而变成了_KPCR;每个CPU(每核)都有一个_KPCR结构体,该结构体中存储了CPU本身需要用到的一些重要数据:如GDT、IDT以及线程相关的一些信息。线程不是被动切换的,而是主动的,这点我们在线程函数的实现代码上有体现,即每个线程函数都调用了线程切换的函数线程切换并没有通过TSS来保护寄存器,而是通过堆栈的方式;线程的切换过程本质上就是堆栈的切换过程。
2025-01-08 09:28:25
1011
原创 2 系统调用
API通过中断门进入0环有一个固定的中断号即0x2E,CS、EIP由中断门描述符提供,ESP、SS由TSS提供,进入0环之后执行的内核函数是nt!API通过SYSENTER指令进入0环,CS、ESP、EIP由MSR寄存器提供,SS由CS的值加0x8计算得出,进入0环之后执行的内核函数是nt!内核函数所在模块为:ntoskrnl.exe(10-10-12分页模式下使用)、ntkrnlpa.exe(2-9-9-12分页模式下使用)。
2025-01-07 09:21:54
102
原创 1 保护模式
为了对数据进行保护,普通代码段是禁止不同级别进行访问的。用户态的代码不能访问内核的数据,同样,内核态的代码也不能访问用户态的数据;如果想提供一些通用的功能,而且这些功能并不会破坏内核数据,那么可以选择一致代码段,这样低级别的程序可以在不提升CPL权限等级的情况下访问。如果想访问普通代码段,只有通过调用门等提升CPL权限,才能访问。跨段调用时,一旦有权限切换,就会切换栈;CS的权限一旦改变,SS的权限也要随着改变,CS与SS的等级必须一样;
2025-01-07 09:20:17
730
原创 11 硬编码
如下图所示50、52之类的硬编码实际上就是定长指令,但并不表示定长指令就只有一个字节;同样,如00D4、0034C3之类的硬编码就是变长指令。简而言之,定长指令可以直接通过Opcode确定硬编码长度,变长指令就无法通过Opcode确定硬编码长度。
2025-01-07 09:15:14
590
原创 10 QT基础
Qt是用C++实现的一套库,也就表示其就是一堆代码,它不是IDE;Qt与MFC一样,它们都是C++语言实现的库,在库里提供了很多接口,使得开发的时候可以更加方便;Qt与MFC的实现原理不一样;Qt可以跨平台,但效率较低。了解了Qt,就不得不了解一下Qt Creator,这是一个IDE,类似于VC6.0、VS等等。
2025-01-07 09:12:09
775
原创 9 COM组件
ATL是活动(动态)模板库(ActiveX Template Library)的缩写,它是一套C++模版;使COM开发尽可能自动化,这个基本目标决定了ATL只面向COM开发提供支持。编译型语言在编译之前引入类型库(tlb文件),编译器编译的时候就知道如何编译接口函数的调用了,这种方式我们称为前绑定;而脚本语言是解释执行的,它执行的时候不会知道具体的函数地址,自动化为此诞生了后绑定;自动化组件其实就是实现了IDispatch(自动化)接口的组件;
2025-01-06 16:50:26
424
原创 8 STL
Vector(向量)是一个封装了动态大小数组的顺序容器;跟任意其它类型容器一样,它能够存放各种类型的对象;Vector是用动态数组来实现的。Vector支持随机存取,它有大小(size)和容量(capacity)两个属性,大小(size)就是实际元素的个数,容量(capacity)表示能容纳元素最大的数量,如果插入元素时,元素个数超过容量大小,则需要重新配置内部存储器。1.Deque是Double-Ended Queue的缩写,是在首尾两端增删元素具有较佳性能的容器;
2025-01-06 16:49:02
444
原创 7 数据库
数据库就是一个用来存储各种数据的容器:专门用于创建和管理数据库的统一软件,介于应用和操作系统之间。比如MySQL、SQL Server、Oracle等等,它们不仅有基础的数据管理功能,还能保证数据的完整性、安全性和可靠性。:通过数据库管理系统提供的接口与之通信,访问和管理数据的应用程序。:它是一种数据库查询语言和程序设计语言,主要用于管理数据库中的数据,如存储数据、查询数据、更新数据等等。
2025-01-06 16:47:59
398
原创 6 网络编程
TCP,英文全称是Transmission Control Protocol,中文为传输控制协议,在我们之前所说的五层还是七层模型中,TCP都属于传输层。UDP是User Datagram Protocol的首字母简写,翻译过来就是标识用户数据报协议。UDP也是属于传输层的协议,从名字上来看,TCP是传输控制,而UDP是用户数据报,其实也就说明了UDP协议并不会去控制传输。多连接就是解决单连接所面临的窘境,使得多个客户端可以同时跟一个服务器进行通信。
2025-01-06 16:47:22
547
原创 IDA 解析节含义
等,都是程序的不同部分,在反汇编过程中被 IDA 自动识别和分类。是指程序中的不同内存区域或段,它们有不同的目的和用途。你提到的这些节名,如。
2024-12-18 14:52:02
579
原创 7 APC机制
(只判断用户空间的APC请求是因为在KiDeliverApc函数中会优先处理内核空间的APC然后处理用户空间的APC,因此我们不需要再多余进行判断)
2024-12-17 16:48:53
647
原创 NAT转换
IP 地址中预留了 3 个网段,在私有网络内,可以任意使用。其余的 IP 地址可以在互联网上使用,由 IANA 统一管理,称为。NAT 解决了 IPv4 地址不够用的问题,另外 NAT 屏蔽了私网用户真实地址,提高了私网用户的安全性。典型的模型,网络通常是被划分为私网和公网两部分,各自使用独立的地址空间。私网使用私有地址 10.0.0.0/24 ,而公网使用公网地址。为了让主机 A 和 B 访问互联网上的服务器 Server ,需要在网络边界部署一台 NAT 设备用于执行地址转换。NAT 设备通常是。
2024-12-16 15:50:57
928
原创 4 Win32
Win32课程介绍很多人对Win32的认识是错误的,他们认为Win32就是画界面,都已经学MFC了还学什么Win32?Win32不是用来画界面的,如果你以后要在Windows写好程序,是必须要学Win32的;摆正学习态度。字符编码我们会经常接触到各种各样的字符编码,本章节就来讲解一下常见的编码。原始的ASCII编码计算机是由美国人发明的,所以一开始设计编码的时候只会考虑到自身的元素,采用ASCII编码完全可以满足其需求,但是计算机普及之后,很多国家的文字是象形文字,所以我们使用ASC
2024-12-14 14:46:48
717
原创 3 C++语言
构造函数名称与类名一样不能写返回类型(无返回值)创建对象时,则会自动调用执行,一般用于初始化可以有多个构造函数(建议只有一个无参的),这种声明方式我们称之为重载(其他函数也可以)编译器不要求必须提供构造函数。
2024-12-14 14:40:22
675
原创 2 C语言
在了解C语言的汇编表示之前,我们要弄清楚C、C++、VC6、VS之间的关系,C和C++都属于编程语言,VC6、VS属于集成开发环境。我们创建第一个C程序的顺序为(以下键盘快捷方式基于VC6):1.创建项目(选择Win32 Console Application)2.创建文件(Source File)3.编写入口程序34.构建(F7)5.运行(F5)main() {;在C语言中约定俗成的入口函数名称为main()返回类型 函数名(参数列表) {函数体;// 执行结束。
2024-12-14 14:31:41
963
原创 1 汇编语言
N进制,由N个符号组成,逢N进1。那么问题来了,十进制是由十个符号组成,就一定是0、1、2、3、4、5、6、7、8、9么?其实并不是,我们既然说了是由符号组成,那么十进制也可以是由A、Y、B、3、4、5、D、9、0、X组成,由什么符号,取决于定义的那个人,我定义的十进制前20个表格是这样的:AYB345D90XYAYYYBY3Y4Y5YDY9Y0YX。
2024-12-14 14:25:55
881
原创 用户 APC 内部结构
此外,执行 APC 时使用的堆栈与当前用户模式线程相同 - 先前执行的上下文(用户模式中的 NtWaitForSingleObject)被推送到堆栈,并在 APC 运行完成后恢复。如果该标志不为 0,则挂起的 APC 将在用户模式下依次执行。在返回 STATUS_USER_APC 之前,KeWaitForSingleObject 将“UserApcPending”设置为 TRUE - 正如我上面所说,“UserApcPending”会在线程返回用户模式之前触发对 KiDeliverApc 的调用。
2024-12-14 10:31:58
771
原创 用户 APC
无论如何,在 APC 内获取锁可能是一个坏主意,但在内核中,微软已经部分解决了这个问题 - 您可以通过将 IRQL 提升到 APC_LEVEL 或通过 KeEnterCriticalRegion / KeEnterGuardedRegion 禁用 APC 来阻止 APC 到获取特定锁的线程 - 有时它是例如,某些 API(例如 ExAcquireResourceSharedLite)需要。APC(异步过程调用)是一种可在 Windows 中使用的机制,用于对要在特定线程的上下文中完成的作业进行排队。
2024-12-14 10:24:27
976
原创 1 保护模式
为了对数据进行保护,普通代码段是禁止不同级别进行访问的。用户态的代码不能访问内核的数据,同样,内核态的代码也不能访问用户态的数据;如果想提供一些通用的功能,而且这些功能并不会破坏内核数据,那么可以选择一致代码段,这样低级别的程序可以在不提升CPL权限等级的情况下访问。如果想访问普通代码段,只有通过调用门等提升CPL权限,才能访问。跨段调用时,一旦有权限切换,就会切换栈;CS的权限一旦改变,SS的权限也要随着改变,CS与SS的等级必须一样;
2024-12-13 17:44:15
817
原创 Windows XP x86分页机制分析
32位的x86 CPU支持两种分页方式,分别是10 10 12分页和2 9 9 12分页,其中2 9 9 12分页模式称为PAE分页。10 10 12分页模式下,PDE和PTE的每一项只占用4字节,此模式下CPU不支持数据执行保护。而PAE分页中PAPTE、PDE、PTE中的每一项都占用8字节,这8字节能够拿出更多的位作为页保护属性和物理地址访问。所以PAE分页模式相对10 10 12分页模式增加了数据执行保护和更多的物理地址访问能力。也正因此PAE分页模式更被广泛的使用。
2024-12-12 17:52:20
681
原创 win7 双机调试
一件事情是配置好虚拟机,我这里使用的VM里安装win 7,在虚拟机关机的情况下安装配置虚拟机的相关选项。最后一步就是开启调试,在主机中找到windbg的安装路径,发送到桌面快捷方式设置属性,在目标位置设置。一般来说,会显示出使用的第一个串口,波特率为115200bps,和期望的一致,不需要修改。如果配置选项中含有打印机选项,可以先把打印机移除,因为打印机也占了虚拟系统的一个com口。开启虚拟机,进入系统,配置GuestOS Win7系统的启动项。点击添加按钮添加串行端口。4、设置新的启动项。
2024-12-05 11:13:28
539
原创 VC++调试QT源码
vs菜单中的 工具-》选项-》调试-》符号,然后添加我们刚才下载的文件中的bin 和lib文件夹(当然我们的这些PBD 可以整合放在下载的QT 文件夹中,这个看自己)右键解决方案-》属性-》通用属性-》调试源文件-》在窗口内添加QT下载时的源码**.src文件夹**2-2:使用vc++2017 64位,这里根据自己系统环境下载对应的 x32 或 x64。2-3:我这里主要下载的是 qtbase PDB 模板,如果需要下载别的模板可以自行下载。2-1:下载 qt5_5142/ 版本。
2023-11-29 15:46:20
443
原创 windbg XP双机调试
D:\wdk7600\path\Debuggers\windbg.exe” -b -k com:pipe,port=\\.\pipe\com_1 ,resets=0,reconnect -y (名字要和你取得名字对应上)2:操作步骤:编辑虚拟机设置 -> 添加 -> 串行端口 -> 完成 参数配置:使用命名管道 -> \\.\pipe\com_1 -> 该端是服务器,另一端是应用程序 -> 轮询时主动放弃CPU->确定。Windbg -属性 目标-把路径复制出来,把参数加上。1:虚拟机增加串行端口。
2023-11-24 15:53:06
552
原创 VC++常用命名法和宏定义
消息框上下文帮助(Message-box Help context)命令上下文帮助(Command Help context)对话框内的控制资源(Control)不与范围前缀结合使用。对话框资源(Dialog)字符串资源(String)Interface 接口。位图资源(Bitmap)光标资源(Cursor)标识多个资源共享的类型。工具栏或菜单栏的命令项。图标资源(Icon)
2023-11-06 11:48:19
166
原创 Windows网络系统架构
以IP 协议为例,实际上就是对网络数据的一种处理方式,根据网络数据包的解析结构,做出相应的处理。Windows的tcpip.sys就实现了多个协议,ip、tcp、udp、arp、icmp、igmp,它为上层的TDI Clients提供了5个设备对象,用于访问使用这些协议,TDI Clients打开这些设备对象,向其发送IRP请求来实现自己的操作。设备制造商开发的Ndis miniport driver直接调用NDIS库中的接口函数,因此不需要考虑重入的问题,就是一个请求尚未结束的时候,新的请求又进来了。
2023-10-14 14:57:21
657
1
OpenSSL教程 适合前后端开发
2022-10-27
pe解析器可运行xp win7 win10
2019-11-22
桌面取色器
2019-04-01
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人