Zitat von T-Virus
Die meisten hier haben sich diese Erfahrung durch Jahre langes einarebiten mit lesen, Videos schauen und probieren beigebracht.
Sag ich ja, wer sich Jahre lang mit einem Thema befasst, der kennt sich gut aus, nix worauf man sich etwas einbilden müsste.
Nimm dein Wissen mit ins Grab.
Im Prinzip kann man sich alles ergoogeln und anlesen, dann erübrigt sich auch dieses Forum hier.
Mit mergen meinte ich, ob mann aus der cpp.dll und der c#.dll eine datei machen kann, aber auch das habe ich mir gegoogelt:
https://www.codeproject.com/Messages/1424822/Using-ILMerge-to-embedd-Cplusplus-DLL-into-Csharp.aspx
Ihr seid wirklich ein hilfbereiter Haufen hier, selten solch charmante Menschen erlebt.
Wenn man sich Jahrzente lang mit ein und demselben Thema befasst, kennt man sich natürlich auch sehr gut damit aus, das liegt in der Natur der Sache und ist keine besondere Begabung (auch wenn sich das gewisse Oberschlaumeier einbilden). Allerdings ist es eine besondere Begabung sich mal in andere Menschen zu versetzten, die vielleicht nicht diesselbe Erfahrung und Screentime haben.
Hallo,
ich habe eine c++ dll in meinen c# code eingebunden:
using System.Runtime.InteropServices;
class Hello
{
static void Main(string[] args)
{
[DllImport("CPPTestDLL.dll", CallingConvention = CallingConvention.Cdecl)]
static extern int subtract(int a, int b);
int x = 10;
int y = 5;
int z = subtract(x, y);
System.Console.WriteLine($"{z}");
}
}
#include < stdio.h >
#include <pch.h>
extern "C"
{
__declspec(dllexport) int add(int a, int b) {
return a + b;
}
__declspec(dllexport) int subtract(int a, int b) {
return a - b;
}
}
Wenn nun gilt:
decimal x = 10;
decimal y = 5;
decimal z = subtract(x, y);
Welchen Datentyp müsste ich in c++ wählen bzw. wie könnte man das lösen ?
Falls es sich beim C# code um eine dll handelt, gibt es eine Möglichkeit beide zu mergen, so dass ich letztlich nur eine dll habe ?
besten Dank für ein paar Tipps.
Hallo,
habt Ihr ein paar Tipps bzw. könnt Ihr Anbieter empfehlen, mit denen man serverbasiert Softwarelizenzen vergeben und überwachen kann.
Hallo,
kann man davon ausgehen, dass die hier angebotene Code Virtualisierung, wie sie auch von diversen anderen Produkten angeboten wird, einen effektiven Schutz darstellt ?
https://www.gapotchenko.com/eazfuscator.net/features/virtualization
Wie sind eure Erfahrungen mit diesem Mechanismus ?
Alternativ:
Macht es Sinn z.B. kritische Codeteile anstatt in C# in C++ oder C zu formulieren, eine dll damit zu erzeugen und diese dll dann in den C#-Code einzubinden ?
Könnte man eine C# dll mit einer C++ dll "verschmelzen, so dass nur eine dll übrig bleibt und wäre der C++ Teil dann weitestgehend sicher vor den üblichen Tools ?
Oben wurde geschrieben: "Sobald der Code ausgeführt wird, lässt sich das mit einem Debugger rekonstruieren."
Wo und wie setzt du hier den Einstieg, denn du hast ja weder den Sourcecode, noch das pdb file ?
Insgesamt wäre es dennoch interessant zu wissen wie das funktioniert.
Die obfuscated Klassen sehen nach der Obfuscation beispielhaft so aus:
internal sealed class XYZ
{
internal SortedList<double, abc> Name { get; set; }
[MethodImpl(MethodImplOptions.NoInlining)]
internal YXZ()
{
}
[MethodImpl(MethodImplOptions.NoInlining)]
internal void Method1(XYZ name zone)
{
}
[MethodImpl(MethodImplOptions.NoInlining)]
internal void AddMethod()
{
}
[MethodImpl(MethodImplOptions.NoInlining)]
internal void RemoveMethod()
{
}
[MethodImpl(MethodImplOptions.NoInlining)]
static XYZ()
{
<AgileDotNetRTPro>.Initialize();
<AgileDotNetRTPro>.PostInitialize();
}
}
Also alle Methoden leer und die untere Methode wird aufgerufen.
Als Assemly existiert eine AgileDotNetRTPro.dll, welche mit dem ursprünglichen Projekt nix zu tun hat.
Die letzte static Methode wurde hinzugefügt.
Hallo, normalerweise werden bei Obfuscation ja codeteile verändert, aber sind (mit gewissem Aufwand) immer noch lesbar.
Hier ist etwas, was scheinbar bullet proof ist.
Alle Methoden der Applikation sind leer und gekennzeichnet mit:
[MethodImpl(MethodImplOptions.NoInlining)]
protected override void OnConnectionStatusUpdate(ConnectionStatusEventArgs status)
{
}
zu den Referenzen gehören u.a.
kernel32.dd
AgileDotNetRT64Pro.dll
AgileDotNetRTPro.dll
Letztere dll stellt eine Klasse mit Methoden bereit, mit denen die eigentliche (geschützte) Applikation scheinbar Initialisiert und geladen wird, fraglich ist nur wie und von wo, letztlich wird sie ja ausgeführt:
internal static IntPtr Load()
{
WindowsImpersonationContext windowsImpersonationContext = WindowsIdentity.Impersonate(IntPtr.Zero);
Type typeFromHandle;
Monitor.Enter(typeFromHandle = typeof(global::<AgileDotNetRTPro>));
string text = ((IntPtr.Size != 4) ? "AgileDotNetRT64Pro.dll" : "AgileDotNetRTPro.dll");
string text2 = Path.Combine(Path.GetDirectoryName(new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath), text);
if (!File.Exists(text2))
{
text2 = text;
}
IntPtr result = LoadLibraryA(text2);
windowsImpersonationContext.Undo();
Monitor.Exit(typeFromHandle);
return result;
}
internal static int InitializeThroughDelegate(IntPtr P_0)
{
IntPtr intPtr = Load();
IntPtr procAddress = GetProcAddress(intPtr, "_Initialize");
global::InitializeDelegate initializeDelegate = (global::InitializeDelegate)Marshal.GetDelegateForFunctionPointer(procAddress, typeof(global::InitializeDelegate));
return initializeDelegate(P_0);
}
Kann jemand was dazu sagen, wie das hier funktionieren könnte, wäre zu Lehrzwecken schon recht interessant ?
Ich arbeite mit einer dll und m.E. ohne Windows Forms.
Wenn ich WindowsBase mit using einbinde, dann meckert er auch und sagt es sei "unnessesary".
Im Projekt unter Frameworks - Microsoft.NetCore.App ist WindowsBase vorhanden, ja, und auch SystemWindows.
Ja, hatte ich ja auch geschrieben, dennoch kennt es der Compiler nicht, siehe Bild.