Example #1
0
        public virtual void Scan()
        {
            if (Memory.Scanner.Enabled == false)
            {
                throw new Exception("Please enable SignatureScanner first");
            }

            var result = Memory.Scanner.Scan <uint>(MemoryRegionType.EXECUTE, Signature);

            foreach (var ptr in Pointers)
            {
                ptr.Refresh(Memory);
            }

            // Search the address and offset.);
            switch (AddressType)
            {
            case MemoryAddress.StaticAbsolute:
            case MemoryAddress.Static:
                if (result == 0)
                {
                    return;
                }
                AddressTree = new int[1 + Pointers.Count()];

                if (Pointers.Count() == 0)
                {
                    // The result is directly our address
                    Address        = (int)result;
                    AddressTree[0] = (int)result;
                }
                else
                {
                    // We must follow one pointer.
                    var computedAddress = 0;
                    if (AddressType == MemoryAddress.Static)
                    {
                        computedAddress = Memory.BaseAddress + (int)result;
                    }
                    else
                    {
                        computedAddress = (int)result;
                    }

                    int treeInd = 0;

                    foreach (var ptr in Pointers)
                    {
                        AddressTree[treeInd++] = computedAddress;
                        if (ptr.Additive)
                        {
                            computedAddress += ptr.Offset;
                        }
                        else
                        {
                            computedAddress = Memory.Reader.ReadInt32(computedAddress + ptr.Offset);
                        }
                    }
                    AddressTree[treeInd] = computedAddress;

                    Address = computedAddress;
                }
                break;

            case MemoryAddress.Dynamic:
                Offset = (int)result;

                foreach (var ptr in Pointers)
                {
                    if (ptr.Additive)
                    {
                        Offset += ptr.Offset;
                    }
                }
                break;

            default:
                throw new Exception("AddressType for '" + Name + "' is not valid");
                break;
            }

            Initialized = true;
        }
Example #2
0
        public void Refresh()
        {
            if (IsTemplate)
            {
                return;
            }

            var computedAddress = 0;

            if (IsSignature && Offset == 0 && Address == 0 && Memory.Scanner.Enabled)
            {
                var result = Memory.Scanner.Scan <uint>(MemoryRegionType.EXECUTE, Signature);

                // Search the address and offset.
                switch (AddressType)
                {
                case MemoryAddress.StaticAbsolute:
                case MemoryAddress.Static:
                    if (result == 0)
                    {
                        return;
                    }

                    if (Pointers.Count() == 0)
                    {
                        // The result is directly our address
                        Address = (int)result;
                    }
                    else
                    {
                        // We must follow one pointer.
                        if (AddressType == MemoryAddress.Static)
                        {
                            computedAddress = Memory.BaseAddress + (int)result;
                        }
                        else
                        {
                            computedAddress = (int)result;
                        }

                        Address = computedAddress;
                    }
                    break;

                case MemoryAddress.Dynamic:
                    Offset = (int)result;
                    break;

                default:
                    throw new Exception("AddressType for '" + Name + "' is not valid");
                    break;
                }
            }

            // Refresh pointers too
            foreach (var ptr in Pointers)
            {
                ptr.Refresh(Memory);
            }

            // Refresh this memory block.
            if (Size > 0)
            {
                AddressTree = new int[1 + Pointers.Count()];
                if (IsStatic)
                {
                    if (Address != 0 && Offset != 0)
                    {
                        computedAddress = Memory.Reader.ReadInt32(Memory.BaseAddress + Address) + Offset;
                    }
                    else
                    {
                        computedAddress = AddressType == MemoryAddress.Static ? Memory.BaseAddress + Address : Address;
                    }
                }
                else
                {
                    computedAddress = Pool == null ? 0 : MemoryDataConverter.Read <int>(Pool.Value, Offset);
                }
                int treeInd = 0;
                foreach (var ptr in Pointers)
                {
                    AddressTree[treeInd++] = computedAddress;
                    if (ptr.Additive)
                    {
                        computedAddress += ptr.Offset;
                    }
                    else
                    {
                        computedAddress = Memory.Reader.ReadInt32(computedAddress + ptr.Offset);
                    }
                }
                AddressTree[treeInd] = computedAddress;

                // Read into this buffer.
                Memory.Reader.Read(computedAddress, Value);
            }

            // Refresh underlying fields.
            foreach (var field in Fields)
            {
                field.Value.Refresh();
            }

            foreach (var pool in Pools.Values)
            {
                pool.Refresh();
            }
        }