1.调用约定
1.1 32位
1.c/c++默认调用约定是_cdecl,返回值在EAX中,该调用规定参数按照从右到左的顺序入栈,由调用者负责清除栈。
2.pascal 语言的调用约定是pascal,参数按照从左到右的方式入栈,函数自身清理堆栈,返回值在EAX中。VC 中已经废弃了这种调用方式。
3.Win32API的调用约定是stdcal,参数从右到左的方式入栈,函数自身清理堆栈,返回值在EAX中。
4.Fastcall通过 CPU 寄存器来传递参数。他用 ECX 和 EDX 传送前两个双字(DWORD)或更小的参数,剩下的参数按照从右至左的方式入栈,函数自身清理堆栈,返回值在 EAX 中。Microsoft Visual C++ 编译器在采用 Fastcall 规范传递参数时,左边的2个不大于4字节(DVORD)的参数分别放在ecx 和edx 奇存器中,寄存器用完后就要使用栈,其余参数仍然按从右到左的顺序压人栈,被调用的西数在返回前清理传送参数的栈。浮点值、远指针和_in164 类型总是通过栈来传递的。
5.thiscall是唯一一个不能明确指明的函数修饰, 因为thiscall不是关键字。它是C++类成员函数缺省的调用约定。由于成员函数调用还有一个this指针, 因此必须特殊处理, thiscall意味着:参数从右向左入栈。如果参数个数确定, this指针通过ecx传递给被调用者, 如果参数个数不确定, this指针在所有参数压栈后被压入堆栈,对参数个数不定的, 调用者清理堆栈, 否则函数自己清理堆栈。
1.2 64位
x64应用程序只有1种寄存器调用约定。前4个参数使用寄存器传递,如果参数超过 4个,多余的参数就放在栈里,人栈顺序从右到左,由函数调用方平衡栈空间。前4个参数存放的寄存器是固定的,分别是第1个参数RCX、第2个参数RDX、第了个参数R8、第4个参数 R9,其他参数从右往左依次人栈。任何大于8字节或者不是1 字节、2字节、4字节、8字节的参数必须由引用来传递(地址传递)。所有浮点参数的传递都是使用 XMM 寄存器完成的,它们在 XMMO、XMIMI、XMM2 和XMM3 中传递。
2、OD常用快捷键 指令
快捷键 | 功能 |
Ctrl+F2 | 重启程序,即重新启动被调试程序。如果当前没有调试的程序,OllyDbg会运行历史列表[historylist]中的第一个程序。程序重启后,将会删除所有内存断点和硬件断点。 |
Alt+F2 | 关闭,即关闭被调试程序。如果程序仍在运行,会弹出一个提示信息,询问您是否要关闭程序。 |
F7 | 单步步入到下一条命令,如果当前命令是一个函数[Call],则会停在这个函数体的第一条命令上。如果当前命令是含有REP前缀,则只执行一次重复操作。 |
F8 | 单步步过到下一条命令。如果当前命令是一个函数,则一次执行完这个函数(除非这个函数内部包含断点,或发生了异常)。如果当前命令是含有REP前缀,则会执行完重复操作,并停在下一条命令上。 |
F9 | 让程序继续执行。 |
Alt+B | 显示断点窗口。在这个窗口中,您可以编辑、删除、或跟进到断点处。 |
Alt+C | 显示CPU窗口。 |
Alt+E | 显示模块列表[list of modules]。 |
Alt+K | 显示调用栈[Call stack]窗口。 |
Alt+M | 显示内存窗口。 |
当CPU窗口中的反汇编面板处于激活状态时,常用快捷间:
快捷键 | 功能 |
Alt+退格键 | 撤消所选部分的修改,以备份数据的相应内容替换所选部分。仅当备份数据存在且与所选部分不同时可用。 |
F2 | 在首个选择的命令上开关INT3 断点[Breakpoint],也可以双击该行第二列。 |
Ctrl+E | 以二进制(十六进制)格式编辑所选内容。 |
Ctrl+G | 转到某地址。该命令将弹出输入地址或表达式的窗口。该命令不会修改 EIP。 |
分号(;) | 添加注释[comment]。显示添加注释窗口[Add label]或修改注释窗口[Changelabel],您可在此输入与首条所选命令的第一个字节相关联的注释(注释串会显示在最后一列中)。 |
3、IDA常用快捷键
快捷键 | 功能 |
空格键 | 切换反汇编窗口(列表视图&图形视图) |
G | 定位地址 |
X | 交叉引用 |
TAB | 汇编指令和伪代码之间切换 |
双击 | 转到定义处 |
; | 输入的注释,所有交叉参考处都会出现, |
: | 输入的注释只在该处出现 |
F5 | 显示C伪代码 |
Alt+t | 打开文本搜索对话框 |