GDB 是不是支持演绎内存扫描,例如 Cheat Engine?
Posted
技术标签:
【中文标题】GDB 是不是支持演绎内存扫描,例如 Cheat Engine?【英文标题】:Does GDB support deductive memory scanning, like Cheat Engine?GDB 是否支持演绎内存扫描,例如 Cheat Engine? 【发布时间】:2021-03-16 17:26:42 【问题描述】:当您没有目标程序的源代码时,在内存中查找变量位置的最佳方法之一是扫描进程的内存中的当前值并记下包含该值的所有地址。然后,做一些事情来改变值,并检查该列表中的每个地址,消除那些没有新值的地址。冲洗并重复。
这种技术对于查找各种值非常有效,我认为它是必不可少的。最知名的工具称为作弊引擎,因为它最常用于黑客游戏。当然,它同样适用于其他类型的软件。
由于某种原因,很多调试器,甚至是为二进制分析而设计的调试器,都没有这个功能。我想知道的是 GDB 是否可以进行这种类型的扫描。我还没有看到它的选项,但是拥有它会非常有用,并且它在 GDB 中运行良好。 (我可以很容易地看到它正在实现,您通过在 C 语法中指定数据类型来初始化扫描,然后通过指定要为每个地址评估的布尔表达式(通过表示指向该地址的指针的变量)来过滤地址的命令数据类型。)
如果 GDB 中不存在此功能,是否有现有的分支或补丁来添加该功能?我知道我可以使用其他工具,但 GDB 得到了许多不同目标的广泛支持,而其他软件不一定支持这些目标。
【问题讨论】:
【参考方案1】:我想知道的是 GDB 是否可以进行这种类型的扫描。
(gdb) help find
Search memory for a sequence of bytes.
Usage:
find [/SIZE-CHAR] [/MAX-COUNT] START-ADDRESS, END-ADDRESS, EXPR1 [, EXPR2 ...]
find [/SIZE-CHAR] [/MAX-COUNT] START-ADDRESS, +LENGTH, EXPR1 [, EXPR2 ...]
SIZE-CHAR is one of b,h,w,g for 8,16,32,64 bit values respectively,
and if not specified the size is taken from the type of the expression
in the current language.
Note that this means for example that in the case of C-like languages
a search for an untyped 0x42 will search for "(int) 0x42"
which is typically four bytes, and a search for a string "hello" will
include the trailing '\0'. The null terminator can be removed from
searching by using casts, e.g.: char[5]"hello".
The address of the last match is stored as the value of "$_".
Convenience variable "$numfound" is set to the number of matches.
【讨论】:
我知道那个命令,但我不认为它符合我的要求。是否有一个选项让它查看以前搜索找到的所有地址,并且只查看那些地址,而不手动指定它们?以上是关于GDB 是不是支持演绎内存扫描,例如 Cheat Engine?的主要内容,如果未能解决你的问题,请参考以下文章