x64(学习笔记) - 1(函数逆向)

要点

  • 在x64默认下不使用rbp寻址,使用rsp寻址

  • 在x64下栈是静态的栈,函数开头会默认开辟好所有的栈
    20200825172443

  • 栈帧 - 栈顶 到 栈底的高度

  • x64中栈帧是静态的,默认就开辟好了

  • 在x64中 修改rsp 可能是 sub 也可能是 lea

  • 在x64中 堆栈回溯 需要计算rsp 来回溯堆栈

  • 在x64中 ret 一般都没有参数 因为栈是静态默认开辟好的

  • 48位有效地址有多少有效内存呢?2^48=40000G

  • 物理地址有效内存 2^40=1024G 物理机的物理线有多少跟

  • 64位下 E9 call 是模块 call 上下2G范围

  • 64位下 跨大地址调用

    1
    2
    3
    4
    push rax;                 1个字节
    mov rax,0x123456789; 10个字节
    push rax; 1个字节
    ret; 1个字节
    1
    2
    3
    push rax;                 1个字节
    mov rax,0x123456789; 10个字节
    jmp rax; 2个字节

    因为会破坏寄存器所以到目标地址后需要pop rax;

  • FF 25(FF 15) 绝对调 jmp + 绝对地址 FF 25 00 00 00 00 XX XX XX XX XX XX XX XX (14个字节) 在头部(尾部)挂hook需要6个字节就够了

注意

  • 在写代码的时候,尽量少直接传递结构体(浪费性能,会多次复制结构)

反调试

  • 回溯堆栈 看看来源 是不是自己模块的函数
  • 伪造调用 调用完挂hook / veh 在修复
评论

:D 一言句子获取中...

加载中,最新评论有1分钟缓存...