x64(学习笔记) - 3(x64InlineHook)

inlineHook 过程

  1. 选择hook方式
  2. 获取hook地址(如果是导入表的函数注意jmp)
  3. 计算hook掉的字节(汇编引擎 / 手动计算)
  4. 保存要被替换掉的汇编,计算被替换掉字节下一行的地址
  5. 构建hook shellcode
  6. shellCode替换掉目标地址的代码(为了不破坏原有寄存器,需要保存当前寄存器,火哥推荐的是 构建的shellcode 使用asm push所有寄存器 然后提升栈顶 调用自己的函数 恢复栈顶 然后pop)
  7. 构建调用原函数的 shell code, 执行被替换掉的汇编,然后jmp到之前存储的地址

要点

  • 因为原有call都是相对偏移,如果hook call相关的 比较麻烦
  • 不能直接hook 函数的地址 因为可能会有jmp跳转,直接调用的函数的地址 可能不是函数头是jmp
    需要使用GetModuleHandleA 然后再GetProcAddress 获取到函数地址

注意

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

要点

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

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

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

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

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

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

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

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


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