diff options
| author | Brian Potchik <brian@vector35.com> | 2019-03-14 17:48:10 -0400 |
|---|---|---|
| committer | Brian Potchik <brian@vector35.com> | 2019-03-14 17:48:10 -0400 |
| commit | 0b1529934c59645c895590997b919d2f0870f891 (patch) | |
| tree | dff5fcf27377f956625cff7bf61a7456b4237f1b | |
| parent | 902750648579d32cc83fbd91181ecea2c9e0c9e5 (diff) | |
BinaryView API for entropy.
| -rw-r--r-- | binaryninjaapi.h | 2 | ||||
| -rw-r--r-- | binaryninjacore.h | 2 | ||||
| -rw-r--r-- | binaryview.cpp | 18 | ||||
| -rw-r--r-- | python/binaryview.py | 20 |
4 files changed, 42 insertions, 0 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 6226d329..c374d954 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -1294,6 +1294,8 @@ namespace BinaryNinja size_t Remove(uint64_t offset, uint64_t len); + std::vector<float> GetEntropy(uint64_t offset, size_t len, size_t blockSize); + BNModificationStatus GetModification(uint64_t offset); std::vector<BNModificationStatus> GetModification(uint64_t offset, size_t len); diff --git a/binaryninjacore.h b/binaryninjacore.h index fcc2937b..2b831266 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -2127,6 +2127,8 @@ extern "C" BINARYNINJACOREAPI void BNNotifyDataInserted(BNBinaryView* view, uint64_t offset, size_t len); BINARYNINJACOREAPI void BNNotifyDataRemoved(BNBinaryView* view, uint64_t offset, uint64_t len); + BINARYNINJACOREAPI size_t BNGetEntropy(BNBinaryView* view, uint64_t offset, size_t len, size_t blockSize, float* result); + BINARYNINJACOREAPI BNModificationStatus BNGetModification(BNBinaryView* view, uint64_t offset); BINARYNINJACOREAPI size_t BNGetModificationArray(BNBinaryView* view, uint64_t offset, BNModificationStatus* result, size_t len); diff --git a/binaryview.cpp b/binaryview.cpp index 690ccee1..b4ca2fd9 100644 --- a/binaryview.cpp +++ b/binaryview.cpp @@ -890,6 +890,24 @@ size_t BinaryView::InsertBuffer(uint64_t offset, const DataBuffer& data) } +vector<float> BinaryView::GetEntropy(uint64_t offset, size_t len, size_t blockSize) +{ + if (!blockSize) + blockSize = len; + + float* entopy = new float[(len / blockSize) + 1]; + len = BNGetEntropy(m_object, offset, len, blockSize, entopy); + + vector<float> result; + result.reserve(len); + for (size_t i = 0; i < len; i++) + result.push_back(entopy[i]); + + delete[] entopy; + return result; +} + + vector<BNModificationStatus> BinaryView::GetModification(uint64_t offset, size_t len) { BNModificationStatus* mod = new BNModificationStatus[len]; diff --git a/python/binaryview.py b/python/binaryview.py index 6b373c27..361833d7 100644 --- a/python/binaryview.py +++ b/python/binaryview.py @@ -2031,6 +2031,26 @@ class BinaryView(object): """ return core.BNRemoveViewData(self.handle, addr, length) + def get_entropy(self, addr, length, block_size=0): + """ + ``get_entropy`` returns the shannon entropy given the start ``addr``, ``length`` in bytes, and optionally in + ``block_size`` chunks. + + :param int addr: virtual address + :param int length: total length in bytes + :param int block_size: optional block size + :return: list of entropy values for each chunk` + :rtype: list of entropy values or an empty list + """ + if block_size == 0: + block_size = length + data = (ctypes.c_float * ((length // block_size) + 1))() + length = core.BNGetEntropy(self.handle, addr, length, block_size, data) + result = [] + for i in range(0, length): + result.append(float(data[i])) + return result + def get_modification(self, addr, length=None): """ ``get_modification`` returns the modified bytes of up to ``length`` bytes from virtual address ``addr``, or if |
