- 博客(400)
- 资源 (4)
- 收藏
- 关注
原创 [Windows核心编程读书笔记2] 字符和字符串处理
字符串处理函数推荐使用中的函数。代表可以容纳的字符数(不是字节数), 字符数可以用的宏来求, 如果缓冲区容量不够会在pszDest首地址置0代替strcpy代替strcat代替sprintf其返回值为类型(())(())(())成功会返回。
2022-10-05 21:55:25
499
原创 [Windows内核源码分析1] 引导过程(对象管理器初始化在Phase0部分的分析)
本文章记录分析对象管理器在windows系统引导的阶段0中的初始化工作。沿着该目录下的链表进行遍历,如果找到了HASH值相等的对象,则获取其HASH值对应对象的头部, 并获取其中的。利用该HASH值找到对应的全局名字空间中特定的对象目录,并获取其结点的指针, 接着锁住该目录。的创建过程, 其主要调用了ExCreateHandleTable函数。其将新的对象插入到对应的目录下的链表中,这样就完成了插入目录的操作。实际上都是初始化system进程的EPROCESS结构体中的对象。接下来仔细查看一下这个。
2022-10-05 15:31:02
722
原创 [Windows内核源码分析0] 引导过程(Phase0部分分析)
看了下之后加载了APCI.sys, pci.sys, isapnp.sys, compbatt.sys, intelide.sys, MountMgr.sys, ftdisk.sys等等。该函数的主要目的是初始化内核数据结构, 初始化空闲线程和处理器对象, 初始化PCB结构即进程控制块, 并调用执行体层的初始化例程, 并且也用于新处理器上线时的初始化。上面的描述说该例程会被调用2次, 首先在Phase0阶段初始化执行体层和所有它的子组件, 接着在Phase1阶段再次执行初始化工作。
2022-09-29 16:13:39
1281
1
原创 KMP算法
这就可以推出B串的索引0, 1与A串的索引4, 5相同。为了寻找对称情况, 我们可以这样来扫描, 首先可以知道索引0是无法回溯的, 因为它是第一个, 所以索引0回溯到的地方还是索引0, 在next数组中就体现在next[0] = 0。串B和串A的匹配为何从串B的索引0与串A的索引4开始呢?而串B的索引4, 5与串A的索引4, 5又是相等的。首先, 来看一个例子, 这个例子中两串字符串, 上面的称为串A简称A, 下面的称串B简称B, 编程的目标是要从A中匹配B, 并返回A中匹配到的B位于A中的索引。
2022-09-05 16:12:09
368
原创 C++的delete与delete[]剖析
如果说把delete[]换成了delete的情况下, 由于delete后面需要接析构地址,根据析构地址再从上面的堆表中寻找信息来进行析构, 它不会把pt0指向的位置往边上挪动,指哪里用哪里,而pt0指针指向的不是堆的开始位置, 即。假如说,我们把delete指向的内容,经过人工干预指向对应的地址会怎么样?这么做虽然main函数中的delete调用成功了,但当其调用析构函数内部时,由于delete (pt0 - 1)把指向的内容时0x0a, 所以内部释放时肯定会出问题。来执行析构的所以没有问题。
2022-08-25 14:53:41
548
原创 C++如何利用成员函数修改this指针的值
由于C++中类内的成员函数使用的是__thiscall的方式传递this指针, 即this指针通过ecx寄存器保存带入函数, 所以想要在成员函数内修改this指针的值就必须修改调用方式,将调用方式修改成__stdcall或者__cdecl的形式, 这样this指针就会被压入栈帧, 通过传入参数就可以修改this指针。发现修改的内容是另一个对象的成员变量。
2022-08-25 11:33:47
922
原创 Rust7错误处理
Rust7_错误处理文章目录Rust7_错误处理1.不可恢复错误与panic!2.Release与Debug版本3.返回值Result枚举值的处理4.出发panic快捷方法, unwrap与expect5.错误传播快捷方式?运算符1.不可恢复错误与panic!当不可恢复错误出现, Rust会沿着调用栈反向展开遍历所有函数清理数据,panic!()宏会打印一段错误提示信息,如果不想要这个过程即直接结束进程让所有操作给操作系统执行,可以在Cargo.toml文件的[profile]区添加panic = '
2022-04-13 11:56:13
770
原创 Typora的markdown语法以及快捷键
Typora的markdown语法以及快捷键Typora的快捷键快捷键描述Ctrl+回车光标下添加一行Ctrl+\源代码模式斜体Ctrl+I粗体Ctrl+B下划线Ctrl+U行内式超链接Ctrl+K插入图片Ctrl+Shift+IMarkdown语法标题1-6级: n*# + 空格 + 标题内容斜体:*Content*或者_Content_,包裹需要变成斜体的内容粗体:**Content**粗体+斜体: ***Conte
2022-04-13 08:19:42
366
原创 Rust6通用集合类型
Rust6_通用集合类型1.通用集合类型种类:动态数组(vector)字符串(string)哈希映射(hash map)2.动态数组vectorvector会对其元素进行修改所以必须使用可变变量, 即定义时需要加上mutfn main() { // v绑定的Vec<T>会持有i32类型的元素 let mut v: Vec<i32> = Vec::new(); // 带初始值的Vec<T>初始化 let k = ve
2022-04-12 16:45:29
536
原创 Rust5包和单元包以及模块
Rust5_包和单元包以及模块1.模块系统的内容包(Package): 用于构建, 测试并分享单元包的Cargo功能单元包(crate): 用于生成库和可执行文件的树形模块结构模块(module)以及use关键字: 用于控制文件结构, 作用域以及路径私有性条目放置于模块后就会默认设成私有属性无法被外部访问父级模块无法访问子级模块, 但是子级模块可以访问所有祖先模块在模块前添加pub关键字可以将其设置成公有路径(path): 一种用于命名条目的方法, 这些条目包括结构体, 函数和模块
2022-04-12 13:56:16
619
原创 Rust4枚举与模式匹配
Rust4_枚举与模式匹配枚举可以关联数据类型以此替代结构体枚举可以自己定义也可以存在于标准库内1.枚举枚举基本使用方式#[derive(Debug)]enum IpAddrKind { V4, V6,}fn route(ip_type: IpAddrKind){ // code}fn main() { let four = IpAddrKind::V4; let six = IpAddrKind::V6; route(six
2022-04-12 11:06:53
183
原创 Rust4枚举与模式匹配
Rust4_枚举与模式匹配枚举可以关联数据类型以此替代结构体枚举可以自己定义也可以存在于标准库内1.枚举枚举基本使用方式#[derive(Debug)]enum IpAddrKind { V4, V6,}fn route(ip_type: IpAddrKind){ // code}fn main() { let four = IpAddrKind::V4; let six = IpAddrKind::V6; route(six
2022-04-12 11:06:20
241
原创 Rust3结构体
Rust3_结构体1.结构体结构体允许是空的, 结构体如果是可变变量则整个结构体内的变量都是可变的// 定义结构体struct User { username: String, email: String, sign_in_count: u64, active: bool, }fn main() { // 可变结构体 let mut user = User { email: String::from("ki0pler@outloo
2022-04-12 10:20:28
416
原创 Rust2所有权与引用和切片
Rust2_所有权与引用和切片1. 所有权概念介绍:Rust中每个值都有一个对应变量作为它的所有者在同一时间, 值有且仅有一个所有者当所有者离开自己的作用域时, 它持有的值就会被释放2.深拷贝与浅拷贝Rust中对于这个问题采用移动的方式进行解决。假设有1个指针A指向堆内存, 突然指针B也指向了A指向的那块堆内存, 这时如果分别对A和B进行释放就会造成多重释放。Rust直接把A指向的内存移动到B处,A即变为无效。这样释放时仅需要释放B即可,解决了深浅拷贝问题。如果说一定要使用深拷贝的情况:
2022-04-12 10:19:47
495
原创 Rust1基础语法
Rust1_基础语法1. 不可变变量与可变变量默认定义的变量是不可变变量, 其概念与常量不同let var = xxx; // 不可变变量var = xx; // 错误行为如果想要声明可变变量, 则需:let mut mutable_variable = xxx; // 可变变量mutable_variable = xx; // 正确常量与不可变变量的区别:常量用const来定义, 而非let无法用mut修饰常量, 常量是默认不可变且总是不可变常量必须声明类型 c
2022-04-12 10:18:58
277
原创 Rust0项目管理与粗略
Rust0_项目管理与粗略Rust项目管理Cargo项目管理工具使用cargo new xxx 创建新项目cargo run 构建+运行cargo build [–release] 构建debug[release]版本项目cargo check: 检测是否构建cargo update: 更新对应包cargo doc --open: 打开某些包文档Rustc编译器rustc *.rs 编译*,rs文件rustc --version 判定rust版本(判定是否安装成功)
2022-04-12 10:17:22
175
原创 内核态进行进程与线程的监控
进程监控主要使用PsSetCreateProcessNotifyEx线程监控主要使用PsSetCreateThreadNotify主要需要注意一点就是,这种方式的使用条件是需要强制完整性检查。可以通过/integritycheck选项添加。或者网上有一种绕过方式, 在调用上面那两个函数前首先调用下面这个函数,如果执行成功即可绕过强制完整性检查。BOOLEAN BypassCheckSign(PDRIVER_OBJECT pDriverObject){#ifdef _WIN64..
2022-03-21 20:59:49
978
原创 Windows内核编程R0与R3通信
直接设备读写其原理是锁定用户空间内存(这解决了分页内存置换导致缺页异常的问题)并将其映射到内核空间地址,直接对该内核空间地址进行写入即可,由于进程的内核空间是共享的。所以属于任何进程的线程都可以写入。注意的点:1. 要为设备添加DO_DIRECT_IO标志2. 为R3下ReadFile和WriteFile派遣函数时获取对对应传入参数a. 其中WriteFile的用户输入内存地址和ReadFile的设备输出地址通过MmGetSystemAddressForMdlSafe函数锁定IRP.
2022-03-20 16:38:04
2263
原创 Windows下进程间通信
1. WM_COPYDATA这种方法仅适合于Windows的GUI程序。利用WM_COPYDATA消息来进行进程间通信。其原理是如下:在x86下,由于保护模式下进程都具有虚拟内存。所以每个进程都拥有4GB的虚存空间,并通过分页机制进行寻址管理。其中2GB的内核空间是进程共享的而2GB的用户空间则是每个进程独立拥有。WM_COPYDATA消息会在内核空间开辟一段缓冲区。然后把要输入的内容传递进去。由于内核空间是共享的,所以其他进程可以直接获取。这种方法比较消耗资源,不推荐携带大量数据。
2022-03-19 21:37:15
3215
原创 跨进程使用进程句柄
1. 父子进程间实现跨进程使用进程句柄首先来查看一个创建进程的关键API,有关于跨进程使用进程句柄中最关键的2个参数已经用红框框出首先知道一个概念,每个进程被创建后内部都有一张句柄表。来看第一个参数bInheritHandles, 这个参数决定了创建的子进程能否继承父进程的句柄表。如果是TRUE则创建的子进程会继承父进程句柄表否则不会。 BOOL bInheritHandles,也就是说假设有2个进程A和B。A进程通过CreateProcess创建了B进程。如果A进程创建B时Cre
2022-03-18 14:05:35
2288
原创 2种利用Win32 API遍历窗口句柄的方法
两种遍历窗口句柄的方法:#include <windows.h>#include <cstdio>BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) { char szBuf[MAX_PATH] = { 0 }; char szOutput[MAX_PATH] = { 0 }; GetWindowText(hwnd, szBuf, MAX_PATH); if (strlen(szBuf))
2022-03-17 11:51:50
2124
原创 mfcdll
mfcdll意思是用MFC类库来创建的dll库,可以看到可以创建一共有3种不同的dll第一种是常规的共享MFC DLL,这个意思是使用MFC类库时是动态链接库。这种方式产生的dll一般都比较小,但是会要求有对应的MFC环境才可以使用运行。还有一点就是这种类型dll中导出函数最上方必须加上一句AFX_MANAGE_STATE(AfxGetStaticModuleState());比如如下导出函数。第二种是静态链接到常规的MFC DLL,这种方式产生的dll一般都比较大,.
2022-03-16 12:52:35
1530
原创 如何利用VS调试dll
VS不可以调试dll,但是可以利用载入该dll的exe文件来调试对应的dll。假设现在有一个dll文件名称为MFCLib.dll,对应加载的exe文件名为WinTest.exe只要在dll工程的属性, 调试中命令选项内加上exe文件的路径,然后在dll内加上断点后调试exe即可断在dll内部, 这样就可以调试dll了。(完)...
2022-03-16 10:26:54
6428
原创 关于Dll
Dll(动态链接库)的加载分为2种:静态加载 动态加载首先来看一个Dll的例子:上面3张图分别是main.cpp, Test.h以及Test.cpp。其编译连接后生成了一个名为Sample.dll以及对应的Sample.lib导入库。静态加载是通过如下几种方式使用:首先可以通过#pragma comment语句来静态使用dll或者可以通过在项目属性中的附加依赖项添加对应的导入库来静态使用这种情况下就无需#pragma comment语句了...
2022-03-15 11:37:57
2410
原创 DebugView无法显示调试信息问题
从Vista开始,要从DebugView显示调试信息就必须在注册表:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\下添加一个名为Debug Print Filter的项,并在其中添加一个名为DEFAULT的键,值至少为8(为了使第三位置位)。并且要在DebugView中勾选Capture Kernel来捕获内核调试信息。(完)...
2022-03-14 14:09:55
3530
原创 SQL注入
0. PHPStorm代码调试方法加上&XDEBUG_SESSION_START=PHPSTORM即可1. 联合查询注入利用前提:页面上有显示位优点:方便快捷, 易于利用缺点:需要显示位细分:字符型注入实践一下:成功注入:可以构造如下来判定是否存在字符型注入:整型注入实践一下:成功联合注入利用order by和group by判断表的列数order by后面是可以接列号的,比如以第一列排序...
2022-01-19 18:56:14
9366
9
原创 远线程代码注入notepad.exe(X86)
这里实现远线程代码注入,刚开始遇到的问题是发现函数拷贝时出现问题。主要问题是函数地址并非真实的函数地址而是一个jmp,其会跳转到真实函数地址。该代码在Win7X86和WinXP下测试通过#include <cstdio>#include <cstdlib>#include <windows.h>#include <TlHelp32.h>const char *g_pcszProcessName = "notepad.exe";typed
2021-12-12 11:57:10
972
原创 3. 资源与对话框笔记与作业*
1. 菜单与快捷键的使用#include <windows.h>#include "resource.h"LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ switch (uMsg) { case WM_CLOSE: { DestroyWindow(hWnd); PostQuitMessage(0); return(0); } case W
2021-12-07 12:37:56
735
原创 4. 控件*
1. 按钮(Button)N - Notify 通告, 按钮发送给我们的消息M - Message 消息, 发送给按钮的, 用来操作或设置按钮的2. 文本框(Edit)获取控件内容的5种方法:#include <windows.h>#include "resource.h"VOID OnBtnClicked(WORD wCtrlId, HWND hWndCtrl){ switch (wCtrlId) { case IDC_BTN_TEST0: {
2021-12-07 12:37:21
240
BZ二进制查看工具
2018-04-07
一个在用户层的调试器设计书
2020-10-09
30天自制操作系统光盘文件
2018-04-07
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人