在特定地址获取ASM中寄存器的值 我仍然在尝试学习如何用C++来使用ASM,我遇到了一个问题。我要做的就是读取程序中整数的指针

在特定地址获取ASM中寄存器的值 我仍然在尝试学习如何用C++来使用ASM,我遇到了一个问题。我要做的就是读取程序中整数的指针,c++,assembly,x86,C++,Assembly,X86,写入该整数的程序代码如下: 00A3EB6C - mov [edi+0C],eax 现在,我想做的就是在该地址获取指针[edi+0C]。我之所以想这样做,是因为我一直无法找到可靠的内存指针 任何帮助都将不胜感激 很抱歉,如果措辞不好,很难解释 编辑:我的最终目标是在Windows窗体的标签中显示地址00A3EB6C处的指针[edi+0C]处的整数值 我正在使用一个附加到外部应用程序的DLL,只是为了澄清一下。因此,您大概有如下功能: void func(...) { asm {

写入该整数的程序代码如下:

00A3EB6C - mov [edi+0C],eax
现在,我想做的就是在该地址获取指针
[edi+0C]
。我之所以想这样做,是因为我一直无法找到可靠的内存指针

任何帮助都将不胜感激

很抱歉,如果措辞不好,很难解释

编辑:我的最终目标是在Windows窗体的标签中显示地址
00A3EB6C
处的指针
[edi+0C]
处的整数值


我正在使用一个附加到外部应用程序的DLL,只是为了澄清一下。

因此,您大概有如下功能:

void func(...)
{
    asm {
      ... 

      mov [edi+0xc], eax
      ... 
    }
}
现在,要从函数中获取eax的值,需要传入一个指针

void func(..., int *ptr)
{
    asm {
       ... 

       mov [edi+oxc], eax
       mov [ptr], eax
       ... 
    }
 }
也可以将其用作返回值:

int func(...)
{
   int ret;

   asm {
       ... 

       mov [edi+oxc], eax
       mov [ret], eax
       ... 
    }

   return ret;
}
可能还有其他选择,但这些是最简单的

如果你真的想得到一个指向edi的指针,你应该使用一个指向指针的指针作为参数[或者一个指针作为返回值-所以我将向你展示指向指针的指针,因为返回值遵循与上面完全相同的模式]

void func(..., int **ptr)
{
    asm {
       ... 

     // Assumes eax isn't used elsewhere below! 
     // Otherwise, find another free register. 
       mov [edi+oxc], eax
       lea [edi+0xc], eax      // LEA = load effective address. 
       mov [ptr], eax
       ... 
    }
 }

指针是
edi
0xC
的值。我不知道你还需要什么。我知道,但是我如何返回一个普通指针的形式,比如0x00亿?或者更好的是,我如何能够将地址[adi+0c]的值写在地址为C++的另一个值上?我对这一点还很陌生。要做到这一点,你需要知道什么时候会发生“向我的指针写入”的情况,并且有办法在那个时候运行你自己的代码。这就是微软走弯路的目的,尽管也有其他选择做同样的事情。请阅读一般的迂回和代码注入,这是一个非常广泛的主题。侧栏:“外部应用程序中的Its”应该在原始帖子中。没有什么发现10条评论深。请务必在将来包含与您的问题相关的关键信息。
mov[edi+0xC],eax
指令存在于外部应用程序中,OP正在读取该应用程序的内存。那么,如果没有二进制修补,就什么也做不了-对不起,我以为他在学习汇编程序,不学习如何破解-找到一些空白并重新排列代码。好的,那么写一个调试模块,停止在该地址,获取EDI的寄存器值并添加12。简单-我想,这只是几十行代码。但你的“需要”听起来更像是黑客而不是编程。这不是我在Linux机器上可以做的事情(在Windows系统上没有用,C#意味着Windows)。看看这些函数:读取寄存器是通过GetThreadContext完成的:我建议您研究整个函数集-我不会告诉您需要使用的每个函数。