精易论坛

标题: 【hook】脚本注入,人造指针 [打印本页]

作者: 大兔崽子    时间: 2024-1-16 15:01
标题: 【hook】脚本注入,人造指针
本帖最后由 大兔崽子 于 2024-1-17 09:13 编辑
CE找基_址,求救
https://125.confly.eu.org/forum.php?mod=viewthread&tid=14809119&extra=


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

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

后面,了解到CE有人造指针,简单来说,就是 通过hook注入自己的脚本,在某个位置,让程序将寄存器的值,赋值到我们指定的 内存地址中,
这样,我们通过访问这个内存地址 ,就能拿到数据的地址了,不再需要寻找游戏的基_址,后续就能做想要的操作了
(当然,也可以注入 其他的汇编操作,比如 在击杀结算的位置,有这么一句话 mov [ebx],eax,// ebx 是经验地址,eax 是当前经验,也就是打完怪了,修改角色的经验值
我们就可以在这句话之前,注入个代码 add eax,3E8 // 3E8 是十六进制,换成10进制就是1000
这样 就实现了,打怪击杀,经验追加1000的效果,升级更快


[开源] 易语言超级模块简单取寄存器地址,以及模拟CE所谓的人造指针开源分享
https://125.confly.eu.org/forum.php?mod=viewthread&tid=14121443&highlight=%E4%BA%BA%E9%80%A0%E6%8C%87%E9%92%88


在这位大佬的源码基础上,我对代码进行了修改与封装,做成了模块,更方便调用了
(上面的源码有问题的,我们只需要取某个寄存器的值,他注入时,将所有寄存器的取值都注入了,这样会导致,寄存器没有压入栈 就会闪退)



模块中有附带一个使用例子, 可以很好上手看懂
内存hook.rar (821.22 KB, 下载次数: 269)

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

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

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


进入地址的汇编代码界面



进入这个界面后,标蓝色的  就是我们刚刚的关键位置,我们选择注入 也就要选择在这附近进行注入,
[Asm] 纯文本查看 复制代码
简易游戏.exe+2000 - E8 FAF8FFFF           - call 简易游戏.exe+18FF
简易游戏.exe+2005 - 8B 5D F0              - mov ebx,[ebp-10]
简易游戏.exe+2008 - 89 03                 - mov [ebx],eax   // 这儿是程序的增加经验值的位置
简易游戏.exe+200A - 8B 1D 30B74A00        - mov ebx,[简易游戏.exe+AB730] { (005DE9E0) }
简易游戏.exe+2010 - E8 EFEFFFFF           - call 简易游戏.exe+1004
简易游戏.exe+2015 - 53                    - push ebx
简易游戏.exe+2016 - 51                    - push ecx
简易游戏.exe+2017 - 8B 45 F4              - mov eax,[ebp-0C]


我们只需要简单的了解一点点  汇编知识即可,  比如  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个字节
[Asm] 纯文本查看 复制代码
简易游戏.exe+2005 - 8B 5D F0              - mov ebx,[ebp-10]
简易游戏.exe+2008 - 89 03                 - mov [ebx],eax


向下的话  就是    89 03 8B 1D 30B74A00   一共8个字节
[Asm] 纯文本查看 复制代码
简易游戏.exe+2008 - 89 03                 - mov [ebx],eax
简易游戏.exe+200A - 8B 1D 30B74A00        - mov ebx,[简易游戏.exe+AB730] { (005DE9E0) }


这儿我选择向上一行,原因的话  是因为  向上的mov 赋值操作  是对寄存器的操作,  是不容易出错,
mov ebx,[简易游戏.exe+AB730] { (005DE9E0) }    这个操作的话,  有对其他静态地址的操作,  我没有尝试 hook后 会不会出错

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

我们双击注入行,  就能在弹出的小框中  查看到 该位置的 内存地址了
00402005  // 要注意, 这是十六进制的 地址,也可以写作  402005  多的0 只是补位,不影响大橘

  
子程序名返回值类型公开备 注
子程序1  
内存Hook.初始化 (程_进程ID, )
程_指针标识 = 内存Hook.注入_寄存器 (进制_十六到十 (“402005”), 5, “ebx”, 0, )


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

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

后续,通过  内存Hook.取值_寄存器 (程_指针标识)   来获取  寄存器 传递出来的地址 ,
当拿到了  地址,  后面 就可以使用 内存操作类, 对地址 进行  读写操作,  就能为所欲为了,  也可以将 该目标地址  作为 游戏jz,进行偏移,找到附近的 其他地址,
例如,这个游戏中, 就可以  +4  -4  得到 等级 和升级经验的地址


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

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

比如 上面 这个位置的特征码  就是  8B 5D F0 89 03
我们使用  内存Hook.特征码搜索 (“8B 5D F0 89 03”)   就能拿到 符合这个特征码的  内存地址,  
再进行注入  就没问题了。

要注意的是, 特征码 越短,  符合特征的概率就越大。   可能会导致你搜索的 结果很多,   特征码越长,  搜索的时间也会越长
然后 有的特征码中,  有些码 是动态变量值(可能每次都会发生变化),  需要注意区分  这种位置  就不能写死 特征码  需要用  ?? 来代替  
例如 : 8B 5D ?? 89 ??






在此,感谢  @流年似水!  @传说中的路人甲 @大漠小鸟 @菊部变暖   对hook 知识上的帮助

码字不易,希望大家喜欢,我也是新手,有不对的地方,希望大佬指出,共同进步,

顺便,有没有大佬 教教 这个小游戏的  基_址 究竟是怎么找的, 我跟它斗智斗勇了2天。  哭了。   好了,已经有大佬教会我了  用xdbg查看才能找出来,CE不方便




作者: 枕风宿雪多年    时间: 2024-1-16 15:05
学习一下~~~感谢大佬分享
作者: 447485268    时间: 2024-1-16 15:07
支持开源~!感谢分享
作者: x25125x    时间: 2024-1-16 15:09
看不懂,但是感觉很牛逼的样子。
作者: 大兔崽子    时间: 2024-1-16 15:12
x25125x 发表于 2024-1-16 15:09
看不懂,但是感觉很牛逼的样子。

其实这个hook注入  还是比较简单的, 可以先刷刷  CE 自带的小游戏 题目,很有意思
而且  从这个方向去入手 学习hook,  比VXhook  要容易很多。   可以很明显的感受到自己的进步
作者: 虚无の世界    时间: 2024-1-16 15:23
jz有点麻烦的,单机游戏反复查数值变化去追,或者搜索指针。现在的网游玩不了一点,还是用特征码吧
作者: 文西哥    时间: 2024-1-16 15:28
  
作者: 2017浮影    时间: 2024-1-16 15:44
不得先申请内存嘛
作者: 大兔崽子    时间: 2024-1-16 15:47
2017浮影 发表于 2024-1-16 15:44
不得先申请内存嘛

注入的方法里面  就自动申请了。   毕竟 人造指针 这个操作比较固定。   传注入的地址 跟寄存器就行了。其他的 细枝末节都是一样的
作者: 布点脚本师    时间: 2024-1-16 15:55
支持开源~!感谢分享
作者: 蓝色梦幻    时间: 2024-1-16 16:14
支持开源~!感谢分享
作者: 蓝色梦幻    时间: 2024-1-16 16:18
又学了不少,好好学习!!每天进步一点点
作者: zzh233    时间: 2024-1-16 16:21
这是不是传说中的超级hook
作者: 大兔崽子    时间: 2024-1-16 16:31
zzh233 发表于 2024-1-16 16:21
这是不是传说中的超级hook

是的。  因为修改了原程序的代码。  所以好像是会被检测到。  具体 怎么检测的,我就不知道了。
如果是直接注入dll 到目标进程,比如VXhook  那操作就是相当于是在VX自身的操作了, 就不会被检测
嗯,我是这样理解的  但是不知道对不对
作者: 谁的坏叔叔    时间: 2024-1-16 16:33

阁下如何应对

作者: zzh233    时间: 2024-1-16 16:33
大兔崽子 发表于 2024-1-16 16:31
是的。  因为修改了原程序的代码。  所以好像是会被检测到。  具体 怎么检测的,我就不知道了。
如果是直 ...

超级hook用好了非常方便啊 摆脱jz的烦恼 就是容易失效得重启游戏
作者: kantal    时间: 2024-1-16 16:35
好!很好!非常好!朕很欣赏你!
作者: 辽阳小哲    时间: 2024-1-16 16:38
感谢楼主提供源码!
作者: 大兔崽子    时间: 2024-1-16 16:38
谁的坏叔叔 发表于 2024-1-16 16:33
阁下如何应对

此处应该有掌声。膜拜大佬    我这个封装 还是太简单了些。
本来我也想写个 回调接口,  不过 后面想了好久  也没想出来咋个去实现。怎么在目标进程里面 把子程序给注入进去呢...
这种注入hook 还能无痕?  展开说说
作者: 大兔崽子    时间: 2024-1-16 16:39
zzh233 发表于 2024-1-16 16:33
超级hook用好了非常方便啊 摆脱jz的烦恼 就是容易失效得重启游戏

容易失效得重启游戏   这个是什么情况。  我也是刚接触这块 ,还没实战经验
作者: 谁的坏叔叔    时间: 2024-1-16 16:42
大兔崽子 发表于 2024-1-16 16:38
此处应该有掌声。膜拜大佬    我这个封装 还是太简单了些。
本来我也想写个 回调接口,  不过  ...

你要考虑不是单单的hook获取值或者改变值  有时候你还需要去改变程序的流程 比如你需要自己在hook 处写一段数据  我遇到过很多类似的问题 这个是很有必要的

作者: 大兔崽子    时间: 2024-1-16 16:48
谁的坏叔叔 发表于 2024-1-16 16:42
你要考虑不是单单的hook获取值或者改变值  有时候你还需要去改变程序的流程 比如你需要自己在hook 处写一 ...

嗯 ,直接注入一段自己的 汇编代码的功能 我也有加。  不过 确实  原代码  是否要写入, 这个确实要自己选择, 有时候  原代码确实不需要了,完全用自己的代码替代。
作者: 谁的坏叔叔    时间: 2024-1-16 17:00
大兔崽子 发表于 2024-1-16 16:48
嗯 ,直接注入一段自己的 汇编代码的功能 我也有加。  不过 确实  原代码  是否要写入, 这个确实要自己 ...

原代码和跳回都需要  有时候你自己在这儿写一段数据以后需要跳转到别的地址
如果你还是
作者: 气质征服一切    时间: 2024-1-16 17:03
加油吧,什么时候能过游戏检测,你就厉害了
作者: 不苦小和尚    时间: 2024-1-16 17:12
真详细,不错不错
作者: 没事瞎琢磨    时间: 2024-1-16 17:14
感谢分享 虽然小白不懂hook 但是看在这么详细得份上 去收藏里吃灰去吧
作者: 大兔崽子    时间: 2024-1-16 17:18
气质征服一切 发表于 2024-1-16 17:03
加油吧,什么时候能过游戏检测,你就厉害了

啊这。   我这是小学二年级难度,  过检测 ,这是大二的难度了..
话说 ,hook 拿到地址后,  再复原现场,  是不是就不会被检测到了..   不改游戏的流程的话。   只拿到地址 读值  写值
作者: 大兔崽子    时间: 2024-1-16 17:20
没事瞎琢磨 发表于 2024-1-16 17:14
感谢分享 虽然小白不懂hook 但是看在这么详细得份上 去收藏里吃灰去吧 ...

别放弃治疗啊哇。  打开CE ,  跟着操作一遍  就恍然大悟了
作者: 没事瞎琢磨    时间: 2024-1-16 17:23
大兔崽子 发表于 2024-1-16 17:20
别放弃治疗啊哇。  打开CE ,  跟着操作一遍  就恍然大悟了

不行 还得去无爱下载ce 在操作  这不纯纯浪费我摸鱼时间吗
作者: 大兔崽子    时间: 2024-1-16 17:27
没事瞎琢磨 发表于 2024-1-16 17:23
不行 还得去无爱下载ce 在操作  这不纯纯浪费我摸鱼时间吗

是真好玩。 我这俩天  天天抱着CE 玩到1,2点
作者: 传说中的路人甲    时间: 2024-1-16 17:49
出教程了,先收藏,改天再看
作者: 刘文明乌猛    时间: 2024-1-16 18:10
        支持开源~!感谢分享
作者: 龙傲天f    时间: 2024-1-16 18:10
支持开源~!感谢分享
作者: zytlj    时间: 2024-1-16 18:37
谢谢分享,用超级HOOK就好。
作者: inat    时间: 2024-1-16 18:40
教程很简单明了,晚点试试..
作者: 同学麻烦让让    时间: 2024-1-16 18:40
本帖最后由 同学麻烦让让 于 2024-1-16 18:47 编辑

这个jz不是分分钟就能找出来吗
简易游戏.exe+1F11 - 8B 1D 30B74A00        - mov ebx,[简易游戏.exe+AB730] { (03E6D708) }
这里4AB730里存放的就是一个数组,这句之后的ebx=03E6D708,接着下面的命令“简易游戏.exe+1F17 - E8 E8F0FFFF           - call 简易游戏.exe+1004”这句是计算数组里的成员数(存放在ecx里)和第一个成员的起始地址(存放在ebx里),在只有一个数组成员的情况下算出的ebx=03E6D708+8=03E6D710,然后是
简易游戏.exe+1F5D - 8B 1B                 - mov ebx,[ebx]
这句之后的ebx=03E6D750,接着是“简易游戏.exe+1F5F - 83 C3 08              - add ebx,08 { 8 }”,算出的ebx=03E6D758,这个值也就是存放经验的地址,所以经验的地址是[[4AB730]+8+4*x-4]+8,x是角色的序号。


说到底其实就是建立了一个数组,每建立一个角色就增加一个成员,数组里的成员值偏移8的地方就是存放经验值的

作者: kk4648    时间: 2024-1-16 18:48
是小学二年级难度
作者: 莉繁    时间: 2024-1-16 18:58
什么小游戏
作者: lsm3    时间: 2024-1-16 19:33
VX小游戏能找地址不
作者: 精易ぁ小染    时间: 2024-1-16 19:47
  不错看看
作者: 美味萝卜    时间: 2024-1-16 20:23
支持开源~!感谢分享
作者: ttggnn    时间: 2024-1-16 20:42

谢谢分享
作者: 515667395    时间: 2024-1-16 22:46
多谢分享
作者: tsl0413    时间: 2024-1-17 00:14
        新技能已get√
作者: pipicool    时间: 2024-1-17 01:16
学习一下
作者: 查过    时间: 2024-1-17 07:56
感谢分享,很给力!~
作者: 豆豆灰常开心    时间: 2024-1-17 08:00
感谢您对论坛的支持!
作者: 396384183    时间: 2024-1-17 08:04
支持开源~!感谢分享
作者: hdldjese    时间: 2024-1-17 08:09
这个值得学习的,哈哈哈
作者: 小虎来了    时间: 2024-1-17 08:15
感谢分享,很给力!~
作者: 743567274    时间: 2024-1-17 08:29
感谢分享~~~~~~~~~~~~
作者: 一指温柔    时间: 2024-1-17 08:48
支持开源~!感谢分享
作者: 大刀刃    时间: 2024-1-17 08:53
感谢分享
作者: yjd    时间: 2024-1-17 09:00
大兔崽子 发表于 2024-1-16 17:18
啊这。   我这是小学二年级难度,  过检测 ,这是大二的难度了..
话说 ,hook 拿到地址后,  再复原现场 ...

看看这位大佬发的游戏检测,一般人干游戏检测可没那么简单:
[原创]简单谈谈“游戏圈”所谓的神乎其技的行为检测(1)
https://bbs.kanxue.com/thread-166288.htm
作者: 气质征服一切    时间: 2024-1-17 09:15
大兔崽子 发表于 2024-1-16 17:18
啊这。   我这是小学二年级难度,  过检测 ,这是大二的难度了..
话说 ,hook 拿到地址后,  再复原现场 ...

被检测到的方法很多的,就看对方想不想检测了
作者: wgqxj    时间: 2024-1-17 09:16
谢谢分享
作者: qqmqqg    时间: 2024-1-17 09:31
66666666666666666666666666
作者: 南少    时间: 2024-1-17 10:14
        一看就会,一学就废
作者: 外星星人    时间: 2024-1-17 13:07
这个 支持一下
作者: 给自己留一片天空    时间: 2024-1-17 15:59
感谢分享,很给力!~
作者: shaokui123    时间: 2024-1-17 20:46
感谢分享
作者: wjc826194    时间: 2024-1-18 06:04
这个支持x64进程吗?
作者: 龍貓    时间: 2024-1-18 07:51

感谢分享
作者: 大兔崽子    时间: 2024-1-18 08:50
wjc826194 发表于 2024-1-18 06:04
这个支持x64进程吗?

留了口子  但是。  还没有实现。   要实现的话   主要是 要把  这个里面的 汇编代码  从32  转成64    微微有一点点工作量。  在就是 要注意。  jmp 在x64里面  是占用10个字节的
作者: 一指温柔    时间: 2024-1-18 08:53
感谢分享,很给力!~
作者: 南黎    时间: 2024-1-18 09:21
我之前学了很久 用的是冰棍大佬的nb模块
作者: 南黎    时间: 2024-1-18 09:22
感谢楼主这个讲解让我发现以前很多不理解的地方,感谢楼主这波思路!
作者: 像神一样飘渺    时间: 2024-1-18 10:37
        一看就会,一学就废
作者: 南黎    时间: 2024-1-18 12:30
其实我个人决定 hook特征码是不是比找jz要稳定(不容易变)
jz经常变 但是特征码变动少 虽然可能效率低了一点
这种hook需要上驱动保护吗?
作者: 大兔崽子    时间: 2024-1-18 13:09
南黎 发表于 2024-1-18 12:30
其实我个人决定 hook特征码是不是比找jz要稳定(不容易变)
jz经常变 但是特征码变动少 虽然可能效率低了一点 ...

版本不变  jz也不会变的。   版本变了  特征码也不一定还能用。 得看新版本 这部分代码有没有改动才行,  这个hook 要改变源代码,  得能写目标程序的内存才行,如果对方有驱动保护,那要想办法处理才行,具体的 我就不知道了
作者: freeocean    时间: 2024-1-19 00:54
zr赠人玫瑰手有余香
作者: 胖子葛格    时间: 2024-1-19 09:09
感谢大神分享!
作者: 恶魔の佐翼    时间: 2024-1-19 13:03
这不就是最简单的HOOK么???
作者: ckzheng    时间: 2024-1-19 16:27
支持开源~!感谢分享
作者: li609545570    时间: 2024-1-19 17:35
这种对待没有CRC的可以!
如果一旦有CRC检测 就废了
作者: 春林    时间: 2024-1-19 20:54
错误(10002): 指定子程序或类方法名称“字节集_还原”未找到。
作者: 艾玛克138    时间: 2024-1-19 22:03
感谢楼主分享
作者: shuya1    时间: 2024-1-20 00:57
新技能已get√
作者: lsvc    时间: 2024-1-20 01:47
感谢大神分享!
作者: camel0170    时间: 2024-1-20 13:41
666666666666666666666666
作者: kuangshen1    时间: 2024-1-20 21:18
下次出个详细的教程我付费购买,还有xdbg查看咋样才能找出jz呢?我和你一样CE找jz好难啊
作者: 青衫衬酸    时间: 2024-1-20 22:17
喔   感谢大神分享!
作者: 一个屁    时间: 2024-1-21 03:49
您好,能够回复我一下吗!就是您学hook具体是从哪里入手的!一直想学,然后又不知道从哪儿学起
作者: 冰炎by    时间: 2024-1-21 10:00
感谢分享,很给力!~
作者: w521521    时间: 2024-1-21 11:43
感谢分享,很给力!~
作者: xmcx888    时间: 2024-1-21 14:52
感谢分享,很给力!~
作者: shaokui123    时间: 2024-1-22 08:40
        感谢分享,很给力!~
作者: 大兔崽子    时间: 2024-1-22 09:15
一个屁 发表于 2024-1-21 03:49
您好,能够回复我一下吗!就是您学hook具体是从哪里入手的!一直想学,然后又不知道从哪儿学起 ...

先从CE的教程小游戏上手,熟悉下基本的汇编语法,和CE的操作
然后,再自己写些小程序,去尝试着hook ,进步很快的, 再然后,可以找VXhook的教程,跟着学习
作者: bianyuan456    时间: 2024-1-22 11:10
本帖最后由 bianyuan456 于 2024-1-22 11:19 编辑

错误(10002): 指定子程序或类方法名称“字节集_还原”未找到。请问楼主用了精易模块哪个版本的?我需要版本号才能去下载这个版本的精易模块

作者: SHIWOOOO    时间: 2024-1-22 14:50
666666666666
作者: xinbin330    时间: 2024-1-22 15:49
感谢分享
作者: yq1431    时间: 2024-1-23 08:32
一看就会,一学就废
作者: helloxy    时间: 2024-1-23 09:04
大兔崽子 发表于 2024-1-22 09:15
先从CE的教程小游戏上手,熟悉下基本的汇编语法,和CE的操作
然后,再自己写些小程序,去尝试着hook ,进 ...

大神,您说的CE教程小游戏在哪里下载?
作者: 大兔崽子    时间: 2024-1-23 09:15
helloxy 发表于 2024-1-23 09:04
大神,您说的CE教程小游戏在哪里下载?



作者: helloxy    时间: 2024-1-23 10:37
大兔崽子 发表于 2024-1-23 09:15

谢谢大神
作者: BlueBoy    时间: 2024-1-23 10:42
#在这里快速回复#        一看就会,一学就废
作者: vennis    时间: 2024-1-23 10:56
感谢分享
作者: chis777780    时间: 2024-1-23 12:32
感谢分享,很给力!~
作者: 沐白    时间: 2024-1-23 19:17
感谢分享,很给力!~
作者: yangdoudou    时间: 2024-1-24 11:52
感谢分享,很给力!~




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4