操作系统问题,关于函数地址空间

2020-08-21 16:41:43 +08:00
 ng29

如题, 假如进程里有函数 fun1, 再进程启动时,malloc 一页内存,拷贝 fun1 的内容到 malloc 出来的内存,称拷贝后的函数为 fun2, 调用 fun1 和 fun2 使用 不同的参数, 问 fun2 是不是可以正常执行?

考虑 fun2 是 fun1 改变了位置,如果有 jmp 指令是位置相关的,此时可不可以调整指令和字节数使得 fun2 可以正常运行直到 ret 返回。

2461 次点击
所在节点    程序员
34 条回复
liuminghao233
2020-08-21 19:08:16 +08:00
好像可以用 mprotect 改 x 权限
但 malloc 默认是不会给你 x 权限的
你把函数 copy 进去 带 x 权限的内存
把 rsp rbp 弄好
按照 x86 调用约定入参 rsi rdi...这些
然后直接 jmp 或者 call 就行了
lniwn
2020-08-21 19:13:01 +08:00
先说结论,是可行的,不过你不能用 malloc,而要用系统的内存分配 api,比如 win32 下的 HeapCreate,指定 PAGE_EXECUTE 权限。
既然可以静态编译,那说明你已经有对应的库文件了,ida 抠出来,重新实现一遍是最简单的方式,然后 hook 原函数到新实现的函数。
limboMu
2020-08-21 19:22:11 +08:00
还可以把代码段的数据拷贝到堆区执行吗?学到了,不过执行的时候参数都是会在栈区保留,唯一的区别就是如果函数内有超出函数边界的相对跳转,就有响应的,其他的情况应该没啥问题。
ng29
2020-08-21 19:49:32 +08:00
@liuminghao233 是这样的 不过我有一个顾虑 就是函数里面有跳转指令的时候 可能有相对位置的 不知道这样的怎么跳转 想找一个通用的方案(适用于绝大多数函数)
ng29
2020-08-21 19:54:36 +08:00
@lniwn 对一个函数比较好操作,如果做成通用的,有没有推荐的参考资料或代码
ng29
2020-08-21 20:08:19 +08:00
原来的问题 也可以改成, 拿一块 代码段 到 自己申请的内存并 变为 位置无关代码
liuminghao233
2020-08-21 20:55:50 +08:00
@ng29
你需要禁止编译器生成位置无关代码 再加上-mcmodel=large
比如说 g++ main.cpp -o main -fno-pie -mcmodel=large
这样你引用变量的地址是绝对地址 而不是 rip relative 的
yangbonis
2020-08-21 21:53:37 +08:00
你是在说 dlopen 吗?
yangbonis
2020-08-21 22:03:47 +08:00
或者反射?
ng29
2020-08-21 22:26:10 +08:00
@liuminghao233 感谢 minghao 我做实验试下
mingl0280
2020-08-21 22:38:41 +08:00
可行,远程线程代码注入中的一步就是这么实现的.
VirtualAllocEx 分配内存同时指定 PAGE_EXECUTE_READWRITE 权限以后用 WriteProcessMemory 将编译后的函数的首地址和函数长度的内存复制到远程线程中,然后给一发 CreateRemoteThread 就可以直接在远程进程里跑你的函数了.
具体资料你完全可以参考 WINAPI 的远程代码注入.
mingl0280
2020-08-21 22:43:28 +08:00
@ng29 函数内跳转指令不存在问题,只要你的函数内跳转指令符合以下要求:
- 不指向在本程序内定义的其它函数,即跳转指令执行的都是处于共享内存区的.
- 不存在可能触发 longjmp 或者其它导致函数退出的指令
另外禁止位置无关代码不会有效的,代码空间不一样了,没法跳转到你自己的内存区继续执行的.
pythonee
2020-08-22 14:05:30 +08:00
期待实验结果
ng29
2020-11-02 17:18:48 +08:00
测试是可以的 一个函数挪动位置,修改 rip relative 的指令,将 偏移修正后 就可以正常调用了,可以作为 hook 的一种方式 总结了一下中间学的东西 http://www.oneyearago.me/2020/09/27/hook_and_internal/

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/700313

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX