Пример #1
0
        public bool SupportsProcess(FMProcess process, byte[] context)
        {
                        #if LINUX || WINDOWS
            return(false);
                        #endif
                        #if MAC
            // Attempt to read the number of continents.
            // They MUST be 7
            // Then double check the date!
            int numberOfObjects = GameManager.TryGetPointerObjects(MemoryAddresses.MainAddress, 0x2C, ProcessManager.fmProcess);
            if (numberOfObjects != 7)
            {
                return(false);
            }

            DateTime dt = ProcessManager.ReadDateTime(MemoryAddresses.CurrentDateTime);
            if (dt.Year < 2012 || dt.Year > 2150)
            {
                return(false);
            }

            process.VersionDescription = "14.3.1 487631 (m.e v1454)";
            return(true);
                        #endif
        }
		public bool SupportsProcess(FMProcess process, byte[] context)
		{
			#if LINUX || WINDOWS
			return false;
			#endif
			#if MAC
			// Attempt to read the number of continents.
			// They MUST be 7
			// Then double check the date!
			int memoryAddress = ProcessManager.ReadInt32 (MemoryAddresses.MainAddress + MemoryAddresses.MainOffset);
			memoryAddress = ProcessManager.ReadInt32(memoryAddress);
			int xorValueOne = ProcessManager.ReadInt32 (memoryAddress + 0x2C + 0x4);
			int xorValueTwo = ProcessManager.ReadInt32 (memoryAddress + 0x2C);
			memoryAddress = xorValueTwo ^ xorValueOne;
			memoryAddress = ProcessManager.ReadInt32 (memoryAddress + MemoryAddresses.XorDistance);

			int numberOfObjects = ProcessManager.ReadArrayLength (memoryAddress);
			if (numberOfObjects != 7)
				return false;

			DateTime dt = ProcessManager.ReadDateTime (MemoryAddresses.CurrentDateTime);
			if (dt.Year < 2012 || dt.Year > 2150)
				return false;

			process.VersionDescription = "14.3.0 474129 (m.e v1454)";
			return true;
			#endif
		}
Пример #3
0
        public bool SupportsProcess(FMProcess process, byte[] context)
        {
                        #if WINDOWS || MAC
            return(false);
                        #endif
                        #if LINUX
            // Try to read the version number from the Heap
            // Look for the version signature
            int memoryAddress = ProcessManager.ReadInt32(MemoryAddresses.MainAddress);
            memoryAddress = ProcessManager.ReadInt32(memoryAddress + 0x1C);
            int xorValueOne = ProcessManager.ReadInt32(memoryAddress + 0x2C + MemoryAddresses.MainOffset);
            int xorValueTwo = ProcessManager.ReadInt32(memoryAddress + 0x2C);
            memoryAddress = xorValueTwo ^ xorValueOne;
            memoryAddress = ProcessManager.ReadInt32(memoryAddress + MemoryAddresses.XorDistance);

            int numberOfObjects = ProcessManager.ReadArrayLength(memoryAddress);
            if (numberOfObjects != 7)
            {
                return(false);
            }

            DateTime dt = ProcessManager.ReadDateTime(ProcessManager.fmProcess.BaseAddress + MemoryAddresses.CurrentDateTime);
            if (dt.Year < 2012 || dt.Year > 2150)
            {
                return(false);
            }

            process.VersionDescription = "14.3.0 474127 (m.e v1454)";
            return(true);
                        #endif
        }
