aboutsummaryrefslogtreecommitdiff
path: root/core/streams.h
diff options
context:
space:
mode:
authorjmpoep <OriginalEntryPoint@qq.com>2023-12-07 16:51:07 +0800
committerjmpoep <OriginalEntryPoint@qq.com>2023-12-07 16:51:07 +0800
commit28008a746a31abb7909dd86cb0cd413ac8943b0b (patch)
treea30b74b8cad548048c3c1551d652828ab76fa9bd /core/streams.h
downloadvmprotect-3.5.1-master.tar
vmprotect-3.5.1-master.tar.gz
vmprotect-3.5.1-master.tar.bz2
vmprotect-3.5.1-master.zip
first commitHEADmaster
Diffstat (limited to 'core/streams.h')
-rw-r--r--core/streams.h110
1 files changed, 110 insertions, 0 deletions
diff --git a/core/streams.h b/core/streams.h
new file mode 100644
index 0000000..bd2ef5e
--- /dev/null
+++ b/core/streams.h
@@ -0,0 +1,110 @@
+/**
+ * Stream implementation.
+ */
+
+#ifndef STREAMS_H
+#define STREAMS_H
+
+class AbstractStream
+{
+public:
+ virtual ~AbstractStream() {}
+ virtual size_t Read(void *buffer, size_t size) = 0;
+ virtual size_t Write(const void *buffer, size_t size) = 0;
+ virtual uint64_t Seek(int64_t offset, SeekOrigin origin) = 0;
+ virtual size_t CopyFrom(AbstractStream &source, size_t count);
+ uint64_t Tell();
+ uint64_t Size();
+ virtual uint64_t Resize(uint64_t new_size) = 0;
+ virtual void Flush() {}
+};
+
+class FileStream : public AbstractStream
+{
+public:
+ explicit FileStream(size_t CACHE_ALLOC_SIZE = 0x10000);
+ virtual ~FileStream();
+ virtual bool Open(const char *filename, int mode);
+ virtual void Close();
+ virtual size_t Read(void *buffer, size_t size);
+ virtual size_t Write(const void *buffer, size_t size);
+ virtual uint64_t Seek(int64_t offset, SeekOrigin origin);
+ virtual uint64_t Resize(uint64_t new_size);
+ virtual void Flush() { FlushCache(); }
+ bool ReadLine(std::string &line);
+ std::string ReadAll();
+protected:
+ uint8_t *Cache();
+ void FlushCache(bool need_seek = false);
+
+ HANDLE h_;
+ enum CacheMode {
+ cmNone,
+ cmRead,
+ cmWrite
+ };
+ CacheMode cache_mode_;
+ const size_t CACHE_ALLOC_SIZE_;
+ std::auto_ptr<uint8_t> cache_;
+ size_t cache_pos_;
+ size_t cache_size_;
+ uint64_t cache_offset_;
+};
+
+class MemoryStream : public AbstractStream
+{
+public:
+ explicit MemoryStream(size_t buf_size_increment = 1024);
+ virtual size_t Read(void *buffer, size_t size);
+ virtual size_t Write(const void *buffer, size_t size);
+ virtual uint64_t Seek(int64_t offset, SeekOrigin origin);
+ virtual uint64_t Resize(uint64_t new_size);
+ std::vector<uint8_t> data() const { return buf_; }
+private:
+ std::vector <uint8_t> buf_;
+ size_t pos_;
+};
+
+class MemoryStreamEnc : public MemoryStream
+{
+public:
+ explicit MemoryStreamEnc(const void *buffer, size_t size, uint32_t key);
+ virtual size_t Read(void *buffer, size_t size);
+ virtual size_t Write(const void *buffer, size_t size);
+private:
+ uint32_t key_;
+};
+
+class ModuleStream : public AbstractStream
+{
+public:
+ ModuleStream();
+ ~ModuleStream();
+ bool Open(uint32_t process_id, HMODULE module);
+ void Close();
+ virtual size_t Read(void *buffer, size_t size);
+ virtual size_t Write(const void *buffer, size_t size);
+ virtual uint64_t Seek(int64_t offset, SeekOrigin origin);
+ virtual uint64_t Resize(uint64_t /*new_size*/) { return size_; }
+private:
+ size_t pos_;
+ size_t size_;
+ void *base_address_;
+ HANDLE process_;
+};
+
+class Buffer
+{
+public:
+ Buffer(const uint8_t *memory);
+ uint8_t ReadByte();
+ uint16_t ReadWord();
+ uint32_t ReadDWord();
+ uint64_t ReadQWord();
+private:
+ void ReadBuff(void *buff, size_t size);
+ const uint8_t *memory_;
+ size_t position_;
+};
+
+#endif