├── .build_number ├── .codecov.yml ├── .editorconfig ├── .github └── workflows │ ├── codecov.yml │ ├── docker.yml │ ├── linux.yml │ ├── osx.yml │ ├── python.yml │ └── vcpkg.yml ├── .gitignore ├── CMakeLists.txt ├── CMakeModules ├── FindBITWUZLA.cmake ├── FindCAPSTONE.cmake ├── FindZ3.cmake └── LibFindMacros.cmake ├── CMakePresets.json ├── Dockerfile ├── LICENSE.txt ├── README.md ├── doc ├── CMakeLists.txt ├── Doxyfile.in ├── DoxygenLayout.xml ├── autocomplete │ ├── .gitignore │ ├── example.py │ ├── function.py │ └── generate_autocomplete.py ├── customdoxygen.css ├── extract_doc.py ├── figures │ ├── figure.1.1.png │ ├── figure.1.10.png │ ├── figure.1.11.png │ ├── figure.1.19.png │ ├── figure.1.20.png │ ├── figure.1.4.png │ ├── figure.1.5.png │ ├── figure.1.6.png │ ├── figure.1.7.png │ ├── figure.1.8.png │ └── figure.1.9.png ├── footer.html └── header.html ├── publications ├── BAR2020-qsynth-robin-david.pdf ├── BHUSA2021-David-Greybox-Program-Synthesis.pdf ├── CESAR2021_robin-david-paper.pdf ├── CESAR2021_robin-david-slide.pdf ├── CSAW2016-SOS-Virtual-Machine-Deobfuscation-RThomas_JSalwan.pdf ├── DIMVA2018-deobfuscation-salwan-bardin-potet.pdf ├── DIMVA2018-slide-deobfuscation-salwan-bardin-potet.pdf ├── ISPOPEN2020-slide-sydr-vishnyakov.pdf ├── ISPOPEN2021-security-predicates-vishnyakov.pdf ├── ISPOPEN2021-slide-security-predicates-vishnyakov.pdf ├── ISPOPEN2022-slide-sydr-fuzz-vishnyakov.pdf ├── ISPOPEN2022-sydr-fuzz.pdf ├── ISPRAS2020-sydr.pdf ├── IVMEM2021-slide-symbolic-pointers-kuts.pdf ├── IVMEM2021-symbolic-pointers-kuts.pdf ├── IVMEM2022-slide-strong-optimistic-parygina.pdf ├── IVMEM2022-strong-optimistic-parygina.pdf ├── KLEE2022-robin-david.pdf ├── MISC-82_French_Paper_How_Triton_may_help_to_analyse_obfuscated_binaries_RThomas_JSalwan.pdf ├── SSTIC2015_English_slide_detailed_version_Triton_Concolic_Execution_FrameWork_FSaudel_JSalwan.pdf ├── SSTIC2015_French_Paper_Triton_Framework_dexecution_Concolique_FSaudel_JSalwan.pdf ├── SSTIC2015_French_slide_light_version_Triton_Concolic_Execution_FrameWork_FSaudel_JSalwan.pdf ├── SSTIC2017-French-Article-desobfuscation_binaire_reconstruction_de_fonctions_virtualisees-salwan_potet_bardin.pdf ├── SSTIC2017_Deobfuscation_of_VM_based_software_protection.pdf ├── SecurityDay2015_dynamic_symbolic_execution_Jonathan_Salwan.pdf ├── StHack2015_Dynamic_Behavior_Analysis_using_Binary_Instrumentation_Jonathan_Salwan.pdf └── StHack2016_Dynamic_Binary_Analysis_and_Obfuscated_Codes_RThomas_JSalwan.pdf ├── setup.py ├── src ├── CMakeLists.txt ├── examples │ ├── CMakeLists.txt │ ├── cmake │ │ ├── CMakeLists.txt │ │ └── myproject.cpp │ ├── cpp │ │ ├── CMakeLists.txt │ │ ├── block.cpp │ │ ├── constraint.cpp │ │ ├── ctest_api.cpp │ │ ├── info_reg.cpp │ │ ├── ir.cpp │ │ ├── simplification.cpp │ │ └── taint_reg.cpp │ └── python │ │ ├── backward_slicing.py │ │ ├── code_coverage_crackme_xor.py │ │ ├── constraints.py │ │ ├── ctf-writeups │ │ ├── NorthSec-2018-MarsAnalytica │ │ │ ├── 00400000-00e5e000.dump │ │ │ ├── MarsAnalytica │ │ │ ├── README.md │ │ │ ├── fulldump.dump │ │ │ ├── solve.py │ │ │ └── sub-trace-of-sym-instructions │ │ ├── Nuit_du_Hack_CTF_Quals_2016_Matriochka_Step_3 │ │ │ ├── solve.py │ │ │ └── stage3.bin │ │ ├── alexctf-2017-re2-cpp-is-awesome │ │ │ ├── re2 │ │ │ └── solve.py │ │ ├── alexctf-2017-re3-catalyst-system │ │ │ ├── catalyst │ │ │ ├── catalyst.patched_without_sleep │ │ │ └── solve.py │ │ ├── cm002 │ │ │ ├── cm002 │ │ │ └── solve.py │ │ ├── custom-crackmes │ │ │ ├── aarch64-hash │ │ │ │ ├── crackme_hash │ │ │ │ ├── crackme_hash.c │ │ │ │ ├── solve-with-abv-logic.py │ │ │ │ └── solve.py │ │ │ ├── arm32-hash │ │ │ │ ├── crackme_hash-arm │ │ │ │ ├── crackme_hash-thumb │ │ │ │ ├── crackme_hash.c │ │ │ │ ├── solve-arm.py │ │ │ │ ├── solve-thumb.py │ │ │ │ └── solve-with-abv-logic.py │ │ │ ├── riscv32-hash │ │ │ │ ├── crackme_hash │ │ │ │ ├── crackme_hash.c │ │ │ │ ├── solve-with-abv-logic.py │ │ │ │ └── solve.py │ │ │ └── riscv64-hash │ │ │ │ ├── crackme_hash │ │ │ │ ├── crackme_hash.c │ │ │ │ ├── solve-with-abv-logic.py │ │ │ │ └── solve.py │ │ ├── defcamp-2015-r100 │ │ │ ├── r100.bin │ │ │ ├── solve-with-abv-logic.py │ │ │ └── solve.py │ │ ├── defcon-2016-baby-re │ │ │ ├── baby-re │ │ │ ├── baby-re.dump │ │ │ ├── gdb-peda-fulldump.patch │ │ │ └── solve.py │ │ ├── ekopartyctf2016_rev250 │ │ │ ├── FUck_binary │ │ │ ├── libget_flag.so │ │ │ └── solve.py │ │ ├── google2016-unbreakable │ │ │ ├── solve.py │ │ │ └── unbreakable-enterprise-product-activation │ │ ├── hackcon-2016-angry-reverser │ │ │ ├── solve.py │ │ │ └── yolomolo │ │ ├── hacklu-2021-ollvm │ │ │ ├── ollvm │ │ │ └── solve.py │ │ ├── hackover-ctf-2015-r150 │ │ │ ├── rvs.bin │ │ │ └── solve.py │ │ ├── mma-2015-howtouse │ │ │ ├── howtouse.dll │ │ │ └── solve.py │ │ └── securityfest-2016-fairlight │ │ │ ├── fairlight │ │ │ └── solve.py │ │ ├── dead_store_elimination.py │ │ ├── disass.py │ │ ├── forward_tainting.py │ │ ├── hooking_libc.py │ │ ├── ir.py │ │ ├── lifting_dot_format.py │ │ ├── multi_threading.py │ │ ├── proving_equivalence.py │ │ ├── proving_opaque_predicates.py │ │ ├── samples │ │ ├── sample_1 │ │ ├── sample_1.c │ │ ├── sample_2 │ │ └── sample_2.c │ │ ├── simplification.py │ │ ├── small_x86-64_symbolic_emulator.py │ │ ├── symbolic_emulation_1.py │ │ ├── symbolic_emulation_2.py │ │ ├── symbolic_emulation_crackme_xor.py │ │ ├── symbolic_pointers_reasoning.py │ │ ├── synthesizing_obfuscated_code.py │ │ └── synthesizing_obfuscated_expressions.py ├── libtriton │ ├── CMakeLists.txt │ ├── Config.cmake.in │ ├── arch │ │ ├── architecture.cpp │ │ ├── arm │ │ │ ├── aarch64 │ │ │ │ ├── aarch64Cpu.cpp │ │ │ │ ├── aarch64Semantics.cpp │ │ │ │ └── aarch64Specifications.cpp │ │ │ ├── arm32 │ │ │ │ ├── arm32Cpu.cpp │ │ │ │ ├── arm32Semantics.cpp │ │ │ │ └── arm32Specifications.cpp │ │ │ └── armOperandProperties.cpp │ │ ├── basicBlock.cpp │ │ ├── bitsVector.cpp │ │ ├── immediate.cpp │ │ ├── instruction.cpp │ │ ├── irBuilder.cpp │ │ ├── memoryAccess.cpp │ │ ├── operandWrapper.cpp │ │ ├── register.cpp │ │ ├── riscv │ │ │ ├── riscv32Cpu.cpp │ │ │ ├── riscv64Cpu.cpp │ │ │ ├── riscvSemantics.cpp │ │ │ └── riscvSpecifications.cpp │ │ └── x86 │ │ │ ├── x8664Cpu.cpp │ │ │ ├── x86Cpu.cpp │ │ │ ├── x86Semantics.cpp │ │ │ └── x86Specifications.cpp │ ├── ast │ │ ├── ast.cpp │ │ ├── astContext.cpp │ │ ├── bitwuzla │ │ │ └── tritonToBitwuzla.cpp │ │ ├── llvm │ │ │ ├── llvmToTriton.cpp │ │ │ └── tritonToLLVM.cpp │ │ ├── representations │ │ │ ├── astPcodeRepresentation.cpp │ │ │ ├── astPythonRepresentation.cpp │ │ │ ├── astRepresentation.cpp │ │ │ └── astSmtRepresentation.cpp │ │ └── z3 │ │ │ ├── tritonToZ3.cpp │ │ │ └── z3ToTriton.cpp │ ├── bindings │ │ └── python │ │ │ ├── init.cpp │ │ │ ├── modules │ │ │ └── tritonCallbacks.cpp │ │ │ ├── namespaces │ │ │ ├── initArchNamespace.cpp │ │ │ ├── initAstNodeNamespace.cpp │ │ │ ├── initAstRepresentationNamespace.cpp │ │ │ ├── initCallbackNamespace.cpp │ │ │ ├── initConditionsNamespace.cpp │ │ │ ├── initCpuSizeNamespace.cpp │ │ │ ├── initExceptionNamespace.cpp │ │ │ ├── initExtendNamespace.cpp │ │ │ ├── initModeNamespace.cpp │ │ │ ├── initOpcodesNamespace.cpp │ │ │ ├── initOperandNamespace.cpp │ │ │ ├── initPrefixesNamespace.cpp │ │ │ ├── initRegNamespace.cpp │ │ │ ├── initShiftsNamespace.cpp │ │ │ ├── initSolverNamespace.cpp │ │ │ ├── initSolverStateNamespace.cpp │ │ │ ├── initStubsNamespace.cpp │ │ │ ├── initSymbolicNamespace.cpp │ │ │ ├── initVASNamespace.cpp │ │ │ └── initVersionNamespace.cpp │ │ │ ├── objects │ │ │ ├── pyAstContext.cpp │ │ │ ├── pyAstNode.cpp │ │ │ ├── pyBasicBlock.cpp │ │ │ ├── pyBitsVector.cpp │ │ │ ├── pyImmediate.cpp │ │ │ ├── pyInstruction.cpp │ │ │ ├── pyMemoryAccess.cpp │ │ │ ├── pyPathConstraint.cpp │ │ │ ├── pyRegister.cpp │ │ │ ├── pySolverModel.cpp │ │ │ ├── pySymbolicExpression.cpp │ │ │ ├── pySymbolicVariable.cpp │ │ │ └── pyTritonContext.cpp │ │ │ ├── pyXFunctions.cpp │ │ │ └── utils.cpp │ ├── callbacks │ │ └── callbacks.cpp │ ├── context │ │ └── context.cpp │ ├── engines │ │ ├── lifters │ │ │ ├── liftingToDot.cpp │ │ │ ├── liftingToLLVM.cpp │ │ │ ├── liftingToPython.cpp │ │ │ └── liftingToSMT.cpp │ │ ├── solver │ │ │ ├── bitwuzla │ │ │ │ └── bitwuzlaSolver.cpp │ │ │ ├── solverEngine.cpp │ │ │ ├── solverModel.cpp │ │ │ └── z3 │ │ │ │ └── z3Solver.cpp │ │ ├── symbolic │ │ │ ├── pathConstraint.cpp │ │ │ ├── pathManager.cpp │ │ │ ├── symbolicEngine.cpp │ │ │ ├── symbolicExpression.cpp │ │ │ ├── symbolicSimplification.cpp │ │ │ └── symbolicVariable.cpp │ │ ├── synthesis │ │ │ ├── oracleTable.cpp │ │ │ ├── synthesisResult.cpp │ │ │ └── synthesizer.cpp │ │ └── taint │ │ │ └── taintEngine.cpp │ ├── includes │ │ └── triton │ │ │ ├── aarch64.spec │ │ │ ├── aarch64Cpu.hpp │ │ │ ├── aarch64Semantics.hpp │ │ │ ├── aarch64Specifications.hpp │ │ │ ├── archEnums.hpp │ │ │ ├── architecture.hpp │ │ │ ├── arm32.spec │ │ │ ├── arm32Cpu.hpp │ │ │ ├── arm32Semantics.hpp │ │ │ ├── arm32Specifications.hpp │ │ │ ├── armOperandProperties.hpp │ │ │ ├── ast.hpp │ │ │ ├── astContext.hpp │ │ │ ├── astEnums.hpp │ │ │ ├── astPcodeRepresentation.hpp │ │ │ ├── astPythonRepresentation.hpp │ │ │ ├── astRepresentation.hpp │ │ │ ├── astRepresentationInterface.hpp │ │ │ ├── astSmtRepresentation.hpp │ │ │ ├── basicBlock.hpp │ │ │ ├── bitsVector.hpp │ │ │ ├── bitwuzlaSolver.hpp │ │ │ ├── callbacks.hpp │ │ │ ├── callbacksEnums.hpp │ │ │ ├── comparableFunctor.hpp │ │ │ ├── config.hpp.in │ │ │ ├── context.hpp │ │ │ ├── coreUtils.hpp │ │ │ ├── cpuInterface.hpp │ │ │ ├── cpuSize.hpp │ │ │ ├── dllexport.hpp │ │ │ ├── exceptions.hpp │ │ │ ├── externalLibs.hpp │ │ │ ├── immediate.hpp │ │ │ ├── instruction.hpp │ │ │ ├── irBuilder.hpp │ │ │ ├── liftingEngine.hpp │ │ │ ├── liftingToDot.hpp │ │ │ ├── liftingToLLVM.hpp │ │ │ ├── liftingToPython.hpp │ │ │ ├── liftingToSMT.hpp │ │ │ ├── llvmToTriton.hpp │ │ │ ├── memoryAccess.hpp │ │ │ ├── modes.hpp │ │ │ ├── modesEnums.hpp │ │ │ ├── operandWrapper.hpp │ │ │ ├── oracleEntry.hpp │ │ │ ├── pathConstraint.hpp │ │ │ ├── pathManager.hpp │ │ │ ├── py3c_compat.h │ │ │ ├── pythonBindings.hpp │ │ │ ├── pythonObjects.hpp │ │ │ ├── pythonUtils.hpp │ │ │ ├── pythonXFunctions.hpp │ │ │ ├── register.hpp │ │ │ ├── riscv32.spec │ │ │ ├── riscv32Cpu.hpp │ │ │ ├── riscv64.spec │ │ │ ├── riscv64Cpu.hpp │ │ │ ├── riscvSemantics.hpp │ │ │ ├── riscvSpecifications.hpp │ │ │ ├── semanticsInterface.hpp │ │ │ ├── shortcutRegister.hpp │ │ │ ├── softfloat.hpp │ │ │ ├── solverEngine.hpp │ │ │ ├── solverEnums.hpp │ │ │ ├── solverInterface.hpp │ │ │ ├── solverModel.hpp │ │ │ ├── stubs.hpp │ │ │ ├── symbolicEngine.hpp │ │ │ ├── symbolicEnums.hpp │ │ │ ├── symbolicExpression.hpp │ │ │ ├── symbolicSimplification.hpp │ │ │ ├── symbolicVariable.hpp │ │ │ ├── synthesisResult.hpp │ │ │ ├── synthesizer.hpp │ │ │ ├── taintEngine.hpp │ │ │ ├── tritonToBitwuzla.hpp │ │ │ ├── tritonToLLVM.hpp │ │ │ ├── tritonToZ3.hpp │ │ │ ├── tritonTypes.hpp │ │ │ ├── uintwide_t.h │ │ │ ├── version.hpp.in │ │ │ ├── x86.spec │ │ │ ├── x8664Cpu.hpp │ │ │ ├── x86Cpu.hpp │ │ │ ├── x86Semantics.hpp │ │ │ ├── x86Specifications.hpp │ │ │ ├── z3Solver.hpp │ │ │ └── z3ToTriton.hpp │ ├── modes │ │ └── modes.cpp │ ├── stubs │ │ ├── aarch64-libc.cpp │ │ ├── i386-systemv-libc.cpp │ │ ├── x8664-ms-libc.cpp │ │ └── x8664-systemv-libc.cpp │ └── utils │ │ ├── coreUtils.cpp │ │ └── softfloat.cpp ├── misc │ ├── aarch64 │ │ ├── crackme_hash │ │ ├── crackme_hash.c │ │ ├── crackme_xor │ │ └── crackme_xor.c │ ├── ir_test_suite │ │ ├── ir │ │ ├── ir.c │ │ └── qemu-test-x86_64 │ └── smt │ │ ├── af.smt2 │ │ ├── array.smt2 │ │ ├── cmp.smt2 │ │ ├── firstCharTest.smt2 │ │ ├── jbe.smt2 │ │ ├── jle.smt2 │ │ ├── jnbe.smt2 │ │ ├── jnle.smt2 │ │ ├── of.smt2 │ │ ├── pf.smt2 │ │ └── sf.smt2 ├── scripts │ ├── docker │ │ ├── Dockerfile │ │ ├── build-docker-image.sh │ │ └── build-wheel-linux.sh │ ├── gen_oracle_table.py │ └── macos │ │ └── delocate-wheel-custom.py ├── stubs │ ├── Makefile │ ├── gen_symbols_vector.py │ └── triton-stubs.c └── testers │ ├── CMakeLists.txt │ ├── aarch64 │ └── unicorn_test_aarch64.py │ ├── arm32 │ ├── crypto_test │ │ ├── bin │ │ │ ├── crypto_test-nothumb-O0.bin │ │ │ ├── crypto_test-nothumb-O1.bin │ │ │ ├── crypto_test-nothumb-O2.bin │ │ │ ├── crypto_test-nothumb-O3.bin │ │ │ ├── crypto_test-nothumb-Os.bin │ │ │ ├── crypto_test-nothumb-Oz.bin │ │ │ ├── crypto_test-thumb-O0.bin │ │ │ ├── crypto_test-thumb-O1.bin │ │ │ ├── crypto_test-thumb-O2.bin │ │ │ ├── crypto_test-thumb-O3.bin │ │ │ ├── crypto_test-thumb-Os.bin │ │ │ └── crypto_test-thumb-Oz.bin │ │ ├── crypto_test-nothumb-O0-run.py │ │ ├── crypto_test-nothumb-O1-run.py │ │ ├── crypto_test-nothumb-O2-run.py │ │ ├── crypto_test-nothumb-O3-run.py │ │ ├── crypto_test-nothumb-Os-run.py │ │ ├── crypto_test-nothumb-Oz-run.py │ │ ├── crypto_test-thumb-O0-run.py │ │ ├── crypto_test-thumb-O1-run.py │ │ ├── crypto_test-thumb-O2-run.py │ │ ├── crypto_test-thumb-O3-run.py │ │ ├── crypto_test-thumb-Os-run.py │ │ └── crypto_test-thumb-Oz-run.py │ ├── unicorn_test_arm32_branch_arm_1.py │ ├── unicorn_test_arm32_branch_arm_2.py │ ├── unicorn_test_arm32_branch_pc_arm_1.py │ ├── unicorn_test_arm32_branch_pc_arm_2.py │ ├── unicorn_test_arm32_branch_thumb_1.py │ ├── unicorn_test_arm32_branch_thumb_2.py │ ├── unicorn_test_arm32_branch_thumb_3.py │ ├── unicorn_test_arm32_branch_thumb_4.py │ ├── unicorn_test_arm32_data_arm.py │ ├── unicorn_test_arm32_data_thumb.py │ ├── unicorn_test_arm32_interworking_arm_1.py │ ├── unicorn_test_arm32_interworking_arm_2.py │ ├── unicorn_test_arm32_interworking_thumb.py │ ├── unicorn_test_arm32_it_thumb.py │ ├── unicorn_test_arm32_loadstore_arm_1.py │ ├── unicorn_test_arm32_loadstore_arm_2.py │ ├── unicorn_test_arm32_loadstore_arm_3.py │ ├── unicorn_test_arm32_loadstore_arm_4.py │ ├── unicorn_test_arm32_loadstore_arm_5.py │ ├── unicorn_test_arm32_loadstore_thumb_1.py │ ├── unicorn_test_arm32_loadstore_thumb_2.py │ ├── unicorn_test_arm32_loadstore_thumb_3.py │ └── unicorn_test_arm32_loadstore_thumb_5.py │ ├── riscv │ ├── unicorn_test_riscv32.py │ └── unicorn_test_riscv64.py │ ├── unittests │ ├── misc │ │ ├── defcamp-2015-r100.bin │ │ ├── emu_1.dump │ │ ├── ir-test-suite.bin │ │ ├── md5 │ │ │ ├── md5-aarch64 │ │ │ ├── md5-arm32 │ │ │ ├── md5-x64 │ │ │ ├── md5-x86 │ │ │ └── md5.c │ │ └── qemu │ │ │ ├── ir-test-suite-qemu-light.bin │ │ │ ├── ir-test-suite-qemu.bin │ │ │ ├── test-i386-muldiv.h │ │ │ ├── test-i386-shift.h │ │ │ ├── test-i386.c │ │ │ └── test-i386.h │ ├── test_arch.py │ ├── test_ast_conversion.py │ ├── test_ast_deep.py │ ├── test_ast_duplication.py │ ├── test_ast_eval.py │ ├── test_ast_reference.py │ ├── test_ast_representation.py │ ├── test_ast_simplification.py │ ├── test_ast_utils.py │ ├── test_bitvector.py │ ├── test_callback.py │ ├── test_concrete_value.py │ ├── test_dead_store_elimination.py │ ├── test_disass.py │ ├── test_doc.py │ ├── test_emulation.py │ ├── test_examples.py │ ├── test_exclusive_memory_access.py │ ├── test_execCallbacks.py │ ├── test_flags.py │ ├── test_github_issues.py │ ├── test_im_callback.py │ ├── test_immediate.py │ ├── test_immutable_registers.py │ ├── test_instruction.py │ ├── test_memory.py │ ├── test_only_symbolized_mode.py │ ├── test_only_tainted_mode.py │ ├── test_path_constraint.py │ ├── test_registers.py │ ├── test_semantics.py │ ├── test_simulation.py │ ├── test_smt_array.py │ ├── test_solver.py │ ├── test_stubs.py │ ├── test_symbolic.py │ ├── test_symbolic_array.py │ ├── test_symbolic_expression.py │ ├── test_symbolic_optimizations.py │ ├── test_symbolic_variable.py │ ├── test_synthesizer.py │ ├── test_taint.py │ ├── test_undefined_registers.py │ └── utils.py │ └── x86 │ └── unicorn_test_x86.py ├── vcpkg.json └── vcpkg └── triplets ├── x64-linux-release.cmake ├── x64-osx-release.cmake └── x64-windows-static-release-md.cmake /.build_number: -------------------------------------------------------------------------------- 1 | 1597 2 | -------------------------------------------------------------------------------- /.codecov.yml: -------------------------------------------------------------------------------- 1 | coverage: 2 | range: 70..90 3 | round: nearest 4 | precision: 2 5 | 6 | ignore: 7 | - "**/examples/cpp" # ignore folders and all its contents 8 | - "**/*.spec" # glob accepted 9 | 10 | comment: false 11 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | # C++ 3 | [*.{h,hpp,c,cpp}] 4 | indent_style = space 5 | indent_size = tab 6 | tab_width = 2 7 | -------------------------------------------------------------------------------- /.github/workflows/codecov.yml: -------------------------------------------------------------------------------- 1 | name: Test the code coverage 2 | 3 | on: [push, pull_request, workflow_dispatch] 4 | 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | strategy: 9 | matrix: 10 | python-version: [3.11] 11 | steps: 12 | - name: Checkout 13 | uses: actions/checkout@v4 14 | 15 | - name: Set up Python ${{ matrix.python-version }} 16 | uses: actions/setup-python@v5 17 | with: 18 | python-version: ${{ matrix.python-version }} 19 | 20 | - name: Upgrade pip version 21 | run: | 22 | python -m pip install -U pip 23 | 24 | - name: Install dependencies 25 | run: | 26 | sudo apt-get install python3-setuptools lcov libboost-dev libgmp-dev 27 | 28 | - name: Install LLVM and Clang 29 | uses: KyleMayes/install-llvm-action@v2 30 | with: 31 | version: "14.0" 32 | directory: ${{ runner.temp }}/llvm 33 | 34 | - name: Install Z3 35 | run: | 36 | sudo apt-get install libz3-dev 37 | python -m pip install z3-solver 38 | python -m pip install importlib-resources 39 | 40 | - name: Install Ninja 41 | run: | 42 | sudo apt-get install ninja-build 43 | 44 | - name: Install Meson 45 | run: | 46 | python -m pip install meson 47 | 48 | - name: Install Bitwuzla 49 | run: | 50 | git clone https://github.com/bitwuzla/bitwuzla.git 51 | cd bitwuzla 52 | git checkout -b 0.7.0 0.7.0 53 | python ./configure.py --shared 54 | cd build 55 | sudo ninja install 56 | sudo ldconfig 57 | cd .. 58 | 59 | - name: Install Capstone 60 | run: | 61 | wget https://github.com/aquynh/capstone/archive/5.0.3.tar.gz 62 | tar -xf ./5.0.3.tar.gz 63 | cd ./capstone-5.0.3 64 | bash ./make.sh 65 | sudo make install 66 | cd ../ 67 | 68 | - name: Install Unicorn 69 | run: | 70 | python -m pip install unicorn 71 | 72 | - name: Install LIEF 73 | run: | 74 | python -m pip install lief 75 | 76 | - name: Compile Triton 77 | run: | 78 | mkdir ./build 79 | cd ./build 80 | cmake -DGCOV=on -DZ3_INTERFACE=on -DBITWUZLA_INTERFACE=on -DBITWUZLA_INCLUDE_DIRS=/usr/local/include -DBITWUZLA_LIBRARIES=/usr/local/lib/x86_64-linux-gnu/libbitwuzla.so -DLLVM_INTERFACE=on -DCMAKE_PREFIX_PATH=${{env.LLVM_PATH}} .. 81 | sudo make -j3 install 82 | 83 | - name: Unittests 84 | run: | 85 | make -C build check 86 | bash <(curl -s https://codecov.io/bash) || echo "Codecov did not collect coverage reports" 87 | -------------------------------------------------------------------------------- /.github/workflows/docker.yml: -------------------------------------------------------------------------------- 1 | name: Docker Image CI 2 | 3 | on: [push, pull_request, workflow_dispatch] 4 | 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: actions/checkout@v4 10 | - name: Set Timestamp Variable 11 | run: echo "TIMESTAMP=$(date +%s)" >> $GITHUB_ENV 12 | - name: Build the Docker image 13 | run: docker build . --file Dockerfile --tag triton-docker:$TIMESTAMP 14 | - name: Run test cases 15 | run: docker run --entrypoint /bin/bash --rm triton-docker:$TIMESTAMP -c 'ctest --test-dir /tmp/triton-build/ --output-on-failure' -------------------------------------------------------------------------------- /.github/workflows/linux.yml: -------------------------------------------------------------------------------- 1 | name: Tests on Linux 2 | 3 | on: [push, pull_request, workflow_dispatch] 4 | 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | strategy: 9 | matrix: 10 | python-version: ['3.9', '3.10', '3.11', '3.12', '3.13'] 11 | boost-interface: ['ON', 'OFF'] 12 | capstone-version: ['5.0.3'] 13 | steps: 14 | - name: Checkout 15 | uses: actions/checkout@v4 16 | 17 | - name: Set up Python ${{ matrix.python-version }} 18 | uses: actions/setup-python@v5 19 | with: 20 | python-version: ${{ matrix.python-version }} 21 | 22 | - name: Upgrade pip version 23 | run: | 24 | python -m pip install -U pip 25 | python -m pip install setuptools 26 | 27 | - name: Install dependencies 28 | run: | 29 | sudo apt-get install python3-setuptools libboost-dev libgmp-dev 30 | 31 | - name: Install LLVM and Clang 32 | uses: KyleMayes/install-llvm-action@v2 33 | with: 34 | version: "14.0" 35 | directory: ${{ runner.temp }}/llvm 36 | 37 | - name: Install Z3 38 | run: | 39 | sudo apt-get install libz3-dev 40 | python -m pip install z3-solver 41 | python -m pip install importlib-resources 42 | 43 | - name: Install Ninja 44 | run: | 45 | sudo apt-get install ninja-build 46 | 47 | - name: Install Meson 48 | run: | 49 | python -m pip install meson 50 | 51 | - name: Install Bitwuzla 52 | run: | 53 | git clone https://github.com/bitwuzla/bitwuzla.git 54 | cd bitwuzla 55 | git checkout -b 0.7.0 0.7.0 56 | python ./configure.py --shared 57 | cd build 58 | sudo ninja install 59 | sudo ldconfig 60 | cd .. 61 | 62 | - name: Install Capstone 63 | run: | 64 | wget https://github.com/aquynh/capstone/archive/${{ matrix.capstone-version }}.tar.gz 65 | tar -xf ./${{ matrix.capstone-version }}.tar.gz 66 | cd ./capstone-${{ matrix.capstone-version }} 67 | bash ./make.sh 68 | sudo make install 69 | cd ../ 70 | 71 | - name: Install Unicorn 72 | run: | 73 | python -m pip install unicorn 74 | 75 | - name: Install LIEF 76 | run: | 77 | python -m pip install lief 78 | 79 | - name: Compile Triton 80 | run: | 81 | mkdir ./build 82 | cd ./build 83 | cmake -DZ3_INTERFACE=ON -DBITWUZLA_INTERFACE=ON -DBITWUZLA_INCLUDE_DIRS=/usr/local/include -DBITWUZLA_LIBRARIES=/usr/local/lib/x86_64-linux-gnu/libbitwuzla.so -DLLVM_INTERFACE=ON -DCMAKE_PREFIX_PATH=${{env.LLVM_PATH}} -DBOOST_INTERFACE=${{ matrix.boost-interface }} .. 84 | sudo make -j3 install 85 | 86 | - name: Unittests 87 | run: | 88 | ctest --test-dir build --output-on-failure 89 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.db 2 | *.i64 3 | *.id0 4 | *.id1 5 | *.id2 6 | *.nam 7 | *.o 8 | *.pyc 9 | *.swp 10 | *.til 11 | .DS_Store 12 | .gdb_history 13 | CMakeLists.txt.user 14 | CMakeUserPresets.json 15 | build*/* 16 | peda-session* 17 | pin.log 18 | pintool.log 19 | private/* 20 | *.so 21 | .cache 22 | .vscode 23 | .venv 24 | dist/ 25 | *.egg-info/ 26 | wheelhouse/ 27 | -------------------------------------------------------------------------------- /CMakeModules/FindBITWUZLA.cmake: -------------------------------------------------------------------------------- 1 | # - Try to find BITWUZLA 2 | # Once done, this will define 3 | # 4 | # BITWUZLA_FOUND - system has BITWUZLA 5 | # BITWUZLA_INCLUDE_DIRS - the BITWUZLA include directories 6 | # BITWUZLA_LIBRARIES - link these to use BITWUZLA 7 | 8 | include(LibFindMacros) 9 | 10 | # Dependencies 11 | # libfind_package(BITWUZLA bitwuzla) 12 | 13 | # Use pkg-config to get hints about paths 14 | # libfind_pkg_check_modules(BITWUZLA_PKGCONF bitwuzla) 15 | 16 | if(NOT BITWUZLA_INCLUDE_DIRS) 17 | set(BITWUZLA_INCLUDE_DIRS "$ENV{BITWUZLA_INCLUDE_DIRS}") 18 | endif() 19 | 20 | if(NOT BITWUZLA_LIBRARIES) 21 | set(BITWUZLA_LIBRARIES "$ENV{BITWUZLA_LIBRARIES}") 22 | endif() 23 | 24 | if(NOT BITWUZLA_INCLUDE_DIRS AND NOT BITWUZLA_LIBRARIES) 25 | find_path(BITWUZLA_INCLUDE_DIR 26 | NAMES bitwuzla/bitwuzla.h bitwuzla/cpp/bitwuzla.h 27 | PATHS ${BITWUZLA_PKGCONF_INCLUDE_DIRS} 28 | ) 29 | 30 | find_library(BITWUZLA_LIBRARY 31 | NAMES bitwuzla 32 | PATHS ${BITWUZLA_PKGCONF_LIBRARY_DIRS} 33 | ) 34 | 35 | # Set the include dir variables and the libraries and let libfind_process do the rest. 36 | # NOTE: Singular variables for this library, plural for libraries this this lib depends on. 37 | set(BITWUZLA_PROCESS_INCLUDES BITWUZLA_INCLUDE_DIR BITWUZLA_INCLUDE_DIRS) 38 | set(BITWUZLA_PROCESS_LIBS BITWUZLA_LIBRARY BITWUZLA_LIBRARIES) 39 | 40 | libfind_process(BITWUZLA) 41 | 42 | if(NOT BITWUZLA_FOUND) 43 | message(FATAL_ERROR "Bitwuzla not found") 44 | else() 45 | cmake_path(GET BITWUZLA_LIBRARY PARENT_PATH BITWUZLA_LIB_DIR) 46 | cmake_path(GET BITWUZLA_LIBRARY STEM LAST_ONLY BITWUZLA_LIB_NAME) 47 | string(REGEX REPLACE "^lib" "" BITWUZLA_LIB_NAME ${BITWUZLA_LIB_NAME}) 48 | endif() 49 | else() 50 | message(STATUS "Bitwuzla includes directory defined: ${BITWUZLA_INCLUDE_DIRS}") 51 | message(STATUS "Bitwuzla libraries defined: ${BITWUZLA_LIBRARIES}") 52 | endif() 53 | -------------------------------------------------------------------------------- /CMakeModules/FindCAPSTONE.cmake: -------------------------------------------------------------------------------- 1 | # - Try to find CAPSTONE 2 | # Once done, this will define 3 | # 4 | # CAPSTONE_FOUND - system has CAPSTONE 5 | # CAPSTONE_VERSION - the CAPSTONE version 6 | # CAPSTONE_INCLUDE_DIRS - the CAPSTONE include directories 7 | # CAPSTONE_LIBRARIES - link these to use CAPSTONE 8 | 9 | include(LibFindMacros) 10 | 11 | # Dependencies 12 | # libfind_package(CAPSTONE capstone) 13 | 14 | # Use pkg-config to get hints about paths 15 | # libfind_pkg_check_modules(CAPSTONE_PKGCONF capstone) 16 | 17 | if(NOT CAPSTONE_INCLUDE_DIRS) 18 | set(CAPSTONE_INCLUDE_DIRS "$ENV{CAPSTONE_INCLUDE_DIRS}") 19 | endif() 20 | 21 | if(NOT CAPSTONE_LIBRARIES) 22 | set(CAPSTONE_LIBRARIES "$ENV{CAPSTONE_LIBRARIES}") 23 | endif() 24 | 25 | if(NOT CAPSTONE_INCLUDE_DIRS AND NOT CAPSTONE_LIBRARIES) 26 | find_path(CAPSTONE_INCLUDE_DIR 27 | NAMES 28 | capstone.h 29 | capstone/capstone.h 30 | PATHS ${CAPSTONE_PKGCONF_INCLUDE_DIRS} 31 | ) 32 | 33 | find_library(CAPSTONE_LIBRARY 34 | NAMES capstone 35 | PATHS ${CAPSTONE_PKGCONF_LIBRARY_DIRS} 36 | ) 37 | 38 | # Set the include dir variables and the libraries and let libfind_process do the rest. 39 | # NOTE: Singular variables for this library, plural for libraries this this lib depends on. 40 | set(CAPSTONE_PROCESS_INCLUDES CAPSTONE_INCLUDE_DIR CAPSTONE_INCLUDE_DIRS) 41 | set(CAPSTONE_PROCESS_LIBS CAPSTONE_LIBRARY CAPSTONE_LIBRARIES) 42 | 43 | libfind_process(CAPSTONE) 44 | 45 | if(NOT CAPSTONE_FOUND) 46 | message(FATAL_ERROR "Capstone not found") 47 | else() 48 | cmake_path(GET CAPSTONE_LIBRARY PARENT_PATH CAPSTONE_LIB_DIR) 49 | cmake_path(GET CAPSTONE_LIBRARY STEM LAST_ONLY CAPSTONE_LIB_NAME) 50 | string(REGEX REPLACE "^lib" "" CAPSTONE_LIB_NAME ${CAPSTONE_LIB_NAME}) 51 | endif() 52 | else() 53 | message(STATUS "Capstone includes directory defined: ${CAPSTONE_INCLUDE_DIRS}") 54 | message(STATUS "Capstone libraries defined: ${CAPSTONE_LIBRARIES}") 55 | endif() 56 | 57 | find_file(CAPSTONE_VERSION_HEADER 58 | NAMES 59 | capstone.h 60 | capstone/capstone.h 61 | PATHS ${CAPSTONE_INCLUDE_DIRS} 62 | REQUIRED 63 | ) 64 | 65 | file(READ "${CAPSTONE_VERSION_HEADER}" CAPSTONE_VERSION_HEADER_CONTENT) 66 | string(REGEX MATCH "CS_API_MAJOR +([0-9]+)" _ ${CAPSTONE_VERSION_HEADER_CONTENT}) 67 | set(CS_VERSION_MAJOR ${CMAKE_MATCH_1}) 68 | string(REGEX MATCH "CS_API_MINOR +([0-9]+)" _ ${CAPSTONE_VERSION_HEADER_CONTENT}) 69 | set(CS_VERSION_MINOR ${CMAKE_MATCH_1}) 70 | string(REGEX MATCH "CS_VERSION_EXTRA +([0-9]+)" _ ${CAPSTONE_VERSION_HEADER_CONTENT}) 71 | set(CS_VERSION_EXTRA ${CMAKE_MATCH_1}) 72 | set(CAPSTONE_VERSION "${CS_VERSION_MAJOR}.${CS_VERSION_MINOR}.${CS_VERSION_EXTRA}") 73 | -------------------------------------------------------------------------------- /CMakeModules/FindZ3.cmake: -------------------------------------------------------------------------------- 1 | # - Try to find Z3 2 | # Once done, this will define 3 | # 4 | # Z3_FOUND - system has Z3 5 | # Z3_VERSION - the Z3 version 6 | # Z3_INCLUDE_DIRS - the Z3 include directories 7 | # Z3_LIBRARIES - link these to use Z3 8 | 9 | include(LibFindMacros) 10 | 11 | # Dependencies 12 | # libfind_package(Z3 z3) 13 | 14 | # Use pkg-config to get hints about paths 15 | # libfind_pkg_check_modules(Z3_PKGCONF z3) 16 | 17 | if(NOT Z3_INCLUDE_DIRS) 18 | set(Z3_INCLUDE_DIRS "$ENV{Z3_INCLUDE_DIRS}") 19 | endif() 20 | 21 | if(NOT Z3_LIBRARIES) 22 | set(Z3_LIBRARIES "$ENV{Z3_LIBRARIES}") 23 | endif() 24 | 25 | if(NOT Z3_INCLUDE_DIRS AND NOT Z3_LIBRARIES) 26 | find_path(Z3_INCLUDE_DIR 27 | NAMES z3.h 28 | PATHS ${Z3_PKGCONF_INCLUDE_DIRS} 29 | ) 30 | 31 | find_library(Z3_LIBRARY 32 | NAMES z3 libz3 33 | PATHS ${Z3_PKGCONF_LIBRARY_DIRS} 34 | ) 35 | 36 | # Set the include dir variables and the libraries and let libfind_process do the rest. 37 | # NOTE: Singular variables for this library, plural for libraries this this lib depends on. 38 | set(Z3_PROCESS_INCLUDES Z3_INCLUDE_DIR Z3_INCLUDE_DIRS) 39 | set(Z3_PROCESS_LIBS Z3_LIBRARY Z3_LIBRARIES) 40 | 41 | libfind_process(Z3) 42 | 43 | if(NOT Z3_FOUND) 44 | message(FATAL_ERROR "Z3 not found") 45 | else() 46 | cmake_path(GET Z3_LIBRARY PARENT_PATH Z3_LIB_DIR) 47 | cmake_path(GET Z3_LIBRARY STEM LAST_ONLY Z3_LIB_NAME) 48 | string(REGEX REPLACE "^lib" "" Z3_LIB_NAME ${Z3_LIB_NAME}) 49 | endif() 50 | else() 51 | message(STATUS "Z3 includes directory defined: ${Z3_INCLUDE_DIRS}") 52 | message(STATUS "Z3 libraries defined: ${Z3_LIBRARIES}") 53 | endif() 54 | 55 | find_file(Z3_VERSION_HEADER 56 | z3_version.h 57 | PATHS ${Z3_INCLUDE_DIRS} 58 | REQUIRED 59 | ) 60 | 61 | file(READ "${Z3_VERSION_HEADER}" Z3_VERSION_HEADER_CONTENT) 62 | string(REGEX MATCH "Z3_MAJOR_VERSION +([0-9]+)" _ ${Z3_VERSION_HEADER_CONTENT}) 63 | set(Z3_MAJOR_VERSION ${CMAKE_MATCH_1}) 64 | string(REGEX MATCH "Z3_MINOR_VERSION +([0-9]+)" _ ${Z3_VERSION_HEADER_CONTENT}) 65 | set(Z3_MINOR_VERSION ${CMAKE_MATCH_1}) 66 | string(REGEX MATCH "Z3_BUILD_NUMBER +([0-9]+)" _ ${Z3_VERSION_HEADER_CONTENT}) 67 | set(Z3_BUILD_NUMBER ${CMAKE_MATCH_1}) 68 | string(REGEX MATCH "Z3_REVISION_NUMBER +([0-9]+)" _ ${Z3_VERSION_HEADER_CONTENT}) 69 | set(Z3_REVISION_NUMBER ${CMAKE_MATCH_1}) 70 | set(Z3_VERSION "${Z3_MAJOR_VERSION}.${Z3_MINOR_VERSION}.${Z3_BUILD_NUMBER}.${Z3_REVISION_NUMBER}") 71 | -------------------------------------------------------------------------------- /doc/autocomplete/.gitignore: -------------------------------------------------------------------------------- 1 | triton_autocomplete 2 | .mypy_cache -------------------------------------------------------------------------------- /doc/autocomplete/example.py: -------------------------------------------------------------------------------- 1 | from __future__ import print_function 2 | # The triton_autocomplete module has been replaced with a .pyi stub file 3 | # which is automatically installed when using a precompiled Triton package 4 | # IDEs should detect it and provide autocomplete without any extra imports 5 | from triton import * 6 | 7 | 8 | ctx = TritonContext() 9 | # Set the arch 10 | ctx.setArchitecture(ARCH.X86) 11 | 12 | inst = Instruction() 13 | inst.setAddress(0x40000) 14 | inst.setOpcode(b"\x89\xd0") # mov eax, edx 15 | ctx.processing(inst) 16 | print(inst) 17 | -------------------------------------------------------------------------------- /doc/autocomplete/function.py: -------------------------------------------------------------------------------- 1 | try: 2 | from typing import Dict, List, Set 3 | except ImportError: 4 | pass 5 | 6 | template = ''' 7 | def {fname}({arg_names}): 8 | # type: ({arg_types}) -> {ret_type} 9 | """{doc_str}""" 10 | pass 11 | ''' 12 | 13 | class Function(): 14 | 15 | def __init__(self, name, args, ret_type, doc_str=''): 16 | # type: (str, Dict[str, str], str, str) -> None 17 | self.name = name 18 | self.arg_types = [{t} for t in args.values()] 19 | self.arg_names = [{n} for n in args.keys()] 20 | self.ret_type = ret_type 21 | self.doc_str = doc_str 22 | self.overloaded_args = [] 23 | 24 | def add_overload(self, other): 25 | assert(self.name == other.name) 26 | 27 | # we have fewer args than the other overload and need to expand them 28 | if len(self.arg_names) < len(other.arg_names): 29 | for i in range(len(self.arg_names), len(other.arg_names)): 30 | self.arg_names.append(set()) 31 | self.arg_types.append(set()) 32 | 33 | # create unions of the names and types 34 | for i in range(len(other.arg_names)): 35 | self.arg_names[i] |= other.arg_names[i] 36 | self.arg_types[i] |= other.arg_types[i] 37 | 38 | def __str__(self): 39 | # type: () -> str 40 | 41 | def handle_default_initializer(full_names): 42 | # type: (Set[str]) -> List[str] 43 | names = list(full_names) 44 | for i in range(len(names) - 1): 45 | # remove the default parameter for every arg except the last one 46 | if '=' in names[i]: 47 | names[i] = names[i][:names[i].find('=')] 48 | 49 | return names 50 | 51 | arg_names = ', '.join(['self'] + ['_'.join(handle_default_initializer(names)) for names in self.arg_names]) 52 | arg_types = 'Self' 53 | if len(self.arg_types) != 1 or len(self.arg_types[0]) > 1 or list(self.arg_types[0])[0] != 'None': 54 | arg_types = ', '.join(['Self'] + [' | '.join(types) for types in self.arg_types]) 55 | func_str = template.format( 56 | fname=self.name, 57 | ret_type=self.ret_type, 58 | arg_names=arg_names, 59 | arg_types=arg_types, 60 | doc_str=self.doc_str) 61 | return func_str 62 | -------------------------------------------------------------------------------- /doc/figures/figure.1.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JonathanSalwan/Triton/e312eafcdf507d9aebd0f8a7daf2eb4c28a19d30/doc/figures/figure.1.1.png -------------------------------------------------------------------------------- /doc/figures/figure.1.10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JonathanSalwan/Triton/e312eafcdf507d9aebd0f8a7daf2eb4c28a19d30/doc/figures/figure.1.10.png -------------------------------------------------------------------------------- /doc/figures/figure.1.11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JonathanSalwan/Triton/e312eafcdf507d9aebd0f8a7daf2eb4c28a19d30/doc/figures/figure.1.11.png -------------------------------------------------------------------------------- /doc/figures/figure.1.19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JonathanSalwan/Triton/e312eafcdf507d9aebd0f8a7daf2eb4c28a19d30/doc/figures/figure.1.19.png -------------------------------------------------------------------------------- /doc/figures/figure.1.20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JonathanSalwan/Triton/e312eafcdf507d9aebd0f8a7daf2eb4c28a19d30/doc/figures/figure.1.20.png -------------------------------------------------------------------------------- /doc/figures/figure.1.4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JonathanSalwan/Triton/e312eafcdf507d9aebd0f8a7daf2eb4c28a19d30/doc/figures/figure.1.4.png -------------------------------------------------------------------------------- /doc/figures/figure.1.5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JonathanSalwan/Triton/e312eafcdf507d9aebd0f8a7daf2eb4c28a19d30/doc/figures/figure.1.5.png -------------------------------------------------------------------------------- /doc/figures/figure.1.6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JonathanSalwan/Triton/e312eafcdf507d9aebd0f8a7daf2eb4c28a19d30/doc/figures/figure.1.6.png -------------------------------------------------------------------------------- /doc/figures/figure.1.7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JonathanSalwan/Triton/e312eafcdf507d9aebd0f8a7daf2eb4c28a19d30/doc/figures/figure.1.7.png -------------------------------------------------------------------------------- /doc/figures/figure.1.8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JonathanSalwan/Triton/e312eafcdf507d9aebd0f8a7daf2eb4c28a19d30/doc/figures/figure.1.8.png -------------------------------------------------------------------------------- /doc/figures/figure.1.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JonathanSalwan/Triton/e312eafcdf507d9aebd0f8a7daf2eb4c28a19d30/doc/figures/figure.1.9.png -------------------------------------------------------------------------------- /doc/footer.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
12 | 13 | 14 |