美文网首页
加密与解密 笔记

加密与解密 笔记

作者: CMPEAX | 来源:发表于2018-11-03 10:41 被阅读0次

64位软件逆向技术

寄存器

64位通用寄存器的名称第一个字母从'E'改为'R',大小扩展到64位,数量增加了8个(R8~R15),扩充了8个128位的XMM寄存器。

函数

  1. 函数调用约定
  • x86应用程序的函数调用有stdcall、__cdecl、Fastcall等方式,但x64应用程序就只有一种寄存器快速调用约定。
  • 前四个用寄存器传递,超过四个多余的参数就放在栈里,入栈顺序从右到左。
  • 前四个参数存放的寄存器是固定的,分别是RCX、RDX、R8、R9.
  • 任何大于8字节或者不是1字节、2字节、4字节、8字节的参数必须由引用来传递(地址传递)
  • 所有浮点参数的传递都是使用XMM寄存器完成的。(在XMM0、XMM1、XMM2、XMM3)

函数的四个参数虽然使用寄存器来传递,但是栈仍然为这4个参数预留了空间(32字节)。
且函数执行体内一般将参数值填充进预留栈空间内并进行数据填充。
参数使用的栈空间由函数调用者负责平衡。

64位环境下,使用RAX寄存器来保存函数返回值。(返回值类型由浮点类型使用MMX0寄存器返回)。

结构体

  • 参数不超过八字节
    传递结构体参数时,直接将结构体内容放在寄存器里。通过访问寄存器高位和低位分别访问结构体成员。
  • 参数超过八字节
    传递参数时,会先将结构内容复制到栈空间中,再把结构体地址当成函数的参数来传递(引用传递)。在函数内部通过“结构体地址+偏移”的方式访问结构体内容。

数据结构

  1. 局部变量
    预留栈空间在低地址,局部变量空间在高地址。

  2. 全局变量
    先定义的在低地址,后定义的在高地址。

  3. 数组
    数组从低地址到高地址进行顺序排列的。
    数组占用大小 : sizeof(类型) * 个数
    寻址公式数组元素的地址 = 数组首地址 + sizeof(数组类型) * 下标
    多维数组也可以看成一个一维数组。
    二维寻址公式数组元素地址 = 数组首地址 + sizeof(一维数组类型)*下标1+sizeof(数组类型)*下标2

    访问二维数组特征:

    • [数组首地址 + n]
    • [数组收地址 + 寄存器 * n]

控制语句

相关文章

网友评论

      本文标题:加密与解密 笔记

      本文链接:https://www.haomeiwen.com/subject/lgckxqtx.html