public AOBScanner(Process process, IntPtr handle, DSRInterface setDSRInterface) { dsrInterface = setDSRInterface; memRegions = new List <MEMORY_BASIC_INFORMATION>(); IntPtr memRegionAddr = process.MainModule.BaseAddress; IntPtr mainModuleEnd = process.MainModule.BaseAddress + process.MainModule.ModuleMemorySize; uint queryResult; do { MEMORY_BASIC_INFORMATION memInfo = new MEMORY_BASIC_INFORMATION(); queryResult = VirtualQueryEx(handle, memRegionAddr, out memInfo, (uint)Marshal.SizeOf(memInfo)); if (queryResult != 0) { if ((memInfo.State & MEM_COMMIT) != 0 && (memInfo.Protect & PAGE_GUARD) == 0 && (memInfo.Protect & PAGE_EXECUTE_ANY) != 0) { memRegions.Add(memInfo); } memRegionAddr = (IntPtr)((ulong)memInfo.BaseAddress.ToInt64() + memInfo.RegionSize); } } while (queryResult != 0 && memRegionAddr.ToInt64() < mainModuleEnd.ToInt64()); readMemory = new Dictionary <IntPtr, byte[]>(); foreach (MEMORY_BASIC_INFORMATION memRegion in memRegions) { readMemory[memRegion.BaseAddress] = dsrInterface.ReadBytes(memRegion.BaseAddress, (int)memRegion.RegionSize); } }
public DSRProcess(Process candidate) { process = candidate; ID = process.Id; int size = process.MainModule.ModuleMemorySize; if (versions.ContainsKey(size)) { Version = versions[size]; } else { Version = String.Format("0x{0:X}", size); } offsets = new DSROffsets(); dsrInterface = new DSRInterface(process); try { DSRInterface.AOBScanner scanner = dsrInterface.GetAOBScanner(); offsets.GraphicsDataPtr = scanner.Scan(DSROffsets.GraphicsDataAOB, 3); offsets.WorldChrBasePtr = scanner.Scan(DSROffsets.WorldChrBaseAOB, 3); offsets.Unknown1Ptr = scanner.Scan(DSROffsets.Unknown1AOB, 1); offsets.Unknown2Ptr = scanner.Scan(DSROffsets.Unknown2AOB, 3); Valid = true; } catch (ArgumentException) { Valid = false; } }