【问题标题】:c++ dll, how to write to a double value of a pointer in memory?c++ dll,如何写入内存中指针的双精度值?
【发布时间】:2016-04-03 08:50:56
【问题描述】:

当我进行 dll 注入时,我在尝试写入指向内存进程中的 double 的指针时遇到了这个问题。

这是我的课:

class SpeedHack : public MasterClass {
    private:
        SpeedHack() {};
        struct Speed { double speed; };
    public:
        Speed* getAddy()
        {
            return (Speed*)(address);
        }
        bool isSpeedAtkon = false;

        void writeMem()
        {

            getAddy()->speed = 3.1;

        }
        static SpeedHack& get()
        {
            static SpeedHack instance;
            return instance;
        }
    };

//address is 0x767650 and value is a double 0.300000

我还有其他类似的课程和所有其他工作,但我在结构中从来没有双重(仅在这个课程中)

应用程序崩溃一旦我尝试调用 writeMemory() 方法...来自其他类的其他结构即使它们更复杂也总是可以工作...

记录这个:Logger::log("%f", SpeedHack::get().getAddy()->speed);按预期返回 0.300000 并记录地址返回正确的地址...

所以我不知道我做错了什么...(一旦我尝试更改此地址的双精度值,应用程序就会崩溃)...有人知道我该如何解决吗?

【问题讨论】:

  • 我假设“双指针”实际上是指 to 一个 double(而不是例如 sometype **)的指针?
  • 是的,对不起,我不是以英语为母语的人
  • 如何程序崩溃了?因为您没有对该值的写入权限,或者因为 3.1 是一个不正确的值?还是别的什么?
  • 我当然没有写权限...但是当我尝试使用内存编辑器时,它运行良好(作弊引擎)。这个程序告诉我地址​​是可写的,我尝试从作弊引擎更改为 3.1 也可以

标签: c++ pointers memory dll double


【解决方案1】:

好的,谢谢 Bo persson,我用这段代码解决了它...我从互联网上抓取了它,但我不知道所有这些都需要:

void doSpeedAtk()
        {
            DWORD OldProtection;
            VirtualProtect((LPVOID)address, 4, PAGE_READWRITE, &OldProtection);
            getAddy()->speed = 3.1;
            VirtualProtect((LPVOID)address, 4, PAGE_READWRITE, &OldProtection);
        }

【讨论】:

  • 可能想写回OldProtection,而不是对第二个值进行读写。
  • 你的第二个 VirtualProtect 应该有OldProtection,它说PAGE_READWRITE 将它设置回原来的样子 - 或者只是保持原样,根本没有第二行。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-23
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
  • 2016-10-04
  • 1970-01-01
相关资源
最近更新 更多