游戏安全的学习(1)
游戏安全的学习(1)—— CE 的基本用法
开始学习游戏安全了,后续跟着队爹搞 O 去。
Cheat Engine
简介
说到游戏安全就不得不提这个软件了,这个软件本质是一款内存调试器,但是它对内存搜索的便捷特性使得它很容易修改游戏的某些数值,成为入门游戏安全必备的一个软件。
CE练习关卡
CE 它内置了很多小游戏帮助我们快速入门 CE
这款软件,基础练习就不说了,我们直接来到游戏修改的这几关。可以在安装目录下找到
gtutorial-i386.exe
这个程序,这就是我们的练习关卡了,有三个经典的小游戏让我们修改。
第一关
一个射击游戏,那边有一个靶标,我们需要摧毁目标,提示说了,每射击五次目标会回血并且立刻处于无敌状态,并且是在第五发子弹射出去的瞬间生效,正常过关我们是很难的,那就考虑修改靶标的血量,找到这一块内存。
因为不知道伤害和血量,所以首次搜索使用未知的初始值去搜索,搜索类型为
4 字节。
每射出一发子弹打到目标,就搜一次减少的数值,如果四次打完还没有找到合适的值,那就打出第五发子弹然后去搜
增加的数值,随后再这样循环操作直到看到合适的值。 ...
Golang入门学习(19)
Go的第19课——Go对mysql的操作
对于包的理解
终于是对包这个东西有点概念了。首先我们直接导包,只会去
GOROOT 当中寻找,GOROOT 就是你安装
go
的一个地方,当然我们如果写的项目太大了肯定是要分很多包的,直接写在
GOROOT 里面又感觉很难受。
那么此时是这样的,我们要新建一个项目,这个项目作为文件夹,然后里面再建包,新建一个
go.mod 文件,内容就是
123module [projectname]go [go version]
比如我的项目名称为 xia0ji233,那么我的
go.mod 就是这样的内容:
123module xia0ji233go 1.19
里面新建的文件夹就会被作为包啦,要引用的时候就是
import "xia0ji233/pkgname"。
环境准备
mysql就不说了官网上直接下,主要说说驱动下载,这里建议直接去
github 官网搞下来,这里贴一个 link。
然后像刚刚那样,新建一个项目,把源码目录改名为 mysql
放入项目文件夹即可,只要能引用就可以了。
连接数据库
然后再 ...
Golang入门学习(18)
Go的第18课——OS模块对进程的操作。
中间歇了一天主要是为ICPC做准备,看ranklist本来感觉能铜,结果打铁,麻了。。
OS模块对进程的操作
获取当前进程pid和父进程pid。
12os.Getpid();os.Getppid();
创建一个进程并为进程设置一个属性。
12345678910111213141516171819package mainimport ( "fmt" "os")func main() { fmt.Println(os.Getpid()) fmt.Println(os.Getppid()) attr := &os.ProcAttr{ Dir: "", Env: os.Environ(), Files: []*os.File{os.Stdin, os.Stdout, os.Stderr}, Sys: nil, } ...
Golang入门学习(17)
Go的第17课——OS模块介绍,OS模块读文件
今天goland又报了错误,按照第一篇文章说的网址激活已经失效,因此换了一个方式,这里贴个链接
OS库
OS标准库实现了平台无关的编程接口。
创建文件:
1os.Create("test.txt")
创建目录:
12os.Mkdir("test", os.ModePerm)os.MkdirAll("a/b/c/d", os.ModePerm)
两个区别就是 MkdirAll 支持多级目录创建,如果尝试用
Mkdir 去创建多级目录那么不会被执行。
删除文件:
12os.Remove("test")os.RemoveAll("a")
RemoveAll 也是一样,如果 remove
尝试删除一个非空目录,那么不会被运行。
获取工作目录:
1os.Getwd()
修改工作目录:
1os.Chdir("../../")
重命名文件:
1os.Rename("src" ...
CS:APP第五章学习
开始学 CSAPP的第五章
逐步更新吧~
2023-01-08 19:00:00 第一次写
2023-01-11 23:00:00 更新新内容
2023-01-12 12:30:00 写完第五章
优化编译器的能力和局限性
也懒得去复制书上的东西了,就是告诉了我们编译器在编译代码的时候会对代码做出优化等等之类的,但是我们的优化需要足够安全,我们必须保证在任何情况下,优化和不优化的代码只会带来效率上的差异而不会对任何形式输出的任何结果产生差异。
这一章主要介绍了一个例子
问:
1234int test(int *x,int *y){ *x+=*y; *x+=*y;}
能否用以下程序作为优化
123int test(int *x,int *y){ *x+=2*(*y);}
乍一看好像可以,因为就是 x 所指向的 int 内存加了两次
y,完全可以用,并且对比上下的代码,上面需要进行 6
次访存(读 y,读x,写x,读y,读x,写x),而下面的代码只需要 3
次访存(读y,读x,写x)
感觉很完美,但是实际上是 ...
Git学习之路(3)
Git学习之路(3)——分支
分支(branch)
为什么使用分支
如果你希望为项目增加新特性,但很可能会影响当前可正常工作的代码。对于该项目的活跃用户而言,这是很糟糕的事情。与其将特性加入到其它人正在使用的master分支,更好的方法是在仓库的其它分支中变更代码。
更重要的是,Git其设计用于协作。如果所有人都在你代码仓库的master分支上操作,会引发很多混乱。对编程语言或项目的知识和阅历因人而异;有些人可能会编写有错误或缺陷的代码,也可能会编写你觉得不适合该项目的代码。使用分支可以让你核验他人的贡献并选择适合的加入到项目中。(这里假设你是代码库唯一的所有者,希望对增加到项目中的代码有完全的控制。在真实的项目中,代码库有多个具有合并代码权限的所有者)
使用分支的好处
同时并行推进多个功能开发,提高开发效率
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。
分支常用命令
查看当前分支
1git branch -v
创建分支
1git branch branch_name
删除分支
1g ...
Git学习之路(2)
Git学习之路(2)——Git的常见命令以及配置
Git常用命令
这里记一下常见的 Git 命令以及它的作用:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364git branch 查看本地所有分支git status 查看当前状态git commit 提交git branch -a 查看所有的分支git branch -r 查看远程所有分支git commit -am "init" 提交并且加注释git remote add origin git@192.168.1.119:ndshow git push origin master 将文件给推到服务器上git remote show origin 显示远程库origin里的资源git push origin master:develop git push origin master:hb-dev 将本地库与服务器上的 ...
开发操作系统(2)
开发OS的第二天
&学习Makefile
编写NAS汇编文件
这里附件给的源文件已经是纯粹的汇编代码+数据组成了。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061; hello-os; TAB=4 ORG 0x7c00 ; 指明程序装载地址; 标准FAT12格式软盘专用的代码 Stand FAT12 format floppy code JMP entry DB 0x90 DB "HELLOIPL" ; 启动扇区名称(8字节) DW 512 ; 每个扇区(sector)大小(必须512字节) DB 1 ; 簇(cluster)大小(必须为1个扇区) DW 1 ; FAT起始位置(一般为第一个扇区) DB 2 ; FAT个数(必须为2) DW 224 ; 根目录大小(一般为224项) DW 288 ...
Git学习之路(1)
Git学习之路(1)——Git的基本用法
就是多学学对自己有用的东西吧
水一章为敬!
什么是Git
WIKI:
在程序设计中,分布式版本控制(英语:distributed revision control 或
distributed version
control,又译为分布式版本控制),又称去中心化版本控制(decentralized
version
control),是一种版本控制的方式,它允许软件开发者可以共同参与一个软件开发项目,但是不必在相同的网络系统下工作。其作法是在每个开发者电脑中复制一份完整的代码库以及完整历史[1]。因此在无法连接网络时,仍可以进行软件的分支及合并,可以加速大部分的作业,增加此情形可以进行的工作,而且系统的代码库可以在多家电脑上备份,不需靠单一位置的备份。而多个位置的代码库再透过其他机制来达到同步。
以分布式版本控制方法,作出的软件版本控制系统,称为分布式版本控制系统(distributed
revision control system,缩写为DRCS,或是distributed version control
sys ...
Golang入门学习(16)
Go的第16课——timer,ticker
Timer
开启定时任务
Timer顾名思义,就是定时器的意思,可以实现一些定时操作,内部也是通过channel来实现的。
虽然可以使用 sleep
实现,但是这个对象可以让我们细化到某个操作到某个操作之间间隔确定的时间,比如我的顺序是要求
A B C,要求 A 和 C 至少间隔两秒的时间。如果使用 sleep
的话就不太方便操作,因为 B 也会消耗一定时间,如果直接 sleep 2
可能会导致等待多余的时间,那么我们就可以在A事件开始后设定 timer,在 C
开始前读出 timer 的 channel,这样就可以保证了,而且写法非常简便。
1234567891011121314151617package mainimport ( "fmt" "time")func main() { timer := time.NewTimer(time.Second * 2)//创建定时器 fmt.Printf("time:%v\n", ...