首页
社区
课程
招聘
[讨论]一种更快速的找call方式
发表于: 2023-8-19 00:49 6166

[讨论]一种更快速的找call方式

2023-8-19 00:49
6166

众所周知,CE具备UltiMap功能。但我在使用它寻找游戏call时发现,在大型网络游戏中难以操作。后了解到UltiMap2利用了Intel 7代及以上CPU的指令追踪功能,性能大幅提升,但我尚未进行测试,期待有经验者分享。

关于UltiMap2的CE论坛讨论如下,供参考:
https://forum.cheatengine.org/viewtopic.php?t=617888&sid=d47bf48a1ef38ad18559b2aa4a28332b
https://www.cheatengine.org/forum/viewtopic.php?t=615155&sid=c8c148101beed8825e30cafebcf50781
此外,以下技巧也很实用:
https://www.cheatengine.org/forum/viewtopic.php?t=614097&sid=ca70f5fd6ac909d84da56d32248aa254

我想分享一个新思路:传统的中断/异常/硬断/软断方法性能开销大,表现不佳。是否考虑换种方法?我们可以在call内部使用inline hook统计call的调用次数,并进一步优化性能:

初始化时扫描所有call,对调用次数超过一定次数的call进行还原hook。通常,我们要找的call调用次数较少。
为了提升性能,可以模仿CE的设计:不使用时关闭计次统计,仅在施放功能前开启,并在施放功能后关闭。然后再进行统计和过滤。

不使用技能时选择不增加调用计次的,再次进行统计和过滤。
总之,类似于CE找数据思路。

这种思路我认为是可以应用于任何程序如(android ios)寻找功能函数的。

大家认为这个思路是否可行,我比较担心思路有方向性错误or实际表现比CE ultiMap2更糟糕.
请大家提供宝贵建议,写好会开源


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 9216
活跃值: (6435)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
10年前我记得都有人提供过这种思路了
hook的字节不足,你只能用cc作为断点。不然一个函数就2字节 那种你基本gg。
再有就是搞了cc就要过crc。完全鸡肋。
普通程序还可以,游戏搞了这个玩意可以卡成狗。我自己实现过一个cc的。
初始化时必须把已断下来的地址全部过滤掉,不然能让程序卡到吐血或者直接让游戏崩盘
然后选择崩溃前的函数地址选择不挂钩。这个操作得搞个3-6次,才能正常断下。
面对现在的组件模式编程。其实这个作用不大。特别是在x64下。如果用你的inline hook 
要求对函数头部做一个jmp 占用字节太多了。会覆盖到另一个函数。然后GG
2023-8-19 02:25
0
雪    币: 1558
活跃值: (3618)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
mudebug 10年前我记得都有人提供过这种思路了 hook的字节不足,你只能用cc作为断点。不然一个函数就2字节 那种你基本gg。 再有就是搞了cc就要过crc。完全鸡肋。 普通程序还可以,游戏搞了这个玩意 ...
谢谢解答疑惑
1.hook字节不足的问题,要回答这个问题,首先要回答我们开发这款插件适用范围,x64找游戏call
如果一个功能函数只有2-3条指令,已经可以排除这是个功能函数
比如常见的
mov rcx
2023-8-19 06:39
0
雪    币: 1558
活跃值: (3618)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
mov rax,[rcx+0x100]
retn
这种情景显然不是一个功能call,可以直接排除
2.x64 hook字节不足的问题,是否可以特殊处理,在retn处前几个字节hook
检查栈,并且还要考虑寄存器变化情况,经过一系列转换后读取栈的调用者的地址
这种hook retn模式只能找到调用者使用call的次数
没法知道这个call总共被调用了几次
总之各有缺陷,但是我感觉还是可以接受
2023-8-19 06:59
0
雪    币: 1558
活跃值: (3618)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
可以这样,用retn 定位到call的调用者,再读取返回栈的地址,解析返回栈的上一条指令
比如call 0x12345678 这个call分多种情况如果是call [rax+8]这种就放弃解析。
如果是call 0x12345678可以统计出0x12345678这个函数的调用计次。
2023-8-19 11:24
0
雪    币: 12857
活跃值: (9172)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
6
什么年代了还hook
IPT了解一下
2023-8-19 11:40
1
雪    币: 1558
活跃值: (3618)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
hzqst 什么年代了还hook IPT了解一下
intel process trace?
我手上没六代以上U
2023-8-19 14:14
0
雪    币: 1558
活跃值: (3618)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
hzqst 什么年代了还hook IPT了解一下
E3 1270v6+ 华硕E3 pro gaming v5+32G ram已下单
2023-8-19 16:51
0
雪    币: 20
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
9
做过命令行工具,用的inline hook,主要是用来抓取特定调用频率的call的,也可以获取调用次数。可能有点小鸡肋
2024-6-5 07:48
0
雪    币: 1558
活跃值: (3618)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
mb_itubdqgo 做过命令行工具,用的inline hook,主要是用来抓取特定调用频率的call的,也可以获取调用次数。可能有点小鸡肋
我也做了类似的工具,问题有几个
1.只能做那种inline hook的call, call [rax+8] 这种就无法处理
2.这么多inline hook 反外挂系统的CRC根本无法处理。
3.如果用vt ept处理CRC,性能又无法接受。
总之。鸡肋
2024-6-5 14:32
0
游客
登录 | 注册 方可回帖
返回
//