WIP .NET การรวม / wrapper ที่แปลกใหม่กว่าเล็กน้อยสำหรับเอ็นจิ้น 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 ที่อนุญาต