游戏安全的学习(4)
游戏安全的学习(4)—— 猫里奥外挂编写。
这也就是一个单机游戏,如果游戏作者觉得侵权了可以联系删除。
游戏分析
突然想起了之前一个很搞人心态的游戏,就是这个猫里奥,各种陷阱防不胜防,因此今天打算用点科技的力量去对抗这个东西。八关版的外挂已经有人做了,这里我用九关版的,下载地址。
坐标读取和修改
首先最简单的就是获取坐标,使用CE反复横跳搜索内存,最终确定了 X 和 Y
坐标的地址分别是在 +78DDC 和 +78DE0
这两个地方,基于此可以做出一个读取坐标信息,修改的目的。
对应代码也非常简单。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980DWORD CCatMariGuaDlg::FindProcess() { HANDLE hSnap = CreateToolhelp32Snapshot ...
计算机网络复习(3)
数据链路层
数据链路层的功能
在物理层的基础上向网络层提供服务,对网络层表现为一条无差错的逻辑链路。
提供的服务
数据链路层可能提供以下的服务:
成帧:链路层封装IP数据报,帧的结构由链路层协议规定。
链路接入:媒体访问控制协议(Medium Access
Control,MAC)规定了帧在链路上传输的规则.
可靠交付:如果链路层实现可靠交付,通常是通过确认和重传取得的。对于高比特差错的链路来说,链路层通常要实现可靠交付,比如无线传输链路而不是通过运输层或应用层协议迫使进行端到端的数据重传。对于低比特差错的链路来说,可靠交付将是不必要的开销,出于此,许多链路层协议不提供可靠交付服务。数据链路层可能提供无连接无确认的服务,有确认无连接的服务,或者是有连接有确认的服务。
检错和纠错:实际链路传输的时候,需要考虑是由信号衰减和电磁噪声导致的。上层也提供了有限的差错检测,也就是因特网检验和,IP校验了它的首部字段,TCP,UDP校验了全部字段。
数据链路
基本概念:
链路(link):是一条无源的点到点的物理线路段,中间没有任何其他的交换结点。
数据链 ...
概率论(2)
大概讲解参数估计的概念。
极大似然估计
这里引用一下Jason Eisner大神讲的一个例子,本篇文章近似对它的原文进行翻译。
概念
这里有两个概念,似然函数和概率密度函数,先细细理解一下这两个概念
Probability and likelihood are closely related concepts in
statistics, but they have slightly different meanings and uses.
Probability is a measure of the chance that an event will occur,
typically expressed as a number between 0 and 1, with 0 indicating that
the event is impossible, and 1 indicating that the event is certain.
A likelihood function is used to calculate the probabilit ...
Windows驱动开发(12)——驱动附加进程读写内存
绕过句柄权限过滤的内存保护
句柄权限过滤
在之前学的常规进程保护种,在驱动层是通过注册打开进程句柄的回调,通过过滤一些权限的方式防止其它进程对指定进程进行跨进程的一些操作,包括进程读写等等。
绕过思路
它可以相当于是对用户层的 OpenProcess 这个 API
作了拦截,那么我们绕过的思路自然也很清楚,那肯定不能通过这个 API
再去获取句柄了,而是可以直接使用驱动附加进程,然后通过 R0 和 R3
通信的方式去读取内存,这里我们做一个简单的小测试,目前代码已经上传至 Github,供大家学习使用。这个里一共包含四个项目,分别对应了游戏程序,外挂程序,游戏驱动和外挂驱动。
这里有一个测试的小技巧,如果觉得每次测试驱动都要安装卸载麻烦,可以把加载驱动写在窗体初始化的时候,把卸载卸载窗体对象析构的时候。
在保护指定进程的时候,通过注册回调的方式过滤句柄权限,用的还是之前的代码:
123456789101112131415161718192021222324OB_PREOP_CALLBACK_STATUS MyProtect( PVOID Registrat ...
概率论(1)
常见的变量分布
随便记了,不是很想管格式。
主要记住一下常见的随机分布的函数和密度函数。
随机变量
随机变量可以分为两种类型:离散随机变量和连续随机变量。
离散随机变量:离散随机变量的取值是可数的,通常表示为整数。它们描述了在离散事件中可能发生的不同结果,例如掷硬币的结果(正面或反面),骰子的点数(1、2、3、4、5或6)等。离散随机变量的概率分布由概率质量函数(Probability
Mass Function,PMF)描述。
连续随机变量:连续随机变量的取值是连续的,可以是实数范围内的任意值。它们描述了在连续事件中可能发生的结果,例如测量温度、身高、时间等。连续随机变量的概率分布由概率密度函数(Probability
Density Function,PDF)描述。
概率分布函数
一般是这个函数是计算随机变量 < 某个值的概率。
不难看出,当变量趋于负无穷的时候,概率的极限为 0,概率趋于 1
的时候,概率的极限为 1。
对于连续的随机变量来说,变量取某个值的概率为
0。很经典的一个例子就是,在数轴 0 - 1 的位置上随机取一个实数, ...
Windows驱动开发(11)——驱动内存属性读写
在R0层中Hook函数
R0层内存属性修改
同样的R0层的内存也有读写保护,如果写了不可写的内存或者读了不可读的内存,此时会直接触发蓝屏。这里也是搜集到了一些修改
R0 层内存属性的方法,可以使用以下代码来修改内存属性:
123456789101112131415161718KIRQL WPOFFx64(){ KIRQL irql = KeRaiseIrqlToDpcLevel(); UINT64 cr0 = __readcr0(); cr0 &= 0xfffffffffffeffff; __writecr0(cr0); _disable(); return irql;}void WPONx64(KIRQL irql){ UINT64 cr0 = __readcr0(); cr0 |= 0x10000; _enable(); __writecr0(cr0); KeLowerIrql(irql);}
WPOFFx64函数可以关闭内存写保护,使我们可以写任何一块区 ...
数据结构复习(4)
第四章——串
字符串存储
一般有定长空间分配法,不定长分配两种方式。
后者以 \0
字符来作为字符串结尾,前者需要再存储一个字符串长度,超出长度之外的字符是无效的。
串的模式匹配算法
假设主串长度为 n,模式串长度为 m。
暴力匹配即对于每一个可能出现模式串的位置(n)对模式串进行匹配判断(m),时间复杂度显而易见的是
O(mn)。
KMP算法会构建一个 Next
数组,在匹配的时候,每一次失配,我们都让模式串指针跳转到 next[j]
的位置上去,主串位置不变。
构建Next数组的方法:
12345678910111213for(int i=1;i<n;i++){ int t=next[i]; while(t!=1&&s[i]!=s[t]){ t=next[t]; } if(s[t]==s[i]){ next[i+1]=t+1; } else{ next[i+1]=1; } ...
《被讨厌的勇气》读后感
很多人推这本书,看了之后感觉挺不错的,特此写读后感。
第一章
我们的不幸是谁造成的?其实是自己。很多时候并不是因为曾经怎么怎么样,或者说现在怎么怎么样我们无法改变命运带来的结果,其实很多时候我们是可以改变的,只不过我们不愿意改变。
这里使用了乍一听非常难以接受的理论——目的论,我们的不幸是因为我们选择了不幸,阿德勒心理学主张人是可以改变的,你可以选择,但是没有足够的勇气!因为你知道你一旦做出改变,你可能要面对很多未知的问题,或者可能是要接受失败的结果,所以你选择了不成功。并因为你选择了不成功,你选择放大自己的缺点并会解释,如果自己没有这些缺点就好了。那只是你不愿意做出改变罢了,没有这样的勇气。
书中举了一个例子来佐证你以为的原因论,实际是目的驱使的:
家长在训斥自己的孩子的时候发怒,一般理解就是是因为女儿成绩不理想,所以家长才那么生气,家长的怒气完全是因为女儿的这个问题。如果说此时是因为家长想发怒而制造出来怒气可能有点诡辩论了,但是实际上在这个情景下,如果家长接到女儿班主任的电话,父母马上就会和颜悦色地去跟老师沟通,完全没有了之前的愤怒情绪。这里想要证明的一个观点是: ...
数据结构复习(3)
第三章——线性数据结构
栈
身为
ACMer,其它基本也不用花太多时间记,只需要记一些没有见过的概念就差不多了。基本特性就是先进后出,常见应用就是函数调用,深度优先搜索(迷宫算法),递归函数,括号匹配,表达式扫描。
卡特兰数
n 个不同的元素入栈,得到不同出栈结果的个数。
结论:\(\frac{1}{n+1}C_{2n}^n\)
共享栈
指两个栈共用一个大数组,其中一个栈顺序增长,另一个栈反方向增长,更大程度避免上溢出,两个栈顶重叠的时候,栈满。
队列
只允许从一端插入,另一端删除,先进先出。
有两种情况需要细致考虑:一个是头指针指向队尾元素,一个是头指针指向队尾的后一个位置,这两个情况略微有差别,此时队列判空判满的条件也有差别。
队头一般使用 head 或者 front,队尾一般使用 tail 或者 rear
变量。为了防止假溢出,出现了循环队列,但是要注意,循环队列需要牺牲一个单元,否则无法判断队满或者队空,因为它们的指针指向一模一样。
双端队列
开放了其中一端插入或者删除,或者都开放。
做这个题目的时候,一般会出现输入限制或者输出限制的双端队列 ...
数据结构复习(2)
线性表章节。
线性表的定义和操作
线性表的定义
线性表是具有相同数据类型的 n 个数据元素的有限序列。
线性表是逻辑结构,表示了元素之间一对一的相邻关系。而顺序表(顺序存取表)和链表(链式存储表)是指存储结构。
线性表具有先后顺序。
线性表每个元素具有相同大小的存储空间。
线性表的操作
有以下操作:
初始化分配内存空间。
求表长。
按值查找。
读取某个元素。
插入操作。
删除操作
顺序输出所有元素。
判断元素个数是否为 0。
销毁线性表。
线性表的顺序实现
概念
顺序表是指,逻辑上相邻的数据元素在物理地址上也相邻。
结论就是:
随机存取方便,插入删除困难,顺序表是一种随机存取的数据结构。
例题遇到的概念
没什么好说的,连续多次删除元素的话不一定要重复 k
次的移动,可以一次移动完。具体算法思路是这样的:
定义一个下表 index=0 和循环变量 i=0。
循环遍历:
如果该元素要被删除,则不作任何操作。
如果该元素不会被删除,把它存入下标为 index 的数组,并使得
index++。
结束循环
最 ...