Пример #4
0
        public bool SupportsProcess(FMProcess process, byte[] context)
        {
                        #if LINUX || WINDOWS
            return(false);
                        #endif
                        #if MAC
            // Attempt to read the number of continents.
            // They MUST be 7
            // Then double check the date!
            int memoryAddress = ProcessManager.ReadInt32(MemoryAddresses.MainAddress + MemoryAddresses.MainOffset);
            memoryAddress = ProcessManager.ReadInt32(memoryAddress);
            int xorValueOne = ProcessManager.ReadInt32(memoryAddress + 0x2C + 0x4);
            int xorValueTwo = ProcessManager.ReadInt32(memoryAddress + 0x2C);
            memoryAddress = xorValueTwo ^ xorValueOne;
            memoryAddress = ProcessManager.ReadInt32(memoryAddress + MemoryAddresses.XorDistance);

            int numberOfObjects = ProcessManager.ReadArrayLength(memoryAddress);
            if (numberOfObjects != 7)
            {
                return(false);
            }

            DateTime dt = ProcessManager.ReadDateTime(MemoryAddresses.CurrentDateTime);
            if (dt.Year < 2012 || dt.Year > 2150)
            {
                return(false);
            }

            process.VersionDescription = "14.3.0 474129 (m.e v1454)";
            return(true);
                        #endif
        }
        public bool SupportsProcess(FMProcess process, byte[] context)
        {
            #if WINDOWS || MAC
            return false;
            #endif
            #if LINUX

            // Try to read the version number from the Heap
            // Look for the version signature
            int memoryAddress = ProcessManager.ReadInt32 (MemoryAddresses.MainAddress);
            memoryAddress = ProcessManager.ReadInt32(memoryAddress + 0x1C);
            int xorValueOne = ProcessManager.ReadInt32 (memoryAddress + 0x2C + MemoryAddresses.MainOffset);
            int xorValueTwo = ProcessManager.ReadInt32 (memoryAddress + 0x2C);
            memoryAddress = xorValueTwo ^ xorValueOne;
            memoryAddress = ProcessManager.ReadInt32 (memoryAddress + MemoryAddresses.XorDistance);

            int numberOfObjects = ProcessManager.ReadArrayLength (memoryAddress);
            if (numberOfObjects != 7)
                return false;

            DateTime dt = ProcessManager.ReadDateTime (ProcessManager.fmProcess.BaseAddress + MemoryAddresses.CurrentDateTime);
            if (dt.Year < 2012 || dt.Year > 2150)
                return false;

            process.VersionDescription = "14.3.0 474127 (m.e v1454)";
            return true;
            #endif
        }
Пример #6
0
		// Finds the process and loads it in memory
		public bool findFMProcess ()
		{
			FMProcess fmProcess = new FMProcess ();
			Process[] fmProcesses = Process.GetProcessesByName ("fm");
			uint pid = fmProcesses.Length > 1 ? (uint)fmProcesses[0].Id : (uint)fmProcesses[0].Id;

			if (fmProcesses.Length > 0) {
				uint buffer;
				uint bufferend;
				uint heap;
				uint endaddress;
				if (ProcessMemoryAPI.GetBaseAddress (pid, out buffer, out bufferend, out heap, out endaddress)) {
					fmProcess.Process = fmProcesses [0];
					fmProcess.BaseAddress = (int)buffer;
					fmProcess.HeapAddress = (int)heap;
					fmProcess.EndPoint = (int)endaddress;
					ProcessManager.fmProcess = fmProcess;

					// Search for the current version
					foreach (var versionType in Assembly.GetCallingAssembly().GetTypes().Where(t => typeof(IIVersion).IsAssignableFrom(t))) {
						if (versionType.IsInterface)
							continue;
						var instance = (IIVersion)Activator.CreateInstance (versionType);

						if (instance.SupportsProcess (fmProcess, null)) {
							Version = instance;
							break;
						}
					}
				}
				fmLoaded = (Version != null);
			}

			if (!fmLoaded) {
				// Try to find info about the version
				// Lookup the objects in the memory
				for (int i = fmProcess.BaseAddress; i < fmProcess.EndPoint - 4; i += 4) {
					try {
						int continents = TryGetPointerObjects(i, 0x1c, fmProcess);
						if (continents == 7)
						{
							Debug.WriteLine ("Found a candidate @ 0x{0:X}", i);
							Debug.WriteLine ("Persons: {0}", TryGetPointerObjects(i, 0x3c, fmProcess));
						}
					}
					catch {
					}
				}
			}

			return fmLoaded;
		}
        public bool SupportsProcess(FMProcess process, byte[] context)
        {
#if LINUX || MAC
			return false;
#endif

#if WINDOWS
            if (process.VersionDescription != "16.3.1f789819") return false;

            var dt = ProcessManager.ReadDateTime(process.BaseAddress + MemoryAddresses.CurrentDateTime);
            if (dt.Year < 2012 || dt.Year > 2150)
                return false;

            return true;
#endif
        }
        public bool SupportsProcess(FMProcess process, byte[] context)
        {
            #if LINUX || MAC
            return false;
            #endif

            #if WINDOWS
            if (process.VersionDescription != "16.3.2f830543") return false;

            var dt = ProcessManager.ReadDateTime(process.BaseAddress + MemoryAddresses.CurrentDateTime);
            if (dt.Year < 2012 || dt.Year > 2150)
            {
                Console.WriteLine("Failed!");
                return false;
            }

            return true;
            #endif
        }
