Disassembly is as follows:
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]
The methShort method is dynamically created in .NET using Reflection.Emit. The "byRef" values ββrequire two Int32 parameters. This is being debugged as a release mode assembly.
I can build up to the call statement. The memory contents pointed to by R8 and RDX (parameters) look great. I don't know what magic allowed JIT to use registers to call instead of the stack, but that is not the case.
When I try to execute the "Step Into" command, the debug command "steps over" it. The subroutine is really called - the method performed its function correctly. But I cannot understand and not enter into a method.
At the point immediately before the call, RAX contains the value 00000000025C67A8h. When 18h is added to it, the address for indirection becomes 00000000025C67C0h. QWORD at this address: 000000001b64dc48h.
If I try to parse this address (000000001b64dc48h), the debugger will return with "The specified address cannot be displayed. There is no code at the specified location".
As an attempt by Hail Mary, I tried to parse the code in RAX without indirectness, but, as I expected, this did not work either.
Can someone tell me how to get to any code on the address, or if something similar to LEA should be executed on the address (RAX + 18h) before disassembling the code there?
Veldaeven
source share