zoukankan      html  css  js  c++  java
  • MamBa项目的插件编写-TikiTorch生成器

    因为在家闲的无事,便开始利用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加载

     成功反弹

  • 相关阅读:
    csharp上传文件到服务器指定文件夹问题
    c#上传文件到服务器指定文件夹问题
    jsp上传文件到服务器指定文件夹问题
    java上传文件到服务器指定文件夹问题
    asp.net上传文件到服务器指定文件夹问题
    .net批量下载图片
    连续肝了好几天,终于把Java面试必备最重要的基础知识【Java集合】知识点总结整理出来了。
    来晚了,秋招五投大厂,成功拿下三家Offer,最终入职美团,分享我的美团1-4面(Java岗)
    变秃了,也变强了!爆肝吐血整理出的超硬核JVM笔记分享!
    Spring框架及七大模块
  • 原文地址:https://www.cnblogs.com/wh4am1/p/12252397.html
Copyright © 2011-2022 走看看