Пример #9
0
        public bool SupportsProcess(FMProcess process, byte[] context)
        {
#if LINUX || MAC
            return(false);
#endif

#if WINDOWS
            if (process.VersionDescription != "16.3.1f789819")
            {
                return(false);
            }

            var dt = ProcessManager.ReadDateTime(process.BaseAddress + MemoryAddresses.CurrentDateTime);
            if (dt.Year < 2012 || dt.Year > 2150)
            {
                return(false);
            }

            return(true);
#endif
        }
        public bool SupportsProcess(FMProcess process, byte[] context)
        {
            #if LINUX || WINDOWS
            return false;
            #endif
            #if MAC
            // Attempt to read the number of continents.
            // They MUST be 7
            // Then double check the date!
            int numberOfObjects = GameManager.TryGetPointerObjects(MemoryAddresses.MainAddress, 0x2C, ProcessManager.fmProcess);
            if (numberOfObjects != 7)
                return false;

            DateTime dt = ProcessManager.ReadDateTime (MemoryAddresses.CurrentDateTime);
            if (dt.Year < 2012 || dt.Year > 2150)
                return false;

            process.VersionDescription = "14.3.1 487631 (m.e v1454)";
            return true;
            #endif
        }
Пример #11
0
        // Finds the process and loads it in memory
        public bool findFMProcess()
        {
            FMProcess fmProcess = new FMProcess();

            Process[] fmProcesses = Process.GetProcessesByName("fm");
            uint      pid         = fmProcesses.Length > 1 ? (uint)fmProcesses[0].Id : (uint)fmProcesses[0].Id;

            if (fmProcesses.Length > 0)
            {
                uint buffer;
                uint heap;
                uint endaddress;
                if (ProcessMemoryAPI.GetBaseAddress(pid, out buffer, out heap, out endaddress))
                {
                    fmProcess.Process        = fmProcesses [0];
                    fmProcess.BaseAddress    = (int)buffer;
                    fmProcess.HeapAddress    = (int)heap;
                    fmProcess.EndPoint       = (int)endaddress;
                    ProcessManager.fmProcess = fmProcess;

                    // Search for the current version
                    foreach (var versionType in Assembly.GetCallingAssembly().GetTypes().Where(t => typeof(IIVersion).IsAssignableFrom(t)))
                    {
                        if (versionType.IsInterface)
                        {
                            continue;
                        }
                        var instance = (IIVersion)Activator.CreateInstance(versionType);

                        if (instance.SupportsProcess(fmProcess, null))
                        {
                            Version = instance;
                            break;
                        }
                    }
                }
                fmLoaded = (Version != null);
            }

            if (!fmLoaded)
            {
                int i;
                // Try to find info about the version
                // Lookup the objects in the memory
                for (i = fmProcess.BaseAddress; i < fmProcess.HeapAddress; i += 4)
                {
                    int memoryAddress = ProcessManager.ReadInt32(i);
                    if (memoryAddress > fmProcess.BaseAddress && memoryAddress < fmProcess.EndPoint)
                    {
                        memoryAddress = ProcessManager.ReadInt32(memoryAddress + 0x1C);
                        if (memoryAddress < fmProcess.BaseAddress || memoryAddress > fmProcess.EndPoint)
                        {
                            continue;
                        }
                        int xorValueOne = ProcessManager.ReadInt32(memoryAddress + 0x2C + 0x4);
                        int xorValueTwo = ProcessManager.ReadInt32(memoryAddress + 0x2C);
                        memoryAddress = xorValueTwo ^ xorValueOne;
                        if (memoryAddress < fmProcess.BaseAddress || memoryAddress > fmProcess.EndPoint)
                        {
                            continue;
                        }
                        memoryAddress = ProcessManager.ReadInt32(memoryAddress + 0x54);
                        if (memoryAddress < fmProcess.BaseAddress || memoryAddress > fmProcess.EndPoint)
                        {
                            continue;
                        }
                        int numberOfObjects = ProcessManager.ReadArrayLength(memoryAddress);
                        if (numberOfObjects != 7)
                        {
                            continue;
                        }
                        else
                        {
                            Debug.WriteLine("Found a candidate @ 0x{0:X}", i);
                        }
                    }
                    else
                    {
                        continue;
                    }
                }
            }

            return(fmLoaded);
        }
