By 飘云/P.Y.G http://bbs.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 [rsp+0x30],rax 000000013FFC32DE mov rax,0x66666666666666 000000013FFC32E8 mov [rsp+0x28],rax 000000013FFC32ED mov rax,0x555555555555555 000000013FFC32F7 mov [rsp+0x20],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) 所以第五个参数开始从 [rsp+20] 传参 以此类推,,每8byte一组 [rsp+28]...... 再写一段浮点参数的试试: /* 000000013F5F3399 movss xmm0,[000000013F5F692C] 000000013F5F33A1 movss [rsp+0x30],xmm0 000000013F5F33A7 movss xmm0,[000000013F5F6928] 000000013F5F33AF movss [rsp+0x28],xmm0 000000013F5F33B5 movss xmm0,[000000013F5F6924] 000000013F5F33BD movss [rsp+0x20],xmm0 000000013F5F33C3 movss xmm3,[000000013F5F6920] 000000013F5F33CB movss xmm2,[000000013F5F691C] 000000013F5F33D3 movss xmm1,[000000013F5F6918] 000000013F5F33DB movss xmm0,[000000013F5F6914] 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
发表评论