ربط/غلاف WIP .NET أكثر روعة قليلاً لمحرك Unicorn.
واجهة برمجة التطبيقات (API) معرضة جدًا للتغييرات في الوقت الحالي.
هنا مثال على كيفية استخدامه. وهذا أيضًا هو نفس المثال الموجود في الوثائق الرسمية المتوفرة هنا ولكن بلغة C# وباستخدام Unicorn.Net.
using ( var emulator = new X86Emulator ( X86Mode . b32 ) )
{
ulong addr = 0x1000000 ;
byte [ ] x86code =
{
0x41 , // INC ECX
0x4a // DEC EDX
} ;
var ecx = 0x1234 ;
var edx = 0x7890 ;
// Map 2mb of memory.
emulator . Memory . Map ( addr , 2 * 1024 * 1024 , MemoryPermissions . All ) ;
emulator . Registers . ECX = ecx ;
emulator . Registers . EDX = edx ;
emulator . Memory . Write ( addr , x86code , x86code . Length ) ;
emulator . Start ( addr , addr + ( ulong ) x86code . Length ) ;
Console . WriteLine ( emulator . Registers . ECX ) ;
Console . WriteLine ( emulator . Registers . EDX ) ;
}
القراءة والكتابة للسجلات.
لا توجد حاليًا طريقة للكتابة إلى السجلات باستخدام معرفات السجل، ولكن هذا قد يتغير.
// Assume emulator is an instance of the X86Emulator type.
// Reading from registers.
var val = emulator . Registers . ECX ;
// Writing to registers.
emulator . Registers . ECX = 0x10 ;
رسم الخرائط، وإلغاء رسم الخرائط، والقراءة، والكتابة، وتغيير أذونات الذاكرة.
var addr = 0x100000 ;
// Getting memory regions.
var regions = emulator . Memory . Regions ;
// Getting memory page size.
var pageSize = emulator . Memory . PageSize ;
// Mapping memory.
emulator . Memory . Map ( addr , 2 * 1024 , 2 * 1024 , MemoryPermissions . All ) ;
// Unmapping memory.
emulator . Memory . Unmap ( addr + ( 4 * 1024 ) , 4 * 1024 ) ;
// Changing memory permissions.
emulator . Memory . Protect ( addr + ( 4 * 1024 ) , 4 * 1024 , MemoryPermissions . Read ) ;
// Code to write to memory.
var code = new byte [ ]
{
0x41 , // INC ECX
0x4a // DEC EDX
}
// Buffer thats going to be the storage for data read from memory.
var buffer = new byte [ 2 ] ;
// Writing to memory.
emulator . Memory . Write ( code , 0 , code . Length ) ;
// Reading to memory.
emulator . Memory . Read ( buffer , 0 , buffer . Length ) ;
لا يزال التثبيت حاليًا قيد العمل وقد يتغير.
// Adding a memory read hook.
emulator . Hooks . Memory . Add ( MemoryHookType . Read , ( emu , type , address , size , val , userData ) => {
Console . WriteLine ( " stuff was read from memory." ) ;
} , addr , addr + ( ulong ) code . Length , null ) ;
التقاط واستعادة السياقات.
// emulator.Context will create a new Context object
// which you will to dispose afterwards. Hence the `using` statement.
// Capturing the context.
using ( var ctx = emulator . Context )
{
.. .
// To restore the context simply do this.
emulator . Context = ctx ;
}
يوفر Unicorn.Net أيضًا بعض الارتباطات الأولية من خلال فئة Bindings
.
var bindings = new Bindings ( ) ;
bindings . Open ( .. . ) ;
bindings . MemMap ( .. . ) ;
.. .
قائمة بالأشياء التي يجب تنفيذها أو التي تم تنفيذها.
منافس
سياق
السجلات
ذاكرة
ربط
أقواس
الارتباطات الفعلية
Unicorn.Net مرخص بموجب ترخيص معهد ماساتشوستس للتكنولوجيا (MIT) المسموح به.