Пример #12
0
		public bool findFMProcess() {
			FMProcess fmProcess = new FMProcess ();
			Process[] fmProcesses = Process.GetProcessesByName ("fm");

			if (fmProcesses.Length > 0) {
				Process activeProcess = fmProcesses [0];

				fmProcess.Pointer = ProcessMemoryAPI.OpenProcess (0x001F0FFF, 1, (uint)activeProcess.Id);
				fmProcess.EndPoint = ProcessManager.GetProcessEndPoint (fmProcess.Pointer);
				fmProcess.Process = activeProcess;
                fmProcess.BaseAddress = activeProcess.MainModule.BaseAddress.ToInt32();

				ProcessManager.fmProcess = fmProcess;
				fmProcess.VersionDescription = fmProcess.Process.MainModule.FileVersionInfo.ProductVersion;

				// Search for the current version
				foreach (var versionType in Assembly.GetCallingAssembly().GetTypes().Where(t => typeof(IIVersion).IsAssignableFrom(t))) {
					if (versionType.IsInterface)
						continue;
					var instance = (IIVersion)Activator.CreateInstance (versionType);

					if (instance.SupportsProcess (fmProcess, null)) {
						Version = instance;
						break;
					}
				}

				fmLoaded = (Version != null);

                if (!fmLoaded)
                {
                    int i;
                    // Try to find info about the version
                    // Lookup the objects in the memory
                    for (i = (fmProcess.BaseAddress + 0x1A8484E); i < fmProcess.EndPoint; i += 4)
                    {
                        int cities, clubs, leagues, stadiums, teams, continents, countries, persons;
                        string[] splitVersion = fmProcess.VersionDescription.Split('.');
                        if (splitVersion[0] == "14") {
                            cities = TryGetPointerObjects(i, 0x14, fmProcess);
                            clubs = TryGetPointerObjects(i, 0x1C, fmProcess);
                            leagues = TryGetPointerObjects(i, 0x24, fmProcess);
                            stadiums = TryGetPointerObjects(i, 0x8C, fmProcess);
                            teams = TryGetPointerObjects(i, 0xA4, fmProcess);
                            continents = TryGetPointerObjects(i, 0x2C, fmProcess);
                            countries = TryGetPointerObjects(i, 0x64, fmProcess);
                            persons = TryGetPointerObjects(i, 0x6C, fmProcess);
                        }
                        else
                        {
                            cities = TryGetPointerObjects(i, 0x10, fmProcess);
                            clubs = TryGetPointerObjects(i, 0x14, fmProcess);
                            leagues = TryGetPointerObjects(i, 0x18, fmProcess);
                            stadiums = TryGetPointerObjects(i, 0x4C, fmProcess);
                            teams = TryGetPointerObjects(i, 0x58, fmProcess);
                            continents = TryGetPointerObjects(i, 0x1C, fmProcess);
                            countries = TryGetPointerObjects(i, 0x38, fmProcess);
                            persons = TryGetPointerObjects(i, 0x3C, fmProcess);
                        }


                        if (continents == 7 && countries > 230 && countries < 250 && (
                            cities > 0 && clubs > 0 && leagues > 0 && stadiums > 0 &&
                            teams > 0 && persons > 0
                            ))
                        {
                            Debug.WriteLine("Found a candidate @ 0x{0:X}", i);
                        }
                    }
                }
			}
			return fmLoaded;
		}
Пример #13
0
        // Finds the process and loads it in memory
        public bool findFMProcess()
        {
            FMProcess fmProcess = new FMProcess();

            Process[] fmProcesses = Process.GetProcessesByName("fm");
            uint      pid         = fmProcesses.Length > 1 ? (uint)fmProcesses[0].Id : (uint)fmProcesses[0].Id;

            if (fmProcesses.Length > 0)
            {
                uint buffer;
                uint bufferend;
                uint heap;
                uint endaddress;
                if (ProcessMemoryAPI.GetBaseAddress(pid, out buffer, out bufferend, out heap, out endaddress))
                {
                    fmProcess.Process        = fmProcesses [0];
                    fmProcess.BaseAddress    = (int)buffer;
                    fmProcess.HeapAddress    = (int)heap;
                    fmProcess.EndPoint       = (int)endaddress;
                    ProcessManager.fmProcess = fmProcess;

                    // Search for the current version
                    foreach (var versionType in Assembly.GetCallingAssembly().GetTypes().Where(t => typeof(IIVersion).IsAssignableFrom(t)))
                    {
                        if (versionType.IsInterface)
                        {
                            continue;
                        }
                        var instance = (IIVersion)Activator.CreateInstance(versionType);

                        if (instance.SupportsProcess(fmProcess, null))
                        {
                            Version = instance;
                            break;
                        }
                    }
                }
                fmLoaded = (Version != null);
            }

            if (!fmLoaded)
            {
                // Try to find info about the version
                // Lookup the objects in the memory
                for (int i = fmProcess.BaseAddress; i < fmProcess.EndPoint - 4; i += 4)
                {
                    try {
                        int continents = TryGetPointerObjects(i, 0x1c, fmProcess);
                        if (continents == 7)
                        {
                            Debug.WriteLine("Found a candidate @ 0x{0:X}", i);
                            Debug.WriteLine("Persons: {0}", TryGetPointerObjects(i, 0x3c, fmProcess));
                        }
                    }
                    catch {
                    }
                }
            }

            return(fmLoaded);
        }
Пример #14
0
		public static int TryGetPointerObjects(int address, int offset, FMProcess fmProcess) {
			return GameManager.TryGetPointerObjects (address, offset, fmProcess, "15");
		}
