MemorySharp 汇编注入实战:用 FASM 编译器在远程进程执行任意代码
2026/8/19 20:09:38 网站建设 项目流程

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 调用(如ReadProcessMemoryWriteProcessMemoryVirtualAllocExCreateRemoteThread等)封装成一套简洁、安全的面向对象接口。你只需要几行 C# 代码,就能完成:

  • 📖 读写远程进程的整数、字符串、结构体等数据
  • 💾 分配与释放远程内存,修改内存保护属性
  • 🧵 创建、挂起、恢复远程线程,获取线程退出码
  • 📦 注入 / 卸载 DLL 模块,枚举模块与函数
  • 🖥️ 与远程窗口交互,模拟键盘鼠标输入
  • ⚙️汇编注入:编写 FASM 语法汇编,注入并在远程进程执行

其中,"汇编注入 + 远程执行"是 MemorySharp 最有魅力的能力之一,也是本文的主角。


FASM 编译器:汇编注入的第一步

在远程进程执行任意代码之前,必须先解决一个核心问题:汇编指令如何变成机器码?

MemorySharp 内置了FASM(Flat Assembler)编译器,封装在Fasm32Assembler类中,源码见 Fasm32Assembler.cs。它的工作非常贴心:

  1. 自动为你的汇编代码添加use32(32 位模式)指令;
  2. 根据指定的基地址自动生成org 0xXXXXXXXX(重定位)指令;
  3. 调用 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被调用方编译器优化
Thiscallthis 指针放 ECX被调用方C++ 成员函数

最常见的用法是调用user32.dll里的MessageBoxA(Stdcall 约定),README 里有一个非常经典的"一行调用"示例:

sharp["user32"]["MessageBoxA"] .Execute(CallingConventions.Stdcall, 0, "Hello", "Title", 0);

Execute方法会自动完成参数封送(字符串会在远程进程动态分配)、调用以及参数清理,整个过程对调用方完全透明。你甚至可以用Execute<T>泛型版本直接把返回值取成布尔值或结构体。

快速上手:完整的实战步骤

总结一下,一次完整的MemorySharp 汇编注入实战只需要四步:

  1. 绑定进程var sharp = new MemorySharp(process);
  2. 编写汇编:用 FASM 语法写 mnemonics,注意以retn结尾;
  3. 选择注入方式Inject(只注入)、InjectAndExecute(注入+执行)或BeginTransaction(事务);
  4. 读取结果:通过线程退出码(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 编译器自动完成汇编与重定位,到InjectInjectAndExecuteAssemblyTransaction三种注入方式,再到 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询