反汇编看起来像:
methShort( ref x, ref y );
000007FF00163F67 lea r8,[rsp+34h]
000007FF00163F6C lea rdx,[rsp+30h]
000007FF00163F71 mov rcx,qword ptr [rsp+20h]
000007FF00163F76 mov rcx,qword ptr [rcx+8]
000007FF00163F7A mov rax,qword ptr [rsp+20h]
000007FF00163F7F call qword ptr [rax+18h]
使用Reflection.Emit在.NET中动态创建方法“methShort”。它将两个Int32参数作为“byRef”值。这被调试为“发布模式”构建。
我可以直接通过装配到“调用”指令。 R8和RDX指向的内存(参数)看起来很好。我不知道什么样的魔法允许JIT使用寄存器来代替堆栈,但这不是重点。
当我尝试“Step Into”调用指令时,调试器会“跳过”它。该例程确实被称为 - 该方法正确执行其功能。但我似乎无法拆解,也无法进入该方法。
在通话之前,RAX包含值00000000025C67A8h。当向其添加18h时,间接地址变为00000000025C67C0h。此地址的QWORD是000000001b64dc48h。
如果我尝试反汇编该地址(000000001b64dc48h),调试器将返回“无法显示指定的地址。所提供的位置没有代码”。
作为Hail Mary的尝试,我尝试在没有间接的情况下在RAX上拆解代码,但正如我所料,这也失败了。
任何人都可以告诉我如何获取地址上的任何代码,或者在解码代码之前是否需要在地址(RAX + 18h)上执行类似于LEA的操作?