Пример #15
0
 public static int TryGetPointerObjects(int address, int offset, FMProcess fmProcess)
 {
     return(GameManager.TryGetPointerObjects(address, offset, fmProcess, "15"));
 }
Пример #16
0
        public static int TryGetPointerObjects(int address, int offset, FMProcess fmProcess, string masterVersion)
        {
                        #if WINDOWS
            int memoryAddress = ProcessManager.ReadInt32(address);
            Debug.WriteLine("Base 0x{0:X} -> 0x{1:X}", address, memoryAddress);
            if (memoryAddress > fmProcess.BaseAddress && memoryAddress < fmProcess.EndPoint)
            {
                memoryAddress = ProcessManager.ReadInt32(memoryAddress);
                if (memoryAddress < fmProcess.BaseAddress || memoryAddress > fmProcess.EndPoint)
                {
                    return(0);
                }

                string[] splitVersion = fmProcess.VersionDescription.Split('.');
                if (splitVersion[0] == "14")
                {
                    int xorValueOne = ProcessManager.ReadInt32(memoryAddress + offset + 0x4);
                    int xorValueTwo = ProcessManager.ReadInt32(memoryAddress + offset);
                    memoryAddress = xorValueTwo ^ xorValueOne;
                    if (memoryAddress < fmProcess.BaseAddress || memoryAddress > fmProcess.EndPoint)
                    {
                        return(0);
                    }
                    memoryAddress = ProcessManager.ReadInt32(memoryAddress + 0x54);
                }
                else
                {
                    memoryAddress = ProcessManager.ReadInt32(memoryAddress + offset);
                    if (memoryAddress < fmProcess.BaseAddress || memoryAddress > fmProcess.EndPoint)
                    {
                        return(0);
                    }
                    memoryAddress = ProcessManager.ReadInt32(memoryAddress + 0x40);
                }

                if (memoryAddress < fmProcess.BaseAddress || memoryAddress > fmProcess.EndPoint)
                {
                    return(0);
                }

                int numberOfObjects = ProcessManager.ReadArrayLength(memoryAddress);
                return(numberOfObjects);
            }
                        #endif
                        #if MAC
            int memoryAddress = ProcessManager.ReadInt32(address);
            if (masterVersion == "14")
            {
                memoryAddress = ProcessManager.ReadInt32(address + 0x1C);
            }

            if (memoryAddress > fmProcess.BaseAddress && memoryAddress < fmProcess.EndPoint)
            {
                if (masterVersion == "14")
                {
                    memoryAddress = ProcessManager.ReadInt32(memoryAddress);
                    if (memoryAddress < fmProcess.BaseAddress || memoryAddress > fmProcess.EndPoint)
                    {
                        return(0);
                    }
                    int xorValueOne = ProcessManager.ReadInt32(memoryAddress + offset + 0x4);
                    int xorValueTwo = ProcessManager.ReadInt32(memoryAddress + offset);
                    memoryAddress = xorValueTwo ^ xorValueOne;
                    if (memoryAddress < fmProcess.BaseAddress || memoryAddress > fmProcess.EndPoint)
                    {
                        return(0);
                    }
                    memoryAddress = ProcessManager.ReadInt32(memoryAddress + 0x54);
                    if (memoryAddress < fmProcess.BaseAddress || memoryAddress > fmProcess.EndPoint)
                    {
                        return(0);
                    }
                }
                else
                {
                    memoryAddress = ProcessManager.ReadInt32(memoryAddress + offset);
                    memoryAddress = ProcessManager.ReadInt32(memoryAddress + 0x40);
                }

                int numberOfObjects = ProcessManager.ReadArrayLength(memoryAddress);
                return(numberOfObjects);
            }
                        #endif
                        #if LINUX
            int memoryAddress = ProcessManager.ReadInt32(address);
            memoryAddress = ProcessManager.ReadInt32(memoryAddress + offset);
            memoryAddress = ProcessManager.ReadInt32(memoryAddress + 0x5c);

            int numberOfObjects = ProcessManager.ReadArrayLength(memoryAddress);
            return(numberOfObjects);
                        #endif
            return(0);
        }
