欢迎光临散文网 会员登陆 & 注册

研究笔记

2022-01-02 07:49 作者:スレーブ_スレイヤー  | 我要投稿

上个笔记起作用了,原本存在txt里面的代码,因为电脑关机没保存全丢了.....

今天笔记的作用主要是整理思路。

首先我对Windows没什么了解,最开始学的JAVA,然后是安卓,买了电脑先装的Ubuntu,几年后才换win10。去年在B站看了小甲鱼的课程,才对windows有初步认识......

网上说CE读取内存用的是ReadProcessMemory函数,这话对了一半。

当勾选下面两个选项,CE读取内存的方式就会变成驱动读写。

这是结论,然后是得出这个理所当然结论的过程。

我认为认识某件事的过程是很重要的,因为人总会在了解某个原理后忘记理解的过程,遇到了不了解的人就会抱有优越感,要教别人的时候也会忘记自己当时的处境。网上很多教程基本都是这样,在那些所谓大佬的视角下理所当然的事,在小白看来是不可理喻的,所以我留下这个过程,记一下还一无所知的自己。

当我用ReadProcessMemory去读取某个游戏的内存,返回值变成了false。中间花了好几个小时解决了诸如编译位数,管理员权限等等问题,依旧没办法正常读取。

然后我调用了GetLastError,得到返回值5——拒绝访问。

为了知道是我哪里写错了,还是游戏真的有保护,我又试着读了某个单机游戏的内存——一切正常。

于是得出结论,游戏被保护了。但是具体怎么保护的,原理是什么,我没理由知道。

但是我知道CE是能读到内存的,而且只有开了那两个选项才能读到。CE的原理我也摸不透,于是我想到易语言好像很擅长这个,于是就开始搜内存读写的模块。

得到两个关键字:内核 驱动

以C++ 驱动读写内存 为关键字继续网上冲浪,找到了一篇看雪论坛的帖子,得到关键库:

Blackbone

据楼主说这个库提供了三种读写内存的方式:

1.ReadProcessMemory(系统函数

2.NtWow64ReadVirtualMemory64(内核

3.MmCopyVirtualMemory(驱动

第一种略过,楼主说第二种在R3,第三种在R0,而且第三种需要额外用软件加载驱动。

看到这我的心情依旧是平静的,只要把这个库封装一下编译一个dll给C#用应该就完事了。解决了各种编译问题,经过无数次断点跟踪,几个小时过去,我发现这个库对外提供的API,还是在用ReadProcessMemory这个函数读写。虽然里面有调用NtWow64ReadVirtualMemory64的代码,但是并没有对外提供。于是我试着强行调用,意料之中的报错。第三种方式不考虑,要加载驱动,得用win7虚拟机。

白白浪费半天以后,我又回到了原点。打开github继续看CE的源码,想找到ReadProcessMemory以外的读取方式。结果发现了一个关键的函数:

NtDeviceIoControlFile

看了一眼微软的文档,在Driver分类里面,也就是和驱动有关。好暂停一下:

现在我认为读写内存一共三种方式,一种是系统API,一种是内核API,一种是驱动读写,一层比一层麻烦,而且驱动读写的话我隐约记得要安装一个未签名驱动,究极麻烦。

所以我觉得CE应该是用的第二层,因为我没安装任何驱动,CE依旧能读到内存。但稍微想想有点不对劲,ReadProcessMemory调用以后,最终还是会来到ntdll调用NtReadVirtualMemory,这两种方式没有什么区别。

CE的源码里有一个dbk32的文件夹,NtDeviceIoControlFile就在这个文件夹里面被调用的。而我每次启动CE都会出现DBK64 LOADED闪烁,关了那两个选项就没有。再结合那个驱动有关的函数,基本可以确定CE也是用的驱动读写了。

但是记忆里,开启CE的驱动读写会蓝屏,而且很麻烦要用win7要用Pchunter。现在看是记错了,那个是调试器,和内存读写不是一回事。另外要win7的说法属于被忽悠了,毕竟我真的对windows没什么了解。

知道是驱动读写了,但我还是不太可能去学驱动开发,另外那个库我其实没怎么看懂,都不知道怎么调用驱动读写。

于是我果断来到github,又搜索到一个新库,只做内存读写,而且代码很容易看懂。


这次终于,正常读到了数据......我感动地哭了出来。

既然如此一开始就直接github搜不就行了吗?不行的。一开始我仅仅知道ReadProcessMemory这个函数用不了,但是到底怎么才行,还是没头绪,虽然听说过驱动读写这个词,但是是怎么实现的,我还是没任何概念。所以弯路是绝对必要的。




研究笔记的评论 (共 条)

分享到微博请遵守国家法律