Example #1
0
        void FIND_DispatchSpawn()
        {
            _context.Name = "DispatchSpawn";

            _pr.Print("Running method 1-- finding \"Entity %s not found, and couldn\'t create!\" string ref and retracing", BlueFG);
            _subContext1.Name = "1";

            IntPtr ptr = _scanner.FindStringPtr("Entity %s not found, and couldn\'t create!\n");

            ptr.Report(_pr, "string");

            if (ptr == IntPtr.Zero)
            {
                goto method2;
            }

            Signature sig = new Signature("68" + ptr.GetByteString());

            ptr = _scanner.Scan(sig);
            ptr.Report(_pr, "string ref");

            var tmpScanner = new SigScanner(Game, ptr, 0x100);

            sig = new Signature("B? 01 E8 ?? ?? ?? ??", 2);
            ptr = Game.ReadRelativeReference(_scanner.Scan(sig));
            ptr.Report(_pr, level: BlueBG);
            return;

method2:
            _subContext1.Name = "";
            _pr.Print("Running method 2 -- finding \"ai_ally_speech_manager\" string ref and retracing", level: BlueFG);
            _subContext1.Name = "2";

            ptr = _scanner.FindStringPtr("ai_ally_speech_manager");
            ptr.Report(_pr, "string");

            if (ptr == IntPtr.Zero)
            {
                return;
            }

            SigCollection sc = new SigCollection();

            sc.Add(new Signature("6A FF 68" + ptr.GetByteString()));
            sc.Add(new Signature("68" + ptr.GetByteString() + "6A FF"));
            ptr = _scanner.Scan(sc);
            ptr.Report(_pr, "string ref");

            sig        = new Signature("74 ?? ?? E8", 3);
            tmpScanner = new SigScanner(Game, ptr, 0x40);
            ptr        = Game.ReadRelativeReference(tmpScanner.Scan(sig));
            ptr.Report(_pr, level: BlueBG);
        }
        public static IntPtr TraceToFuncEnd(this SigScanner scanner, IntPtr ptr, bool early = false)
        {
            if (ptr == IntPtr.Zero)
            {
                return(ptr);
            }

            var tmpScanner = new SigScanner(scanner.Process, ptr, scanner.End);
            var sc         = new SigCollection();

            if (early)
            {
                sc.Add("C3");
                sc.Add("C3");
                sc.Add(new Signature("C2 ?? 00", 3));

                return(tmpScanner.ScanMinimum(sc));
            }

            sc.Add(new Signature("CC CC CC CC", -1));
            sc.Add(new Signature("C3 CC CC CC", 0));
            sc.Add(new Signature("90 90 90 90", -1));
            sc.Add(new Signature("C3 90 90 90", 0));
            sc.Add(new Signature("C2 90 90 90", 0));

            return(tmpScanner.ScanMinimum(sc));
        }
        public static List <IntPtr> FindRelativeCalls(this SigScanner scanner, IntPtr ptr, IntPtr start, IntPtr end, int delta = 0)
        {
            _context.Update($"Relative Calls : 0x{ptr.ToString("X")}", ConsoleColor.Green);
            StationaryPrint sp = new StationaryPrint(_pr);

            char[] posArr = new char[8];

            int boundary   = 0;
            int deltaEnd   = end.SubtractI(ptr).Abs();
            int deltaStart = start.SubtractI(ptr).Abs();

            boundary = deltaEnd > deltaStart ? deltaEnd : deltaStart;

            for (int i = 0x10000000, j = 0; i >= 1; i /= 0x10, j++)
            {
                posArr[_endianMapping[j]] = boundary > i ? '?' : '0';
            }

            string pos = new string(posArr);
            string neg = pos.Replace('0', 'F');

            SigCollection s = new SigCollection();

            s.Add("E8 " + neg);
            s.Add("E8 " + pos);
            s.Add("E9 " + neg);
            s.Add("E9 " + pos);

            SigScanner newScanner = new SigScanner(
                scanner.Process,
                start,
                (int)end.Subtract(start));

            s.EvaluateMatch = (a) =>
            {
                if ((int)(Math.Abs(a.SubtractI(ptr))) < boundary &&
                    Math.Abs(scanner.Process.ReadRelativeReference(a).SubtractI(ptr)) <= delta)
                {
                    sp.Print($"Match at 0x{a.ToString("X")}");
                    return(true);
                }
                return(false);
            };

            try { return(newScanner.ScanAll(s)); }
            finally { sp.Return(); }
        }
        public static List <IntPtr> FindMOVReferences(this SigScanner scanner, IntPtr ptr)
        {
            List <IntPtr> output = new List <IntPtr>();

            if (ptr == IntPtr.Zero)
            {
                return(output);
            }

            string byteStr = ptr.GetByteString();

            var sc = new SigCollection();

            sc.Add($"8B ?? {byteStr}");
            sc.Add($"8A ?? {byteStr}");
            sc.Add($"A1  {byteStr}");
            sc.Add($"A2  {byteStr}");
            sc.Add($"A3  {byteStr}");
            sc.Add($"B8 ?? {byteStr}");
            sc.Add($"B9 ?? {byteStr}");

            return(scanner.ScanAll(sc));
        }