Пример #17
0
        public bool findFMProcess()
        {
            FMProcess fmProcess = new FMProcess();

            Process[] fmProcesses = Process.GetProcessesByName("fm");

            if (fmProcesses.Length > 0)
            {
                Process activeProcess = fmProcesses [0];

                fmProcess.Pointer     = ProcessMemoryAPI.OpenProcess(0x001F0FFF, 1, (uint)activeProcess.Id);
                fmProcess.EndPoint    = ProcessManager.GetProcessEndPoint(fmProcess.Pointer);
                fmProcess.Process     = activeProcess;
                fmProcess.BaseAddress = activeProcess.MainModule.BaseAddress.ToInt32();

                ProcessManager.fmProcess     = fmProcess;
                fmProcess.VersionDescription = fmProcess.Process.MainModule.FileVersionInfo.ProductVersion;

                // Search for the current version
                foreach (var versionType in Assembly.GetCallingAssembly().GetTypes().Where(t => typeof(IIVersion).IsAssignableFrom(t)))
                {
                    if (versionType.IsInterface)
                    {
                        continue;
                    }
                    var instance = (IIVersion)Activator.CreateInstance(versionType);

                    if (instance.SupportsProcess(fmProcess, null))
                    {
                        Version = instance;
                        break;
                    }
                }

                fmLoaded = (Version != null);

                if (!fmLoaded)
                {
                    int i;
                    // Try to find info about the version
                    // Lookup the objects in the memory
                    for (i = (fmProcess.BaseAddress + 0x1A8484E); i < fmProcess.EndPoint; i += 4)
                    {
                        int      cities, clubs, leagues, stadiums, teams, continents, countries, persons;
                        string[] splitVersion = fmProcess.VersionDescription.Split('.');
                        if (splitVersion[0] == "14")
                        {
                            cities     = TryGetPointerObjects(i, 0x14, fmProcess);
                            clubs      = TryGetPointerObjects(i, 0x1C, fmProcess);
                            leagues    = TryGetPointerObjects(i, 0x24, fmProcess);
                            stadiums   = TryGetPointerObjects(i, 0x8C, fmProcess);
                            teams      = TryGetPointerObjects(i, 0xA4, fmProcess);
                            continents = TryGetPointerObjects(i, 0x2C, fmProcess);
                            countries  = TryGetPointerObjects(i, 0x64, fmProcess);
                            persons    = TryGetPointerObjects(i, 0x6C, fmProcess);
                        }
                        else
                        {
                            cities     = TryGetPointerObjects(i, 0x10, fmProcess);
                            clubs      = TryGetPointerObjects(i, 0x14, fmProcess);
                            leagues    = TryGetPointerObjects(i, 0x18, fmProcess);
                            stadiums   = TryGetPointerObjects(i, 0x4C, fmProcess);
                            teams      = TryGetPointerObjects(i, 0x58, fmProcess);
                            continents = TryGetPointerObjects(i, 0x1C, fmProcess);
                            countries  = TryGetPointerObjects(i, 0x38, fmProcess);
                            persons    = TryGetPointerObjects(i, 0x3C, fmProcess);
                        }


                        if (continents == 7 && countries > 230 && countries < 250 && (
                                cities > 0 && clubs > 0 && leagues > 0 && stadiums > 0 &&
                                teams > 0 && persons > 0
                                ))
                        {
                            Debug.WriteLine("Found a candidate @ 0x{0:X}", i);
                        }
                    }
                }
            }
            return(fmLoaded);
        }
Пример #18
0
        public bool findFMProcess()
        {
            FMProcess fmProcess = new FMProcess();

            Process[] fmProcesses = Process.GetProcessesByName("fm");
            if (fmProcesses.Length > 0)
            {
                Process activeProcess = fmProcesses [0];
                fmProcess.Process     = activeProcess;
                fmProcess.BaseAddress = activeProcess.MainModule.BaseAddress.ToInt32();
                fmProcess.EndPoint    = ProcessManager.GetProcessEndPoint(activeProcess.Id);

                ProcessManager.fmProcess = fmProcess;

                // Search for the current version
                foreach (var versionType in Assembly.GetCallingAssembly().GetTypes().Where(t => typeof(IIVersion).IsAssignableFrom(t)))
                {
                    if (versionType.IsInterface)
                    {
                        continue;
                    }
                    var instance = (IIVersion)Activator.CreateInstance(versionType);

                    if (instance.SupportsProcess(fmProcess, null))
                    {
                        Version = instance;
                        break;
                    }
                }

                fmLoaded = (Version != null);

                #region ObjectScanner
                if (!fmLoaded)
                {
                    int i;
                    // Try to find info about the version
                    // Lookup the objects in the memory
                    for (i = 0x32A0000; i < fmProcess.EndPoint; i += 4)
                    {
                        int cities     = TryGetPointerObjects(i, 0x14, fmProcess);
                        int clubs      = TryGetPointerObjects(i, 0x1C, fmProcess);
                        int leagues    = TryGetPointerObjects(i, 0x24, fmProcess);
                        int stadiums   = TryGetPointerObjects(i, 0x8C, fmProcess);
                        int teams      = TryGetPointerObjects(i, 0xA4, fmProcess);
                        int continents = TryGetPointerObjects(i, 0x2C, fmProcess);
                        int countries  = TryGetPointerObjects(i, 0x64, fmProcess);
                        int persons    = TryGetPointerObjects(i, 0x6C, fmProcess);

                        if (continents == 7 && countries == 240 && (
                                cities > 0 && clubs > 0 && leagues > 0 && stadiums > 0 &&
                                teams > 0 && persons > 0
                                ))
                        {
                            Debug.WriteLine("Found a candidate @ 0x{0:X}", i);
                        }
                    }
                }
                #endregion
            }

            return(fmLoaded);
        }
