【问题标题】:Equivalent of VirtualProtectEx/CreateRemoteThread in Linux?相当于 Linux 中的 VirtualProtectEx/CreateRemoteThread?
【发布时间】:2016-02-05 00:17:25
【问题描述】:

我想知道在库中或作为系统调用中是否存在允许进程与其他进程空间交互的 Windows API 的等效版本,这意味着修改第二个进程的流程。 这是在正在运行的进程中注入一个.so而不杀死它。

谢谢!

【问题讨论】:

  • 如果这是题外话,那么我不知道什么是题外话了。
  • 你不应该在 Linux 中要求相当于 Windows 的Foo,你应该解释你的目标和动机,并询问如何在 Linux 上做到这些。没有理由说 Windows 中的每个函数在 Linux 中都有直接的等价物(反之亦然)
  • 我的目标和动机在我的帖子末尾清楚地解释了,我引用:“这是在正在运行的进程中注入 .so 而不会杀死它。”我意识到 Windows 中的每个函数都没有理由在 Linux 中具有直接等价物,这就是为什么我以“是或否”的方式提出这个问题。
  • 这怎么跑题了?
  • 不是离题的 IMO,但可能与 stackoverflow.com/q/10534841/886887 重复

标签: linux windows dll code-injection


【解决方案1】:

也许看看这里:CreateRemoteThread in Linux

我不知道比那里描述的更简单的方法。在 Windows 上,你有这个 像 VirtualProtectEx 这样的花哨的 API。在 Linux 上,您将编写一个 .so ,例如执行 pthread_create 在__attribute__((constructor)) 函数中。然后,您将通过 LD_PRELOAD 机制加载该 .so。

CreateRemoteThread 的下一个最好的事情是操作主线程 使用 ptrace API 的进程。但这会涉及

  1. 保持线程
  2. 保存其上下文
  3. 为 pthread_create 设置参数
  4. 将 IP 设置为 pthread_create 并执行
  5. 恢复旧上下文。

我认为操纵内存访问权限还涉及从进程上下文调用 mprotect。如上所述,最简单的方法 这样做不会使用 ptrace,而是使用预编译的共享对象。

【讨论】:

    【解决方案2】:

    在 Linux 上,有一种将代码注入程序的标准机制。您基本上定义了一个环境变量 LD_PRELOAD,它指定了一个在所有其他 .so 文件之前加载的 .so 库。 .so 中的函数将替换函数的标准版本。不需要像windows那样手动修改函数的汇编代码来插入你自己的代码的钩子。

    这是一个很好的教程:https://rafalcieslak.wordpress.com/2013/04/02/dynamic-linker-tricks-using-ld_preload-to-cheat-inject-features-and-investigate-programs/

    【讨论】:

    • LD_PRELOAD 仅与启动新进程一起使用。 OP 似乎正在寻找一种在已经运行的进程中注入代码的方法,就像 CreateRemoteThread 在 Windows 上所做的那样。 Windows 也有 LD_PRELOAD 的等价物。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多