Memory Mapperは軽量なライブラリで、ユーザーが指定したプロセスへのプロセスインジェクション、または自己インジェクション(インジェクションを実行しようとしている現在のプロセスにアセンブリを注入する手法)を用いて、ネイティブアセンブリとマネージドアセンブリの両方をメモリにマッピングする機能を提供します。このライブラリには、アセンブリのマッピングだけでなく、暗号化、復号化、さまざまな量の暗号学的に強力なデータの生成を行うツールも含まれています。
注: (Memory Mapperを使用する実行中のアセンブリのみ* — スタブやシェルコードには適用されません)*
PE (ポータブル実行可能ファイル) の構造を調査する
マネージドアセンブリとネイティブアセンブリの両方からリソースを読み取る
プロセスインジェクションと自己インジェクションを使用してネイティブアセンブリをメモリにマッピングする
プロセスインジェクションおよびその他の手法を使用してマネージドアセンブリをメモリにマッピングする
任意のファイルサイズのファイルのバイト配列を取得する
ファイル全体と生のバイトを暗号化および復号化する
ファイルと生のバイトのチェックサムを生成および検証する
SecureRandom オブジェクトを使用して暗号学的に強力なランダムデータを生成する
複数の暗号化およびハッシュアルゴリズムがバンドルされています
この例では、NativeLoader ツールを使用してネイティブアセンブリを静的にメモリにマッピングする方法を示します。この例では、ディスクからファイルのすべてのバイトを読み込んでファイルをロードし、そのバイトに関連付けられたPE (ポータブル実行可能ファイル) を直接メモリに注入します。ネイティブローダーと、私の Amaterasu ライブラリにある動的コードコンパイルを組み合わせることで、すべてをインメモリコードからオンザフライのコードコンパイルとインジェクションを実現できます。
using System;
using System.IO;
using System.Reflection;
using MemoryMapper;
namespace Example
{
class Program
{
static void Main(string[] args)
{
// Get the bytes of the file we want to load.
var filePath = "FileToReadBytesOf";
var fileBytes = File.ReadAllBytes(filePath);
// Check if the assembly is managed or native.
bool isManaged = false;
try
{
// Note — this is one of the simplest variations of checking assemblies
var assemblyName = AssemblyName.GetAssemblyName(filePath);
if (assemblyName != null)
if (assemblyName.FullName != null)
isManaged = true;
}
catch { isManaged = false; }
// Try loading the assembly if it's truly native.
if (!isManaged)
{
NativeLoader loader = new NativeLoader();
if (loader.LoadAssembly(fileBytes))
Console.WriteLine("Assembly loaded successfully!");
else
Console.WriteLine("Assembly could not be loaded.");
}
// Wait for user interaction.
Console.Read();
}
}
}
この例では、バイトを読み込むか、埋め込みバイト配列を使用してマネージドアセンブリを静的にメモリにマッピングし、ManagedLoader を使用して現在実行中のプロセスに注入する方法を示します。提供されている ManagedLoader ツールを使用して、ほぼすべてのマネージドアセンブリをマッピングできます。
using System;
using System.IO;
using System.Reflection;
using MemoryMapper;
namespace Example
{
class Program
{
static void Main(string[] args)
{
// Get the bytes of the file we want to load.
var filePath = "FileToReadBytesOf";
var fileBytes = File.ReadAllBytes(filePath);
// Check if the assembly is managed or native.
bool isManaged = false;
try
{
// Note — this is one of the simplest variations of checking assemblies
var assemblyName = AssemblyName.GetAssemblyName(filePath);
if (assemblyName != null)
if (assemblyName.FullName != null)
isManaged = true;
}
catch { isManaged = false; }
// Try loading the assembly if it's truly managed.
if (isManaged)
{
// Set the name of a surrogate process - the process we'll inject into.
var processName = "explorer.exe"; // Can also be the current process's name for self-injection.
ManagedLoader loader = new ManagedLoader();
if (loader.LoadAssembly(fileBytes, processName))
Console.WriteLine("Assembly loaded successfully!");
else
Console.WriteLine("Assembly could not be loaded.");
}
// Wait for user interaction.
Console.Read();
}
}
}
アイコン: DesignBolts
http://www.designbolts.com/
Copyright © ∞ Jason Drawdy
All rights reserved.
MIT ライセンス (MIT)
ここに、本ソフトウェアのコピーを入手するすべての人に対し、無償で本ソフトウェアの使用、複製、変更、統合、出版、配布、サブライセンス、および/または販売を許可します。また、本ソフトウェアが提供されるすべての人物に対しても、以下の条件に従うことを条件として、同様の権利を許可します。
上記の著作権表示およびこの許可表示は、本ソフトウェアのすべてのコピーまたは重要な部分に含まれるものとします。
本ソフトウェアは「現状のまま」提供され、明示または黙示を問わず、商品性、特定目的への適合性、および非侵害の黙示の保証を含むがこれに限定されない、いかなる種類の保証もありません。いかなる場合においても、著作者または著作権保持者は、契約行為、不法行為、またはその他の行為に基づく場合を問わず、本ソフトウェアまたは本ソフトウェアの使用もしくはその他の取引に起因または関連して生じた、いかなる請求、損害、またはその他の責任についても一切の責任を負いません。
本通知に含まれている場合を除き、上記の著作権保持者の名称は、事前の書面による許可なしに、本ソフトウェアの販売、使用、またはその他の取引を宣伝または促進するために使用してはなりません。