Ich möchte gerne string in meinen Programm verstecken. Habe die ldstr anweisung durch eine Verschlüsselungs- Methode von mir ersetzt. Funktioniert auch soweit bis bei den Methoden die ein if else oder case Statement haben. Hab gelesen das Cecil dort die Offsets nicht anpasst. Ich habe aber keine ahnung wie ich das Lösen soll.
private void CryptString_Inject(MethodBody body, MethodReference decryptMethod)
{
InstructionCollection instructions = (InstructionCollection)body.Instructions;
ILProcessor ilProcessor = body.GetILProcessor();
List<Instruction> listInstructionsToChange = new List<Instruction>();
foreach (Instruction instruction in instructions)
{
if (instruction.OpCode.Name == "ldstr")
{
if (instruction.Operand is string)
listInstructionsToChange.Add(instruction);
}
}
foreach (Instruction instruction in listInstructionsToChange)
{
string sOriginalValue = instruction.Operand.ToString( );
int salt = random.Next( );
string byteArray = CryptString_Encryption(sOriginalValue, salt);
Instruction loadString = ilProcessor.Create(OpCodes.Ldstr, byteArray);
ilProcessor.Replace(instruction, loadString);
Instruction loadSalt = ilProcessor.Create(OpCodes.Ldc_I4, salt);
ilProcessor.InsertAfter(loadString, loadSalt);
Instruction callMethod = ilProcessor.Create(OpCodes.Call, decryptMethod);
ilProcessor.InsertAfter(loadSalt, callMethod);
}
}
Hallo Ayke,
ich verstehe nicht, was du vor hast. Du möchtest also einen string verschlüsseln. Dann kannst du aber nicht das komplette Opcode verstecken. Im der Regel ist es so, dass man die strings verschlüsselt, aber nicht das Opcode. Kannst du mir - uns - genauer beschrieben was du vor hast?
zero_x
zero_x | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.
Ich versteck den Opcode nicht ich ersetze ldstr durch meine methode die einen entschlüsselten string zurück liefert.
Hallo Ayke,
das ist verständlicher ausgedrückt. Dazu musst du die Methode, die den String entschlüsselt, durch das ldstr-Opcode ersetzen. Der IL-Code ist so aufgebaut, dass man zwischen jedem Opcode immer ein Offset hat. Das muss natürlich alles angepasst werden. Bevor du jetzt alles von Hand schreibst, würde ich dir raten, hier das anzuschauen. Dort findest du bestimmt ein Code-Snippet.
Das könnte dich auch interessieren manuelles Laden von Assemblies. Siehe auch Mono.Cecil Alle referenzen eines Types..
zero_x
zero_x | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.
Habe ich schon alles fertig geschrieben mir geht es nur darum das Cecil die Offsets bei if else oder case Statement nicht angepasst und Mono.Cecil Alle referenzen eines Types ist mein Thread 😛
@Ayke: Du warst doch der, der sich einen Obfuskator selbst zusammenbauen willst.
Warum nimmst du nicht einfach einen vorhandenen? Bsp. Babel.NET verschlüsselt dir auch strings genau so, wie du das auch machen willst. (Und benennt Variablen um, verschleiert IL-Code, etc). Willst du echt alles selbst machen?
einglich schon aber so langsam verliere ich die geduld 😛
vor allem Cecil ist undokumentiert... da sucht man sich tot