首页
社区
课程
招聘
[原创]Windows X64汇编入门(2)
发表于: 2007-5-7 22:51 30051

[原创]Windows X64汇编入门(2)

2007-5-7 22:51
30051

tankaiha

    五一长假就要结束了,总算有时间好好睡了几个懒觉。今天醒来后想到的第一件事就是,该写第二篇了。
    64位技术现在还不成熟,没有好调试器,但是我们搞技术的总是对新东西充满了好奇和热情。这个理由就足够我们现在开始学习64位汇编了!OK,Let’s go on。

1.        再说Calling convention
    关于API的调用方式,在入门(1)中说了一些,不过感觉有必要再讲两点。一是在调用API时椎栈的框架,也就是Stack Frame,二是利用反汇编64位C/C++程序来研究calling convention。
    先说Stack Frame。图1是一个通用的椎栈框架。


    在一个使用STDCALL的32位程序中,stack frame的四项工作:
(1)        传入参数的调用;
(2)        在返回caller时,callee要负责平衡椎栈;
(3)        给局部变量提供空间;
(4)        保证ebx、esi、edi和ebp四个寄存器的值不变(这种寄存器被称为non-volatile)。
在64位环境中,少了一个平衡椎栈的任务,因为平衡椎栈的工作由caller负责了,因此callee的stack frame只剩下三项工作:
(1)        将寄存器传入的参数和其它超过4个以上的参数在椎栈上保存(入栈);
(2)        给局部变量提供空间;
(3)        保证non-volatile寄存器的值不变,包括ebp、ebx、rdi、rsi、r12到r15,xmm6到xmm15。

    所以,在一个函数的开始往往有如下代码:

        MOV [RSP+8h],RCX
        MOV [RSP+10h],RDX
        MOV [RSP+18h],R8
        MOV [RSP+20h],R9
        PUSH RBP
        MOV RBP,RSP

    而在返回时会有如下代码:
        LEA RSP,[RBP]
        POP RBP
        RET

    图2摘自GoASM的帮助文档,上文描述的情况在图中一目了然。


    如果能在VC中编译64位C/C++程序,再用IDA反汇编,不是挺好的吗?正确,这正是我们玩儿逆向工程的人喜欢的方法。Visual Studio 2005的64位开发环境设置网上有,这里不多说了。以一个C/C++的代码为例:

// Message handler for about box.
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	UNREFERENCED_PARAMETER(lParam);
	switch (message)
	{
	case WM_INITDIALOG:
		return (INT_PTR)TRUE;

	case WM_COMMAND:
		if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
		{
			EndDialog(hDlg, LOWORD(wParam));
			return (INT_PTR)TRUE;
		}
		break;
	}
	return (INT_PTR)FALSE;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (11)
雪    币: 2506
活跃值: (1030)
能力值: (RANK:990 )
在线值:
发帖
回帖
粉丝
2
64位的操作系统没玩过,32位的程序应该也能在上面运行吧?如果是GoASM的话,RadASM 倒是对它支持。另一个支持的IDE是 Easy Code:
http://www.easycoder.org/English/Download.htm

关于 GoASM,还可以看看Donkey的网站:
http://www.assembler.ca/
2007-5-7 23:26
0
雪    币: 415
活跃值: (34)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
午夜一口气看完。受益非浅。
2007-5-8 03:09
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
一口气看完。受益非浅。
2007-5-8 12:05
0
雪    币: 5275
活跃值: (456)
能力值: (RANK:1170 )
在线值:
发帖
回帖
粉丝
5
easy coder支持Goasm的32位,而且支持非常好,但64位好像差点,而且扩展性比radasm差点。

radasm可以设置成完全支持64位goasm汇编。
2007-5-8 19:51
0
雪    币: 707
活跃值: (1301)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
6
学习.....
2007-5-8 22:24
0
雪    币: 78
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
x64不能用_asm{}!!!!!Q!Q!Q!Q!Q!
2013-7-6 10:48
0
雪    币: 2664
活跃值: (3401)
能力值: ( LV13,RANK:1760 )
在线值:
发帖
回帖
粉丝
8
Mark,留名...
2014-5-4 18:33
0
雪    币: 2275
活跃值: (2391)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
有所收获,顶贴表示感谢!
2016-6-8 23:46
0
雪    币: 333
活跃值: (161)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
学习了 膜拜大神 ···
2016-6-11 22:59
0
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
学习了 。。。留名...
2016-12-27 10:29
0
雪    币: 14
活跃值: (126)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
挖个坟,不知道作者还在不在,就想问问这方面的资料masm 64位的,从头到脚学一遍的那种
2020-11-6 14:36
0
游客
登录 | 注册 方可回帖
返回
//