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