Laden...

Mono.Cecil Offsets anpassen nach ersetzen von ldstr mit einer Encryption- Methode

Erstellt von Ayke vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.232 Views
Ayke Themenstarter:in
643 Beiträge seit 2006
vor 13 Jahren
Mono.Cecil Offsets anpassen nach ersetzen von ldstr mit einer Encryption- Methode

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);

            }
        }
1.044 Beiträge seit 2008
vor 13 Jahren

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

Ayke Themenstarter:in
643 Beiträge seit 2006
vor 13 Jahren

Ich versteck den Opcode nicht ich ersetze ldstr durch meine methode die einen entschlüsselten string zurück liefert.

1.044 Beiträge seit 2008
vor 13 Jahren

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

Ayke Themenstarter:in
643 Beiträge seit 2006
vor 13 Jahren

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 Themenstarter:in
643 Beiträge seit 2006
vor 13 Jahren
2.891 Beiträge seit 2004
vor 13 Jahren

@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?

Ayke Themenstarter:in
643 Beiträge seit 2006
vor 13 Jahren

einglich schon aber so langsam verliere ich die geduld 😛
vor allem Cecil ist undokumentiert... da sucht man sich tot