抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

Inline Hook(内联钩子注入)流程

  1. 构造跳转指令[JMP后的偏移量 = 目标地址 - 原地址 - jcc的指令长度]
  2. 在内存中找到欲HOOK函数地址,并保存欲HOOK位置处的前5个字节
  3. 将构造的跳转指令写入需HOOK的位置处
  4. 当被HOOK位置被执行时会转到自己的流程执行
  5. 如果要执行原来的流程,取消HOOK,还原被修改的字节
  6. 执行原来的流程
  7. 继续HOOK住原来的位置

  • 远程线程注入是指一个进程在另一个进程中创建线程的技术。是一种病毒木马所青睐的注入技术。

基础知识

  • 基地址(ImageBase): 当PE文件通过Windows加载器载入内存后,内存中的版本称为模块,映射文件的起始地址称为模块句柄,可通过句柄访问内存中其他数据结构,这个内存起始地址称为基地址。
  • 虚拟地址(VA): 在Windows系统中,PE文件被系统加载到内存后,每个程序都有自己的虚拟空间,这个虚拟空间的内存地址称为虚拟地址。
  • 相对虚拟地址(RVA): 可执行文件中,有许多地方需要指定内存中的地址。例如,应用全局变量时需要指定它的地址。为了避免在PE文件中出现绝对内存地址引入了相对虚拟地址,它就是在内存中相对于PE文件载入地址的偏移量。
  • 文件偏移地址(FOA): 当PE文件存储在磁盘中时,某个数据的位置相对于文件头的偏移量称为文件偏移地址(FOA)。文件偏移地址从PE文件中的第一个字节开始计数,起始值为0。

它们之间的关系:虚拟地址(VA) = 基地址(ImageBase) + 相对虚拟地址(RVA)

Windows PE

  • 可执行文件(Executable file)指的是可以由操作系统进行加载执行的文件
  • 可执行文件的格式:
    • Windows 平台
      PE(Portable Executable)文件结构
    • Linux 平台
      ELF(Executable and Linking Format)文件结构

  1. 面向对象编程思维
    • 提高代码的可复用率 => 更加合理的数据关系
  2. 隐式原型和显式原型
    • 对象的隐式原型和构造函数的显式原型的连接
  3. 原型链机制核心
    a. new: 执行前绑定this并指向空对象, 将对象的隐式原型指向函数的显式原型
    b. [[GET]]

理解原型链

  1. 理解new关键字的作用机制(写)
  2. 理解[[GET]](读)

  1. 变量的本质
  2. 深拷贝
  3. 垃圾回收

背景

设计一个方法doSomething来限制异步任务的最大并发数

async 函数可能包含 0 个或者多个 await 表达式。await 表达式会暂停整个 async 函数的执行进程并出让其控制权,只有当其等待的基于 promise 的异步操作被兑现或被拒绝之后才会恢复进程。promise 的解决值会被当作该 await 表达式的返回值。使用 async/await 关键字就可以在异步代码中使用普通的 try/catch 代码块。

this到底指向什么?

函数在调用时,JavaScript会默认给this绑定一个值

this的绑定和定义的位置(编写的位置)没有关系

this的绑定和调用方式以及调用的位置有关系

this是在运行时被绑定的