Files
Edward Larson 4f5401601b Fix for issue #427 (#429)
* Add support for MSP430

* Fix test-all.sh

* Use corrected TableGen output files

* Fix bindings for EVM and MSP430

* Remove LLVM_CONSTEXPR (like upstream LLVM did) and fix Java binding

See https://github.com/llvm-mirror/llvm/commit/6feedc56f7855aa24baf759f3bc17112ecbf5699#diff-d14f03e012a2bdbf93486dc1c4ce95ec

* Revert bindings

* Remove added files as well

* Add back changes for bindings created by const_gnerator

* Add back changes for other bindings

* Update CREDITS.TXT

* Fix ADRP instruction encoding

* Trigger checks on PR again, it failed for some reason unrelated to my code

* Add correct offset checks back in

* added llvm support post jan 2

* Remove bounds check on ppc branch instructions target address (fix issue 423)

* Fix vm address reset in aliased PPC instructions

* Fix vm address reset in aliased PPC instructions

(cherry picked from commit 06425a32f3)

* Remove bounds check on ppc branch instructions target address (fix issue 423)

(cherry picked from commit 06afb493e0)

* Clean up test for issue #427

Co-authored-by: Trey Keown <trey@redballoonsecurity.com>
Co-authored-by: Dan Pesce <dan@redballoonsecurity.com>
Co-authored-by: Trey Keown <jfktrey@gmail.com>
Co-authored-by: Nguyen Anh Quynh <aquynh@gmail.com>
2020-06-14 16:04:10 +08:00

78 lines
2.8 KiB
Haskell

-- Sample code for Keystone Assembler Engine.
import Keystone
import qualified Data.ByteString as BS
import Data.List (intercalate)
import qualified Numeric as N (showHex)
-- Pretty-print byte string as hex.
showHexBS :: BS.ByteString
-> String
showHexBS =
concatMap (flip N.showHex " ") . BS.unpack
testKs :: Architecture
-> [Mode]
-> [String]
-> Maybe OptionValue
-> IO ()
testKs arch mode assembly maybeSyntax = do
result <- runAssembler $ do
ks <- open arch mode
case maybeSyntax of
Just syntax -> option ks OptSyntax syntax
Nothing -> return ()
(encode, count) <- assemble ks assembly Nothing
return (encode, count)
case result of
Right (encode, count) -> let size = BS.length encode in do
putStr $ intercalate ";" assembly ++ " = "
putStrLn $ showHexBS encode
putStrLn $ "Assembled: " ++ show size ++ " bytes, " ++
show count ++ " statements\n"
Left err -> putStrLn $ "Failed with error: " ++ show err ++ " (" ++
strerror err ++ ")"
main :: IO ()
main = do
-- X86
testKs ArchX86 [Mode16] ["add eax, ecx"] Nothing
testKs ArchX86 [Mode32] ["add eax, ecx"] Nothing
testKs ArchX86 [Mode64] ["add rax, rcx"] Nothing
testKs ArchX86 [Mode32] ["add %ecx, %eax"] (Just SyntaxAtt)
testKs ArchX86 [Mode64] ["add %rcx, %rax"] (Just SyntaxAtt)
-- ARM
testKs ArchArm [ModeArm] ["sub r1, r2, r5"] Nothing
testKs ArchArm [ModeArm, ModeBigEndian] ["sub r1, r2, r5"] Nothing
testKs ArchArm [ModeThumb] ["movs r4, #0xf0"] Nothing
testKs ArchArm [ModeThumb, ModeBigEndian] ["movs r4, #0xf0"] Nothing
-- ARM64
testKs ArchArm64 [ModeLittleEndian] ["ldr w1, [sp, #0x8]"] Nothing
-- Hexagon
testKs ArchHexagon [ModeBigEndian] ["v23.w=vavg(v11.w,v2.w):rnd"] Nothing
-- MIPS
testKs ArchMips [ModeMips32] ["and $9, $6, $7"] Nothing
testKs ArchMips [ModeMips32, ModeBigEndian] ["and $9, $6, $7"] Nothing
testKs ArchMips [ModeMips64] ["and $9, $6, $7"] Nothing
testKs ArchMips [ModeMips64, ModeBigEndian] ["and $9, $6, $7"] Nothing
-- PowerPC
testKs ArchPpc [ModePpc32, ModeBigEndian] ["add 1, 2, 3"] Nothing
testKs ArchPpc [ModePpc64] ["add 1, 2, 3"] Nothing
testKs ArchPpc [ModePpc64, ModeBigEndian] ["add 1, 2, 3"] Nothing
-- SPARC
testKs ArchSparc [ModeSparc32, ModeLittleEndian] ["add %g1, %g2, %g3"] Nothing
testKs ArchSparc [ModeSparc32, ModeBigEndian] ["add %g1, %g2, %g3"] Nothing
-- SystemZ
testKs ArchSystemz [ModeBigEndian] ["a %r0, 4095(%r15,%r1)"] Nothing
-- MSP430
testKs ArchMsp430 [ModeLittleEndian] ["and r12, r13"] Nothing