为什么我不能在调试/反汇编期间进入调用指令?

时间:2015-04-30 16:40:46

标签: .net x86-64 cil reflection.emit disassembly

反汇编看起来像:

                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的操作?

0 个答案:

没有答案