【问题标题】:Changing Value of a Register using C++使用 C++ 更改寄存器的值
【发布时间】:2016-04-07 00:01:45
【问题描述】:

我正在尝试使用 C++ 更改寄存器的整数值。

这就是我所拥有的......

DWORD_PTR* value_pointer= NULL;
__asm
{
    MOV [value_pointer], esp
}

// Create a pointer so we can modify the integer value stored in ESP, via value_pointer...
// We do +0x10 because the address is actually +0x10 ahead, I just couldn't compile the code using MOV [value_pointer], DWORD PTR SS:[ESP+0x10]
// Assume ESP+0x10 holds an integer value of 8
char* adjustable_value_pointer = ((char*)value_pointer + 0x10);

adjustable_value_pointer += 4;

现在,如果我们假设 ESP+0x10 最初保存一个整数值 8,那么当这段代码运行后再次(在汇编中)引用 ESP+0x10 时,该值现在应该是 12,而不是 8。

但这似乎对我不起作用......

请帮忙?!

【问题讨论】:

  • 您似乎在修改指针,而不是引用的值。这是预期的行为吗?
  • 我要修改ESP+0x10中存储的原始值
  • ((char*)value_pointer + 0x10; 你有不匹配的括号,所以代码甚至不应该编译。此外,在adjustable_value_pointer += 4; 中,您正在调整指针的值,而不是被指向的东西(正如@owacoder 所指出的那样)。
  • 你用的是什么编译器?
  • 你怎么确定编译器相对于esp 放置了一些东西?

标签: c++ assembly reverse-engineering


【解决方案1】:

value_pointer应该是DWORD_PTR而不是DWORD_PTR*,并且你不需要声明一个新的指针,你可以使用以value_pointer为基础的数组索引(并根据大步前进):

value_pointer[4] += 4;

4DWORDs(0x16 字节)的大小添加到value_pointer,并访问该地址处的内存。

【讨论】:

    猜你喜欢
    • 2023-03-27
    • 2021-01-21
    • 1970-01-01
    • 2020-11-04
    • 2013-03-04
    • 2013-10-21
    • 2010-12-22
    • 1970-01-01
    相关资源
    最近更新 更多