MemorySharp 汇编注入实战:用 FASM 编译器在远程进程执行任意代码
【免费下载链接】MemorySharpA C# based memory editing library targeting Windows applications, offering various functions to extract and inject data and codes into remote processes to allow interoperability.项目地址: https://gitcode.com/gh_mirrors/me/MemorySharp
MemorySharp 是一款基于 C# 的内存编辑库,面向 Windows 应用程序开发,支持在远程进程中读取和写入数据,并通过内嵌的 FASM 编译器实现汇编注入,从而执行任意代码。本文将从零开始,带你完成一次完整的 MemorySharp 汇编注入实战,掌握在远程进程执行任意代码的三种核心写法,并理解调用约定的选择技巧。
什么是 MemorySharp?
简单来说,MemorySharp 是一个C# 内存编辑库,它把繁琐的 Win32 API 调用(如ReadProcessMemory、WriteProcessMemory、VirtualAllocEx、CreateRemoteThread等)封装成一套简洁、安全的面向对象接口。你只需要几行 C# 代码,就能完成:
- 📖 读写远程进程的整数、字符串、结构体等数据
- 💾 分配与释放远程内存,修改内存保护属性
- 🧵 创建、挂起、恢复远程线程,获取线程退出码
- 📦 注入 / 卸载 DLL 模块,枚举模块与函数
- 🖥️ 与远程窗口交互,模拟键盘鼠标输入
- ⚙️汇编注入:编写 FASM 语法汇编,注入并在远程进程执行
其中,"汇编注入 + 远程执行"是 MemorySharp 最有魅力的能力之一,也是本文的主角。
FASM 编译器:汇编注入的第一步
在远程进程执行任意代码之前,必须先解决一个核心问题:汇编指令如何变成机器码?
MemorySharp 内置了FASM(Flat Assembler)编译器,封装在Fasm32Assembler类中,源码见 Fasm32Assembler.cs。它的工作非常贴心:
- 自动为你的汇编代码添加
use32(32 位模式)指令; - 根据指定的基地址自动生成
org 0xXXXXXXXX(重定位)指令; - 调用 Fasm.NET 完成汇编,返回机器码字节数组。
这意味着你完全不用关心地址重定位的细节,只需要写裸的 mnemonics(助记符)即可。AssemblyFactory在构造时会自动初始化这个 FASM 编译器,参考 AssemblyFactory.cs。
第一种写法:Inject 注入汇编代码
Inject方法负责把汇编代码编译并写入远程进程的指定地址。它有两种常见形态:
① 注入到指定地址
var sharp = new MemorySharp(process); // 绑定远程进程 sharp.Assembly.Inject( new[] { "push 0", "add esp, 4", "retn" }, someAddress);② 自动分配内存并注入(返回地址)
var memory = sharp.Assembly.Inject("mov eax, 66\nretn"); // memory.BaseAddress 就是代码所在位置第二种写法最省心:Inject内部会先调用Memory.Allocate自动分配一块远程内存,再把编译好的机器码写进去,并返回一个RemoteAllocation对象(相关实现见 MemoryFactory.cs)。
第二种写法:InjectAndExecute 注入并立即执行
如果不想分两步,InjectAndExecute能一步到位——注入后立刻在远程进程中创建一个新线程来执行这段代码,并把线程的退出码返回给你。例如,测试代码 AssemblyFactoryTests.cs 中就有这样的例子:
var ret = sharp.Assembly.InjectAndExecute<int>( new[] { "use32", "mov eax, 66", "retn" }); // ret == 66可以看到,执行完成后EAX寄存器的值(66)会作为线程退出码被读回 C# 侧。这就是"在远程进程执行任意代码并拿到返回值"的标准套路,非常适合用来验证一段注入代码是否生效。
第三种写法:AssemblyTransaction 事务注入(推荐)
如果你要注入的代码较长、需要按顺序拼装多行指令,AssemblyTransaction事务模式是更优雅的选择。它把多条 mnemonics 收集起来,在对象被释放(Dispose)时自动完成注入与执行:
using (var t = sharp.Assembly.BeginTransaction()) { t.AddLine("use32"); t.AddLine("mov eax, 66"); t.AddLine("retn"); } // 离开 using 块后,代码已自动注入并执行事务支持三个实用特性(源码见 AssemblyTransaction.cs):
AddLine/InsertLine:追加或插入任意 mnemonics,支持格式化字符串;autoExecute参数:控制释放时是否自动执行,设为false可只注入不运行;GetExitCode<T>():执行结束后取出线程退出码,转为任意类型。
调用远程函数:4 种调用约定
汇编注入的终极形态是直接调用远程进程里的 API 函数。不同的函数使用不同的调用约定(参数入栈顺序、栈清理责任方都不同),MemorySharp 通过CallingConventionSelector自动生成对应的 push / call / add esp 指令,封装细节见 CallingConventionSelector.cs。
| 调用约定 | 参数传递 | 栈清理 | 典型场景 |
|---|---|---|---|
| Cdecl | 逆序压栈 | 调用方 | GCC 编译的 C 函数 |
| Stdcall | 逆序压栈 | 被调用方 | Win32 API |
| Fastcall | 前两个参数放 ECX / EDX | 被调用方 | 编译器优化 |
| Thiscall | this 指针放 ECX | 被调用方 | C++ 成员函数 |
最常见的用法是调用user32.dll里的MessageBoxA(Stdcall 约定),README 里有一个非常经典的"一行调用"示例:
sharp["user32"]["MessageBoxA"] .Execute(CallingConventions.Stdcall, 0, "Hello", "Title", 0);Execute方法会自动完成参数封送(字符串会在远程进程动态分配)、调用以及参数清理,整个过程对调用方完全透明。你甚至可以用Execute<T>泛型版本直接把返回值取成布尔值或结构体。
快速上手:完整的实战步骤
总结一下,一次完整的MemorySharp 汇编注入实战只需要四步:
- 绑定进程:
var sharp = new MemorySharp(process); - 编写汇编:用 FASM 语法写 mnemonics,注意以
retn结尾; - 选择注入方式:
Inject(只注入)、InjectAndExecute(注入+执行)或BeginTransaction(事务); - 读取结果:通过线程退出码(EAX)取回执行结果。
如果需要传参数,Execute(address, callingConvention, params dynamic[] parameters)会自动把参数封送到远程进程内存并在执行结束后释放——这部分逻辑封装在 AssemblyFactory.cs 的Execute<T>重载中。
安全与合规提醒
⚠️ 需要特别强调:在远程进程执行任意代码具有极大风险。注入错误代码可能导致目标进程崩溃,甚至触发安全软件的拦截。请务必遵守以下原则:
- 只在自己拥有或明确授权的程序上进行测试;
- 注入前做好数据备份,优先使用事务模式便于回滚;
- 不要将本教程技术用于游戏外挂、恶意软件等非法用途;
- 学习用途建议先用
Process.GetCurrentProcess()对自己当前进程做练习。
参与开源:项目如何协作
MemorySharp 采用经典的Git Flow 分支模型组织开发:master存放稳定版本,develop存放日常开发,功能分支、发布分支、热修复分支各有前缀(feature-、release-、hotfix-),架构图如下:
如果你也想贡献代码,可以克隆仓库后基于develop分支创建自己的功能分支:
git clone https://gitcode.com/gh_mirrors/me/MemorySharp结语
从内置 FASM 编译器自动完成汇编与重定位,到Inject、InjectAndExecute、AssemblyTransaction三种注入方式,再到 4 种调用约定的自动适配,MemorySharp 把"在远程进程执行任意代码"这件原本需要大量 Win32 编码的复杂工作,压缩成了几行直观的 C# 代码。掌握本文的实战流程后,无论是做进程互操作、调试辅助,还是学习 Windows 内存机制,你都有了趁手的工具。希望这篇 MemorySharp 汇编注入实战教程对你有所帮助!🚀
【免费下载链接】MemorySharpA C# based memory editing library targeting Windows applications, offering various functions to extract and inject data and codes into remote processes to allow interoperability.项目地址: https://gitcode.com/gh_mirrors/me/MemorySharp
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考