small-q 发表于 2014-9-23 09:15:17

x64传参规则研究--飘云[转自飘云BLOG]

http://www.dllhook.com/?id=10

By 飘云/P.Y.G
https://www.chinapyg.com
http://www.dllhook.com


先写一段函数测试:

        /*
        000000013F991062   mov         r9,0x44444444444444
        000000013F99106C   mov         r8,0x333333333333333
        000000013F991076   mov         rdx,0x222222222222222
        000000013F991080   mov         rcx,0x111111111111111
        000000013F99108A   call      @ILT+0(?FunTest@@YAX_J000@Z)
        */
        FunTest(0x111111111111111, 0x222222222222222, 0x333333333333333, 0x44444444444444);
       
这里看到顺序是 rcx rdx r8 r9 从左到右 -- 返回值 RAX


再写一段更多参数的试试:
        /*
        000000013FFC32CF   mov         rax,0x77777777777777
        000000013FFC32D9   mov         ,rax
        000000013FFC32DE   mov         rax,0x66666666666666
        000000013FFC32E8   mov         ,rax
        000000013FFC32ED   mov         rax,0x555555555555555
        000000013FFC32F7   mov         ,rax
        000000013FFC32FC   mov         r9,0x44444444444444
        000000013FFC3306   mov         r8,0x333333333333333
        000000013FFC3310   mov         rdx,0x222222222222222
        000000013FFC331A   mov         rcx,0x111111111111111
        000000013FFC3324   call      @ILT+10(?FunTest2@@YAX_J000000@Z)
        */
        FunTest2(0x111111111111111, 0x222222222222222, 0x333333333333333, 0x44444444444444, 0x555555555555555, 0x66666666666666, 0x77777777777777);


这里可以看到前4个不变,,后面开始用栈传递--前四个寄存器占了32字节(0x20)   所以第五个参数开始从 传参 以此类推,,每8byte一组   ......

再写一段浮点参数的试试:
        /*
        000000013F5F3399   movss       xmm0,
        000000013F5F33A1   movss       ,xmm0
        000000013F5F33A7   movss       xmm0,
        000000013F5F33AF   movss       ,xmm0
        000000013F5F33B5   movss       xmm0,
        000000013F5F33BD   movss       ,xmm0
        000000013F5F33C3   movss       xmm3,
        000000013F5F33CB   movss       xmm2,
        000000013F5F33D3   movss       xmm1,
        000000013F5F33DB   movss       xmm0,
        000000013F5F33E3   call      @ILT+15(?FunTest3@@YAXMMMMMMM@Z)
        */
        FunTest3(11.0, 22.0, 33.0, 44.0, 55.0, 66.0, 77.0);
       
这里看到浮点从 xmm0-xmm3 固定顺序传入 前4参数   从左到右   其他和上面同理


微软官方文档:
http://msdn.microsoft.com/zh-cn/library/9z1stfyw.aspx


GGLHY 发表于 2014-9-23 09:23:56

专坐Q婶沙发~~

gujin162 发表于 2016-5-10 17:22:23


感谢楼主分享,非常感谢~~

飓风861 发表于 2016-12-5 15:44:43

感谢楼主分享 谢谢 收藏
页: [1]
查看完整版本: x64传参规则研究--飘云[转自飘云BLOG]