jy04468108 发表于 2021-6-9 11:11

X64dbg中fastcall约定的第五个参数怎么找

网上都是说的超过4个参数,使用栈来传递,那么这个栈是如何传递的,如何找到栈地址。




揰掵佲 发表于 2021-6-9 12:26

jy04468108 发表于 2021-6-9 12:15
主要是rsp的值是在调用的时候确定的?
为什么x64dbg里面显示的第五个参数是rxp+0x28?

我这里说的是全部按照长整数来算的
你说的这个情况,我看到过一篇文章有说明

https://bbs.pediy.com/thread-247887-1.htm

网上的文档说明,往往都忽略了浮点数参数的传递和参数位置对齐的问题.
比如参数1和2是整数,参数3和4是浮点数,参数5是整数,那么他们对应的位置是rcx,rdx,xmm2,xmm3,(进入函数体后,rbp会被压入栈顶),坑就坑在这个栈上面,编译器优化的话,为了保存快速调用,被压入寄存器的参数,依然会霸占栈内存的,而某些情况下,也可能出现不霸占栈内存的情况,这个纯属看编译器优化了.
类似的调用约定,和clrcall差不多.clrcall更坑,分为32位clrcall和64位clrcall,而64位clrcall又很像fastcall....
之前我做JIT的时候,就被这些东西搞得晕坨坨的.

张傻子 发表于 2021-6-9 11:18

这是加密与解密嘛?

jy04468108 发表于 2021-6-9 11:22

张傻子 发表于 2021-6-9 11:18
这是加密与解密嘛?

逆向啊。

揰掵佲 发表于 2021-6-9 11:28

rcx
rdx
r8
r9
rsp+0x20
rsp+0x28
rsp+0x30
rsp+0x38
rsp+0x40
rsp+0x48
rsp+0x50
rsp+0x58
rsp+0x60
rsp+0x68
rsp+0x70

1~15参数

jy04468108 发表于 2021-6-9 12:15

揰掵佲 发表于 2021-6-9 11:28
rcx
rdx
r8


主要是rsp的值是在调用的时候确定的?
为什么x64dbg里面显示的第五个参数是rxp+0x28?

无闻无问 发表于 2021-6-9 12:16

超过4个,先压了rcx,rdx,r8,r9,后压的地址在他们之后,最接近rbp的,相当于夹在中间了…我觉得应该是这样吧

lies2014 发表于 2021-6-9 12:50

jy04468108 发表于 2021-6-9 12:15
主要是rsp的值是在调用的时候确定的?
为什么x64dbg里面显示的第五个参数是rxp+0x28?

都没有错,如果你在call执行前断下就是,进入call后因为栈顶变了,因此当前的才是执行call前的

jy04468108 发表于 2021-6-9 13:05

本帖最后由 jy04468108 于 2021-6-9 13:09 编辑

揰掵佲 发表于 2021-6-9 12:26
我这里说的是全部按照长整数来算的
你说的这个情况,我看到过一篇文章有说明

@lies2014
那么问题来了,如果我是64位托管代码调用的非托管方法,此时是不是用的64位的clrcall?
这种情况下,如果调用的方法中参数是ref或者out的,怎么从非托管代码中把值返回到托管代码中。

揰掵佲 发表于 2021-6-9 14:44

jy04468108 发表于 2021-6-9 13:05
@lies2014
那么问题来了,如果我是64位托管代码调用的非托管方法,此时是不是用的64位的clrcall?
这种 ...

我复制的文章原,对我而言,我的结论就是我说的那些参数顺序. 我没纠结这么多
页: [1]
查看完整版本: X64dbg中fastcall约定的第五个参数怎么找