1
mirror of https://github.com/rapid7/metasploit-payloads synced 2025-03-30 22:19:17 +02:00

66 lines
2.4 KiB
C#
Executable File

using System;
using System.Runtime.InteropServices;
using System.Text;
namespace MSF.Powershell.Meterpreter
{
public static class Core
{
private delegate void MeterpreterInvoke(uint isLocal, byte[] input, uint inputSize, ref IntPtr output, ref uint outputSize);
private static MeterpreterInvoke _callback = null;
public static void SetInvocationPointer(Int64 callbackPointer)
{
System.Diagnostics.Debug.Write(string.Format("[PSH BINDING] Callback pointer being set to 0x{0:X}", callbackPointer));
_callback = (MeterpreterInvoke)Marshal.GetDelegateForFunctionPointer(new IntPtr(callbackPointer), typeof(MeterpreterInvoke));
System.Diagnostics.Debug.Write(string.Format("[PSH BINDING] _callback is {0}null", _callback == null ? "" : "not "));
}
public static string RandomString(int length)
{
var r = new Random();
var chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
var bytes = new byte[length];
for (int i = 0; i < length; ++i)
{
bytes[i] = (byte)chars[r.Next(chars.Length)];
}
return Encoding.ASCII.GetString(bytes);
}
internal static byte[] InvokeMeterpreterBinding(bool isLocal, byte[] input)
{
if (_callback != null)
{
IntPtr output = IntPtr.Zero;
try
{
uint outputLength = 0;
_callback(isLocal ? 1U : 0U, input, (uint)input.Length, ref output, ref outputLength);
if (output != IntPtr.Zero && outputLength > 0)
{
var result = new byte[outputLength];
Marshal.Copy(output, result, 0, result.Length);
return result;
}
}
finally
{
if (output != IntPtr.Zero)
{
System.Diagnostics.Debug.Write(string.Format("[PSH BINDINGS] Freeing up memory allocated from the C++ Binding: {0:X}", output));
Marshal.FreeCoTaskMem(output);
}
}
}
return null;
}
}
}