因为在家闲的无事,便开始利用winform编写了一个插件式工具。
下面将介绍插件编写的过程。
插件项目地址:https://github.com/sf197/Mamba-Plugin
一、插件构建
插件可以通过直接建立Winform工程来编写,上手简单,及易修改。
这里工具对插件有个硬性要求,那就是工具给插件留下的窗口只有System.Drawing.Size(1027, 481)。(由于比较菜,暂时没想到有什么好的定位方式。
接下来就是拖放控件了,这里就不再描述了。
二、制作动态生成器
由于这款插件是基于TikiTorch编写的,所以需要一个获取shellcode的窗口和一个输出路径
生成的原理也很简单,就是通过CompileAssemblyFromSource编译源代码
CSharpCodeProvider provider = new CSharpCodeProvider(); //设置好编译参数 CompilerParameters paras = new CompilerParameters(); //引用第三方dll paras.ReferencedAssemblies.Add(@"System.dll"); //是否内存中生成输出 paras.GenerateInMemory = false; //是否生成可执行文件 paras.GenerateExecutable = false; //选择生成的路径 paras.OutputAssembly = path; CompilerResults cr = provider.CompileAssemblyFromSource(paras, code); if (cr.Errors.Count > 0) { StringBuilder sb = new StringBuilder(); foreach (var er in cr.Errors) sb.AppendLine(er.ToString()); MessageBox.Show(sb.ToString()); } else { MessageBox.Show("编译成功"); }
我在这里创建了一个GetCode类,里面有个函数用于获取我要动态生成的代码并传入到CompileAssemblyFromSource中去
但是由于生成后的Dll需要应用TikiLoader.dll,可以直接用ReferencedAssemblies.Add添加,但是这有个弊端就是生成后的dll也必须在namespace中引入TikiLoader
于是乎找到一个解决方案
1.当程序加载该dll失败的时候会触发AssemblyResolve事件
2.监听该事件,放事件触发后从Resource资源文件中加载该dll
具体代码:
static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) { //获取加载失败的程序集的全名 var assName = new AssemblyName(args.Name).FullName; if (args.Name.Contains(""TikiLoader"")) { //读取资源 using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(""TikiLoader.dll"")) { var bytes = new byte[stream.Length]; stream.Read(bytes, 0, (int)stream.Length); return Assembly.Load(bytes);//加载资源文件中的dll,代替加载失败的程序集 } } throw new DllNotFoundException(assName); }
在从构造函数中添加事件监听
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
这时候只需要在生成的时候添加资源就可以了
paras.EmbeddedResources.Add(System.Environment.CurrentDirectory + @"TikiLoader.dll");
三、修改插件接口
当插件界面大致完成后,引用插件基类PlugInBase.dll,开始就修改Form继承的接口为UserControlBase
并在窗口初始化的构造函数中设置插件的名称,插件项目名称要包含以“Uc”的命名,否则无法被工具读取。
public partial class Form1 : UserControlBase { public Form1() { InitializeComponent(); ucName = "UcTikiTorch"; // 插件名称 } }
并删除Program.cs
修改生成类型为类库,并放入MamBa程序的Plugins目录下
通过msf生成payload来测试生成结果
打开powershell加载
成功反弹