summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Potchik <brian@vector35.com>2019-03-14 17:48:10 -0400
committerBrian Potchik <brian@vector35.com>2019-03-14 17:48:10 -0400
commit0b1529934c59645c895590997b919d2f0870f891 (patch)
treedff5fcf27377f956625cff7bf61a7456b4237f1b
parent902750648579d32cc83fbd91181ecea2c9e0c9e5 (diff)
BinaryView API for entropy.
-rw-r--r--binaryninjaapi.h2
-rw-r--r--binaryninjacore.h2
-rw-r--r--binaryview.cpp18
-rw-r--r--python/binaryview.py20
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