🧬 One-touch unmanaged memory, runtime dynamic use of the unmanaged native C/C++ in .NET world, related P/Invoke features, and …
📦 Download | What's new in 1.5:
🔨 No more manual type conversions and memory management complexities. Because nothing easier than just use it,
using dynamic l = new ConariX("regXwild.dll");
string data = "number = 888;";
bool found = l.replace<bool>(ref data, "+??;", "2034;");
// found: true; data: number = 2034;
using var u = NativeStruct.Make.f<UIntPtr>("start", "end").Struct;
/* Hey! We just generated a structure like
[StructLayout(LayoutKind.Sequential)]
private struct MatchResult
{
public UIntPtr start;
public UIntPtr end;
}*/
l.Memory.@goto(e_lfanew).eq('P', 'E', '\0', '\0').check()
using NativeArray<short> nr = new(pointer); // points to ~0x2674F89EDF0
nr[0] = 1; nr[1] = 2;
NEW: New modern NativeString<T> replaces UnmanagedString.
using NativeString<WCharPtr> data = new("Hello {p}!");
NEW: New TCharPtr marshalable type which aggregates WCharPtr + CharPtr at runtime.
NEW: New modern NativeStruct<T> replaces UnmanagedStructure.
Two modes!
using var u = NativeStruct.Make.f<UIntPtr>("start", "end").Struct;
using var u = new NativeStruct<MatchResult>();
using NativeStruct u = new();
u.Native
.f<UIntPtr>("start", "end")
.build(out dynamic mres);
string data = "number = 888;";
bool found = l.replace<bool>(ref data, "+??;", "2034;");
NEW: New VPtr type - Variable long pointer. This type supports adding long numbers to IntPtr (IntPtr + long), a complete comparing >,<,>=,<=,==,!= between VPtr and int/long, and more.
NEW: Added support for optional arguments in DLR via IProviderDLR.TrailingArgs. Can be applied only if varargs. Useful in avoiding any optional values. Eg. (1, 2, 3, [0, 0]).
bool func(const TCHAR* input, flagcfg_t options = 0, MatchResult* result = nullptr);
l.func<bool>(input); -> input, [+ 0, + nullptr]
Accessor.Native()
.t<DWORD>("VirtualAddress")
.t<DWORD>("Size")
.build(out dynamic idd);
NEW: PE32/PE32+ Memory and Streams implementations. Configure it through IConfig.PeImplementation or use manually.
NEW: IMarshalableGeneric for marshaling generic types.
Use or implement this to avoid possible:
using NativeString<CharPtr> data = new("Hello {p}!");
l.replace<bool>(data, ...)
using var str = input + " " + "world";
NEW: New lightweight way of generating Dynamic MethodInfo.
As part of optimization,
This is the default way for DLR starting with 1.5. Use IProviderDLR.SignaturesViaTypeBuilder to configure it.
NEW: Native chains. Added support 8/16 bit characters via configurable .readChar() and writeChar().
NEW: Native chains. Added conditional .eq(), .or() that verifies input T is equal to T. It can be checked via .check(), ifTrue(Action)/ifFalse(Action), and failed(bool when).
l.Memory
.@goto(l.PE.Addresses.IMAGE_NT_HEADERS)
.eq('P', 'E', '\0', '\0')
.check()
using NativeArray<short> nr = new(pointer); // points to ~0x2674F89EDF0
nr[0] = 1; nr[1] = 2;
using NativeArray nr = new(2, -4, 6);
Memory memory = nr;
NEW: New modern Memory VPtr based implementation in native chains (serializable) to work with RAM related processes.
NEW: New modern NativeStream VPtr based implementation in native chains (serializable) to work with any supported stream related processes.
NEW: New modern LocalContent VPtr based implementation in native chains (serializable) to work with any local allocated data.
NEW: Added generic IConari<TCharIn> for a specific char type by default in used instance.
NEW: Added Allocator for allocating any data in unmanaged memory.
Allocator
based on NativeArray<byte>
.
using Allocator alloc = new(0x70, 0xDE, 0x01, 0xAC,
0x04, 0xCB, 0x70, 0xDE,
0x93, 0x12, 0x74, 0x94);
alloc.Memory // access via native chains Memory implementation
NEW: The fast way to update an unmanaged strings without allocating new in memory through modern NativeString<T> and BufferedString<T>.
NEW: New BufferedString<T> a specialized native strings for future possible changing with additional buffer.
BufferedString<T>
is a type alias for NativeString<T>
with the default buffer
using factor 2.5f relative to the string;
NEW: Native chains. New working with a different positions
Zone (Initial/Region/Current) and aliases (D/U/V)
+rewind(Zone) Rewind the chain to a specific region.
+@goto(VPtr) Go to a new address using absolute position.
+back\<T\>(int count = 1); - Move back on T type size from the current position. + T1, T2, T3 aliases.
NEW: New achar
and wchar
type markers for a native chains.
NEW: Added extension methods: +NativeSize() for objects - Get the size in bytes of the selected managed type to be treated as an unmanaged. +IAccessor Access() - Accessing data via Memory or LocalContent implementation.
NEW: New for NativeData:
+assign<T>(string[]) - Assigns new fields for each presented name. +f<T>(string[]) - alias
+renew(SeekPosition) - An additional way to start the chain with specific SeekPosition +renew(out VPtr, SeekPosition)
+region() - Mark new region in the chain. +region(out int) +region(out VPtr)
+ofs<T>(int, string[]) - Use offset to the data.
+extend(byte[] bytes) - Extends local data using additional bytes.
+mode(ChainMode) - to control chain and its new fields via ChainMode.
NEW: PeImplType.Disabled to disable all related to PE features such as mangling, list of exported proc, etc.
NEW: Added IProviderDLR.TryEvaluateContext. It can help better understand what are you trying to call without specified casting. true value by default.
NEW: Added IProviderDLR.ManageNativeStrings. Collect information about all input INativeString and delegate control. true value by default.
NEW: Added IProviderDLR.BoxingControl. Control of boxing for input data. BoxingType.UnboxingAndBoxing value by default.
NEW: IProvider.addr() address of the specific item such streams std::cin etc. Part of Issue #17.
l.addr("get_GPtrVal")
NEW: ConariL/X Make() wrapper to use both runtime dynamic and compile type objects.
NEW: Added manager NativeStringManager for a new modern NativeString<T> strings. Helps to manage c-strings easily.
NEW: Added the following static Members:
NEW: Added IProviderDLR.RefModifiableStringBuffer. Allows configure additional buffer to process ref strings (ByRef&).
NEW: Adds IModuleIsolationRecipe for configurable isolation handlers.
NEW: New IConfig option. LoaderSyncLimit. Limit in milliseconds for how long to wait signals when synchronization of threads (processes).
NEW: INativeAccessor and IDlrAccessor unifies ConariL, ConariX objects, Native chains and various raw Memory accessing.
NEW: New IConfig option. CancelIfCantIsolate. Cancel processing in loader if module can't be isolated.
NEW: New IConfig option. Cts. Signals to cancel active operations as soon as possible.
NEW: New IConfig option. PeImplementation. Use specific implementation around PE processing. Affects loader, mangling, and other related core features.
NEW: New for IPE interface:
NEW: IConari now extends IStringMaker to provide direct _T()
accessing in implemented ConariX / ConariL objects.
l.match<bool>(l._T("test"))
NEW: IConari now specifies INativeStringManager Strings { get; } property for a quick accessing to used string manager in implemented objects.
FIXED: Fixed possible incorrect loading and resolving module in Loader.
FIXED: Fixed CalculateHashCode() affects comparing lot of Conari's types etc.
FIXED: Fixed clarifying the context when DLR.
FIXED: Fixed possible "Parameter count mismatch" when using caching and different signatures to the same pointer. For 1.4 it can be avoided by resetting cache.
FIXED: Improved multiprocessing of requests to the same module. Part of Issue #15.
CHANGED: Hack for .NET Standard now is under UnmanagedEmitCalli 1.1
CHANGED: Adds aggressive finalization for ConariX/L objects to avoid possible abandoned pointers.
CHANGED: New ArchitectureMismatchException will help clarify the Issue #4.
CHANGED: Improved Native chains and Unmanaged Memory accessing:
IAccessor + Reader/Writter/Updater ++ as a common interface
for a modern native chains implementations such as Memory, NativeStream, LocalContent, etc.
All this implements also IPointer (VPtr based).
memory.Native()
.f<WORD>("Machine", "NumberOfSections") // IMAGE_FILE_HEADER (0xF4)
.align<DWORD>(3)
.t<WORD>("SizeOfOptionalHeader")
.t<WORD>("Characteristics")
.region()
.t<WORD>("Magic") // IMAGE_OPTIONAL_HEADER (0x108)
.build(out dynamic ifh);
acs
.write(-4)
.update(6)
.rewind(Zone.Region)
.read<byte>(2, out byte[] r)
.next<short>(ref v)
...
CHANGED: Loader now uses PE Memory implementation by default.
CHANGED: IDynamic & Dynamic changes:
CHANGED: Updated a bit Config as a class with top namespace +IConfig.Cache.
CHANGED: Fully updated WCharPtr + CharPtr types:
CHANGED: Removed old _
method aliases from NativeData due to modern IDlrAccessor.
Please use other available options (.ctor, Native extension, INativeAccessor, etc.)
CHANGED: Updated Microsoft.CSharp 4.7.0
CHANGED: Updated System.Reflection.Emit 4.7.0
CHANGED: Updated System.Reflection.Emit.Lightweight 4.7.0
OBSOLETE: UnmanagedStructure marked as obsolete.
OBSOLETE: Marked as Obsolete:
OBSOLETE: IPE.ExportedProcNamesArray marked as Obsolete.
OBSOLETE: BSTR marked as obsolete.
OBSOLETE: PtrSize marked as obsolete in WCharPtr + CharPtr types.
OBSOLETE: UnmanagedString marked as obsolete.
🎲 Nightly build
of 3be8617aeab68dc3cd192c25dd251d599cb2b315 ➾ Worker image: $(APPVEYOR_BUILD_WORKER_IMAGE)
; Console: ci.appveyor.../build-64
❕ Only for tests. 🗨 Commit message:
+kernel32 +user32 via new ConariX [DLR version]:
~
dynamic user32 = new User32();
user32.ShowWindow(0x000A0A28, 3);
user32.MessageBoxA(0, "Conari in action", "Hello!", 0);
dynamic kernel32 = new Kernel32();
kernel32.GetModuleHandleA<IntPtr>("libcurl-x64");
kernel32.GetModuleHandleW<IntPtr>((WCharPtr)ustr);
+Added tests
🎲 Nightly build
of 9b7e1371a4f9381a82603f5c638ce4d6742168ec ➾ Worker image: Visual Studio 2017
; Console: ci.appveyor.com/.../build-50
❕ Please use this only for tests of latest changes! ❕ 🗨 Commit message:
Implemented initialization of UnmanagedString from IntPtr
$(APPVEYOR_REPO_COMMIT_MESSAGE_EXTENDED)
public release of Conari engine - v1.3:
New version of Conari engine contains major improvements and fixes with DLR features, ByRef types, new support of Exported-Variables, Aliases, improved Native.Core, ... But it also contains minor incompatible changes with previous versions.
Look here: https://github.com/3F/Conari/wiki/Upgrade-v1.3
*
results for regXwild x64 (Unicode) via snet tester - https://github.com/3F/regXwild
NullType<T>
as optional way for work with reference-types. And for other purpose to store additional information about basic type for any null values.l.ExVar.DLR.ADDR_SPEC; // 0x00001CE8
l.ExVar.get<UInt32>("ADDR_SPEC"); // 0x00001CE8
l.ExVar.getField(typeof(UInt32).NativeSize(), "ADDR_SPEC"); // Native.Core.Field via raw size
l.Svc.native("lpProcName"); // Raw access via NativeData & Native.Core !
l.Aliases["Flag"] = l.Aliases["getFlag"] = l.Aliases["xFunc"]; //Flag() -> getFlag() -> xFunc()->...
l.DLR.getFlag<bool>();
l.Aliases["gmn"] = new ProcAlias(
"GetMagicNum",
new AliasCfg() { NoPrefixR = true } // false by default
);
t
signatures for node (raw alignments via size and managed types)
+t(Type type, string name = null)
+t(Type[] types, params string[] names)
+t(int size, string name = null)
Action bindFunc(string lpProcName);
+Action bind(string func);
Method bindFunc(string lpProcName, Type ret, params Type[] args);
+Method<T, object> bindFunc<T>(string lpProcName, Type ret, params Type[] args);
+Method bind(string func, Type ret, params Type[] args);
+Method<T, object> bind<T>(string func, Type ret, params Type[] args);
IPE PE
property for complex work with PE-file.
* The ExportFunctionNames
property has been removed as obsolete. Use same PE.ExportedProcNamesArray
funcName()
-> procName()
string funcName(string name);
has been renamed to string procName(string name);
- as a common method for getting full lpProcName with main prefix etc.TDyn IBinder.bind(MethodInfo mi, bool prefix = false);
removed as a deprecated, because for this can be a lot of misunderstandings.
If you need something, use like: prefix ? l.procName(mi.Name) : mi.Name
etc. for any available methods with MethodInfo.user
) for Native.Core.Field. To store any additional information that's related for specific field.