예제 #1
0
        public static ResourceUtilities.SignatureType determineSignatureNeeded()
        {
            ResourceUtilities.SignatureType type = ResourceUtilities.SignatureType.NORMAL_TYPE;
            bool       flag  = false;
            StackTrace trace = new StackTrace();

            if (trace.FrameCount > 0)
            {
                for (int i = 0; (i < trace.FrameCount) && !flag; i++)
                {
                    string location = trace.GetFrame(i).GetMethod().Module.Assembly.Location;
                    string fileName = Path.GetFileName(JAM.ToStringFromLocale(JAM_get_filename("", location)));
                    if (string.Compare(fileName, "Snap.dll", true) == 0)
                    {
                        type = ResourceUtilities.SignatureType.SNAP_TYPE;
                    }
                    if (string.Compare(fileName, "MiniSnap.dll", true) == 0)
                    {
                        flag = true;
                        type = ResourceUtilities.SignatureType.MINI_SNAP;
                    }
                }
            }
            return(type);
        }
예제 #2
0
        private static bool CheckDLLAuthorization(string filename, ResourceUtilities.SignatureType sigType)
        {
            if ((sessionList == null) || (filename == null))
            {
                return(false);
            }
            if (!sessionList.Contains(filename))
            {
                return(false);
            }
            int num = sessionList.IndexOfKey(filename);

            ResourceUtilities.SignatureType type = (ResourceUtilities.SignatureType)sessionList.GetValueList()[num];
            if ((type != ResourceUtilities.SignatureType.BOTH_TYPE) && (type != sigType))
            {
                return(false);
            }
            return(true);
        }
예제 #3
0
        public static bool needToEvaluate()
        {
            ResourceUtilities.SignatureType sigType = ResourceUtilities.SignatureType.NORMAL_TYPE;
            string key = JAM.ToStringFromLocale(evalualuteCallStack(ref sigType));

            if ((key == null) || (sigType == ResourceUtilities.SignatureType.MINI_SNAP))
            {
                return(false);
            }
            bool flag = true;

            if ((sessionList == null) || !sessionList.Contains(key))
            {
                return(flag);
            }
            int num = sessionList.IndexOfKey(key);

            ResourceUtilities.SignatureType type2 = (ResourceUtilities.SignatureType)sessionList.GetValueList()[num];
            if ((type2 == ResourceUtilities.SignatureType.BOTH_TYPE) || (type2 == sigType))
            {
                return(false);
            }
            return(true);
        }
예제 #4
0
 private static void AddDLLAuthorization(string filename, ResourceUtilities.SignatureType sigType)
 {
     if (sessionList == null)
     {
         sessionList = new SortedList();
     }
     if (filename != null)
     {
         if (sessionList.Contains(filename))
         {
             int index = sessionList.IndexOfKey(filename);
             ResourceUtilities.SignatureType type = (ResourceUtilities.SignatureType)sessionList.GetValueList()[index];
             if ((type != ResourceUtilities.SignatureType.BOTH_TYPE) && (type != sigType))
             {
                 sessionList.RemoveAt(index);
                 sessionList.Add(filename, ResourceUtilities.SignatureType.BOTH_TYPE);
             }
         }
         else
         {
             sessionList.Add(filename, sigType);
         }
     }
 }
