我对逆向工程完全陌生,我目前正在努力获取我自己编写的程序变量的静态偏移量/地址。
所以我用 C++ 编写了以下程序,只是为了得到一些练习:
#include <iostream>
#include <Windows.h>
#include <string>
class Entity
{
public:
Entity(int health, int max_health, int armor) : m_health{ health }, m_max_health{ max_health }, m_armor{ armor }
{}
protected:
int m_health;
int m_max_health;
int m_armor;
};
class Player : public Entity
{
public:
Player() : Entity(200, 400, 50)
{}
void heal() { m_health = m_max_health; }
int get_health() { return m_health; }
private:
};
int main()
{
Player player;
while (1)
{
std::cout << "player health: " << player.get_health() << "\n";
Sleep(500);
}
}
之后我在 x32dbg 中打开了可执行文件。我的第一步是查找字符串引用,然后检查是否可以找到“玩家健康”字符串。这相当简单,它让我看到了以下指令,它们代表了可执行文件的 while 循环:
在那之后,我在 010C24EC 处设置了一个断点(如您在图片中看到的),并且我在愚蠢的情况下跟随了 ESP(即 31FE18),这使我得到了 200 的值,我认为这是变量的值,所以我认为地址 31FE18 是我的变量 player.m_health 的地址。现在我的问题是每次重新启动程序时地址都在变化(这是正常的),所以我用C++编写了另一个程序,它读出了另一个进程的Imagebase,所以我想当我减去的地址时我的图像库中的变量,我可以获得静态偏移量,当我将它添加到图像库时,它总是会引导我找到正确的变量。
我很确定我误解了一些事情,如果有人能帮助我,我会非常高兴,因为我真的花了一些时间试图自己解决这个问题,但我尝试过的所有事情都没有奏效迄今为止。
提前致谢。
问候史蒂文