Пример #19
0
        // Finds the process and loads it in memory
        public bool findFMProcess()
        {
            FMProcess fmProcess = new FMProcess ();
            Process[] fmProcesses = Process.GetProcessesByName ("fm");
            uint pid = fmProcesses.Length > 1 ? (uint)fmProcesses[0].Id : (uint)fmProcesses[0].Id;

            if (fmProcesses.Length > 0) {
                uint buffer;
                uint heap;
                uint endaddress;
                if (ProcessMemoryAPI.GetBaseAddress (pid, out buffer, out heap, out endaddress)) {
                    fmProcess.Process = fmProcesses [0];
                    fmProcess.BaseAddress = (int)buffer;
                    fmProcess.HeapAddress = (int)heap;
                    fmProcess.EndPoint = (int)endaddress;
                    ProcessManager.fmProcess = fmProcess;

                    // Search for the current version
                    foreach (var versionType in Assembly.GetCallingAssembly().GetTypes().Where(t => typeof(IIVersion).IsAssignableFrom(t))) {
                        if (versionType.IsInterface)
                            continue;
                        var instance = (IIVersion)Activator.CreateInstance (versionType);

                        if (instance.SupportsProcess (fmProcess, null)) {
                            Version = instance;
                            break;
                        }
                    }
                }
                fmLoaded = (Version != null);
            }

            if (!fmLoaded) {
                int i;
                // Try to find info about the version
                // Lookup the objects in the memory
                for (i = fmProcess.BaseAddress; i < fmProcess.HeapAddress; i += 4) {
                    int memoryAddress = ProcessManager.ReadInt32 (i);
                    if (memoryAddress > fmProcess.BaseAddress && memoryAddress < fmProcess.EndPoint) {
                        memoryAddress = ProcessManager.ReadInt32 (memoryAddress + 0x1C);
                        if (memoryAddress < fmProcess.BaseAddress || memoryAddress > fmProcess.EndPoint)
                            continue;
                        int xorValueOne = ProcessManager.ReadInt32 (memoryAddress + 0x2C + 0x4);
                        int xorValueTwo = ProcessManager.ReadInt32 (memoryAddress + 0x2C);
                        memoryAddress = xorValueTwo ^ xorValueOne;
                        if (memoryAddress < fmProcess.BaseAddress || memoryAddress > fmProcess.EndPoint)
                            continue;
                        memoryAddress = ProcessManager.ReadInt32 (memoryAddress + 0x54);
                        if (memoryAddress < fmProcess.BaseAddress || memoryAddress > fmProcess.EndPoint)
                            continue;
                        int numberOfObjects = ProcessManager.ReadArrayLength (memoryAddress);
                        if (numberOfObjects != 7)
                            continue;
                        else
                            Debug.WriteLine ("Found a candidate @ 0x{0:X}", i);
                    } else
                        continue;
                }
            }

            return fmLoaded;
        }
Пример #20
0
		public bool findFMProcess() {
			FMProcess fmProcess = new FMProcess ();
			Process[] fmProcesses = Process.GetProcessesByName ("fm");
			if (fmProcesses.Length > 0) {

				Process activeProcess = fmProcesses [0];
				fmProcess.Process = activeProcess;
				fmProcess.BaseAddress = activeProcess.MainModule.BaseAddress.ToInt32 ();
				fmProcess.EndPoint = ProcessManager.GetProcessEndPoint (activeProcess.Id);

				ProcessManager.fmProcess = fmProcess;

				// Search for the current version
				foreach (var versionType in Assembly.GetCallingAssembly().GetTypes().Where(t => typeof(IIVersion).IsAssignableFrom(t))) {
					if (versionType.IsInterface)
						continue;
					var instance = (IIVersion)Activator.CreateInstance (versionType);

					if (instance.SupportsProcess (fmProcess, null)) {
						Version = instance;
						break;
					}
				}

				fmLoaded = (Version != null);

				#region ObjectScanner
				if (!fmLoaded)
				{
					int i;
					// Try to find info about the version
					// Lookup the objects in the memory
					for (i = 0x32A0000; i < fmProcess.EndPoint; i += 4)
					{
						int cities = TryGetPointerObjects(i, 0x14, fmProcess);
						int clubs = TryGetPointerObjects(i, 0x1C, fmProcess);
						int leagues = TryGetPointerObjects(i, 0x24, fmProcess);
						int stadiums = TryGetPointerObjects(i, 0x8C, fmProcess);
						int teams = TryGetPointerObjects(i, 0xA4, fmProcess);
						int continents = TryGetPointerObjects(i, 0x2C, fmProcess);
						int countries = TryGetPointerObjects(i, 0x64, fmProcess);
						int persons = TryGetPointerObjects(i, 0x6C, fmProcess);

						if (continents == 7 && countries == 240 && (
							cities > 0 && clubs > 0 && leagues > 0 && stadiums > 0 &&
							teams > 0 && persons > 0
						))
						{
							Debug.WriteLine("Found a candidate @ 0x{0:X}", i);
						}
					}
				}
				#endregion
			}

			return fmLoaded;
		}