예제 #5
0
        public static bool verifyAssemblyData(bool callEvaluateStack)
        {
            return(true);

            bool   flag  = false;
            bool   flag2 = false;
            IntPtr p     = JAM_get_filename(AppDomain.CurrentDomain.BaseDirectory, AppDomain.CurrentDomain.FriendlyName);

            ResourceUtilities.SignatureType sigType = ResourceUtilities.SignatureType.NORMAL_TYPE;
            if (((p == IntPtr.Zero) && (JAM_dotnet_verification_override() == 0)) || callEvaluateStack)
            {
                p = evalualuteCallStack(ref sigType);
            }
            else
            {
                sigType = determineSignatureNeeded();
            }
            if (sigType != ResourceUtilities.SignatureType.MINI_SNAP)
            {
                if (CheckDLLAuthorization(AppDomain.CurrentDomain.BaseDirectory + AppDomain.CurrentDomain.FriendlyName, sigType))
                {
                    JAM.SMFree(p);
                }
                else
                {
                    string filename = JAM.ToStringFromLocale(p);
                    flag2 = verifyAssembly(filename, ref flag, sigType);
                    if (flag2)
                    {
                        AddDLLAuthorization(AppDomain.CurrentDomain.BaseDirectory + AppDomain.CurrentDomain.FriendlyName, sigType);
                    }
                    else
                    {
                        StackTrace trace = new StackTrace();
                        SortedList list  = GenerateInitialDllList();
                        string     key   = Path.GetFileNameWithoutExtension(filename) + ".dll";
                        list.Add(key, "notsigned");
                        if (trace.FrameCount > 0)
                        {
                            for (int i = 0; (i < trace.FrameCount) && !flag2; i++)
                            {
                                string location = trace.GetFrame(i).GetMethod().Module.Assembly.Location;
                                string str5     = Path.GetFileNameWithoutExtension(JAM.ToStringFromLocale(JAM_get_filename("", location))) + ".dll";
                                if (list.Contains(str5))
                                {
                                    string strA = (string)list.GetValueList()[0];
                                    if (((string.Compare(strA, "skip", false) == 0) || (string.Compare(strA, "notsigned", false) == 0)) || (string.Compare(strA, "signed", false) == 0))
                                    {
                                        continue;
                                    }
                                }
                                flag2 = verifyAssembly(JAM.ToStringFromLocale(JAM_get_filename("", location)), ref flag, sigType);
                                if (flag2)
                                {
                                    list.Add(str5, "signed");
                                    AddDLLAuthorization(location, sigType);
                                }
                                else
                                {
                                    list.Add(str5, "notsigned");
                                }
                            }
                        }
                        if (!flag2)
                        {
                            if (sigType == ResourceUtilities.SignatureType.SNAP_TYPE)
                            {
                                throw new NeedSNAPAuthorLicenseException("Invalid NX signature found");
                            }
                            throw new NeedDOTNETAuthorLicenseException("Invalid NX signature found");
                        }
                    }
                }
                if (flag)
                {
                    JAM_declare_alliance_context(AppDomain.CurrentDomain.BaseDirectory + AppDomain.CurrentDomain.FriendlyName);
                }
            }
            return(flag);
        }
예제 #6
0
        private static bool verifyAssembly(string filename, ref bool alliance_mode, ResourceUtilities.SignatureType signTypeNeeded)
        {
            bool flag = true;

            alliance_mode = false;
            try
            {
                string str = "";
                if (signTypeNeeded == ResourceUtilities.SignatureType.NORMAL_TYPE)
                {
                    str = "NXOpen";
                }
                else if (signTypeNeeded == ResourceUtilities.SignatureType.SNAP_TYPE)
                {
                    str = "SNAP";
                }
                if (filename == null)
                {
                    return(flag);
                }
                Trace.WriteLine("Verifying " + filename + " for " + str + " signature.");
                FileInfo          info      = new FileInfo(filename);
                BinaryReader      reader    = new BinaryReader(info.OpenRead());
                ResourceUtilities utilities = new ResourceUtilities(reader.ReadBytes((int)info.Length));
                byte[]            hashValue = utilities.computeHash();
                byte[]            signature = utilities.getSignature();
                if (!Decryptor.verifySignature(hashValue, signature))
                {
                    throw new Exception("Invalid NX signature found");
                }
                ASCIIEncoding encoding = new ASCIIEncoding();
                byte[]        bytes    = utilities.getEmbeddedData();
                string        str2     = encoding.GetString(bytes, 1, bytes.Length - 1);
                if (str2.StartsWith("2 "))
                {
                    alliance_mode = true;
                }
                else if (str2.StartsWith("1 "))
                {
                    if ((signTypeNeeded == ResourceUtilities.SignatureType.SNAP_TYPE) || (signTypeNeeded == ResourceUtilities.SignatureType.BOTH_TYPE))
                    {
                        flag = false;
                        Trace.WriteLine("Is signed with NXOpen signature but needs Snap or Both signature type");
                    }
                }
                else if (str2.StartsWith("3 "))
                {
                    if ((signTypeNeeded == ResourceUtilities.SignatureType.BOTH_TYPE) || (signTypeNeeded == ResourceUtilities.SignatureType.NORMAL_TYPE))
                    {
                        flag = false;
                        Trace.WriteLine("Is signed with Snap signature but needs NXOpen or Both signature type");
                    }
                }
                else
                {
                    if (!str2.StartsWith("4 "))
                    {
                        throw new Exception("Corrupted NX signature text " + str2);
                    }
                    if (((signTypeNeeded == ResourceUtilities.SignatureType.SNAP_TYPE) || (signTypeNeeded == ResourceUtilities.SignatureType.BOTH_TYPE)) || (signTypeNeeded == ResourceUtilities.SignatureType.NORMAL_TYPE))
                    {
                        flag = true;
                    }
                }
                Trace.WriteLine("Signed by : " + str2.Substring("1 ".Length));
            }
            catch (Exception exception)
            {
                Trace.WriteLine(exception);
                Trace.WriteLine("Validation failed ");
                flag = false;
            }
            return(flag);
        }
