window 和 linux x64差别

原创作者:狂客

版权声明:转载 请标注来源

差别一  window 和 linux 调用CALL 使用寄存器传参不同

  window

 1 /**
 2 注意现在使用函数库必须先调用 KuangKeInIt 这个函数
 3 
 4 r8-r15
 5 r8 保存 64位
 6 r8d 保存 32位
 7 汇编调用函数 没有默认值一说
 8 调用CALL
 9 注意:
10 调用call rsp必须减去0x20 或者 0x20以上的数字。且是8的倍数 减去 必须调用完加上 堆栈平衡
11 
12 000000013F0B3385  mov         dword ptr [rsp+38h],0Bh //参数八
13 000000013F0B338D  mov         dword ptr [rsp+30h],0Ah //参数七
14 000000013F0B3395  mov         dword ptr [rsp+28h],9 //参数六
15 000000013F0B339D  mov         dword ptr [rsp+20h],7 //参数五
16 000000013F0B33A5  mov         r9d,5 //参数四
17 000000013F0B33AB  mov         r8d,3 //参数三
18 000000013F0B33B1  lea         rdx,[_load_config_used+70h (013F0BCCB0h)] //参数二
19 000000013F0B33B8  lea         rcx,[_load_config_used+78h (013F0BCCB8h)] //参数一
20 000000013F0B33BF  call        qword ptr [__imp_printf (013F0C1300h)]
21 
22 **/

 linux

push   0x9  //参数八
push   0x8  //参数七
mov    r9d,0x7 //参数六
mov    r8d,0x6 //参数五
mov    ecx,0x5 //参数四
mov    edx,0x3 //参数三
mov    esi,0x2 //参数二
mov    edi,0x1 //参数一 注: 代码我没复制全 这里全是64位寄存器 之所以 mov edi, 0x1 前面有 xor rdi, rdi
call   0x555555555185 //<liu(unsigned long long, unsigned long long, unsigned long long, unsigned long long, unsigned long long, unsigned long long, unsigned long long, unsigned long long)> 
add    rsp,0x10 
call   0x555555555030 //<pause@plt> 

猜你喜欢

转载自www.cnblogs.com/kuangke/p/12397124.html