C++、Cheat Engine / OllyDBG 从多级指针查找基“静态”地址

2024-03-13

我又回来了,沮丧并拼命寻求帮助:D。

我正在尝试为一个简单的程序创建一个作弊程序,它基本上是一个 .dll 文件,当使用其基地址注入主程序时,它将更改主程序中的整数值。问题是,我无法使用作弊引擎找到它,主要是因为有多个带有负数的级别指针?偏移量。例如:

//Starting pointer address
0x0033FCF0 -> 200

//Finding second level pointer using "Find out what's accessing this address" in Cheat Engine
**(mov eax,[ebp+08])** // **EAX=0x00000007** , **EPB=0x0033FCE8 => mov 00000007,[0033FCE8+08]**

2nd Level Pointer:
**(0033FCE8+18) -> 200**

因此,我继续使用“找出是什么......”来查找下一个指针,但是在使用带有二级指针地址的 T-SEARCH 时,我得到了 7 - 8 个新的静态地址。

问题是,我无法判断哪一个是正确的,因为作弊引擎拒绝让我使用负数添加指针?抵消。

Example:

Base Pointer:
**mov eax,[epb-18] !!!** // Notice the **MINUS**

最重要的是,作弊引擎拒绝接受带有负偏移量的指针!


我认为你误解了作弊引擎的目标。

CE 允许您修改以持久方式存储在内存中的值。例如,在堆上,或者在程序的静态数据中。

例如,C++ 对象以确定性方式分配,因此它们永远不会移动。这就是为什么它们可以通过在对象的整个生命周期中保持不变的指针来引用。该对象有时由另一个对象拥有。如果你找到一个指向所有者对象的指针,你就找到了所谓的基指针.

例如 :

class Object
{
    bool dummy;
    int someField;
    Object* child;
};

现在假设你有一棵包含 3 个元素的嵌套树Object。意味着你有根Object(n°1),其child是另一个Object(n°2),其child是另一个Object(n°3)。想象一下你做了这样的事情:

int main(int argc, char** argv)
{
    Object root; // n°1
    root.child = new Object(); // n°2
    root.child->child = new Object(); // n°3

    return 0;
}

你有兴趣搞乱 n°3someField价值。你知道地址someField,相对于Object, is of +sizeof(bool) = 1. So (void*)&(object n°3) + 1是一个指向someField你要。

现在,如何找到指向对象 n°3 的指针? 知道相对地址child is +sizeof(bool)+sizeof(int) = 5。我们知道指向对象 n°3 的指针是(void*)&(object n°2) + 5.

对象 n°2 的地址也是如此,我将其作为练习。

但是对象 n°1 呢?它没有分配在堆上。它在堆栈上。废话。所以我们必须找到另一种方法来找到对象n°1存储的地址。

局部变量存储在堆栈中。在汇编中,它们通过相对于寄存器的偏移量来识别EBP (or ESP如果函数不改变堆栈)。EBP是堆栈的顶部,而ESP是堆栈的底部。

在这个例子中:

function foo()
{
    int a;
    double b;
}

当调用 foo 时,堆栈将增加刚好足以容纳 a 和 b,即 sizeof(int) + sizeof(double),即 12 个字节。 a 将存储在EBP - sizeof(int) = EBP - 4(与...一样ESP + 8) 和 b 将被存储在EBP - sizeof(int) - sizeof(double) = EBP - 12(与...一样ESP). 注意力!编译器可以更改此顺序,因此变量的声明顺序在内存中不一定相同。优化也可以彻底改变这一点。但让我们保持简单好吗?

回到我们的主要例子。我们有哪些局部变量?仅根。因此根将位于EBP - 9直接地。但这仅当 main 是调用堆栈顶部的函数时才有效。没有调试器,你就无法做到这一点。

让我们假设我们的EBP当 main 被调用时(取自新编译的 C 程序),值为 0028FF28。

根位于 (0x0028FF28 - 9) = 0x0028FF1F; 指向的指针root.child位于 (0x0028FF1F + 5) = (0x0028FF24); 所以,root.child位于*0x0028FF24。

指向的指针root.child->child位于 (*0x0028FF24 + 5) = (假设 10000) 然后root.child->child为 *10000。

最后,root.child->child.someField为 *10000 + 3。

总结一下:你只需要找到root的静态地址即可找到其余的。 root 不在堆或任何类型的持久内存上,但它在 main 的堆栈上,该堆栈几乎在整个程序中持续存在,因此它几乎就像是永久的。 CE通过扫描整个进程内存空间帮助您找到静态地址