Пример #21
0
		public static int TryGetPointerObjects(int address, int offset, FMProcess fmProcess, string masterVersion)
        {
			#if WINDOWS
            int memoryAddress = ProcessManager.ReadInt32(address);
            Debug.WriteLine("Base 0x{0:X} -> 0x{1:X}", address, memoryAddress);
            if (memoryAddress > fmProcess.BaseAddress && memoryAddress < fmProcess.EndPoint)
            {
                memoryAddress = ProcessManager.ReadInt32(memoryAddress);
                if (memoryAddress < fmProcess.BaseAddress || memoryAddress > fmProcess.EndPoint)
                    return 0;

                string[] splitVersion = fmProcess.VersionDescription.Split('.');
                if (splitVersion[0] == "14")
                {
                    int xorValueOne = ProcessManager.ReadInt32(memoryAddress + offset + 0x4);
                    int xorValueTwo = ProcessManager.ReadInt32(memoryAddress + offset);
                    memoryAddress = xorValueTwo ^ xorValueOne;
                    if (memoryAddress < fmProcess.BaseAddress || memoryAddress > fmProcess.EndPoint)
                        return 0;
                    memoryAddress = ProcessManager.ReadInt32(memoryAddress + 0x54);
                }
                else
                {
                    memoryAddress = ProcessManager.ReadInt32(memoryAddress + offset);
                    if (memoryAddress < fmProcess.BaseAddress || memoryAddress > fmProcess.EndPoint)
                        return 0;
                    memoryAddress = ProcessManager.ReadInt32(memoryAddress + 0x40);
                }
                
                if (memoryAddress < fmProcess.BaseAddress || memoryAddress > fmProcess.EndPoint)
                    return 0;

                int numberOfObjects = ProcessManager.ReadArrayLength(memoryAddress);
                return numberOfObjects;
            }
			#endif
			#if MAC
			int memoryAddress = ProcessManager.ReadInt32 (address);
			if (masterVersion == "14") {
				memoryAddress = ProcessManager.ReadInt32 (address + 0x1C);
			}

			if (memoryAddress > fmProcess.BaseAddress && memoryAddress < fmProcess.EndPoint)
			{
				if (masterVersion == "14") {
					memoryAddress = ProcessManager.ReadInt32(memoryAddress);
					if (memoryAddress < fmProcess.BaseAddress || memoryAddress > fmProcess.EndPoint)
						return 0;
					int xorValueOne = ProcessManager.ReadInt32(memoryAddress + offset + 0x4);
					int xorValueTwo = ProcessManager.ReadInt32(memoryAddress + offset);
					memoryAddress = xorValueTwo ^ xorValueOne;
					if (memoryAddress < fmProcess.BaseAddress || memoryAddress > fmProcess.EndPoint)
						return 0;
					memoryAddress = ProcessManager.ReadInt32(memoryAddress + 0x54);
					if (memoryAddress < fmProcess.BaseAddress || memoryAddress > fmProcess.EndPoint)
						return 0;
				}
				else {
					memoryAddress = ProcessManager.ReadInt32(memoryAddress + offset);
					memoryAddress = ProcessManager.ReadInt32(memoryAddress + 0x40);
				}

				int numberOfObjects = ProcessManager.ReadArrayLength(memoryAddress);
				return numberOfObjects;
			}
			#endif
			#if LINUX
			int memoryAddress = ProcessManager.ReadInt32 (address);
			memoryAddress = ProcessManager.ReadInt32(memoryAddress + offset);
			memoryAddress = ProcessManager.ReadInt32(memoryAddress + 0x5c);

			int numberOfObjects = ProcessManager.ReadArrayLength(memoryAddress);
			return numberOfObjects;
			#endif
			return 0;
        }