module Binja.Llil
( Binja.Llil.startIndex,
Binja.Llil.sourceFunc,
Binja.Llil.fromRef,
Binja.Llil.at,
Binja.Llil.llilRefToMlilExprIndex,
)
where
import Binja.BinaryView (functionsContaining)
import Binja.FFI
import Binja.Function
import Binja.Types.Core
sourceFunc :: BNLlilFunctionPtr -> IO BNFunctionPtr
sourceFunc :: BNLlilFunctionPtr -> IO BNFunctionPtr
sourceFunc BNLlilFunctionPtr
func = do
BNLlilFunctionPtr -> IO BNFunctionPtr
c_BNGetLowLevelILOwnderFunction BNLlilFunctionPtr
func
startIndex :: BNLlilFunctionPtr -> BNArchPtr -> Word64 -> IO CSize
startIndex :: BNLlilFunctionPtr -> BNArchPtr -> Word64 -> IO CSize
startIndex BNLlilFunctionPtr
func BNArchPtr
arch' Word64
addr = do
if BNArchPtr
arch' BNArchPtr -> BNArchPtr -> Bool
forall a. Eq a => a -> a -> Bool
== BNArchPtr
forall a. Ptr a
nullPtr Bool -> Bool -> Bool
|| BNLlilFunctionPtr
func BNLlilFunctionPtr -> BNLlilFunctionPtr -> Bool
forall a. Eq a => a -> a -> Bool
== BNLlilFunctionPtr
forall a. Ptr a
nullPtr
then [Char] -> IO CSize
forall a. HasCallStack => [Char] -> a
error [Char]
"Binja.Llil.startIndex: called with nullPtr argument"
else do
startI <- BNLlilFunctionPtr -> BNArchPtr -> Word64 -> IO CSize
c_BNLowLevelILGetInstructionStart BNLlilFunctionPtr
func BNArchPtr
arch' Word64
addr
count' <- c_BNGetLowLevelILInstructionCount func
if startI >= count'
then error ("Binja.Llil.startIndex: startI:" ++ show startI ++ " >= count:" ++ show count')
else pure startI
instIndexToExprIndex :: BNLlilFunctionPtr -> Word64 -> IO CSize
instIndexToExprIndex :: BNLlilFunctionPtr -> Word64 -> IO CSize
instIndexToExprIndex = BNLlilFunctionPtr -> Word64 -> IO CSize
c_BNGetLowLevelILIndexForInstruction
llilByIndex :: BNLlilFunctionPtr -> CSize -> IO BNLowLevelILInstruction
llilByIndex :: BNLlilFunctionPtr -> CSize -> IO BNLowLevelILInstruction
llilByIndex BNLlilFunctionPtr
func CSize
index' =
(Ptr BNLowLevelILInstruction -> IO BNLowLevelILInstruction)
-> IO BNLowLevelILInstruction
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr BNLowLevelILInstruction -> IO BNLowLevelILInstruction)
-> IO BNLowLevelILInstruction)
-> (Ptr BNLowLevelILInstruction -> IO BNLowLevelILInstruction)
-> IO BNLowLevelILInstruction
forall a b. (a -> b) -> a -> b
$ \Ptr BNLowLevelILInstruction
p -> do
_ <- Ptr BNLowLevelILInstruction
-> BNLlilFunctionPtr -> CSize -> IO (Ptr BNLowLevelILInstruction)
c_BNGetLowLevelILByIndexPtr Ptr BNLowLevelILInstruction
p BNLlilFunctionPtr
func CSize
index'
peek p
fromRef :: BNReferenceSource -> IO BNLowLevelILInstruction
fromRef :: BNReferenceSource -> IO BNLowLevelILInstruction
fromRef BNReferenceSource
ref = do
func <- BNFunctionPtr -> IO BNLlilFunctionPtr
Binja.Function.llil (BNReferenceSource -> BNFunctionPtr
bnFunc BNReferenceSource
ref)
sIndex <- startIndex func (bnArch ref) (bnAddr ref)
exprIndex' <- instIndexToExprIndex func (fromIntegral sIndex)
llilByIndex func exprIndex'
at :: BNBinaryViewPtr -> Word64 -> IO BNLowLevelILInstruction
at :: BNBinaryViewPtr -> Word64 -> IO BNLowLevelILInstruction
at BNBinaryViewPtr
view Word64
addr = do
rawFuncs <- BNBinaryViewPtr -> Word64 -> IO [BNFunctionPtr]
functionsContaining BNBinaryViewPtr
view Word64
addr
case rawFuncs of
[] -> [Char] -> IO BNLowLevelILInstruction
forall a. HasCallStack => [Char] -> a
error ([Char] -> IO BNLowLevelILInstruction)
-> [Char] -> IO BNLowLevelILInstruction
forall a b. (a -> b) -> a -> b
$ [Char]
"Binja.Llil.at: No functions at: " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Word64 -> [Char]
forall a. Show a => a -> [Char]
show Word64
addr
(BNFunctionPtr
hd : [BNFunctionPtr]
_) -> do
llilFunc <- BNFunctionPtr -> IO BNLlilFunctionPtr
Binja.Function.llil BNFunctionPtr
hd
archHandle' <- c_BNGetFunctionArchitecture hd
sIndex <- startIndex llilFunc archHandle' addr
exprIndex' <- instIndexToExprIndex llilFunc (fromIntegral sIndex)
llilByIndex llilFunc exprIndex'
llilRefToMlilExprIndex :: BNReferenceSource -> IO CSize
llilRefToMlilExprIndex :: BNReferenceSource -> IO CSize
llilRefToMlilExprIndex BNReferenceSource
ref = do
func <- BNFunctionPtr -> IO BNLlilFunctionPtr
Binja.Function.llil (BNReferenceSource -> BNFunctionPtr
bnFunc BNReferenceSource
ref)
sIndex <- startIndex func (bnArch ref) (bnAddr ref)
llilExprIndex <- instIndexToExprIndex func (fromIntegral sIndex)
mlilExprIndex <- c_BNGetMediumLevelILExprIndex func llilExprIndex
funcSSA <- Binja.Function.mlil (bnFunc ref)
c_BNGetMediumLevelILSSAExprIndex funcSSA mlilExprIndex