예제 #7
0
        public static IntPtr evalualuteCallStack(ref ResourceUtilities.SignatureType sigType)
        {
            StackTrace trace = new StackTrace();

            sigType = ResourceUtilities.SignatureType.NORMAL_TYPE;
            bool       flag  = false;
            bool       flag2 = false;
            SortedList list  = GenerateInitialDllList();
            ArrayList  c     = new ArrayList();

            if (trace.FrameCount > 0)
            {
                for (int i = 0; i < trace.FrameCount; i++)
                {
                    string location = trace.GetFrame(i).GetMethod().Module.Assembly.Location;
                    string path     = JAM.ToStringFromLocale(JAM_get_filename("", location));
                    string key      = Path.GetFileNameWithoutExtension(path) + ".dll";
                    if (!list.Contains(key) && !c.Contains(path))
                    {
                        c.Add(path);
                    }
                    //if (!flag && (string.Compare(key, "Snap.dll", true) == 0))
                    //{
                    //    flag = true;
                    //    sigType = ResourceUtilities.SignatureType.SNAP_TYPE;
                    //}
                    //if (!flag2 && (string.Compare(key, "MiniSnap.dll", true) == 0))
                    //{
                    //    flag2 = true;
                    //    sigType = ResourceUtilities.SignatureType.MINI_SNAP;
                    //}
                }
                int    num2  = 0;
                string str4  = null;
                bool   flag3 = false;
                for (int j = 0; j < c.Count; j++)
                {
                    string fileName = Path.GetFileName((string)c[j]);
                    if (string.Compare("journal.dll", fileName, true) == 0)
                    {
                        num2++;
                        if (!flag3)
                        {
                            flag3 = true;
                            str4  = (string)c[j];
                        }
                    }
                }
                if (num2 > 0)
                {
                    if (num2 == 1)
                    {
                        ArrayList list3 = new ArrayList(c);
                        list3.Remove(str4);
                        if (list3.Count == 0)
                        {
                            return(IntPtr.Zero);
                        }
                        JAM_lprintf("Detected call to non-NX dll while replaying journal.\n");
                        JAM_lprintf("Validating DLL - " + list3[0] + "\n");
                        return(JAM.ToLocaleString((string)list3[0]));
                    }
                    JAM_lprintf("Detected call to non-NX dll while replaying journal.\n");
                    JAM_lprintf("Validating DLL - " + str4 + "\n");
                    return(JAM.ToLocaleString(str4));
                }
                if (c.Count > 0)
                {
                    return(JAM.ToLocaleString((string)c[0]));
                }
                JAM_lprintf("No journal.dll detected in call stack while replaying journal.\n");
            }
            return(IntPtr.Zero);
        }