Beispiel #1
-1
        public StringDecrypter(StringDecrypterInfo stringDecrypterInfo)
        {
            StringDecrypterInfo = stringDecrypterInfo;

            if (stringDecrypterInfo != null) {
                if (!stringDecrypterInfo.StringsEncrypted) {
                    stringOffset = stringDecrypterInfo.StringOffset;
                    decryptedData = stringDecrypterInfo.StringsResource.GetResourceData();
                }
                else if (stringDecrypterInfo.CanDecrypt) {
                    stringOffset = stringDecrypterInfo.StringOffset;
                    decryptedData = stringDecrypterInfo.decrypt();
                }
            }
        }
Beispiel #2
-1
        void initStringDecrypterInfos()
        {
            var stringEncoderClassFinder = new StringEncoderClassFinder(module, DeobfuscatedFile);
            stringEncoderClassFinder.find();
            foreach (var info in stringEncoderClassFinder.StringsEncoderInfos) {
                var sinfo = new StringDecrypterInfo(module, info.StringDecrypterClass) {
                    GetStringDelegate = info.GetStringDelegate,
                    StringsType = info.StringsType,
                    CreateStringDelegateMethod = info.CreateStringDelegateMethod,
                };
                stringDecrypterInfos.Add(sinfo);
            }

            // There may be more than one string decrypter. The strings in the first one's
            // methods may be decrypted by the other string decrypter.

            var initd = new Dictionary<StringDecrypterInfo, bool>(stringDecrypterInfos.Count);
            while (initd.Count != stringDecrypterInfos.Count) {
                StringDecrypterInfo initdInfo = null;
                for (int i = 0; i < 2; i++) {
                    foreach (var info in stringDecrypterInfos) {
                        if (initd.ContainsKey(info))
                            continue;
                        if (info.init(this, DeobfuscatedFile)) {
                            resourceDecrypterInfo.setSimpleZipType(info.SimpleZipType, DeobfuscatedFile);
                            initdInfo = info;
                            break;
                        }
                    }
                    if (initdInfo != null)
                        break;

                    assemblyResolverInfo.findTypes();
                    resourceResolverInfo.findTypes();
                    decryptResources();
                }

                if (initdInfo == null)
                    break;

                initd[initdInfo] = true;
                initStringDecrypter(initdInfo);
            }

            // Sometimes there could be a string decrypter present that isn't called by anyone.
            foreach (var info in stringDecrypterInfos) {
                if (initd.ContainsKey(info))
                    continue;
                Log.v("String decrypter not initialized. Token {0:X8}", info.StringsEncodingClass.MetadataToken.ToInt32());
            }
        }
Beispiel #3
-1
 void initStringDecrypter(StringDecrypterInfo info)
 {
     Log.v("Adding string decrypter. Resource: {0}", Utils.toCsharpString(info.StringsResource.Name));
     var decrypter = new StringDecrypter(info);
     if (decrypter.CanDecrypt) {
         staticStringDecrypter.add(DotNetUtils.getMethod(info.GetStringDelegate, "Invoke"), (method, args) => {
             var fieldDefinition = DotNetUtils.getField(module, (FieldReference)args[0]);
             return decrypter.decrypt(fieldDefinition.MetadataToken.ToInt32(), (int)args[1]);
         });
         staticStringDecrypter.add(info.StringDecrypterMethod, (method, args) => {
             return decrypter.decrypt(0, (int)args[0]);
         });
     }
     stringDecrypters.Add(decrypter);
     DeobfuscatedFile.stringDecryptersAdded();
 }
Beispiel #4
-1
        void initStringDecrypterInfos()
        {
            var stringEncoderClassFinder = new StringEncoderClassFinder(module, DeobfuscatedFile);
            stringEncoderClassFinder.find();
            foreach (var info in stringEncoderClassFinder.StringsEncoderInfos) {
                var sinfo = new StringDecrypterInfo(module, info.StringDecrypterClass) {
                    GetStringDelegate = info.GetStringDelegate,
                    StringsType = info.StringsType,
                    CreateStringDelegateMethod = info.CreateStringDelegateMethod,
                };
                stringDecrypterInfos.Add(sinfo);
            }

            // There may be more than one string decrypter. The strings in the first one's
            // methods may be decrypted by the other string decrypter.

            var initd = new Dictionary<StringDecrypterInfo, bool>(stringDecrypterInfos.Count);
            while (initd.Count != stringDecrypterInfos.Count) {
                StringDecrypterInfo initdInfo = null;
                for (int i = 0; i < 2; i++) {
                    foreach (var info in stringDecrypterInfos) {
                        if (initd.ContainsKey(info))
                            continue;
                        if (info.init(this, DeobfuscatedFile)) {
                            resourceDecrypterInfo.setSimpleZipType(info.SimpleZipType, DeobfuscatedFile);
                            initdInfo = info;
                            break;
                        }
                    }
                    if (initdInfo != null)
                        break;

                    assemblyResolverInfo.findTypes();
                    resourceResolverInfo.findTypes();
                    decryptResources();
                }

                if (initdInfo == null)
                    throw new ApplicationException("Could not initialize all stringDecrypterInfos");

                initd[initdInfo] = true;
                initStringDecrypter(initdInfo);
            }
        }