考虑到所有这些,您应该能够计算hp的相对地址在堆栈上并找到一个指向它的静态指针(main 非常非常非常有可能在每次启动程序时都有一个静态帧地址)。如果您需要帮助,请使用调试器!我推荐免疫调试器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++、Cheat Engine / OllyDBG 从多级指针查找基“静态”地址 的相关文章

  • 起订量要求?违背了目的?

    是否需要虚拟化您想要模拟的所有属性访问器就违背了模拟的目的 我的意思是 如果我必须修改我的对象并虚拟化我想要模拟的每个访问器 我难道不能继承我的类并自己模拟它吗 你的问题非常有效 但如果你仔细想想 没有其他方法可以模拟课程 如果你采用一个接
  • 无法从 Web api POST 读取正文数据

    我正在尝试从新的 Asp Net Web Api 中的请求中提取一些数据 我有一个像这样的处理程序设置 public class MyTestHandler DelegatingHandler protected override Syst
  • 如何在 Asp.net Gridview 列中添加复选框单击事件

    我在 asp 中有一个 gridview 其中我添加了第一列作为复选框列 现在我想选择此列并获取该行的 id 值 但我不知道该怎么做 这是我的 Aspx 代码
  • 存储过程上的 OdbcCommand - 输出参数上出现“未提供参数”错误

    我正在尝试执行存储过程 通过 ODBC 驱动程序针对 SQL Server 2005 但收到以下错误 过程或函数 GetNodeID 需要参数 ID 但未提供该参数 ID 是我的过程的 OUTPUT 参数 在存储过程中指定了一个输入 mac
  • 在 MATLAB 中创建共享库

    一位研究人员在 MATLAB 中创建了一个小型仿真 我们希望其他人也能使用它 我的计划是进行模拟 清理一些东西并将其变成一组函数 然后我打算将其编译成C库并使用SWIG https en wikipedia org wiki SWIG创建一
  • 默认值 C# 类 [重复]

    这个问题在这里已经有答案了 我在控制器中有一个函数 并且我收到表单的信息 我有这个代码 public Actionresult functionOne string a string b string c foo 我尝试将其转换为类似的类
  • 我可以仅在少数情况下关闭模拟吗

    我有一个始终使用模拟的应用程序 但是 当用户以管理员身份登录时 一些操作需要他们写入服务器本身 现在 如果这些用户在实际服务器上没有权限 有些用户没有 则不会让他们写入 我想做的是关闭几个命令的模拟 有没有办法做这样的事情 using Ho
  • 指向字节数组的指针

    由于 Misra C 的要求 我的一位同事想要使用指针声明 但我遇到了一些问题 Misra 安全关键指南 不会让我们纯粹的程序员使用指针 但会让我们对数组字节进行操作 他打算获取一个指向字节数组的指针 因此我们不会在堆栈上传递实际的数组 T
  • 无法加载文件或程序集“EntityFramework,版本=6.0.0.0”

    我究竟做错了什么 我该如何解决这个问题 我有一个包含多个项目的解决方案 它是一个 MVC NET 4 5 Web 应用程序 在调试模式下启动后调用其中一个项目时 出现此错误 导致此错误的项目具有以下参考 两个都是版本6 0 0 0 应用程序
  • 防止GDB中的PLT(过程链接表)断点

    在最新版本的 GDB 中 在库函数调用上设置断点会导致多个实际断点 调用过程链接表 PLT 实际的函数调用 这意味着当调用库函数时 我们每次都会经历两次中断 在以前的 GDB 版本中 只会创建 2 因此您只能得到一次中断 那么问题来了 是否
  • dropdownlist DataTextField 由属性组成?

    有没有一种方法可以通过 C 使 asp net 中的下拉列表的 datatextfield 属性由对象的多个属性组成 public class MyObject public int Id get set public string Nam
  • 如何用 C 语言练习 Unix 编程?

    经过五年的专业 Java 以及较小程度上的 Python 编程并慢慢感觉到我的计算机科学教育逐渐消失 我决定要拓宽我的视野 对世界的一般用处 并做一些 对我来说 感觉更重要的事情就像我真的对机器有影响一样 我选择学习 C 和 Unix 编程
  • 系统错误 124 - SHFileOperation 的 ERROR_INVALID_LEVEL

    我在使用时遇到问题SHFileOperation SHFileOperation SHFILEOPSTRUCT https stackoverflow com questions 9191415 shfileoperation shfile
  • 使用(linq to sql)更新错误

    我有两个表 通过外键 CarrierID 绑定 Carrier CarrierID CarrierName CarrierID 1 CarrierName DHL CarrierID 2 CarrierName Fedex Vendor V
  • 纯虚函数可能没有内联定义。为什么?

    纯虚函数是那些虚函数并且具有纯说明符 0 第 10 4 条第 2 款C 03 的内容告诉我们什么是抽象类 顺便说一句 如下 注意 函数声明不能 同时提供纯说明符和定义 尾注 示例 struct C virtual void f 0 ill
  • ASP.NET Core Razor Page 多路径路由

    我正在使用 ASP NET Core 2 0 Razor Pages 不是 MVC 构建系统 但在为页面添加多个路由时遇到问题 例如 所有页面都应该能够通过 abc com language 访问segment shop mypage 或
  • 如何获取 QIcon 的文件/资源​​路径

    假设我做了这样的事情 QIcon myIcon resources icon ico 我稍后如何确定该图标的路径 例如 QString path myIcon getPath 问题是 没有getPath 会员 我找不到类似的东西 但肯定有办
  • C++ [Windows] 可执行文件所在文件夹的路径[重复]

    这个问题在这里已经有答案了 我需要访问一些文件fstream在我的 Windows 上的 C 应用程序中 这些文件都位于我的exe文件所在文件夹的子文件夹中 获取当前可执行文件的文件夹路径的最简单且更重要的 最安全的方法是什么 Use 获取
  • C# 粘贴到文本框时检查剪贴板中的字符

    有没有一些方法可以在粘贴到文本框 C 之前仅检查剪贴板中的字符 Ctrl V 和右键单击 gt 粘贴 但不使用 MaskedTextbox 在文本框文本更改中添加规则以仅接受数字 例如 private string value privat
  • 新的 .NET 6 控制台模板中的 C# 函数重载不起作用

    我在尝试重载该函数时遇到错误Print object in the 新的 NET 6 C 控制台应用程序模板 https learn microsoft com en us dotnet core tutorials top level t

随机推荐