开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 6861|回复: 6
收起左侧

[技术专题] x64汇编逆向报告

[复制链接]
发表于 2019-10-8 14:14:46 | 显示全部楼层 |阅读模式   江西省九江市
本帖最后由 aa328496536 于 2019-10-8 15:05 编辑

1:参数传递不同 , x86是以压栈实现传入参数(例如:push 1 push 2) , 而到了x64则是 rcx rdx r8 r9 [rsp+0x20] [rsp+0x28] 从左往右传递参数 , 前4个参数是固定的,如果超过4个参数则堆栈传递,如[rsp+0x20]


当参数小于4个

c函数:LONG64 add(LONG64 a, LONG64 b, LONG64 c, LONG64 d )
{        
return a + b + c + d ;
}
汇编代码:
mov r9d , 4
mov r8d , 3
mov edx , 2
mov ecx , 1
call add
调用代码:
add(1 , 2 , 3 , 4 );

总结:可以看出当参数等于4个时候,参数的传递是以 rcx rdx r8 r9 来依次传递



当参数大于4个


c函数:LONG64 add(LONG64 a, LONG64 b, LONG64 c, LONG64 d  , LONG64 e , LONG64 f , LONG64 g )
{
return a + b + c + d + e + f + g;
}


汇编代码:
mov qword ptr [rsp+30h],7
mov qword ptr [rsp+28h],6
mov qword ptr [rsp+20h],5
mov r9d , 4
mov r8d , 3
mov edx , 2
mov ecx , 1
call add

调用代码:add(1 , 2 , 3 , 4 , 5 , 6 , 7);总结:可以看出当参数大于4个参数时候,多余的参数则以堆栈传递


当参数为结构体,且大小小于等于8字节
struct S
{
int x1;
int x2;
};

LONG64 add(S s1 )
{

return s1.x1 + s1.x2;
}

调用代码:
S s1 = {1 , 2};
add(s1);



汇编代码:
mov dword ptr [rsp+8] , 1
mov dword ptr [rsp+c] , 2
mov rcx , qword ptr[rsp+8]
call add

总结:如果参数为结构体且结构体小于等于8字节,在传递结构体参数时,应直接把结构体的内容放在寄存器中

当参数为结构体,且大小大于8字节
c函数:
struct S
{
int x1;
int x2;
int x3;
int x4;
};
LONG64 add(S s1 )
{
return s1.x1 + s1.x2 + s1.x3 + s1.x4;
}


调用代码:
S s1 = {1 , 2 , 3 , 4};
add(s1);



汇编代码:
mov dword ptr [rsp+8] , 1
mov dword ptr [rsp+c] , 2
mov dword ptr [rsp+10] , 3
mov dword ptr [rsp+14] , 4
lea rax , [rsp + 100h]lea rcx , [rsp + 8]
mov rdi , rax
mov rsi , rcx
mov rcx , 10hrep
movs byte ptr[rdi] , byte ptr[rsi]
lea rcx , [rsp + 100h]
call add

总结:通过以上代码可以看出,如果参数是结构体且大于8个字节,在传递参数时,会先把结构体内容复制到栈空间中,再把结构地址当成函数的参数来传递



thiscall调用约定,他是c++类的成员函数调用约定:


c代码:
class CAdd
{
public:
int add(int nNum1, int nNum2)
{
  return nNum1 + nNum2;
}
};



调用代码:
CAdd ob;
ob.add(1 , 2);



汇编代码:
mov r8d , 2
mov edx , 1

lea rcx , [rsp + 4]
call  CAdd::add

总结:通过这个实例可以知道,类的成员函数调用,参数传递方式和普通函数没有很大区别,唯一区别是,成员函数调用会隐藏的传递一个this指针参数








发表于 2020-2-24 21:04:35 | 显示全部楼层   山东省济南市
6666666666
回复 支持 反对

使用道具 举报

发表于 2019-11-27 19:07:39 | 显示全部楼层   吉林省长春市
分析的挺好,支持一下!
回复 支持 反对

使用道具 举报

发表于 2019-11-11 12:27:57 | 显示全部楼层   云南省昆明市
6666666666
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2019-10-16 12:32:31 | 显示全部楼层   湖北省武汉市
感谢分享 感谢分享
回复 支持 反对

使用道具 举报

结帖率:100% (3/3)
发表于 2019-10-13 11:40:53 | 显示全部楼层   广东省河源市
非常好  但是用E该怎么调用···
回复 支持 反对

使用道具 举报

结帖率:50% (1/2)
发表于 2019-10-10 23:51:46 | 显示全部楼层   江苏省宿迁市
非常好  但是用E该怎么调用···
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表