易语言资源网 - 做最全的易语言资源下载社区
精易论坛授权登录

【hook】脚本注入,人造指针   [复制链接]

    2024-01-20 09:22:38
    高级教程源码
    易语言资源网
    887 次浏览
    来源链接

CE找基_址,求救
https://bbs.125.la/forum.php?mod=viewthread&tid=14809119&extra=

起初,是因为这个原因,想要学习下如何寻找基_址,后面,在一众大佬的热心帮助下。

热心大佬太多,就不一一感谢了。

我终于放弃了找基_址,太难了, CE自带的小游戏 都刷了一遍,多级指针的也玩明白了,但是,依然找不到我这个小游戏的基_址

后面,了解到CE有人造指针,简单来说,就是 通过hook注入自己的脚本,在某个位置,让程序将寄存器的值,赋值到我们指定的 内存地址中,

这样,我们通过访问这个内存地址 ,就能拿到数据的地址了,不再需要寻找游戏的基_址,后续就能做想要的操作了

(当然,也可以注入 其他的汇编操作,比如 在击杀结算的位置,有这么一句话 mov [ebx],eax,// ebx 是经验地址,eax 是当前经验,也就是打完怪了,修改角色的经验值

我们就可以在这句话之前,注入个代码 add eax,3E8 // 3E8 是十六进制,换成10进制就是1000

这样 就实现了,打怪击杀,经验追加1000的效果,升级更快

[开源] 易语言超级模块简单取寄存器地址,以及模拟CE所谓的人造指针开源分享

https://bbs.125.la/forum.php?mod=viewthread&tid=14121443&highlight=%E4%BA%BA%E9%80%A0%E6%8C%87%E9%92%88

在这位大佬的源码基础上,我对代码进行了修改与封装,做成了模块,更方便调用了

(上面的源码有问题的,我们只需要取某个寄存器的值,他注入时,将所有寄存器的取值都注入了,这样会导致,寄存器没有压入栈 就会闪退)

模块中有附带一个使用例子, 可以很好上手看懂

接下来的内容适合 hook小白,大佬就可以跳过了

想要hook,我们首先得找到 hook的目标地址,已这个简单的小游戏为例,先使用ce 寻找到经验的地址

选中找到的地址,按F6,监听是谁改写了这个地址 ,再去操作游戏,让经验值发生变化

进入地址的汇编代码界面

进入这个界面后,标蓝色的  就是我们刚刚的关键位置,我们选择注入 也就要选择在这附近进行注入,

我们只需要简单的了解一点点  汇编知识即可,  比如  mov  是赋值语句,call 是调用子程序   push 是入栈,jmp 是跳转, add 是加法  ...  

eax,ebx,ecx  。。。  等等  这种都是寄存器的代名词,用来暂时存放参与运算的数据和运算结果

其中,eax  代表着  eax 寄存器的值,[eax] 代表的就是  eax地址的值(也就是,eax寄存器的值是一个内存地址,然后 [eax] 代表的是这个内存地址的值,这里要重点注意!!!

mov [ebx],eax // 通过上面简单的了解,我们就能看懂  这句就是说,  将  eax的值,赋值给  ebx指针(也就是ebx寄存器存储的地址)

那么,也就意味着,此时,ebx寄存器 存放的地址 就是我们想要的经验的地址,

那么,我们就可以增加hook代码,让游戏将 ebx的值,也传递给我们,我们拿到地址后,  后面就能为所欲为了!!!

好了,那我们说干就干,怎么hook呢,通常,我们是在选定的位置,  修改原代码,  变成一个  jmp xxxx  ,xxxx 是我们自己申请的内存地址,

也就是  让程序走到这儿时,跳转到我们的代码段, 等运行完,再跳转回来即可,

然后  在32位的程序中, jmp 的代码  是要占用5个字节的,

简易游戏.exe+2008 - 89 03                 - mov [ebx],eax   这句话 只有2个字节,显然不够我们注入 (89 03  代表的就是2个字节)

所以,我们注入的话,  要么 向下 占用字节   ,要么 将注入位置 向上移动一行,往上占用字节

向上的话 ,  就是在  2005  这个位置  进行注入     8B 5D F0 89 03   刚好5个字节

向下的话  就是    89 03 8B 1D 30B74A00   一共8个字节

这儿我选择向上一行,原因的话  是因为  向上的mov 赋值操作  是对寄存器的操作,  是不容易出错,

mov ebx,[简易游戏.exe+AB730] { (005DE9E0) }    这个操作的话,  有对其他静态地址的操作,  我没有尝试 hook后 会不会出错

很好,我们已经确定好注入的位置了,那么,铺垫了这么久,究竟如何注入呢,

我们双击注入行,  就能在弹出的小框中  查看到 该位置的 内存地址了

00402005  // 要注意, 这是十六进制的 地址,也可以写作  402005  多的0 只是补位,不影响大橘

首先初始化 ,主要是用来绑定 游戏的进程ID

然后 通过 模块的  注入_寄存器 传入 注入的地址,以及  要获取的 寄存器 名字 ,这儿,我们的经验地址 暂时是存放在 ebx 寄存器的, 所以,我们就填ebx

注入完成后, 会返回  一个注入标识

后续,通过  内存Hook.取值_寄存器 (程_指针标识)   来获取  寄存器 传递出来的地址 ,

当拿到了  地址,  后面 就可以使用 内存操作类, 对地址 进行  读写操作,  就能为所欲为了,  也可以将 该目标地址  作为 游戏jz,进行偏移,找到附近的 其他地址,

例如,这个游戏中, 就可以  +4  -4  得到 等级 和升级经验的地址

上面,注入的方法,我们是直接写死了  注入地址,通常来说,只要游戏版本不变,通常也不会出问题,  但如果版本变了,  内存地址 可能就发生了变化,导致我们辛辛苦苦写的代码就不能用了

所以我们还可以用第二种方案,  通过特征码去搜索  内存地址 ,然后再注入

比如 上面 这个位置的特征码  就是  8B 5D F0 89 03

我们使用  内存Hook.特征码搜索 (“8B 5D F0 89 03”)   就能拿到 符合这个特征码的  内存地址,  

再进行注入  就没问题了。

要注意的是, 特征码 越短,  符合特征的概率就越大。   可能会导致你搜索的 结果很多,   特征码越长,  搜索的时间也会越长

然后 有的特征码中,  有些码 是动态变量值(可能每次都会发生变化),  需要注意区分  这种位置  就不能写死 特征码  需要用  ?? 来代替  

例如 : 8B 5D ?? 89 ??



点我下载 (已有 40 次下载)

引用模块


源码文件名 模块文件名
内存hook模块.e
精易模块.ec


引用支持库


源码文件名 支持库文件名 支持库标识
内存hook模块.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
特殊功能支持库 3.1 A512548E76954B6E92C21055517615B0
应用接口支持库 3.1 F7FC1AE45C5C4758AF03EF19F18A395D
数据操作支持库一 2.0 4BB4003860154917BC7D8230BF4FA58A


[错误报告]   上一篇:监视热键和取任务栏高度模块源码...     下一篇:一个新手鱼刺多线程例子...