Esempio n. 1
0
        internal string GetName(PEBuffer buff, int resourceStartFileOffset)
        {
            if (IsStringName)
            {
                int   nameLen = *((ushort *)buff.Fetch(NameOffset + resourceStartFileOffset, 2));
                char *namePtr = (char *)buff.Fetch(NameOffset + resourceStartFileOffset + 2, nameLen);
                return(new string(namePtr));
            }

            return(Id.ToString());
        }
Esempio n. 2
0
        public unsafe int ReadVirtual(IntPtr self, ulong address, IntPtr buffer, int bytesRequested, out int bytesRead)
        {
            if (_dataReader.ReadMemory(address, buffer, bytesRequested, out int read))
            {
                bytesRead = read;
                return(S_OK);
            }

            bytesRead = 0;
            ModuleInfo info = GetModule(address);

            if (info != null)
            {
                if (Path.GetExtension(info.FileName).ToLower() == ".so")
                {
                    // TODO
                    System.Diagnostics.Debug.WriteLine($"TODO: Implement reading from module '{info.FileName}'");
                    return(E_NOTIMPL);
                }

                string filePath = _dataTarget.SymbolLocator.FindBinary(info.FileName, info.TimeStamp, info.FileSize, true);
                if (filePath == null)
                {
                    bytesRead = 0;
                    return(E_FAIL);
                }

                // We do not put a using statement here to prevent needing to load/unload the binary over and over.
                PEFile file = _dataTarget.FileLoader.LoadPEFile(filePath);
                if (file?.Header != null)
                {
                    PEBuffer peBuffer = file.AllocBuff();

                    int rva = checked ((int)(address - info.ImageBase));

                    if (file.Header.TryGetFileOffsetFromRva(rva, out rva))
                    {
                        byte *dst = (byte *)buffer.ToPointer();
                        byte *src = peBuffer.Fetch(rva, bytesRequested);

                        for (int i = 0; i < bytesRequested; i++)
                        {
                            dst[i] = src[i];
                        }

                        bytesRead = bytesRequested;
                        return(S_OK);
                    }

                    file.FreeBuff(peBuffer);
                }
            }

            return(E_FAIL);
        }
Esempio n. 3
0
        public unsafe int ReadVirtual(ulong address, IntPtr buffer, int bytesRequested, out int bytesRead)
        {
            int read = 0;

            if (_dataReader.ReadMemory(address, buffer, bytesRequested, out read))
            {
                bytesRead = read;
                return(0);
            }

            ModuleInfo info = GetModule(address);

            if (info != null)
            {
                PEFile file = _dataTarget.SymbolLocator.LoadBinary(info.FileName, info.TimeStamp, info.FileSize, true);
                if (file != null)
                {
                    PEBuffer peBuffer = file.AllocBuff();

                    int rva = checked ((int)(address - info.ImageBase));

                    if (file.Header.TryGetFileOffsetFromRva(rva, out rva))
                    {
                        byte *dst = (byte *)buffer.ToPointer();
                        byte *src = peBuffer.Fetch(rva, bytesRequested);

                        for (int i = 0; i < bytesRequested; i++)
                        {
                            dst[i] = src[i];
                        }

                        bytesRead = bytesRequested;
                        return(0);
                    }

                    file.FreeBuff(peBuffer);
                }
            }

            bytesRead = 0;
            return(-1);
        }