在特定地址获取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完成的:我建议您研究整个函数集-我不会告诉您需要使用的每个函数。