diff options
author | jmpoep <OriginalEntryPoint@qq.com> | 2023-12-07 16:51:07 +0800 |
---|---|---|
committer | jmpoep <OriginalEntryPoint@qq.com> | 2023-12-07 16:51:07 +0800 |
commit | 28008a746a31abb7909dd86cb0cd413ac8943b0b (patch) | |
tree | a30b74b8cad548048c3c1551d652828ab76fa9bd /core/streams.h | |
download | vmprotect-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 |
Diffstat (limited to 'core/streams.h')
-rw-r--r-- | core/streams.h | 110 |
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 |