angr 9.2.103__py3-none-manylinux2014_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of angr might be problematic. Click here for more details.

Files changed (1300) hide show
  1. angr/__init__.py +153 -0
  2. angr/__main__.py +59 -0
  3. angr/analyses/__init__.py +46 -0
  4. angr/analyses/analysis.py +359 -0
  5. angr/analyses/backward_slice.py +691 -0
  6. angr/analyses/binary_optimizer.py +683 -0
  7. angr/analyses/bindiff.py +1251 -0
  8. angr/analyses/boyscout.py +77 -0
  9. angr/analyses/callee_cleanup_finder.py +75 -0
  10. angr/analyses/calling_convention.py +956 -0
  11. angr/analyses/cdg.py +197 -0
  12. angr/analyses/cfg/__init__.py +11 -0
  13. angr/analyses/cfg/cfb.py +436 -0
  14. angr/analyses/cfg/cfg.py +73 -0
  15. angr/analyses/cfg/cfg_arch_options.py +82 -0
  16. angr/analyses/cfg/cfg_base.py +2917 -0
  17. angr/analyses/cfg/cfg_emulated.py +3570 -0
  18. angr/analyses/cfg/cfg_fast.py +5053 -0
  19. angr/analyses/cfg/cfg_fast_soot.py +669 -0
  20. angr/analyses/cfg/cfg_job_base.py +204 -0
  21. angr/analyses/cfg/indirect_jump_resolvers/__init__.py +8 -0
  22. angr/analyses/cfg/indirect_jump_resolvers/amd64_elf_got.py +63 -0
  23. angr/analyses/cfg/indirect_jump_resolvers/amd64_pe_iat.py +52 -0
  24. angr/analyses/cfg/indirect_jump_resolvers/arm_elf_fast.py +151 -0
  25. angr/analyses/cfg/indirect_jump_resolvers/const_resolver.py +141 -0
  26. angr/analyses/cfg/indirect_jump_resolvers/default_resolvers.py +68 -0
  27. angr/analyses/cfg/indirect_jump_resolvers/jumptable.py +2368 -0
  28. angr/analyses/cfg/indirect_jump_resolvers/mips_elf_fast.py +517 -0
  29. angr/analyses/cfg/indirect_jump_resolvers/propagator_utils.py +26 -0
  30. angr/analyses/cfg/indirect_jump_resolvers/resolver.py +74 -0
  31. angr/analyses/cfg/indirect_jump_resolvers/x86_elf_pic_plt.py +93 -0
  32. angr/analyses/cfg/indirect_jump_resolvers/x86_pe_iat.py +51 -0
  33. angr/analyses/cfg_slice_to_sink/__init__.py +2 -0
  34. angr/analyses/cfg_slice_to_sink/cfg_slice_to_sink.py +117 -0
  35. angr/analyses/cfg_slice_to_sink/graph.py +84 -0
  36. angr/analyses/cfg_slice_to_sink/transitions.py +25 -0
  37. angr/analyses/class_identifier.py +62 -0
  38. angr/analyses/code_tagging.py +123 -0
  39. angr/analyses/complete_calling_conventions.py +424 -0
  40. angr/analyses/congruency_check.py +384 -0
  41. angr/analyses/data_dep/__init__.py +2 -0
  42. angr/analyses/data_dep/data_dependency_analysis.py +605 -0
  43. angr/analyses/data_dep/dep_nodes.py +170 -0
  44. angr/analyses/data_dep/sim_act_location.py +46 -0
  45. angr/analyses/datagraph_meta.py +105 -0
  46. angr/analyses/ddg.py +1695 -0
  47. angr/analyses/decompiler/__init__.py +13 -0
  48. angr/analyses/decompiler/ail_simplifier.py +1408 -0
  49. angr/analyses/decompiler/ailgraph_walker.py +48 -0
  50. angr/analyses/decompiler/block_io_finder.py +293 -0
  51. angr/analyses/decompiler/block_similarity.py +188 -0
  52. angr/analyses/decompiler/block_simplifier.py +434 -0
  53. angr/analyses/decompiler/call_counter.py +43 -0
  54. angr/analyses/decompiler/callsite_maker.py +403 -0
  55. angr/analyses/decompiler/ccall_rewriters/__init__.py +6 -0
  56. angr/analyses/decompiler/ccall_rewriters/amd64_ccalls.py +489 -0
  57. angr/analyses/decompiler/ccall_rewriters/rewriter_base.py +19 -0
  58. angr/analyses/decompiler/clinic.py +2166 -0
  59. angr/analyses/decompiler/condition_processor.py +1184 -0
  60. angr/analyses/decompiler/decompilation_cache.py +38 -0
  61. angr/analyses/decompiler/decompilation_options.py +274 -0
  62. angr/analyses/decompiler/decompiler.py +544 -0
  63. angr/analyses/decompiler/empty_node_remover.py +211 -0
  64. angr/analyses/decompiler/expression_counters.py +76 -0
  65. angr/analyses/decompiler/expression_narrower.py +92 -0
  66. angr/analyses/decompiler/goto_manager.py +73 -0
  67. angr/analyses/decompiler/graph_region.py +413 -0
  68. angr/analyses/decompiler/jump_target_collector.py +36 -0
  69. angr/analyses/decompiler/jumptable_entry_condition_rewriter.py +66 -0
  70. angr/analyses/decompiler/optimization_passes/__init__.py +108 -0
  71. angr/analyses/decompiler/optimization_passes/base_ptr_save_simplifier.py +144 -0
  72. angr/analyses/decompiler/optimization_passes/code_motion.py +360 -0
  73. angr/analyses/decompiler/optimization_passes/const_derefs.py +265 -0
  74. angr/analyses/decompiler/optimization_passes/cross_jump_reverter.py +108 -0
  75. angr/analyses/decompiler/optimization_passes/deadblock_remover.py +73 -0
  76. angr/analyses/decompiler/optimization_passes/div_simplifier.py +391 -0
  77. angr/analyses/decompiler/optimization_passes/engine_base.py +303 -0
  78. angr/analyses/decompiler/optimization_passes/expr_op_swapper.py +136 -0
  79. angr/analyses/decompiler/optimization_passes/flip_boolean_cmp.py +91 -0
  80. angr/analyses/decompiler/optimization_passes/inlined_string_transformation_simplifier.py +386 -0
  81. angr/analyses/decompiler/optimization_passes/ite_expr_converter.py +226 -0
  82. angr/analyses/decompiler/optimization_passes/ite_region_converter.py +189 -0
  83. angr/analyses/decompiler/optimization_passes/lowered_switch_simplifier.py +757 -0
  84. angr/analyses/decompiler/optimization_passes/mod_simplifier.py +86 -0
  85. angr/analyses/decompiler/optimization_passes/multi_simplifier.py +227 -0
  86. angr/analyses/decompiler/optimization_passes/optimization_pass.py +397 -0
  87. angr/analyses/decompiler/optimization_passes/register_save_area_simplifier.py +198 -0
  88. angr/analyses/decompiler/optimization_passes/ret_addr_save_simplifier.py +172 -0
  89. angr/analyses/decompiler/optimization_passes/ret_deduplicator.py +219 -0
  90. angr/analyses/decompiler/optimization_passes/return_duplicator_base.py +448 -0
  91. angr/analyses/decompiler/optimization_passes/return_duplicator_high.py +57 -0
  92. angr/analyses/decompiler/optimization_passes/return_duplicator_low.py +121 -0
  93. angr/analyses/decompiler/optimization_passes/spilled_register_finder.py +18 -0
  94. angr/analyses/decompiler/optimization_passes/stack_canary_simplifier.py +293 -0
  95. angr/analyses/decompiler/optimization_passes/switch_default_case_duplicator.py +110 -0
  96. angr/analyses/decompiler/optimization_passes/win_stack_canary_simplifier.py +281 -0
  97. angr/analyses/decompiler/optimization_passes/x86_gcc_getpc_simplifier.py +87 -0
  98. angr/analyses/decompiler/peephole_optimizations/__init__.py +69 -0
  99. angr/analyses/decompiler/peephole_optimizations/a_div_const_add_a_mul_n_div_const.py +38 -0
  100. angr/analyses/decompiler/peephole_optimizations/a_mul_const_div_shr_const.py +38 -0
  101. angr/analyses/decompiler/peephole_optimizations/a_shl_const_sub_a.py +31 -0
  102. angr/analyses/decompiler/peephole_optimizations/a_sub_a_div.py +25 -0
  103. angr/analyses/decompiler/peephole_optimizations/a_sub_a_div_const_mul_const.py +56 -0
  104. angr/analyses/decompiler/peephole_optimizations/a_sub_a_sub_n.py +19 -0
  105. angr/analyses/decompiler/peephole_optimizations/arm_cmpf.py +235 -0
  106. angr/analyses/decompiler/peephole_optimizations/base.py +120 -0
  107. angr/analyses/decompiler/peephole_optimizations/basepointeroffset_add_n.py +33 -0
  108. angr/analyses/decompiler/peephole_optimizations/basepointeroffset_and_mask.py +35 -0
  109. angr/analyses/decompiler/peephole_optimizations/bitwise_or_to_logical_or.py +34 -0
  110. angr/analyses/decompiler/peephole_optimizations/bool_expr_xor_1.py +27 -0
  111. angr/analyses/decompiler/peephole_optimizations/bswap.py +131 -0
  112. angr/analyses/decompiler/peephole_optimizations/cmpord_rewriter.py +72 -0
  113. angr/analyses/decompiler/peephole_optimizations/coalesce_same_cascading_ifs.py +27 -0
  114. angr/analyses/decompiler/peephole_optimizations/const_mull_a_shift.py +91 -0
  115. angr/analyses/decompiler/peephole_optimizations/constant_derefs.py +43 -0
  116. angr/analyses/decompiler/peephole_optimizations/conv_a_sub0_shr_and.py +70 -0
  117. angr/analyses/decompiler/peephole_optimizations/conv_shl_shr.py +51 -0
  118. angr/analyses/decompiler/peephole_optimizations/eager_eval.py +225 -0
  119. angr/analyses/decompiler/peephole_optimizations/extended_byte_and_mask.py +55 -0
  120. angr/analyses/decompiler/peephole_optimizations/inlined_strcpy.py +146 -0
  121. angr/analyses/decompiler/peephole_optimizations/inlined_strcpy_consolidation.py +102 -0
  122. angr/analyses/decompiler/peephole_optimizations/inlined_wstrcpy.py +159 -0
  123. angr/analyses/decompiler/peephole_optimizations/invert_negated_logical_conjuction_disjunction.py +50 -0
  124. angr/analyses/decompiler/peephole_optimizations/one_sub_bool.py +33 -0
  125. angr/analyses/decompiler/peephole_optimizations/remove_cascading_conversions.py +19 -0
  126. angr/analyses/decompiler/peephole_optimizations/remove_empty_if_body.py +45 -0
  127. angr/analyses/decompiler/peephole_optimizations/remove_noop_conversions.py +26 -0
  128. angr/analyses/decompiler/peephole_optimizations/remove_redundant_bitmasks.py +48 -0
  129. angr/analyses/decompiler/peephole_optimizations/remove_redundant_conversions.py +160 -0
  130. angr/analyses/decompiler/peephole_optimizations/remove_redundant_ite_branch.py +29 -0
  131. angr/analyses/decompiler/peephole_optimizations/remove_redundant_ite_comparisons.py +54 -0
  132. angr/analyses/decompiler/peephole_optimizations/remove_redundant_nots.py +17 -0
  133. angr/analyses/decompiler/peephole_optimizations/remove_redundant_reinterprets.py +43 -0
  134. angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts.py +44 -0
  135. angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts_around_comparators.py +40 -0
  136. angr/analyses/decompiler/peephole_optimizations/rewrite_bit_extractions.py +85 -0
  137. angr/analyses/decompiler/peephole_optimizations/rewrite_mips_gp_loads.py +47 -0
  138. angr/analyses/decompiler/peephole_optimizations/rol_ror.py +77 -0
  139. angr/analyses/decompiler/peephole_optimizations/sar_to_signed_div.py +105 -0
  140. angr/analyses/decompiler/peephole_optimizations/simplify_pc_relative_loads.py +37 -0
  141. angr/analyses/decompiler/peephole_optimizations/single_bit_cond_to_boolexpr.py +52 -0
  142. angr/analyses/decompiler/peephole_optimizations/single_bit_xor.py +26 -0
  143. angr/analyses/decompiler/peephole_optimizations/tidy_stack_addr.py +133 -0
  144. angr/analyses/decompiler/redundant_label_remover.py +116 -0
  145. angr/analyses/decompiler/region_identifier.py +1098 -0
  146. angr/analyses/decompiler/region_simplifiers/__init__.py +1 -0
  147. angr/analyses/decompiler/region_simplifiers/cascading_cond_transformer.py +93 -0
  148. angr/analyses/decompiler/region_simplifiers/cascading_ifs.py +81 -0
  149. angr/analyses/decompiler/region_simplifiers/expr_folding.py +606 -0
  150. angr/analyses/decompiler/region_simplifiers/goto.py +177 -0
  151. angr/analyses/decompiler/region_simplifiers/if_.py +142 -0
  152. angr/analyses/decompiler/region_simplifiers/ifelse.py +90 -0
  153. angr/analyses/decompiler/region_simplifiers/loop.py +135 -0
  154. angr/analyses/decompiler/region_simplifiers/node_address_finder.py +23 -0
  155. angr/analyses/decompiler/region_simplifiers/region_simplifier.py +211 -0
  156. angr/analyses/decompiler/region_simplifiers/switch_cluster_simplifier.py +644 -0
  157. angr/analyses/decompiler/region_simplifiers/switch_expr_simplifier.py +83 -0
  158. angr/analyses/decompiler/region_walker.py +23 -0
  159. angr/analyses/decompiler/return_maker.py +70 -0
  160. angr/analyses/decompiler/seq_to_blocks.py +19 -0
  161. angr/analyses/decompiler/sequence_walker.py +235 -0
  162. angr/analyses/decompiler/structured_codegen/__init__.py +10 -0
  163. angr/analyses/decompiler/structured_codegen/base.py +132 -0
  164. angr/analyses/decompiler/structured_codegen/c.py +3811 -0
  165. angr/analyses/decompiler/structured_codegen/dummy.py +14 -0
  166. angr/analyses/decompiler/structured_codegen/dwarf_import.py +186 -0
  167. angr/analyses/decompiler/structuring/__init__.py +15 -0
  168. angr/analyses/decompiler/structuring/dream.py +1225 -0
  169. angr/analyses/decompiler/structuring/phoenix.py +2546 -0
  170. angr/analyses/decompiler/structuring/recursive_structurer.py +186 -0
  171. angr/analyses/decompiler/structuring/structurer_base.py +954 -0
  172. angr/analyses/decompiler/structuring/structurer_nodes.py +414 -0
  173. angr/analyses/decompiler/utils.py +787 -0
  174. angr/analyses/disassembly.py +1302 -0
  175. angr/analyses/disassembly_utils.py +104 -0
  176. angr/analyses/dominance_frontier.py +39 -0
  177. angr/analyses/find_objects_static.py +203 -0
  178. angr/analyses/flirt.py +185 -0
  179. angr/analyses/forward_analysis/__init__.py +2 -0
  180. angr/analyses/forward_analysis/forward_analysis.py +527 -0
  181. angr/analyses/forward_analysis/job_info.py +64 -0
  182. angr/analyses/forward_analysis/visitors/__init__.py +4 -0
  183. angr/analyses/forward_analysis/visitors/call_graph.py +28 -0
  184. angr/analyses/forward_analysis/visitors/function_graph.py +85 -0
  185. angr/analyses/forward_analysis/visitors/graph.py +250 -0
  186. angr/analyses/forward_analysis/visitors/loop.py +28 -0
  187. angr/analyses/forward_analysis/visitors/single_node_graph.py +38 -0
  188. angr/analyses/identifier/__init__.py +1 -0
  189. angr/analyses/identifier/custom_callable.py +138 -0
  190. angr/analyses/identifier/errors.py +9 -0
  191. angr/analyses/identifier/func.py +57 -0
  192. angr/analyses/identifier/functions/__init__.py +36 -0
  193. angr/analyses/identifier/functions/atoi.py +75 -0
  194. angr/analyses/identifier/functions/based_atoi.py +128 -0
  195. angr/analyses/identifier/functions/fdprintf.py +122 -0
  196. angr/analyses/identifier/functions/free.py +64 -0
  197. angr/analyses/identifier/functions/int2str.py +302 -0
  198. angr/analyses/identifier/functions/malloc.py +113 -0
  199. angr/analyses/identifier/functions/memcmp.py +69 -0
  200. angr/analyses/identifier/functions/memcpy.py +89 -0
  201. angr/analyses/identifier/functions/memset.py +43 -0
  202. angr/analyses/identifier/functions/printf.py +122 -0
  203. angr/analyses/identifier/functions/recv_until.py +315 -0
  204. angr/analyses/identifier/functions/skip_calloc.py +72 -0
  205. angr/analyses/identifier/functions/skip_realloc.py +99 -0
  206. angr/analyses/identifier/functions/skip_recv_n.py +107 -0
  207. angr/analyses/identifier/functions/snprintf.py +114 -0
  208. angr/analyses/identifier/functions/sprintf.py +115 -0
  209. angr/analyses/identifier/functions/strcasecmp.py +32 -0
  210. angr/analyses/identifier/functions/strcmp.py +112 -0
  211. angr/analyses/identifier/functions/strcpy.py +43 -0
  212. angr/analyses/identifier/functions/strlen.py +26 -0
  213. angr/analyses/identifier/functions/strncmp.py +103 -0
  214. angr/analyses/identifier/functions/strncpy.py +65 -0
  215. angr/analyses/identifier/functions/strtol.py +91 -0
  216. angr/analyses/identifier/identify.py +848 -0
  217. angr/analyses/identifier/runner.py +359 -0
  218. angr/analyses/init_finder.py +264 -0
  219. angr/analyses/loop_analysis.py +353 -0
  220. angr/analyses/loopfinder.py +174 -0
  221. angr/analyses/propagator/__init__.py +1 -0
  222. angr/analyses/propagator/engine_ail.py +1560 -0
  223. angr/analyses/propagator/engine_base.py +53 -0
  224. angr/analyses/propagator/engine_vex.py +328 -0
  225. angr/analyses/propagator/outdated_definition_walker.py +158 -0
  226. angr/analyses/propagator/propagator.py +422 -0
  227. angr/analyses/propagator/tmpvar_finder.py +17 -0
  228. angr/analyses/propagator/top_checker_mixin.py +14 -0
  229. angr/analyses/propagator/values.py +116 -0
  230. angr/analyses/propagator/vex_vars.py +67 -0
  231. angr/analyses/proximity_graph.py +452 -0
  232. angr/analyses/reaching_definitions/__init__.py +65 -0
  233. angr/analyses/reaching_definitions/call_trace.py +72 -0
  234. angr/analyses/reaching_definitions/dep_graph.py +392 -0
  235. angr/analyses/reaching_definitions/engine_ail.py +1172 -0
  236. angr/analyses/reaching_definitions/engine_vex.py +1102 -0
  237. angr/analyses/reaching_definitions/external_codeloc.py +0 -0
  238. angr/analyses/reaching_definitions/function_handler.py +603 -0
  239. angr/analyses/reaching_definitions/heap_allocator.py +69 -0
  240. angr/analyses/reaching_definitions/rd_initializer.py +235 -0
  241. angr/analyses/reaching_definitions/rd_state.py +613 -0
  242. angr/analyses/reaching_definitions/reaching_definitions.py +594 -0
  243. angr/analyses/reaching_definitions/subject.py +64 -0
  244. angr/analyses/reassembler.py +2970 -0
  245. angr/analyses/soot_class_hierarchy.py +283 -0
  246. angr/analyses/stack_pointer_tracker.py +832 -0
  247. angr/analyses/static_hooker.py +51 -0
  248. angr/analyses/typehoon/__init__.py +1 -0
  249. angr/analyses/typehoon/dfa.py +108 -0
  250. angr/analyses/typehoon/lifter.py +91 -0
  251. angr/analyses/typehoon/simple_solver.py +1258 -0
  252. angr/analyses/typehoon/translator.py +242 -0
  253. angr/analyses/typehoon/typeconsts.py +294 -0
  254. angr/analyses/typehoon/typehoon.py +239 -0
  255. angr/analyses/typehoon/typevars.py +565 -0
  256. angr/analyses/typehoon/variance.py +10 -0
  257. angr/analyses/variable_recovery/__init__.py +2 -0
  258. angr/analyses/variable_recovery/annotations.py +57 -0
  259. angr/analyses/variable_recovery/engine_ail.py +746 -0
  260. angr/analyses/variable_recovery/engine_base.py +962 -0
  261. angr/analyses/variable_recovery/engine_vex.py +580 -0
  262. angr/analyses/variable_recovery/irsb_scanner.py +131 -0
  263. angr/analyses/variable_recovery/variable_recovery.py +552 -0
  264. angr/analyses/variable_recovery/variable_recovery_base.py +452 -0
  265. angr/analyses/variable_recovery/variable_recovery_fast.py +589 -0
  266. angr/analyses/veritesting.py +635 -0
  267. angr/analyses/vfg.py +1945 -0
  268. angr/analyses/vsa_ddg.py +423 -0
  269. angr/analyses/vtable.py +92 -0
  270. angr/analyses/xrefs.py +263 -0
  271. angr/angrdb/__init__.py +9 -0
  272. angr/angrdb/db.py +208 -0
  273. angr/angrdb/models.py +183 -0
  274. angr/angrdb/serializers/__init__.py +2 -0
  275. angr/angrdb/serializers/cfg_model.py +41 -0
  276. angr/angrdb/serializers/comments.py +59 -0
  277. angr/angrdb/serializers/funcs.py +60 -0
  278. angr/angrdb/serializers/kb.py +110 -0
  279. angr/angrdb/serializers/labels.py +58 -0
  280. angr/angrdb/serializers/loader.py +81 -0
  281. angr/angrdb/serializers/structured_code.py +128 -0
  282. angr/angrdb/serializers/variables.py +58 -0
  283. angr/angrdb/serializers/xrefs.py +48 -0
  284. angr/annocfg.py +320 -0
  285. angr/blade.py +430 -0
  286. angr/block.py +506 -0
  287. angr/callable.py +162 -0
  288. angr/calling_conventions.py +2383 -0
  289. angr/code_location.py +168 -0
  290. angr/codenode.py +140 -0
  291. angr/concretization_strategies/__init__.py +97 -0
  292. angr/concretization_strategies/any.py +15 -0
  293. angr/concretization_strategies/any_named.py +32 -0
  294. angr/concretization_strategies/controlled_data.py +54 -0
  295. angr/concretization_strategies/eval.py +18 -0
  296. angr/concretization_strategies/logging.py +32 -0
  297. angr/concretization_strategies/max.py +24 -0
  298. angr/concretization_strategies/nonzero.py +14 -0
  299. angr/concretization_strategies/nonzero_range.py +20 -0
  300. angr/concretization_strategies/norepeats.py +35 -0
  301. angr/concretization_strategies/norepeats_range.py +35 -0
  302. angr/concretization_strategies/range.py +17 -0
  303. angr/concretization_strategies/signed_add.py +24 -0
  304. angr/concretization_strategies/single.py +12 -0
  305. angr/concretization_strategies/solutions.py +18 -0
  306. angr/concretization_strategies/unlimited_range.py +15 -0
  307. angr/distributed/__init__.py +3 -0
  308. angr/distributed/server.py +198 -0
  309. angr/distributed/worker.py +183 -0
  310. angr/engines/__init__.py +41 -0
  311. angr/engines/concrete.py +178 -0
  312. angr/engines/engine.py +212 -0
  313. angr/engines/failure.py +27 -0
  314. angr/engines/hook.py +67 -0
  315. angr/engines/light/__init__.py +2 -0
  316. angr/engines/light/data.py +715 -0
  317. angr/engines/light/engine.py +1441 -0
  318. angr/engines/pcode/__init__.py +2 -0
  319. angr/engines/pcode/behavior.py +995 -0
  320. angr/engines/pcode/cc.py +123 -0
  321. angr/engines/pcode/emulate.py +446 -0
  322. angr/engines/pcode/engine.py +256 -0
  323. angr/engines/pcode/lifter.py +1423 -0
  324. angr/engines/procedure.py +71 -0
  325. angr/engines/soot/__init__.py +1 -0
  326. angr/engines/soot/engine.py +415 -0
  327. angr/engines/soot/exceptions.py +14 -0
  328. angr/engines/soot/expressions/__init__.py +56 -0
  329. angr/engines/soot/expressions/arrayref.py +21 -0
  330. angr/engines/soot/expressions/base.py +22 -0
  331. angr/engines/soot/expressions/binop.py +27 -0
  332. angr/engines/soot/expressions/cast.py +21 -0
  333. angr/engines/soot/expressions/condition.py +34 -0
  334. angr/engines/soot/expressions/constants.py +45 -0
  335. angr/engines/soot/expressions/instanceOf.py +11 -0
  336. angr/engines/soot/expressions/instancefieldref.py +7 -0
  337. angr/engines/soot/expressions/invoke.py +117 -0
  338. angr/engines/soot/expressions/length.py +7 -0
  339. angr/engines/soot/expressions/local.py +7 -0
  340. angr/engines/soot/expressions/new.py +15 -0
  341. angr/engines/soot/expressions/newArray.py +51 -0
  342. angr/engines/soot/expressions/newMultiArray.py +84 -0
  343. angr/engines/soot/expressions/paramref.py +7 -0
  344. angr/engines/soot/expressions/phi.py +29 -0
  345. angr/engines/soot/expressions/staticfieldref.py +7 -0
  346. angr/engines/soot/expressions/thisref.py +6 -0
  347. angr/engines/soot/expressions/unsupported.py +6 -0
  348. angr/engines/soot/field_dispatcher.py +49 -0
  349. angr/engines/soot/method_dispatcher.py +49 -0
  350. angr/engines/soot/statements/__init__.py +30 -0
  351. angr/engines/soot/statements/assign.py +29 -0
  352. angr/engines/soot/statements/base.py +80 -0
  353. angr/engines/soot/statements/goto.py +11 -0
  354. angr/engines/soot/statements/identity.py +14 -0
  355. angr/engines/soot/statements/if_.py +16 -0
  356. angr/engines/soot/statements/invoke.py +11 -0
  357. angr/engines/soot/statements/return_.py +19 -0
  358. angr/engines/soot/statements/switch.py +38 -0
  359. angr/engines/soot/statements/throw.py +12 -0
  360. angr/engines/soot/values/__init__.py +24 -0
  361. angr/engines/soot/values/arrayref.py +124 -0
  362. angr/engines/soot/values/base.py +4 -0
  363. angr/engines/soot/values/constants.py +17 -0
  364. angr/engines/soot/values/instancefieldref.py +42 -0
  365. angr/engines/soot/values/local.py +17 -0
  366. angr/engines/soot/values/paramref.py +17 -0
  367. angr/engines/soot/values/staticfieldref.py +37 -0
  368. angr/engines/soot/values/strref.py +37 -0
  369. angr/engines/soot/values/thisref.py +148 -0
  370. angr/engines/successors.py +540 -0
  371. angr/engines/syscall.py +53 -0
  372. angr/engines/unicorn.py +483 -0
  373. angr/engines/vex/__init__.py +4 -0
  374. angr/engines/vex/claripy/__init__.py +1 -0
  375. angr/engines/vex/claripy/ccall.py +2097 -0
  376. angr/engines/vex/claripy/datalayer.py +149 -0
  377. angr/engines/vex/claripy/irop.py +1279 -0
  378. angr/engines/vex/heavy/__init__.py +5 -0
  379. angr/engines/vex/heavy/actions.py +237 -0
  380. angr/engines/vex/heavy/concretizers.py +394 -0
  381. angr/engines/vex/heavy/dirty.py +467 -0
  382. angr/engines/vex/heavy/heavy.py +379 -0
  383. angr/engines/vex/heavy/inspect.py +51 -0
  384. angr/engines/vex/heavy/resilience.py +85 -0
  385. angr/engines/vex/heavy/super_fastpath.py +34 -0
  386. angr/engines/vex/lifter.py +424 -0
  387. angr/engines/vex/light/__init__.py +3 -0
  388. angr/engines/vex/light/light.py +555 -0
  389. angr/engines/vex/light/resilience.py +73 -0
  390. angr/engines/vex/light/slicing.py +51 -0
  391. angr/errors.py +604 -0
  392. angr/exploration_techniques/__init__.py +176 -0
  393. angr/exploration_techniques/bucketizer.py +96 -0
  394. angr/exploration_techniques/common.py +56 -0
  395. angr/exploration_techniques/dfs.py +34 -0
  396. angr/exploration_techniques/director.py +523 -0
  397. angr/exploration_techniques/driller_core.py +102 -0
  398. angr/exploration_techniques/explorer.py +146 -0
  399. angr/exploration_techniques/lengthlimiter.py +20 -0
  400. angr/exploration_techniques/local_loop_seer.py +64 -0
  401. angr/exploration_techniques/loop_seer.py +239 -0
  402. angr/exploration_techniques/manual_mergepoint.py +80 -0
  403. angr/exploration_techniques/memory_watcher.py +40 -0
  404. angr/exploration_techniques/oppologist.py +93 -0
  405. angr/exploration_techniques/slicecutor.py +115 -0
  406. angr/exploration_techniques/spiller.py +282 -0
  407. angr/exploration_techniques/spiller_db.py +27 -0
  408. angr/exploration_techniques/stochastic.py +57 -0
  409. angr/exploration_techniques/suggestions.py +156 -0
  410. angr/exploration_techniques/symbion.py +78 -0
  411. angr/exploration_techniques/tech_builder.py +47 -0
  412. angr/exploration_techniques/threading.py +77 -0
  413. angr/exploration_techniques/timeout.py +31 -0
  414. angr/exploration_techniques/tracer.py +1101 -0
  415. angr/exploration_techniques/unique.py +104 -0
  416. angr/exploration_techniques/veritesting.py +36 -0
  417. angr/factory.py +385 -0
  418. angr/flirt/__init__.py +126 -0
  419. angr/flirt/build_sig.py +316 -0
  420. angr/graph_utils.py +0 -0
  421. angr/keyed_region.py +532 -0
  422. angr/knowledge_base/__init__.py +1 -0
  423. angr/knowledge_base/knowledge_base.py +145 -0
  424. angr/knowledge_plugins/__init__.py +18 -0
  425. angr/knowledge_plugins/callsite_prototypes.py +52 -0
  426. angr/knowledge_plugins/cfg/__init__.py +16 -0
  427. angr/knowledge_plugins/cfg/cfg_manager.py +94 -0
  428. angr/knowledge_plugins/cfg/cfg_model.py +1057 -0
  429. angr/knowledge_plugins/cfg/cfg_node.py +541 -0
  430. angr/knowledge_plugins/cfg/indirect_jump.py +67 -0
  431. angr/knowledge_plugins/cfg/memory_data.py +156 -0
  432. angr/knowledge_plugins/comments.py +15 -0
  433. angr/knowledge_plugins/custom_strings.py +37 -0
  434. angr/knowledge_plugins/data.py +21 -0
  435. angr/knowledge_plugins/debug_variables.py +221 -0
  436. angr/knowledge_plugins/functions/__init__.py +2 -0
  437. angr/knowledge_plugins/functions/function.py +1694 -0
  438. angr/knowledge_plugins/functions/function_manager.py +501 -0
  439. angr/knowledge_plugins/functions/function_parser.py +295 -0
  440. angr/knowledge_plugins/functions/soot_function.py +131 -0
  441. angr/knowledge_plugins/indirect_jumps.py +34 -0
  442. angr/knowledge_plugins/key_definitions/__init__.py +16 -0
  443. angr/knowledge_plugins/key_definitions/atoms.py +314 -0
  444. angr/knowledge_plugins/key_definitions/constants.py +23 -0
  445. angr/knowledge_plugins/key_definitions/definition.py +217 -0
  446. angr/knowledge_plugins/key_definitions/environment.py +92 -0
  447. angr/knowledge_plugins/key_definitions/heap_address.py +32 -0
  448. angr/knowledge_plugins/key_definitions/key_definition_manager.py +81 -0
  449. angr/knowledge_plugins/key_definitions/live_definitions.py +1074 -0
  450. angr/knowledge_plugins/key_definitions/liveness.py +170 -0
  451. angr/knowledge_plugins/key_definitions/rd_model.py +176 -0
  452. angr/knowledge_plugins/key_definitions/tag.py +77 -0
  453. angr/knowledge_plugins/key_definitions/undefined.py +67 -0
  454. angr/knowledge_plugins/key_definitions/unknown_size.py +83 -0
  455. angr/knowledge_plugins/key_definitions/uses.py +180 -0
  456. angr/knowledge_plugins/labels.py +109 -0
  457. angr/knowledge_plugins/patches.py +125 -0
  458. angr/knowledge_plugins/plugin.py +23 -0
  459. angr/knowledge_plugins/propagations/__init__.py +2 -0
  460. angr/knowledge_plugins/propagations/prop_value.py +193 -0
  461. angr/knowledge_plugins/propagations/propagation_manager.py +60 -0
  462. angr/knowledge_plugins/propagations/propagation_model.py +74 -0
  463. angr/knowledge_plugins/propagations/states.py +1064 -0
  464. angr/knowledge_plugins/structured_code/__init__.py +1 -0
  465. angr/knowledge_plugins/structured_code/manager.py +59 -0
  466. angr/knowledge_plugins/sync/__init__.py +1 -0
  467. angr/knowledge_plugins/sync/sync_controller.py +329 -0
  468. angr/knowledge_plugins/types.py +87 -0
  469. angr/knowledge_plugins/variables/__init__.py +1 -0
  470. angr/knowledge_plugins/variables/variable_access.py +114 -0
  471. angr/knowledge_plugins/variables/variable_manager.py +1191 -0
  472. angr/knowledge_plugins/xrefs/__init__.py +3 -0
  473. angr/knowledge_plugins/xrefs/xref.py +157 -0
  474. angr/knowledge_plugins/xrefs/xref_manager.py +122 -0
  475. angr/knowledge_plugins/xrefs/xref_types.py +13 -0
  476. angr/lib/angr_native.so +0 -0
  477. angr/misc/__init__.py +8 -0
  478. angr/misc/ansi.py +46 -0
  479. angr/misc/autoimport.py +89 -0
  480. angr/misc/bug_report.py +125 -0
  481. angr/misc/hookset.py +106 -0
  482. angr/misc/import_hooks.py +63 -0
  483. angr/misc/loggers.py +130 -0
  484. angr/misc/picklable_lock.py +45 -0
  485. angr/misc/plugins.py +291 -0
  486. angr/misc/range.py +21 -0
  487. angr/misc/testing.py +23 -0
  488. angr/misc/ux.py +31 -0
  489. angr/misc/weakpatch.py +58 -0
  490. angr/procedures/__init__.py +2 -0
  491. angr/procedures/advapi32/__init__.py +0 -0
  492. angr/procedures/cgc/__init__.py +3 -0
  493. angr/procedures/cgc/_terminate.py +10 -0
  494. angr/procedures/cgc/allocate.py +76 -0
  495. angr/procedures/cgc/deallocate.py +59 -0
  496. angr/procedures/cgc/fdwait.py +62 -0
  497. angr/procedures/cgc/random.py +60 -0
  498. angr/procedures/cgc/receive.py +91 -0
  499. angr/procedures/cgc/transmit.py +63 -0
  500. angr/procedures/definitions/__init__.py +784 -0
  501. angr/procedures/definitions/cgc.py +19 -0
  502. angr/procedures/definitions/glibc.py +8384 -0
  503. angr/procedures/definitions/gnulib.py +35 -0
  504. angr/procedures/definitions/libstdcpp.py +20 -0
  505. angr/procedures/definitions/linux_kernel.py +6167 -0
  506. angr/procedures/definitions/linux_loader.py +6 -0
  507. angr/procedures/definitions/msvcr.py +15 -0
  508. angr/procedures/definitions/parse_syscalls_from_local_system.py +49 -0
  509. angr/procedures/definitions/parse_win32json.py +2556 -0
  510. angr/procedures/definitions/types_win32.py +34481 -0
  511. angr/procedures/definitions/wdk_api-ms-win-dx-d3dkmt-l1-1-4.py +44 -0
  512. angr/procedures/definitions/wdk_api-ms-win-dx-d3dkmt-l1-1-6.py +40 -0
  513. angr/procedures/definitions/wdk_clfs.py +154 -0
  514. angr/procedures/definitions/wdk_fltmgr.py +570 -0
  515. angr/procedures/definitions/wdk_fwpkclnt.py +44 -0
  516. angr/procedures/definitions/wdk_fwpuclnt.py +330 -0
  517. angr/procedures/definitions/wdk_gdi32.py +380 -0
  518. angr/procedures/definitions/wdk_hal.py +92 -0
  519. angr/procedures/definitions/wdk_ksecdd.py +76 -0
  520. angr/procedures/definitions/wdk_ndis.py +252 -0
  521. angr/procedures/definitions/wdk_ntoskrnl.py +3463 -0
  522. angr/procedures/definitions/wdk_offreg.py +86 -0
  523. angr/procedures/definitions/wdk_pshed.py +50 -0
  524. angr/procedures/definitions/wdk_secur32.py +54 -0
  525. angr/procedures/definitions/wdk_vhfum.py +48 -0
  526. angr/procedures/definitions/win32_aclui.py +44 -0
  527. angr/procedures/definitions/win32_activeds.py +82 -0
  528. angr/procedures/definitions/win32_advapi32.py +1698 -0
  529. angr/procedures/definitions/win32_advpack.py +138 -0
  530. angr/procedures/definitions/win32_amsi.py +52 -0
  531. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-1.py +58 -0
  532. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-3.py +48 -0
  533. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-6.py +40 -0
  534. angr/procedures/definitions/win32_api-ms-win-core-apiquery-l2-1-0.py +40 -0
  535. angr/procedures/definitions/win32_api-ms-win-core-backgroundtask-l1-1-0.py +40 -0
  536. angr/procedures/definitions/win32_api-ms-win-core-comm-l1-1-1.py +40 -0
  537. angr/procedures/definitions/win32_api-ms-win-core-comm-l1-1-2.py +40 -0
  538. angr/procedures/definitions/win32_api-ms-win-core-enclave-l1-1-1.py +44 -0
  539. angr/procedures/definitions/win32_api-ms-win-core-errorhandling-l1-1-3.py +40 -0
  540. angr/procedures/definitions/win32_api-ms-win-core-featurestaging-l1-1-0.py +48 -0
  541. angr/procedures/definitions/win32_api-ms-win-core-featurestaging-l1-1-1.py +40 -0
  542. angr/procedures/definitions/win32_api-ms-win-core-file-fromapp-l1-1-0.py +60 -0
  543. angr/procedures/definitions/win32_api-ms-win-core-handle-l1-1-0.py +40 -0
  544. angr/procedures/definitions/win32_api-ms-win-core-ioring-l1-1-0.py +62 -0
  545. angr/procedures/definitions/win32_api-ms-win-core-marshal-l1-1-0.py +46 -0
  546. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-3.py +46 -0
  547. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-4.py +40 -0
  548. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-5.py +44 -0
  549. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-6.py +46 -0
  550. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-7.py +42 -0
  551. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-8.py +44 -0
  552. angr/procedures/definitions/win32_api-ms-win-core-path-l1-1-0.py +82 -0
  553. angr/procedures/definitions/win32_api-ms-win-core-psm-appnotify-l1-1-0.py +42 -0
  554. angr/procedures/definitions/win32_api-ms-win-core-psm-appnotify-l1-1-1.py +42 -0
  555. angr/procedures/definitions/win32_api-ms-win-core-realtime-l1-1-1.py +44 -0
  556. angr/procedures/definitions/win32_api-ms-win-core-realtime-l1-1-2.py +44 -0
  557. angr/procedures/definitions/win32_api-ms-win-core-slapi-l1-1-0.py +40 -0
  558. angr/procedures/definitions/win32_api-ms-win-core-state-helpers-l1-1-0.py +40 -0
  559. angr/procedures/definitions/win32_api-ms-win-core-synch-l1-2-0.py +44 -0
  560. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-0.py +40 -0
  561. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-3.py +42 -0
  562. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-4.py +42 -0
  563. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-6.py +40 -0
  564. angr/procedures/definitions/win32_api-ms-win-core-util-l1-1-1.py +42 -0
  565. angr/procedures/definitions/win32_api-ms-win-core-winrt-error-l1-1-0.py +43 -0
  566. angr/procedures/definitions/win32_api-ms-win-core-winrt-error-l1-1-1.py +37 -0
  567. angr/procedures/definitions/win32_api-ms-win-core-winrt-l1-1-0.py +39 -0
  568. angr/procedures/definitions/win32_api-ms-win-core-winrt-registration-l1-1-0.py +23 -0
  569. angr/procedures/definitions/win32_api-ms-win-core-winrt-robuffer-l1-1-0.py +23 -0
  570. angr/procedures/definitions/win32_api-ms-win-core-winrt-roparameterizediid-l1-1-0.py +27 -0
  571. angr/procedures/definitions/win32_api-ms-win-core-winrt-string-l1-1-0.py +75 -0
  572. angr/procedures/definitions/win32_api-ms-win-core-winrt-string-l1-1-1.py +23 -0
  573. angr/procedures/definitions/win32_api-ms-win-core-wow64-l1-1-1.py +44 -0
  574. angr/procedures/definitions/win32_api-ms-win-devices-query-l1-1-0.py +56 -0
  575. angr/procedures/definitions/win32_api-ms-win-devices-query-l1-1-1.py +48 -0
  576. angr/procedures/definitions/win32_api-ms-win-dx-d3dkmt-l1-1-0.py +40 -0
  577. angr/procedures/definitions/win32_api-ms-win-gaming-deviceinformation-l1-1-0.py +40 -0
  578. angr/procedures/definitions/win32_api-ms-win-gaming-expandedresources-l1-1-0.py +44 -0
  579. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-0.py +52 -0
  580. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-1.py +42 -0
  581. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-2.py +52 -0
  582. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-3.py +42 -0
  583. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-4.py +54 -0
  584. angr/procedures/definitions/win32_api-ms-win-mm-misc-l1-1-1.py +40 -0
  585. angr/procedures/definitions/win32_api-ms-win-net-isolation-l1-1-0.py +54 -0
  586. angr/procedures/definitions/win32_api-ms-win-security-base-l1-2-2.py +40 -0
  587. angr/procedures/definitions/win32_api-ms-win-security-isolatedcontainer-l1-1-0.py +40 -0
  588. angr/procedures/definitions/win32_api-ms-win-security-isolatedcontainer-l1-1-1.py +40 -0
  589. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-3.py +40 -0
  590. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-4.py +40 -0
  591. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-5.py +42 -0
  592. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-0.py +44 -0
  593. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-1.py +50 -0
  594. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-2.py +40 -0
  595. angr/procedures/definitions/win32_api-ms-win-shcore-stream-winrt-l1-1-0.py +27 -0
  596. angr/procedures/definitions/win32_api-ms-win-wsl-api-l1-1-0.py +52 -0
  597. angr/procedures/definitions/win32_apphelp.py +40 -0
  598. angr/procedures/definitions/win32_authz.py +104 -0
  599. angr/procedures/definitions/win32_avicap32.py +46 -0
  600. angr/procedures/definitions/win32_avifil32.py +158 -0
  601. angr/procedures/definitions/win32_avrt.py +66 -0
  602. angr/procedures/definitions/win32_bcp47mrm.py +42 -0
  603. angr/procedures/definitions/win32_bcrypt.py +144 -0
  604. angr/procedures/definitions/win32_bcryptprimitives.py +42 -0
  605. angr/procedures/definitions/win32_bluetoothapis.py +120 -0
  606. angr/procedures/definitions/win32_bthprops.py +33 -0
  607. angr/procedures/definitions/win32_bthprops_cpl.py +50 -0
  608. angr/procedures/definitions/win32_cabinet.py +82 -0
  609. angr/procedures/definitions/win32_certadm.py +74 -0
  610. angr/procedures/definitions/win32_certpoleng.py +54 -0
  611. angr/procedures/definitions/win32_cfgmgr32.py +516 -0
  612. angr/procedures/definitions/win32_chakra.py +212 -0
  613. angr/procedures/definitions/win32_cldapi.py +110 -0
  614. angr/procedures/definitions/win32_clfsw32.py +156 -0
  615. angr/procedures/definitions/win32_clusapi.py +598 -0
  616. angr/procedures/definitions/win32_comctl32.py +268 -0
  617. angr/procedures/definitions/win32_comdlg32.py +80 -0
  618. angr/procedures/definitions/win32_compstui.py +46 -0
  619. angr/procedures/definitions/win32_computecore.py +146 -0
  620. angr/procedures/definitions/win32_computenetwork.py +124 -0
  621. angr/procedures/definitions/win32_computestorage.py +62 -0
  622. angr/procedures/definitions/win32_comsvcs.py +52 -0
  623. angr/procedures/definitions/win32_coremessaging.py +23 -0
  624. angr/procedures/definitions/win32_credui.py +76 -0
  625. angr/procedures/definitions/win32_crypt32.py +496 -0
  626. angr/procedures/definitions/win32_cryptnet.py +48 -0
  627. angr/procedures/definitions/win32_cryptui.py +58 -0
  628. angr/procedures/definitions/win32_cryptxml.py +76 -0
  629. angr/procedures/definitions/win32_cscapi.py +46 -0
  630. angr/procedures/definitions/win32_d2d1.py +64 -0
  631. angr/procedures/definitions/win32_d3d10.py +92 -0
  632. angr/procedures/definitions/win32_d3d10_1.py +42 -0
  633. angr/procedures/definitions/win32_d3d11.py +44 -0
  634. angr/procedures/definitions/win32_d3d12.py +54 -0
  635. angr/procedures/definitions/win32_d3d9.py +60 -0
  636. angr/procedures/definitions/win32_d3dcompiler_47.py +90 -0
  637. angr/procedures/definitions/win32_d3dcsx.py +56 -0
  638. angr/procedures/definitions/win32_davclnt.py +74 -0
  639. angr/procedures/definitions/win32_dbgeng.py +46 -0
  640. angr/procedures/definitions/win32_dbghelp.py +476 -0
  641. angr/procedures/definitions/win32_dbgmodel.py +40 -0
  642. angr/procedures/definitions/win32_dciman32.py +78 -0
  643. angr/procedures/definitions/win32_dcomp.py +62 -0
  644. angr/procedures/definitions/win32_ddraw.py +52 -0
  645. angr/procedures/definitions/win32_deviceaccess.py +40 -0
  646. angr/procedures/definitions/win32_dflayout.py +40 -0
  647. angr/procedures/definitions/win32_dhcpcsvc.py +68 -0
  648. angr/procedures/definitions/win32_dhcpcsvc6.py +50 -0
  649. angr/procedures/definitions/win32_dhcpsapi.py +430 -0
  650. angr/procedures/definitions/win32_diagnosticdataquery.py +108 -0
  651. angr/procedures/definitions/win32_dinput8.py +40 -0
  652. angr/procedures/definitions/win32_directml.py +42 -0
  653. angr/procedures/definitions/win32_dmprocessxmlfiltered.py +40 -0
  654. angr/procedures/definitions/win32_dnsapi.py +166 -0
  655. angr/procedures/definitions/win32_drt.py +70 -0
  656. angr/procedures/definitions/win32_drtprov.py +56 -0
  657. angr/procedures/definitions/win32_drttransport.py +42 -0
  658. angr/procedures/definitions/win32_dsound.py +58 -0
  659. angr/procedures/definitions/win32_dsparse.py +76 -0
  660. angr/procedures/definitions/win32_dsprop.py +52 -0
  661. angr/procedures/definitions/win32_dssec.py +46 -0
  662. angr/procedures/definitions/win32_dsuiext.py +46 -0
  663. angr/procedures/definitions/win32_dwmapi.py +100 -0
  664. angr/procedures/definitions/win32_dwrite.py +40 -0
  665. angr/procedures/definitions/win32_dxcompiler.py +42 -0
  666. angr/procedures/definitions/win32_dxcore.py +40 -0
  667. angr/procedures/definitions/win32_dxgi.py +50 -0
  668. angr/procedures/definitions/win32_dxva2.py +114 -0
  669. angr/procedures/definitions/win32_eappcfg.py +66 -0
  670. angr/procedures/definitions/win32_eappprxy.py +74 -0
  671. angr/procedures/definitions/win32_efswrt.py +42 -0
  672. angr/procedures/definitions/win32_elscore.py +48 -0
  673. angr/procedures/definitions/win32_esent.py +496 -0
  674. angr/procedures/definitions/win32_evr.py +52 -0
  675. angr/procedures/definitions/win32_faultrep.py +46 -0
  676. angr/procedures/definitions/win32_fhsvcctl.py +52 -0
  677. angr/procedures/definitions/win32_firewallapi.py +44 -0
  678. angr/procedures/definitions/win32_fltlib.py +94 -0
  679. angr/procedures/definitions/win32_fontsub.py +42 -0
  680. angr/procedures/definitions/win32_forceinline.py +44 -0
  681. angr/procedures/definitions/win32_fwpuclnt.py +422 -0
  682. angr/procedures/definitions/win32_fxsutility.py +42 -0
  683. angr/procedures/definitions/win32_gdi32.py +900 -0
  684. angr/procedures/definitions/win32_gdiplus.py +1296 -0
  685. angr/procedures/definitions/win32_glu32.py +142 -0
  686. angr/procedures/definitions/win32_gpedit.py +50 -0
  687. angr/procedures/definitions/win32_hhctrl_ocx.py +42 -0
  688. angr/procedures/definitions/win32_hid.py +128 -0
  689. angr/procedures/definitions/win32_hlink.py +94 -0
  690. angr/procedures/definitions/win32_hrtfapo.py +40 -0
  691. angr/procedures/definitions/win32_httpapi.py +124 -0
  692. angr/procedures/definitions/win32_icm32.py +80 -0
  693. angr/procedures/definitions/win32_icmui.py +42 -0
  694. angr/procedures/definitions/win32_icu.py +2088 -0
  695. angr/procedures/definitions/win32_ieframe.py +96 -0
  696. angr/procedures/definitions/win32_imagehlp.py +90 -0
  697. angr/procedures/definitions/win32_imgutil.py +56 -0
  698. angr/procedures/definitions/win32_imm32.py +202 -0
  699. angr/procedures/definitions/win32_infocardapi.py +72 -0
  700. angr/procedures/definitions/win32_inkobjcore.py +92 -0
  701. angr/procedures/definitions/win32_iphlpapi.py +440 -0
  702. angr/procedures/definitions/win32_iscsidsc.py +196 -0
  703. angr/procedures/definitions/win32_isolatedwindowsenvironmentutils.py +42 -0
  704. angr/procedures/definitions/win32_kernel32.py +3199 -0
  705. angr/procedures/definitions/win32_kernelbase.py +50 -0
  706. angr/procedures/definitions/win32_keycredmgr.py +46 -0
  707. angr/procedures/definitions/win32_ksproxy_ax.py +50 -0
  708. angr/procedures/definitions/win32_ksuser.py +54 -0
  709. angr/procedures/definitions/win32_ktmw32.py +116 -0
  710. angr/procedures/definitions/win32_licenseprotection.py +42 -0
  711. angr/procedures/definitions/win32_loadperf.py +62 -0
  712. angr/procedures/definitions/win32_magnification.py +76 -0
  713. angr/procedures/definitions/win32_mapi32.py +170 -0
  714. angr/procedures/definitions/win32_mdmlocalmanagement.py +44 -0
  715. angr/procedures/definitions/win32_mdmregistration.py +68 -0
  716. angr/procedures/definitions/win32_mf.py +162 -0
  717. angr/procedures/definitions/win32_mfcore.py +42 -0
  718. angr/procedures/definitions/win32_mfplat.py +328 -0
  719. angr/procedures/definitions/win32_mfplay.py +40 -0
  720. angr/procedures/definitions/win32_mfreadwrite.py +48 -0
  721. angr/procedures/definitions/win32_mfsensorgroup.py +58 -0
  722. angr/procedures/definitions/win32_mfsrcsnk.py +42 -0
  723. angr/procedures/definitions/win32_mgmtapi.py +56 -0
  724. angr/procedures/definitions/win32_mi.py +40 -0
  725. angr/procedures/definitions/win32_mmdevapi.py +40 -0
  726. angr/procedures/definitions/win32_mpr.py +132 -0
  727. angr/procedures/definitions/win32_mprapi.py +262 -0
  728. angr/procedures/definitions/win32_mqrt.py +106 -0
  729. angr/procedures/definitions/win32_mrmsupport.py +92 -0
  730. angr/procedures/definitions/win32_msacm32.py +122 -0
  731. angr/procedures/definitions/win32_msajapi.py +1132 -0
  732. angr/procedures/definitions/win32_mscms.py +196 -0
  733. angr/procedures/definitions/win32_mscoree.py +92 -0
  734. angr/procedures/definitions/win32_msctfmonitor.py +44 -0
  735. angr/procedures/definitions/win32_msdelta.py +70 -0
  736. angr/procedures/definitions/win32_msdmo.py +60 -0
  737. angr/procedures/definitions/win32_msdrm.py +206 -0
  738. angr/procedures/definitions/win32_msi.py +566 -0
  739. angr/procedures/definitions/win32_msimg32.py +44 -0
  740. angr/procedures/definitions/win32_mspatcha.py +70 -0
  741. angr/procedures/definitions/win32_mspatchc.py +56 -0
  742. angr/procedures/definitions/win32_msports.py +52 -0
  743. angr/procedures/definitions/win32_msrating.py +76 -0
  744. angr/procedures/definitions/win32_mssign32.py +58 -0
  745. angr/procedures/definitions/win32_mstask.py +42 -0
  746. angr/procedures/definitions/win32_msvfw32.py +124 -0
  747. angr/procedures/definitions/win32_mswsock.py +70 -0
  748. angr/procedures/definitions/win32_mtxdm.py +40 -0
  749. angr/procedures/definitions/win32_ncrypt.py +116 -0
  750. angr/procedures/definitions/win32_ndfapi.py +70 -0
  751. angr/procedures/definitions/win32_netapi32.py +450 -0
  752. angr/procedures/definitions/win32_netsh.py +54 -0
  753. angr/procedures/definitions/win32_netshell.py +42 -0
  754. angr/procedures/definitions/win32_newdev.py +60 -0
  755. angr/procedures/definitions/win32_ninput.py +98 -0
  756. angr/procedures/definitions/win32_normaliz.py +42 -0
  757. angr/procedures/definitions/win32_ntdll.py +185 -0
  758. angr/procedures/definitions/win32_ntdllk.py +40 -0
  759. angr/procedures/definitions/win32_ntdsapi.py +200 -0
  760. angr/procedures/definitions/win32_ntlanman.py +58 -0
  761. angr/procedures/definitions/win32_odbc32.py +406 -0
  762. angr/procedures/definitions/win32_odbcbcp.py +92 -0
  763. angr/procedures/definitions/win32_ole32.py +672 -0
  764. angr/procedures/definitions/win32_oleacc.py +72 -0
  765. angr/procedures/definitions/win32_oleaut32.py +848 -0
  766. angr/procedures/definitions/win32_oledlg.py +84 -0
  767. angr/procedures/definitions/win32_ondemandconnroutehelper.py +48 -0
  768. angr/procedures/definitions/win32_opengl32.py +748 -0
  769. angr/procedures/definitions/win32_opmxbox.py +44 -0
  770. angr/procedures/definitions/win32_p2p.py +254 -0
  771. angr/procedures/definitions/win32_p2pgraph.py +112 -0
  772. angr/procedures/definitions/win32_pdh.py +234 -0
  773. angr/procedures/definitions/win32_peerdist.py +94 -0
  774. angr/procedures/definitions/win32_powrprof.py +206 -0
  775. angr/procedures/definitions/win32_prntvpt.py +60 -0
  776. angr/procedures/definitions/win32_projectedfslib.py +76 -0
  777. angr/procedures/definitions/win32_propsys.py +474 -0
  778. angr/procedures/definitions/win32_psapi.py +92 -0
  779. angr/procedures/definitions/win32_quartz.py +42 -0
  780. angr/procedures/definitions/win32_query.py +46 -0
  781. angr/procedures/definitions/win32_qwave.py +60 -0
  782. angr/procedures/definitions/win32_rasapi32.py +206 -0
  783. angr/procedures/definitions/win32_rasdlg.py +50 -0
  784. angr/procedures/definitions/win32_resutils.py +278 -0
  785. angr/procedures/definitions/win32_rometadata.py +23 -0
  786. angr/procedures/definitions/win32_rpcns4.py +160 -0
  787. angr/procedures/definitions/win32_rpcproxy.py +46 -0
  788. angr/procedures/definitions/win32_rpcrt4.py +932 -0
  789. angr/procedures/definitions/win32_rstrtmgr.py +60 -0
  790. angr/procedures/definitions/win32_rtm.py +190 -0
  791. angr/procedures/definitions/win32_rtutils.py +120 -0
  792. angr/procedures/definitions/win32_rtworkq.py +104 -0
  793. angr/procedures/definitions/win32_sas.py +40 -0
  794. angr/procedures/definitions/win32_scarddlg.py +48 -0
  795. angr/procedures/definitions/win32_schannel.py +56 -0
  796. angr/procedures/definitions/win32_sechost.py +42 -0
  797. angr/procedures/definitions/win32_secur32.py +216 -0
  798. angr/procedures/definitions/win32_sensapi.py +44 -0
  799. angr/procedures/definitions/win32_sensorsutilsv2.py +118 -0
  800. angr/procedures/definitions/win32_setupapi.py +706 -0
  801. angr/procedures/definitions/win32_sfc.py +50 -0
  802. angr/procedures/definitions/win32_shdocvw.py +44 -0
  803. angr/procedures/definitions/win32_shell32.py +526 -0
  804. angr/procedures/definitions/win32_shlwapi.py +758 -0
  805. angr/procedures/definitions/win32_slc.py +102 -0
  806. angr/procedures/definitions/win32_slcext.py +46 -0
  807. angr/procedures/definitions/win32_slwga.py +40 -0
  808. angr/procedures/definitions/win32_snmpapi.py +90 -0
  809. angr/procedures/definitions/win32_spoolss.py +90 -0
  810. angr/procedures/definitions/win32_srclient.py +40 -0
  811. angr/procedures/definitions/win32_srpapi.py +60 -0
  812. angr/procedures/definitions/win32_sspicli.py +52 -0
  813. angr/procedures/definitions/win32_sti.py +40 -0
  814. angr/procedures/definitions/win32_t2embed.py +66 -0
  815. angr/procedures/definitions/win32_tapi32.py +536 -0
  816. angr/procedures/definitions/win32_tbs.py +66 -0
  817. angr/procedures/definitions/win32_tdh.py +92 -0
  818. angr/procedures/definitions/win32_tokenbinding.py +58 -0
  819. angr/procedures/definitions/win32_traffic.py +78 -0
  820. angr/procedures/definitions/win32_txfw32.py +56 -0
  821. angr/procedures/definitions/win32_ualapi.py +46 -0
  822. angr/procedures/definitions/win32_uiautomationcore.py +234 -0
  823. angr/procedures/definitions/win32_urlmon.py +192 -0
  824. angr/procedures/definitions/win32_user32.py +1565 -0
  825. angr/procedures/definitions/win32_userenv.py +126 -0
  826. angr/procedures/definitions/win32_usp10.py +118 -0
  827. angr/procedures/definitions/win32_uxtheme.py +192 -0
  828. angr/procedures/definitions/win32_verifier.py +40 -0
  829. angr/procedures/definitions/win32_version.py +66 -0
  830. angr/procedures/definitions/win32_vertdll.py +52 -0
  831. angr/procedures/definitions/win32_virtdisk.py +96 -0
  832. angr/procedures/definitions/win32_vmdevicehost.py +64 -0
  833. angr/procedures/definitions/win32_vmsavedstatedumpprovider.py +124 -0
  834. angr/procedures/definitions/win32_vssapi.py +40 -0
  835. angr/procedures/definitions/win32_wcmapi.py +48 -0
  836. angr/procedures/definitions/win32_wdsbp.py +52 -0
  837. angr/procedures/definitions/win32_wdsclientapi.py +112 -0
  838. angr/procedures/definitions/win32_wdsmc.py +50 -0
  839. angr/procedures/definitions/win32_wdspxe.py +100 -0
  840. angr/procedures/definitions/win32_wdstptc.py +64 -0
  841. angr/procedures/definitions/win32_webauthn.py +64 -0
  842. angr/procedures/definitions/win32_webservices.py +424 -0
  843. angr/procedures/definitions/win32_websocket.py +64 -0
  844. angr/procedures/definitions/win32_wecapi.py +68 -0
  845. angr/procedures/definitions/win32_wer.py +80 -0
  846. angr/procedures/definitions/win32_wevtapi.py +108 -0
  847. angr/procedures/definitions/win32_winbio.py +146 -0
  848. angr/procedures/definitions/win32_windows_ai_machinelearning.py +40 -0
  849. angr/procedures/definitions/win32_windows_data_pdf.py +23 -0
  850. angr/procedures/definitions/win32_windows_media_mediacontrol.py +54 -0
  851. angr/procedures/definitions/win32_windows_networking.py +40 -0
  852. angr/procedures/definitions/win32_windows_ui_xaml.py +42 -0
  853. angr/procedures/definitions/win32_windowscodecs.py +56 -0
  854. angr/procedures/definitions/win32_winfax.py +150 -0
  855. angr/procedures/definitions/win32_winhttp.py +150 -0
  856. angr/procedures/definitions/win32_winhvemulation.py +46 -0
  857. angr/procedures/definitions/win32_winhvplatform.py +170 -0
  858. angr/procedures/definitions/win32_wininet.py +630 -0
  859. angr/procedures/definitions/win32_winml.py +40 -0
  860. angr/procedures/definitions/win32_winmm.py +390 -0
  861. angr/procedures/definitions/win32_winscard.py +178 -0
  862. angr/procedures/definitions/win32_winspool.py +363 -0
  863. angr/procedures/definitions/win32_winspool_drv.py +382 -0
  864. angr/procedures/definitions/win32_wintrust.py +158 -0
  865. angr/procedures/definitions/win32_winusb.py +106 -0
  866. angr/procedures/definitions/win32_wlanapi.py +158 -0
  867. angr/procedures/definitions/win32_wlanui.py +40 -0
  868. angr/procedures/definitions/win32_wldap32.py +524 -0
  869. angr/procedures/definitions/win32_wldp.py +56 -0
  870. angr/procedures/definitions/win32_wmvcore.py +60 -0
  871. angr/procedures/definitions/win32_wnvapi.py +42 -0
  872. angr/procedures/definitions/win32_wofutil.py +60 -0
  873. angr/procedures/definitions/win32_ws2_32.py +358 -0
  874. angr/procedures/definitions/win32_wscapi.py +50 -0
  875. angr/procedures/definitions/win32_wsclient.py +44 -0
  876. angr/procedures/definitions/win32_wsdapi.py +102 -0
  877. angr/procedures/definitions/win32_wsmsvc.py +104 -0
  878. angr/procedures/definitions/win32_wsnmp32.py +136 -0
  879. angr/procedures/definitions/win32_wtsapi32.py +164 -0
  880. angr/procedures/definitions/win32_xaudio2_8.py +46 -0
  881. angr/procedures/definitions/win32_xinput1_4.py +52 -0
  882. angr/procedures/definitions/win32_xinputuap.py +35 -0
  883. angr/procedures/definitions/win32_xmllite.py +50 -0
  884. angr/procedures/definitions/win32_xolehlp.py +46 -0
  885. angr/procedures/definitions/win32_xpsprint.py +42 -0
  886. angr/procedures/glibc/__ctype_b_loc.py +22 -0
  887. angr/procedures/glibc/__ctype_tolower_loc.py +22 -0
  888. angr/procedures/glibc/__ctype_toupper_loc.py +22 -0
  889. angr/procedures/glibc/__errno_location.py +6 -0
  890. angr/procedures/glibc/__init__.py +3 -0
  891. angr/procedures/glibc/__libc_init.py +36 -0
  892. angr/procedures/glibc/__libc_start_main.py +294 -0
  893. angr/procedures/glibc/dynamic_loading.py +19 -0
  894. angr/procedures/glibc/scanf.py +10 -0
  895. angr/procedures/glibc/sscanf.py +5 -0
  896. angr/procedures/gnulib/__init__.py +3 -0
  897. angr/procedures/gnulib/xalloc_die.py +13 -0
  898. angr/procedures/gnulib/xstrtol_fatal.py +13 -0
  899. angr/procedures/java/__init__.py +38 -0
  900. angr/procedures/java/unconstrained.py +64 -0
  901. angr/procedures/java_io/__init__.py +0 -0
  902. angr/procedures/java_io/read.py +11 -0
  903. angr/procedures/java_io/write.py +16 -0
  904. angr/procedures/java_jni/__init__.py +475 -0
  905. angr/procedures/java_jni/array_operations.py +309 -0
  906. angr/procedures/java_jni/class_and_interface_operations.py +31 -0
  907. angr/procedures/java_jni/field_access.py +176 -0
  908. angr/procedures/java_jni/global_and_local_refs.py +56 -0
  909. angr/procedures/java_jni/method_calls.py +364 -0
  910. angr/procedures/java_jni/not_implemented.py +25 -0
  911. angr/procedures/java_jni/object_operations.py +95 -0
  912. angr/procedures/java_jni/string_operations.py +86 -0
  913. angr/procedures/java_jni/version_information.py +11 -0
  914. angr/procedures/java_lang/__init__.py +0 -0
  915. angr/procedures/java_lang/character.py +31 -0
  916. angr/procedures/java_lang/double.py +24 -0
  917. angr/procedures/java_lang/exit.py +12 -0
  918. angr/procedures/java_lang/getsimplename.py +15 -0
  919. angr/procedures/java_lang/integer.py +42 -0
  920. angr/procedures/java_lang/load_library.py +8 -0
  921. angr/procedures/java_lang/math.py +14 -0
  922. angr/procedures/java_lang/string.py +78 -0
  923. angr/procedures/java_lang/stringbuilder.py +43 -0
  924. angr/procedures/java_lang/system.py +17 -0
  925. angr/procedures/java_util/__init__.py +0 -0
  926. angr/procedures/java_util/collection.py +34 -0
  927. angr/procedures/java_util/iterator.py +45 -0
  928. angr/procedures/java_util/list.py +98 -0
  929. angr/procedures/java_util/map.py +132 -0
  930. angr/procedures/java_util/random.py +11 -0
  931. angr/procedures/java_util/scanner_nextline.py +22 -0
  932. angr/procedures/libc/__init__.py +3 -0
  933. angr/procedures/libc/abort.py +8 -0
  934. angr/procedures/libc/access.py +10 -0
  935. angr/procedures/libc/atoi.py +14 -0
  936. angr/procedures/libc/atol.py +12 -0
  937. angr/procedures/libc/calloc.py +7 -0
  938. angr/procedures/libc/closelog.py +9 -0
  939. angr/procedures/libc/err.py +13 -0
  940. angr/procedures/libc/error.py +55 -0
  941. angr/procedures/libc/exit.py +10 -0
  942. angr/procedures/libc/fclose.py +20 -0
  943. angr/procedures/libc/feof.py +19 -0
  944. angr/procedures/libc/fflush.py +15 -0
  945. angr/procedures/libc/fgetc.py +24 -0
  946. angr/procedures/libc/fgets.py +68 -0
  947. angr/procedures/libc/fopen.py +64 -0
  948. angr/procedures/libc/fprintf.py +24 -0
  949. angr/procedures/libc/fputc.py +22 -0
  950. angr/procedures/libc/fputs.py +23 -0
  951. angr/procedures/libc/fread.py +22 -0
  952. angr/procedures/libc/free.py +8 -0
  953. angr/procedures/libc/fscanf.py +20 -0
  954. angr/procedures/libc/fseek.py +32 -0
  955. angr/procedures/libc/ftell.py +21 -0
  956. angr/procedures/libc/fwrite.py +18 -0
  957. angr/procedures/libc/getchar.py +13 -0
  958. angr/procedures/libc/getdelim.py +96 -0
  959. angr/procedures/libc/getegid.py +7 -0
  960. angr/procedures/libc/geteuid.py +7 -0
  961. angr/procedures/libc/getgid.py +7 -0
  962. angr/procedures/libc/gets.py +66 -0
  963. angr/procedures/libc/getuid.py +7 -0
  964. angr/procedures/libc/malloc.py +11 -0
  965. angr/procedures/libc/memcmp.py +69 -0
  966. angr/procedures/libc/memcpy.py +37 -0
  967. angr/procedures/libc/memset.py +69 -0
  968. angr/procedures/libc/openlog.py +9 -0
  969. angr/procedures/libc/perror.py +12 -0
  970. angr/procedures/libc/printf.py +33 -0
  971. angr/procedures/libc/putchar.py +12 -0
  972. angr/procedures/libc/puts.py +16 -0
  973. angr/procedures/libc/rand.py +7 -0
  974. angr/procedures/libc/realloc.py +7 -0
  975. angr/procedures/libc/rewind.py +11 -0
  976. angr/procedures/libc/scanf.py +20 -0
  977. angr/procedures/libc/setbuf.py +8 -0
  978. angr/procedures/libc/setvbuf.py +6 -0
  979. angr/procedures/libc/snprintf.py +33 -0
  980. angr/procedures/libc/sprintf.py +22 -0
  981. angr/procedures/libc/srand.py +6 -0
  982. angr/procedures/libc/sscanf.py +13 -0
  983. angr/procedures/libc/stpcpy.py +18 -0
  984. angr/procedures/libc/strcat.py +13 -0
  985. angr/procedures/libc/strchr.py +44 -0
  986. angr/procedures/libc/strcmp.py +28 -0
  987. angr/procedures/libc/strcpy.py +13 -0
  988. angr/procedures/libc/strlen.py +99 -0
  989. angr/procedures/libc/strncat.py +18 -0
  990. angr/procedures/libc/strncmp.py +180 -0
  991. angr/procedures/libc/strncpy.py +18 -0
  992. angr/procedures/libc/strnlen.py +13 -0
  993. angr/procedures/libc/strstr.py +94 -0
  994. angr/procedures/libc/strtol.py +263 -0
  995. angr/procedures/libc/strtoul.py +9 -0
  996. angr/procedures/libc/system.py +12 -0
  997. angr/procedures/libc/time.py +9 -0
  998. angr/procedures/libc/tmpnam.py +19 -0
  999. angr/procedures/libc/tolower.py +7 -0
  1000. angr/procedures/libc/toupper.py +7 -0
  1001. angr/procedures/libc/ungetc.py +19 -0
  1002. angr/procedures/libc/vsnprintf.py +16 -0
  1003. angr/procedures/libc/wchar.py +15 -0
  1004. angr/procedures/libstdcpp/__init__.py +0 -0
  1005. angr/procedures/libstdcpp/_unwind_resume.py +10 -0
  1006. angr/procedures/libstdcpp/std____throw_bad_alloc.py +12 -0
  1007. angr/procedures/libstdcpp/std____throw_bad_cast.py +12 -0
  1008. angr/procedures/libstdcpp/std____throw_length_error.py +12 -0
  1009. angr/procedures/libstdcpp/std____throw_logic_error.py +12 -0
  1010. angr/procedures/libstdcpp/std__terminate.py +12 -0
  1011. angr/procedures/linux_kernel/__init__.py +3 -0
  1012. angr/procedures/linux_kernel/access.py +17 -0
  1013. angr/procedures/linux_kernel/arch_prctl.py +33 -0
  1014. angr/procedures/linux_kernel/arm_user_helpers.py +58 -0
  1015. angr/procedures/linux_kernel/brk.py +17 -0
  1016. angr/procedures/linux_kernel/cwd.py +27 -0
  1017. angr/procedures/linux_kernel/fstat.py +137 -0
  1018. angr/procedures/linux_kernel/fstat64.py +169 -0
  1019. angr/procedures/linux_kernel/futex.py +17 -0
  1020. angr/procedures/linux_kernel/getegid.py +16 -0
  1021. angr/procedures/linux_kernel/geteuid.py +16 -0
  1022. angr/procedures/linux_kernel/getgid.py +16 -0
  1023. angr/procedures/linux_kernel/getpid.py +13 -0
  1024. angr/procedures/linux_kernel/getrlimit.py +24 -0
  1025. angr/procedures/linux_kernel/gettid.py +8 -0
  1026. angr/procedures/linux_kernel/getuid.py +16 -0
  1027. angr/procedures/linux_kernel/iovec.py +43 -0
  1028. angr/procedures/linux_kernel/lseek.py +39 -0
  1029. angr/procedures/linux_kernel/mmap.py +15 -0
  1030. angr/procedures/linux_kernel/mprotect.py +41 -0
  1031. angr/procedures/linux_kernel/munmap.py +7 -0
  1032. angr/procedures/linux_kernel/openat.py +28 -0
  1033. angr/procedures/linux_kernel/set_tid_address.py +7 -0
  1034. angr/procedures/linux_kernel/sigaction.py +16 -0
  1035. angr/procedures/linux_kernel/sigprocmask.py +20 -0
  1036. angr/procedures/linux_kernel/stat.py +22 -0
  1037. angr/procedures/linux_kernel/sysinfo.py +58 -0
  1038. angr/procedures/linux_kernel/tgkill.py +7 -0
  1039. angr/procedures/linux_kernel/time.py +30 -0
  1040. angr/procedures/linux_kernel/uid.py +29 -0
  1041. angr/procedures/linux_kernel/uname.py +28 -0
  1042. angr/procedures/linux_kernel/unlink.py +22 -0
  1043. angr/procedures/linux_kernel/vsyscall.py +15 -0
  1044. angr/procedures/linux_loader/__init__.py +3 -0
  1045. angr/procedures/linux_loader/_dl_initial_error_catch_tsd.py +6 -0
  1046. angr/procedures/linux_loader/_dl_rtld_lock.py +14 -0
  1047. angr/procedures/linux_loader/sim_loader.py +53 -0
  1048. angr/procedures/linux_loader/tls.py +40 -0
  1049. angr/procedures/msvcr/__getmainargs.py +15 -0
  1050. angr/procedures/msvcr/__init__.py +4 -0
  1051. angr/procedures/msvcr/_initterm.py +37 -0
  1052. angr/procedures/msvcr/fmode.py +28 -0
  1053. angr/procedures/ntdll/__init__.py +0 -0
  1054. angr/procedures/ntdll/exceptions.py +57 -0
  1055. angr/procedures/posix/__init__.py +3 -0
  1056. angr/procedures/posix/accept.py +29 -0
  1057. angr/procedures/posix/bind.py +12 -0
  1058. angr/procedures/posix/bzero.py +6 -0
  1059. angr/procedures/posix/chroot.py +26 -0
  1060. angr/procedures/posix/close.py +9 -0
  1061. angr/procedures/posix/closedir.py +6 -0
  1062. angr/procedures/posix/dup.py +55 -0
  1063. angr/procedures/posix/fcntl.py +9 -0
  1064. angr/procedures/posix/fdopen.py +77 -0
  1065. angr/procedures/posix/fileno.py +17 -0
  1066. angr/procedures/posix/fork.py +10 -0
  1067. angr/procedures/posix/getenv.py +34 -0
  1068. angr/procedures/posix/gethostbyname.py +42 -0
  1069. angr/procedures/posix/getpass.py +18 -0
  1070. angr/procedures/posix/getsockopt.py +10 -0
  1071. angr/procedures/posix/htonl.py +11 -0
  1072. angr/procedures/posix/htons.py +11 -0
  1073. angr/procedures/posix/inet_ntoa.py +61 -0
  1074. angr/procedures/posix/listen.py +12 -0
  1075. angr/procedures/posix/mmap.py +140 -0
  1076. angr/procedures/posix/open.py +17 -0
  1077. angr/procedures/posix/opendir.py +9 -0
  1078. angr/procedures/posix/poll.py +54 -0
  1079. angr/procedures/posix/pread64.py +45 -0
  1080. angr/procedures/posix/pthread.py +87 -0
  1081. angr/procedures/posix/pwrite64.py +45 -0
  1082. angr/procedures/posix/read.py +12 -0
  1083. angr/procedures/posix/readdir.py +59 -0
  1084. angr/procedures/posix/recv.py +12 -0
  1085. angr/procedures/posix/recvfrom.py +12 -0
  1086. angr/procedures/posix/select.py +46 -0
  1087. angr/procedures/posix/send.py +22 -0
  1088. angr/procedures/posix/setsockopt.py +8 -0
  1089. angr/procedures/posix/sigaction.py +20 -0
  1090. angr/procedures/posix/sim_time.py +45 -0
  1091. angr/procedures/posix/sleep.py +7 -0
  1092. angr/procedures/posix/socket.py +18 -0
  1093. angr/procedures/posix/strcasecmp.py +23 -0
  1094. angr/procedures/posix/strdup.py +17 -0
  1095. angr/procedures/posix/strtok_r.py +65 -0
  1096. angr/procedures/posix/syslog.py +15 -0
  1097. angr/procedures/posix/tz.py +8 -0
  1098. angr/procedures/posix/unlink.py +10 -0
  1099. angr/procedures/posix/usleep.py +7 -0
  1100. angr/procedures/posix/write.py +12 -0
  1101. angr/procedures/procedure_dict.py +48 -0
  1102. angr/procedures/stubs/CallReturn.py +12 -0
  1103. angr/procedures/stubs/NoReturnUnconstrained.py +12 -0
  1104. angr/procedures/stubs/Nop.py +6 -0
  1105. angr/procedures/stubs/PathTerminator.py +8 -0
  1106. angr/procedures/stubs/Redirect.py +15 -0
  1107. angr/procedures/stubs/ReturnChar.py +10 -0
  1108. angr/procedures/stubs/ReturnUnconstrained.py +24 -0
  1109. angr/procedures/stubs/UnresolvableCallTarget.py +8 -0
  1110. angr/procedures/stubs/UnresolvableJumpTarget.py +8 -0
  1111. angr/procedures/stubs/UserHook.py +15 -0
  1112. angr/procedures/stubs/__init__.py +3 -0
  1113. angr/procedures/stubs/b64_decode.py +12 -0
  1114. angr/procedures/stubs/caller.py +13 -0
  1115. angr/procedures/stubs/crazy_scanf.py +17 -0
  1116. angr/procedures/stubs/format_parser.py +677 -0
  1117. angr/procedures/stubs/syscall_stub.py +26 -0
  1118. angr/procedures/testing/__init__.py +3 -0
  1119. angr/procedures/testing/manyargs.py +8 -0
  1120. angr/procedures/testing/retreg.py +8 -0
  1121. angr/procedures/tracer/__init__.py +4 -0
  1122. angr/procedures/tracer/random.py +8 -0
  1123. angr/procedures/tracer/receive.py +21 -0
  1124. angr/procedures/tracer/transmit.py +24 -0
  1125. angr/procedures/uclibc/__init__.py +3 -0
  1126. angr/procedures/uclibc/__uClibc_main.py +9 -0
  1127. angr/procedures/win32/EncodePointer.py +6 -0
  1128. angr/procedures/win32/ExitProcess.py +8 -0
  1129. angr/procedures/win32/GetCommandLine.py +11 -0
  1130. angr/procedures/win32/GetCurrentProcessId.py +6 -0
  1131. angr/procedures/win32/GetCurrentThreadId.py +6 -0
  1132. angr/procedures/win32/GetLastInputInfo.py +37 -0
  1133. angr/procedures/win32/GetModuleHandle.py +30 -0
  1134. angr/procedures/win32/GetProcessAffinityMask.py +34 -0
  1135. angr/procedures/win32/InterlockedExchange.py +14 -0
  1136. angr/procedures/win32/IsProcessorFeaturePresent.py +6 -0
  1137. angr/procedures/win32/VirtualAlloc.py +113 -0
  1138. angr/procedures/win32/VirtualProtect.py +59 -0
  1139. angr/procedures/win32/__init__.py +3 -0
  1140. angr/procedures/win32/critical_section.py +11 -0
  1141. angr/procedures/win32/dynamic_loading.py +103 -0
  1142. angr/procedures/win32/file_handles.py +47 -0
  1143. angr/procedures/win32/gethostbyname.py +10 -0
  1144. angr/procedures/win32/heap.py +42 -0
  1145. angr/procedures/win32/is_bad_ptr.py +25 -0
  1146. angr/procedures/win32/local_storage.py +85 -0
  1147. angr/procedures/win32/mutex.py +10 -0
  1148. angr/procedures/win32/sim_time.py +135 -0
  1149. angr/procedures/win32/system_paths.py +34 -0
  1150. angr/procedures/win32_kernel/ExAllocatePool.py +12 -0
  1151. angr/procedures/win32_kernel/ExFreePoolWithTag.py +7 -0
  1152. angr/procedures/win32_kernel/__init__.py +3 -0
  1153. angr/procedures/win_user32/__init__.py +0 -0
  1154. angr/procedures/win_user32/chars.py +12 -0
  1155. angr/procedures/win_user32/keyboard.py +13 -0
  1156. angr/procedures/win_user32/messagebox.py +49 -0
  1157. angr/project.py +834 -0
  1158. angr/protos/__init__.py +13 -0
  1159. angr/protos/cfg_pb2.py +31 -0
  1160. angr/protos/function_pb2.py +37 -0
  1161. angr/protos/primitives_pb2.py +124 -0
  1162. angr/protos/variables_pb2.py +126 -0
  1163. angr/protos/xrefs_pb2.py +34 -0
  1164. angr/py.typed +1 -0
  1165. angr/serializable.py +63 -0
  1166. angr/service.py +35 -0
  1167. angr/sim_manager.py +971 -0
  1168. angr/sim_options.py +444 -0
  1169. angr/sim_procedure.py +606 -0
  1170. angr/sim_state.py +1003 -0
  1171. angr/sim_state_options.py +409 -0
  1172. angr/sim_type.py +3372 -0
  1173. angr/sim_variable.py +562 -0
  1174. angr/simos/__init__.py +31 -0
  1175. angr/simos/cgc.py +152 -0
  1176. angr/simos/javavm.py +471 -0
  1177. angr/simos/linux.py +519 -0
  1178. angr/simos/simos.py +450 -0
  1179. angr/simos/snimmuc_nxp.py +152 -0
  1180. angr/simos/userland.py +163 -0
  1181. angr/simos/windows.py +562 -0
  1182. angr/slicer.py +353 -0
  1183. angr/state_hierarchy.py +262 -0
  1184. angr/state_plugins/__init__.py +29 -0
  1185. angr/state_plugins/callstack.py +404 -0
  1186. angr/state_plugins/cgc.py +153 -0
  1187. angr/state_plugins/concrete.py +297 -0
  1188. angr/state_plugins/debug_variables.py +194 -0
  1189. angr/state_plugins/filesystem.py +469 -0
  1190. angr/state_plugins/gdb.py +146 -0
  1191. angr/state_plugins/globals.py +62 -0
  1192. angr/state_plugins/heap/__init__.py +5 -0
  1193. angr/state_plugins/heap/heap_base.py +126 -0
  1194. angr/state_plugins/heap/heap_brk.py +134 -0
  1195. angr/state_plugins/heap/heap_freelist.py +210 -0
  1196. angr/state_plugins/heap/heap_libc.py +45 -0
  1197. angr/state_plugins/heap/heap_ptmalloc.py +646 -0
  1198. angr/state_plugins/heap/utils.py +21 -0
  1199. angr/state_plugins/history.py +548 -0
  1200. angr/state_plugins/inspect.py +376 -0
  1201. angr/state_plugins/javavm_classloader.py +133 -0
  1202. angr/state_plugins/jni_references.py +93 -0
  1203. angr/state_plugins/libc.py +1263 -0
  1204. angr/state_plugins/light_registers.py +170 -0
  1205. angr/state_plugins/log.py +85 -0
  1206. angr/state_plugins/loop_data.py +92 -0
  1207. angr/state_plugins/plugin.py +155 -0
  1208. angr/state_plugins/posix.py +709 -0
  1209. angr/state_plugins/preconstrainer.py +195 -0
  1210. angr/state_plugins/scratch.py +175 -0
  1211. angr/state_plugins/sim_action.py +334 -0
  1212. angr/state_plugins/sim_action_object.py +148 -0
  1213. angr/state_plugins/sim_event.py +58 -0
  1214. angr/state_plugins/solver.py +1129 -0
  1215. angr/state_plugins/symbolizer.py +292 -0
  1216. angr/state_plugins/trace_additions.py +752 -0
  1217. angr/state_plugins/uc_manager.py +85 -0
  1218. angr/state_plugins/unicorn_engine.py +1899 -0
  1219. angr/state_plugins/view.py +341 -0
  1220. angr/storage/__init__.py +9 -0
  1221. angr/storage/file.py +1219 -0
  1222. angr/storage/memory_mixins/__init__.py +393 -0
  1223. angr/storage/memory_mixins/__init__.pyi +49 -0
  1224. angr/storage/memory_mixins/actions_mixin.py +69 -0
  1225. angr/storage/memory_mixins/address_concretization_mixin.py +388 -0
  1226. angr/storage/memory_mixins/bvv_conversion_mixin.py +74 -0
  1227. angr/storage/memory_mixins/clouseau_mixin.py +131 -0
  1228. angr/storage/memory_mixins/conditional_store_mixin.py +24 -0
  1229. angr/storage/memory_mixins/convenient_mappings_mixin.py +257 -0
  1230. angr/storage/memory_mixins/default_filler_mixin.py +146 -0
  1231. angr/storage/memory_mixins/dirty_addrs_mixin.py +9 -0
  1232. angr/storage/memory_mixins/hex_dumper_mixin.py +85 -0
  1233. angr/storage/memory_mixins/javavm_memory/__init__.py +1 -0
  1234. angr/storage/memory_mixins/javavm_memory/javavm_memory_mixin.py +394 -0
  1235. angr/storage/memory_mixins/keyvalue_memory/__init__.py +1 -0
  1236. angr/storage/memory_mixins/keyvalue_memory/keyvalue_memory_mixin.py +36 -0
  1237. angr/storage/memory_mixins/label_merger_mixin.py +31 -0
  1238. angr/storage/memory_mixins/multi_value_merger_mixin.py +68 -0
  1239. angr/storage/memory_mixins/name_resolution_mixin.py +70 -0
  1240. angr/storage/memory_mixins/paged_memory/__init__.py +0 -0
  1241. angr/storage/memory_mixins/paged_memory/page_backer_mixins.py +266 -0
  1242. angr/storage/memory_mixins/paged_memory/paged_memory_mixin.py +750 -0
  1243. angr/storage/memory_mixins/paged_memory/paged_memory_multivalue_mixin.py +63 -0
  1244. angr/storage/memory_mixins/paged_memory/pages/__init__.py +33 -0
  1245. angr/storage/memory_mixins/paged_memory/pages/cooperation.py +330 -0
  1246. angr/storage/memory_mixins/paged_memory/pages/history_tracking_mixin.py +87 -0
  1247. angr/storage/memory_mixins/paged_memory/pages/ispo_mixin.py +53 -0
  1248. angr/storage/memory_mixins/paged_memory/pages/list_page.py +346 -0
  1249. angr/storage/memory_mixins/paged_memory/pages/multi_values.py +290 -0
  1250. angr/storage/memory_mixins/paged_memory/pages/mv_list_page.py +434 -0
  1251. angr/storage/memory_mixins/paged_memory/pages/permissions_mixin.py +33 -0
  1252. angr/storage/memory_mixins/paged_memory/pages/refcount_mixin.py +51 -0
  1253. angr/storage/memory_mixins/paged_memory/pages/ultra_page.py +468 -0
  1254. angr/storage/memory_mixins/paged_memory/privileged_mixin.py +36 -0
  1255. angr/storage/memory_mixins/paged_memory/stack_allocation_mixin.py +73 -0
  1256. angr/storage/memory_mixins/regioned_memory/__init__.py +6 -0
  1257. angr/storage/memory_mixins/regioned_memory/abstract_address_descriptor.py +35 -0
  1258. angr/storage/memory_mixins/regioned_memory/abstract_merger_mixin.py +43 -0
  1259. angr/storage/memory_mixins/regioned_memory/region_category_mixin.py +7 -0
  1260. angr/storage/memory_mixins/regioned_memory/region_data.py +245 -0
  1261. angr/storage/memory_mixins/regioned_memory/region_meta_mixin.py +125 -0
  1262. angr/storage/memory_mixins/regioned_memory/regioned_address_concretization_mixin.py +118 -0
  1263. angr/storage/memory_mixins/regioned_memory/regioned_memory_mixin.py +462 -0
  1264. angr/storage/memory_mixins/regioned_memory/static_find_mixin.py +70 -0
  1265. angr/storage/memory_mixins/simple_interface_mixin.py +73 -0
  1266. angr/storage/memory_mixins/simplification_mixin.py +13 -0
  1267. angr/storage/memory_mixins/size_resolution_mixin.py +140 -0
  1268. angr/storage/memory_mixins/slotted_memory.py +140 -0
  1269. angr/storage/memory_mixins/smart_find_mixin.py +159 -0
  1270. angr/storage/memory_mixins/symbolic_merger_mixin.py +12 -0
  1271. angr/storage/memory_mixins/top_merger_mixin.py +24 -0
  1272. angr/storage/memory_mixins/underconstrained_mixin.py +67 -0
  1273. angr/storage/memory_mixins/unwrapper_mixin.py +26 -0
  1274. angr/storage/memory_object.py +194 -0
  1275. angr/storage/pcap.py +65 -0
  1276. angr/tablespecs.py +90 -0
  1277. angr/utils/__init__.py +33 -0
  1278. angr/utils/algo.py +33 -0
  1279. angr/utils/constants.py +7 -0
  1280. angr/utils/cowdict.py +64 -0
  1281. angr/utils/dynamic_dictlist.py +92 -0
  1282. angr/utils/enums_conv.py +80 -0
  1283. angr/utils/env.py +11 -0
  1284. angr/utils/formatting.py +124 -0
  1285. angr/utils/funcid.py +133 -0
  1286. angr/utils/graph.py +822 -0
  1287. angr/utils/lazy_import.py +12 -0
  1288. angr/utils/library.py +214 -0
  1289. angr/utils/loader.py +55 -0
  1290. angr/utils/mp.py +64 -0
  1291. angr/utils/segment_list.py +558 -0
  1292. angr/utils/timing.py +45 -0
  1293. angr/utils/typing.py +17 -0
  1294. angr/vaults.py +370 -0
  1295. angr-9.2.103.dist-info/LICENSE +24 -0
  1296. angr-9.2.103.dist-info/METADATA +119 -0
  1297. angr-9.2.103.dist-info/RECORD +1300 -0
  1298. angr-9.2.103.dist-info/WHEEL +5 -0
  1299. angr-9.2.103.dist-info/entry_points.txt +2 -0
  1300. angr-9.2.103.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1302 @@
1
+ import logging
2
+ from collections import defaultdict
3
+ from typing import Union, Any
4
+ from collections.abc import Sequence
5
+
6
+ import pyvex
7
+ import archinfo
8
+ from angr.knowledge_plugins import Function
9
+
10
+ from . import Analysis
11
+
12
+ from ..errors import AngrTypeError
13
+ from ..utils.library import get_cpp_function_name
14
+ from ..utils.formatting import ansi_color_enabled, ansi_color, add_edge_to_buffer
15
+ from ..block import DisassemblerInsn, CapstoneInsn, SootBlockNode
16
+ from ..codenode import BlockNode
17
+ from .disassembly_utils import decode_instruction
18
+
19
+ try:
20
+ from ..engines import pcode
21
+ import pypcode
22
+
23
+ IRSBType = Union[pyvex.IRSB, pcode.lifter.IRSB]
24
+ IROpObjType = Union[pyvex.stmt.IRStmt, pypcode.PcodeOp]
25
+ except ImportError:
26
+ pcode = None
27
+ IRSBType = pyvex.IRSB
28
+ IROpObjType = pyvex.stmt
29
+
30
+ l = logging.getLogger(name=__name__)
31
+
32
+ # pylint: disable=unidiomatic-typecheck
33
+
34
+
35
+ class DisassemblyPiece:
36
+ addr = None
37
+ ident = float("nan")
38
+
39
+ def render(self, formatting=None):
40
+ x = self._render(formatting)
41
+ if len(x) == 1:
42
+ return [self.highlight(x[0], formatting)]
43
+ else:
44
+ return x
45
+
46
+ def _render(self, formatting):
47
+ raise NotImplementedError
48
+
49
+ def getpiece(self, formatting, column): # pylint:disable=unused-argument
50
+ return self
51
+
52
+ def width(self, formatting):
53
+ r = self._render(formatting)
54
+ if not r:
55
+ return 0
56
+ return max(len(x) for x in r)
57
+
58
+ def height(self, formatting):
59
+ return len(self._render(formatting))
60
+
61
+ @staticmethod
62
+ def color(string, coloring, formatting):
63
+ try:
64
+ return "{}{}{}".format(formatting["colors"][coloring][0], string, formatting["colors"][coloring][1])
65
+ except KeyError:
66
+ return string
67
+
68
+ def highlight(self, string, formatting=None):
69
+ try:
70
+ if formatting is not None:
71
+ if "format_callback" in formatting:
72
+ return formatting["format_callback"](self, string)
73
+ if self in formatting["highlight"]:
74
+ return self.color(string, "highlight", formatting)
75
+ except KeyError:
76
+ pass
77
+ return string
78
+
79
+ def __eq__(self, other):
80
+ return False
81
+
82
+
83
+ class FunctionStart(DisassemblyPiece):
84
+ def __init__(self, func):
85
+ """
86
+ Constructor.
87
+
88
+ :param angr.knowledge.Function func: The function instance.
89
+ """
90
+
91
+ self.addr = func.addr
92
+ self.vars = []
93
+ self.name = func.name
94
+ self.is_simprocedure = func.is_simprocedure
95
+ self.sim_procedure = None
96
+ if func.is_syscall:
97
+ self.sim_procedure = func._project.simos.syscall_from_addr(self.addr)
98
+ elif func.is_simprocedure:
99
+ self.sim_procedure = func._project.hooked_by(self.addr)
100
+
101
+ def _render(self, formatting):
102
+ # TODO: Make the individual elements be individual Pieces
103
+ return [f"{name} = {offset:#x}" for offset, name in self.vars]
104
+
105
+ def height(self, formatting):
106
+ return len(self.vars)
107
+
108
+
109
+ class Label(DisassemblyPiece):
110
+ def __init__(self, addr, name):
111
+ self.addr = addr
112
+ self.name = name
113
+
114
+ def _render(self, formatting): # pylint:disable=unused-argument
115
+ return [self.name + ":"]
116
+
117
+
118
+ class IROp(DisassemblyPiece):
119
+ __slots__ = (
120
+ "addr",
121
+ "seq",
122
+ "obj",
123
+ "irsb",
124
+ )
125
+
126
+ addr: int
127
+ seq: int
128
+ obj: IROpObjType
129
+ irsb: IRSBType
130
+
131
+ def __init__(self, addr: int, seq: int, obj: IROpObjType, irsb: IRSBType):
132
+ self.addr = addr
133
+ self.seq = seq
134
+ self.obj = obj
135
+ self.irsb = irsb
136
+
137
+ def __str__(self):
138
+ if pcode and isinstance(self.obj, pypcode.PcodeOp):
139
+ return pypcode.PcodePrettyPrinter.fmt_op(self.obj)
140
+ return str(self.obj)
141
+
142
+ def _render(self, formatting): # pylint:disable=unused-argument
143
+ return [str(self)]
144
+
145
+
146
+ class BlockStart(DisassemblyPiece):
147
+ def __init__(self, block, parentfunc, project):
148
+ self.addr = block.addr
149
+ self.size = block.size
150
+ self.parentfunc = parentfunc
151
+ self.project = project
152
+
153
+ def _render(self, formatting):
154
+ return []
155
+
156
+
157
+ class Hook(DisassemblyPiece):
158
+ def __init__(self, block):
159
+ self.addr = block.addr
160
+ simproc_name = str(block.sim_procedure)
161
+ self.name = simproc_name.split()[-1].strip("'<>")
162
+ self.short_name = simproc_name.strip("'<>").split(".")[-1]
163
+
164
+ def _render(self, formatting):
165
+ return ["SimProcedure " + self.short_name]
166
+
167
+ def __eq__(self, other):
168
+ return type(other) is Hook and self.name == other.name
169
+
170
+
171
+ class Instruction(DisassemblyPiece):
172
+ def __init__(self, insn, parentblock, project=None):
173
+ self.addr = insn.address
174
+ self.size = insn.size
175
+ self.insn = insn
176
+ self.parentblock = parentblock
177
+ self.project = parentblock.project if parentblock is not None else project
178
+ self.arch = self.project.arch
179
+ self.format = ""
180
+ self.components = ()
181
+ self.opcode = None
182
+ self.operands = []
183
+
184
+ # the following members will be filled in after dissecting the instruction
185
+ self.type = None
186
+ self.branch_type = None
187
+ self.branch_target_operand = None
188
+
189
+ self.dissect_instruction()
190
+
191
+ if isinstance(insn, CapstoneInsn):
192
+ decode_instruction(self.arch, self)
193
+
194
+ @property
195
+ def mnemonic(self):
196
+ return self.opcode
197
+
198
+ def reload_format(self):
199
+ self.insn = CapstoneInsn(next(self.arch.capstone.disasm(self.insn.bytes, self.addr)))
200
+ self.dissect_instruction()
201
+
202
+ def dissect_instruction(self):
203
+ if isinstance(
204
+ self.arch,
205
+ (archinfo.ArchAArch64, archinfo.ArchARM, archinfo.ArchARMEL, archinfo.ArchARMHF, archinfo.ArchARMCortexM),
206
+ ):
207
+ self.dissect_instruction_for_arm()
208
+ else:
209
+ # the default one works well for x86, add more arch-specific
210
+ # code when you find it doesn't meet your need.
211
+ self.dissect_instruction_by_default()
212
+
213
+ def dissect_instruction_for_arm(self):
214
+ self.opcode = Opcode(self)
215
+ self.operands = []
216
+
217
+ # We use capstone for arm64 disassembly, so this assertion must success
218
+ assert hasattr(self.insn, "operands")
219
+
220
+ op_str = self.insn.op_str
221
+ dummy_operands = self.split_arm_op_string(op_str)
222
+
223
+ for operand in dummy_operands:
224
+ opr_pieces = self.split_op_string(operand)
225
+ cur_operand = []
226
+
227
+ if not (operand and opr_pieces):
228
+ # opr_pieces may contain empty string when invalid disasm
229
+ # result is generated by capstone
230
+ l.error(f'Failed to parse insn "{self.insn}". Please report.')
231
+ self.operands.clear()
232
+ break
233
+
234
+ if opr_pieces[0][0].isalpha() and opr_pieces[0] in self.arch.registers:
235
+ cur_operand.append(Register(opr_pieces[0]))
236
+ # handle register's suffix (e.g. "sp!", "d0[1]", "v0.16b")
237
+ cur_operand.extend(opr_pieces[1:])
238
+ self.operands.append(cur_operand)
239
+ continue
240
+
241
+ for i, p in enumerate(opr_pieces):
242
+ if p[0].isnumeric():
243
+ if any(
244
+ (
245
+ i > 0 and opr_pieces[i - 1] == ".",
246
+ i > 1
247
+ and (
248
+ opr_pieces[i - 2] in ["lsl", "lsr", "asr", "ror", "msl"]
249
+ or opr_pieces[i - 2][:3] in ("uxt", "sxt")
250
+ ),
251
+ )
252
+ ):
253
+ cur_operand.append(p)
254
+ continue
255
+ # Always set False. I don't see any '+' sign appear
256
+ # in capstone's arm disasm result
257
+ with_sign = False
258
+ try:
259
+ v = int(p, 0)
260
+ except ValueError:
261
+ l.error("Failed to parse operand %s at %016x. Please report.", p, self.addr)
262
+ cur_operand.append(p)
263
+ continue
264
+ if i > 0 and opr_pieces[i - 1] == "-":
265
+ v = -v
266
+ cur_operand.pop()
267
+ cur_operand.append(Value(v, with_sign))
268
+ elif p[0].isalpha() and p in self.arch.registers:
269
+ cur_operand.append(Register(p))
270
+ else:
271
+ cur_operand.append(p)
272
+ self.operands.append(cur_operand)
273
+
274
+ for i, opr in enumerate(self.operands):
275
+ if i < len(self.insn.operands):
276
+ op_type = self.insn.operands[i].type
277
+ else:
278
+ # set extra dummy operand type to default 0
279
+ op_type = 0
280
+ self.operands[i] = Operand.build(op_type, i, opr, self)
281
+
282
+ if len(self.operands) == 0 and len(self.insn.operands) != 0:
283
+ l.error("Operand parsing failed for instruction %s at address %x", str(self.insn), self.insn.address)
284
+ return
285
+
286
+ @staticmethod
287
+ def split_arm_op_string(op_str: str):
288
+ # Split arm operand string with commas outside the square brackets
289
+ pieces = []
290
+ in_square_brackets = False
291
+ cur_opr = ""
292
+ for c in op_str:
293
+ if c == "[":
294
+ in_square_brackets = True
295
+ if c == "]":
296
+ in_square_brackets = False
297
+ if c == "," and not in_square_brackets:
298
+ pieces.append(cur_opr)
299
+ cur_opr = ""
300
+ continue
301
+ if c == " ":
302
+ continue
303
+ cur_opr += c
304
+ if cur_opr:
305
+ pieces.append(cur_opr)
306
+ return pieces
307
+
308
+ def dissect_instruction_by_default(self):
309
+ # perform a "smart split" of an operands string into smaller pieces
310
+ insn_pieces = self.split_op_string(self.insn.op_str)
311
+ self.operands = []
312
+ cur_operand = None
313
+ i = len(insn_pieces) - 1
314
+ cs_op_num = -1
315
+ nested_mem = False
316
+
317
+ # iterate over operands in reverse order
318
+ while i >= 0:
319
+ c = insn_pieces[i]
320
+ if c == "":
321
+ i -= 1
322
+ continue
323
+
324
+ if cur_operand is None:
325
+ cur_operand = []
326
+ self.operands.append(cur_operand)
327
+
328
+ # Check if this is a number or an identifier.
329
+ ordc = ord(c[0])
330
+ # pylint:disable=too-many-boolean-expressions
331
+ if 0x30 <= ordc <= 0x39 or 0x41 <= ordc <= 0x5A or 0x61 <= ordc <= 0x7A:
332
+ # perform some basic classification
333
+ intc = None
334
+ reg = False
335
+ try:
336
+ intc = int(c, 0)
337
+ except ValueError:
338
+ reg = c in self.arch.registers
339
+
340
+ # if this is a "live" piece, liven it up!
341
+ # special considerations:
342
+ # - registers should consolidate with a $ or % prefix
343
+ # - integers should consolidate with a sign prefix
344
+
345
+ if reg:
346
+ prefix = ""
347
+ if i > 0 and insn_pieces[i - 1] in ("$", "%"):
348
+ prefix = insn_pieces[i - 1]
349
+ insn_pieces[i - 1] = ""
350
+ cur_operand.append(Register(c, prefix))
351
+ elif intc is not None:
352
+ with_sign = False
353
+ if i > 0 and insn_pieces[i - 1] in ("+", "-"):
354
+ with_sign = True
355
+ if insn_pieces[i - 1] == "-":
356
+ intc = -intc # pylint: disable=invalid-unary-operand-type
357
+ insn_pieces[i - 1] = ""
358
+ cur_operand.append(Value(intc, with_sign))
359
+ else:
360
+ cur_operand.append(c)
361
+
362
+ elif c == "," and not nested_mem:
363
+ cs_op_num -= 1
364
+ cur_operand = None
365
+
366
+ elif c == ":": # XXX this is a hack! fix this later
367
+ insn_pieces[i - 1] += ":"
368
+
369
+ else:
370
+ # Check if we are inside braces or parentheses. Do not forget
371
+ # that we are iterating in reverse order!
372
+ if c == "]" or c == ")":
373
+ nested_mem = True
374
+
375
+ elif c == "[" or c == "(":
376
+ nested_mem = False
377
+
378
+ if cur_operand is None:
379
+ cur_operand = [c]
380
+ self.operands.append(cur_operand)
381
+ else:
382
+ cur_operand.append(c if c[0] != "," else c + " ")
383
+
384
+ i -= 1
385
+
386
+ self.opcode = Opcode(self)
387
+ self.operands.reverse()
388
+
389
+ if not hasattr(self.insn, "operands"):
390
+ # Not all disassemblers provide operands. Just use our smart split
391
+ for i, o in enumerate(self.operands):
392
+ o.reverse()
393
+ self.operands[i] = Operand.build(1, i, o, self)
394
+ return
395
+
396
+ if len(self.operands) != len(self.insn.operands):
397
+ l.error(
398
+ "Operand parsing failed for instruction %s. %d operands are parsed, while %d are expected.",
399
+ str(self.insn),
400
+ len(self.operands),
401
+ len(self.insn.operands),
402
+ )
403
+ self.operands = []
404
+ return
405
+
406
+ for i, o in enumerate(self.operands):
407
+ o.reverse()
408
+ self.operands[i] = Operand.build(self.insn.operands[i].type, i, o, self)
409
+
410
+ @staticmethod
411
+ def split_op_string(insn_str):
412
+ pieces = []
413
+ in_word = False
414
+ for c in insn_str:
415
+ if c.isspace():
416
+ in_word = False
417
+ continue
418
+ if c.isalnum():
419
+ if in_word:
420
+ pieces[-1] += c
421
+ else:
422
+ in_word = True
423
+ pieces.append(c)
424
+ else:
425
+ in_word = False
426
+ pieces.append(c)
427
+ return pieces
428
+
429
+ def _render(self, formatting=None):
430
+ return [
431
+ "{} {}".format(self.opcode.render(formatting)[0], ", ".join(o.render(formatting)[0] for o in self.operands))
432
+ ]
433
+
434
+
435
+ class SootExpression(DisassemblyPiece):
436
+ def __init__(self, expr):
437
+ self.expr = expr
438
+
439
+ def _render(self, formatting=None):
440
+ return [self.expr]
441
+
442
+
443
+ class SootExpressionTarget(SootExpression):
444
+ def __init__(self, target_stmt_idx):
445
+ super().__init__(target_stmt_idx)
446
+ self.target_stmt_idx = target_stmt_idx
447
+
448
+ def _render(self, formatting=None):
449
+ return ["Goto %d" % self.target_stmt_idx]
450
+
451
+
452
+ class SootExpressionStaticFieldRef(SootExpression):
453
+ def __init__(self, field):
454
+ field_str = ".".join(field)
455
+ super().__init__(field_str)
456
+ self.field = field
457
+ self.field_str = field_str
458
+
459
+ def _render(self, formatting=None):
460
+ return [self.field_str]
461
+
462
+
463
+ class SootExpressionInvoke(SootExpression):
464
+ Virtual = "virtual"
465
+ Static = "static"
466
+ Special = "special"
467
+
468
+ def __init__(self, invoke_type, expr):
469
+ super().__init__(str(expr))
470
+
471
+ self.invoke_type = invoke_type
472
+ self.base = str(expr.base) if self.invoke_type in (self.Virtual, self.Special) else ""
473
+ self.method_name = expr.method_name
474
+ self.arg_str = expr.list_to_arg_str(expr.args)
475
+
476
+ def _render(self, formatting=None):
477
+ return [
478
+ "{}{}({}) [{}]".format(
479
+ self.base + "." if self.base else "", self.method_name, self.arg_str, self.invoke_type
480
+ )
481
+ ]
482
+
483
+
484
+ class SootStatement(DisassemblyPiece):
485
+ def __init__(self, block_addr, raw_stmt):
486
+ self.addr = block_addr.copy()
487
+ self.addr.stmt_idx = raw_stmt.label
488
+ self.raw_stmt = raw_stmt
489
+
490
+ self.components = []
491
+
492
+ self._parse()
493
+
494
+ @property
495
+ def stmt_idx(self):
496
+ return self.addr.stmt_idx
497
+
498
+ def _parse(self):
499
+ func = "_parse_%s" % self.raw_stmt.__class__.__name__
500
+
501
+ if hasattr(self, func):
502
+ getattr(self, func)()
503
+ else:
504
+ # print func
505
+ self.components += ["NotImplemented: %s" % func]
506
+
507
+ def _expr(self, expr):
508
+ func = "_handle_%s" % expr.__class__.__name__
509
+
510
+ if hasattr(self, func):
511
+ return getattr(self, func)(expr)
512
+ else:
513
+ # print func
514
+ return SootExpression(str(expr))
515
+
516
+ def _render(self, formatting=None):
517
+ return [
518
+ " ".join(
519
+ [
520
+ component if type(component) is str else component.render(formatting=formatting)[0]
521
+ for component in self.components
522
+ ]
523
+ )
524
+ ]
525
+
526
+ #
527
+ # Statement parsers
528
+ #
529
+
530
+ def _parse_AssignStmt(self):
531
+ self.components += [
532
+ SootExpression(str(self.raw_stmt.left_op)),
533
+ "=",
534
+ self._expr(self.raw_stmt.right_op),
535
+ ]
536
+
537
+ def _parse_InvokeStmt(self):
538
+ self.components += [
539
+ self._expr(self.raw_stmt.invoke_expr),
540
+ ]
541
+
542
+ def _parse_GotoStmt(self):
543
+ self.components += [
544
+ SootExpressionTarget(self.raw_stmt.target),
545
+ ]
546
+
547
+ def _parse_IfStmt(self):
548
+ self.components += [
549
+ "if (",
550
+ SootExpression(str(self.raw_stmt.condition)),
551
+ ")",
552
+ SootExpressionTarget(self.raw_stmt.target),
553
+ ]
554
+
555
+ def _parse_ReturnVoidStmt(self):
556
+ self.components += [
557
+ "return",
558
+ ]
559
+
560
+ def _parse_IdentityStmt(self):
561
+ self.components += [
562
+ SootExpression(str(self.raw_stmt.left_op)),
563
+ "<-",
564
+ SootExpression(str(self.raw_stmt.right_op)),
565
+ ]
566
+
567
+ #
568
+ # Expression handlers
569
+ #
570
+
571
+ def _handle_SootStaticFieldRef(self, expr):
572
+ return SootExpressionStaticFieldRef(expr.field[::-1])
573
+
574
+ def _handle_SootVirtualInvokeExpr(self, expr):
575
+ return SootExpressionInvoke(SootExpressionInvoke.Virtual, expr)
576
+
577
+ def _handle_SootStaticInvokeExpr(self, expr):
578
+ return SootExpressionInvoke(SootExpressionInvoke.Static, expr)
579
+
580
+ def _handle_SootSpecialInvokeExpr(self, expr):
581
+ return SootExpressionInvoke(SootExpressionInvoke.Special, expr)
582
+
583
+
584
+ class Opcode(DisassemblyPiece):
585
+ def __init__(self, parentinsn):
586
+ self.addr = parentinsn.addr
587
+ self.insn = parentinsn.insn
588
+ self.parentinsn = parentinsn
589
+ self.opcode_string = self.insn.mnemonic
590
+ self.ident = (self.addr, "opcode")
591
+
592
+ def _render(self, formatting=None):
593
+ return [self.opcode_string.ljust(7)]
594
+
595
+ def __eq__(self, other):
596
+ return type(other) is Opcode and self.opcode_string == other.opcode_string
597
+
598
+
599
+ class Operand(DisassemblyPiece):
600
+ def __init__(self, op_num, children, parentinsn):
601
+ self.addr = parentinsn.addr
602
+ self.children = children
603
+ self.parentinsn = parentinsn
604
+ self.op_num = op_num
605
+ self.ident = (self.addr, "operand", self.op_num)
606
+
607
+ for i, c in enumerate(self.children):
608
+ if type(c) not in (bytes, str):
609
+ c.ident = (self.addr, "operand piece", self.op_num, i)
610
+ c.parentop = self
611
+
612
+ @property
613
+ def cs_operand(self):
614
+ return self.parentinsn.insn.operands[self.op_num]
615
+
616
+ def _render(self, formatting):
617
+ return [
618
+ "".join(
619
+ x if type(x) is str else x.decode() if type(x) is bytes else x.render(formatting)[0]
620
+ for x in self.children
621
+ )
622
+ ]
623
+
624
+ @staticmethod
625
+ def build(operand_type, op_num, children, parentinsn):
626
+ # Maps capstone operand types to operand classes
627
+ MAPPING = {
628
+ 0: Operand, # default type for operand that haven't been fully implemented
629
+ 1: RegisterOperand,
630
+ 2: ConstantOperand,
631
+ 3: MemoryOperand,
632
+ 4: Operand, # ARM FP
633
+ 64: Operand, # ARM CIMM
634
+ 65: Operand, # ARM PIMM | ARM64 REG_MRS
635
+ 66: Operand, # ARM SETEND | ARM64 REG_MSR
636
+ 67: Operand, # ARM SYSREG | ARM64 PSTATE
637
+ 68: Operand, # ARM64 SYS
638
+ 69: Operand, # ARM64 PREFETCH
639
+ 70: Operand, # ARM64 BARRIER
640
+ }
641
+
642
+ cls = MAPPING.get(operand_type, None)
643
+ if cls is None:
644
+ raise ValueError("Unknown capstone operand type %s." % operand_type)
645
+
646
+ operand = cls(op_num, children, parentinsn)
647
+
648
+ # Post-processing
649
+ if cls is MemoryOperand and parentinsn.arch.name in {"AMD64"} and len(operand.values) == 2:
650
+ op0, op1 = operand.values
651
+ if type(op0) is Register and op0.is_ip and type(op1) is Value:
652
+ # Indirect addressing in x86_64
653
+ # 400520 push [rip+0x200782] ==> 400520 push [0x600ca8]
654
+ absolute_addr = parentinsn.addr + parentinsn.size + op1.val
655
+ return MemoryOperand(1, operand.prefix + ["[", Value(absolute_addr, False), "]"], parentinsn)
656
+
657
+ return operand
658
+
659
+
660
+ class ConstantOperand(Operand):
661
+ pass
662
+
663
+
664
+ class RegisterOperand(Operand):
665
+ @property
666
+ def register(self):
667
+ return next((child for child in self.children if isinstance(child, Register)), None)
668
+
669
+ def _render(self, formatting):
670
+ custom_value_str = None
671
+ if formatting is not None:
672
+ try:
673
+ custom_value_str = formatting["custom_values_str"][self.ident]
674
+ except KeyError:
675
+ pass
676
+
677
+ if custom_value_str:
678
+ return [custom_value_str]
679
+ else:
680
+ return super()._render(formatting)
681
+
682
+
683
+ class MemoryOperand(Operand):
684
+ def __init__(self, op_num, children, parentinsn):
685
+ super().__init__(op_num, children, parentinsn)
686
+
687
+ # a typical "children" looks like the following:
688
+ # [ 'dword', 'ptr', '[', Register, Value, ']' ]
689
+ # or
690
+ # [ '[', Register, ']' ]
691
+ # or
692
+ # [ Value, '(', Regsiter, ')' ]
693
+
694
+ # it will be converted into more meaningful and Pythonic properties
695
+
696
+ self.segment_selector = None
697
+ self.prefix = []
698
+ self.suffix_str = "" # could be arm pre index mark "!"
699
+ self.values = []
700
+ self.offset = []
701
+ # offset_location
702
+ # - prefix: -0xff00($gp)
703
+ # - before_value: 0xff00+rax
704
+ # - after_value: rax+0xff00
705
+ self.offset_location = "after_value"
706
+ # values_style
707
+ # - square: [rax+0x10]
708
+ # - curly: {rax+0x10}
709
+ # - paren: (rax+0x10)
710
+ self.values_style = "square"
711
+
712
+ try:
713
+ if "[" in self.children:
714
+ self._parse_memop_squarebracket()
715
+ elif "(" in self.children:
716
+ self._parse_memop_paren()
717
+ else:
718
+ raise ValueError()
719
+
720
+ except ValueError:
721
+ l.error("Failed to parse operand children %s. Please report to Fish.", self.children)
722
+
723
+ # setup all dummy properties
724
+ self.prefix = None
725
+ self.values = None
726
+
727
+ def _parse_memop_squarebracket(self):
728
+ if self.children[0] != "[":
729
+ try:
730
+ square_bracket_pos = self.children.index("[")
731
+ except ValueError: # pylint: disable=try-except-raise
732
+ raise
733
+
734
+ self.prefix = self.children[:square_bracket_pos]
735
+
736
+ # take out segment selector
737
+ if len(self.prefix) == 3:
738
+ self.segment_selector = self.prefix[-1]
739
+ self.prefix = self.prefix[:-1]
740
+ else:
741
+ self.segment_selector = None
742
+
743
+ else:
744
+ # empty
745
+ square_bracket_pos = 0
746
+ self.prefix = []
747
+ self.segment_selector = None
748
+
749
+ close_square_pos = len(self.children) - 1
750
+ if self.children[-1] != "]":
751
+ if self.children[-1] == "!" and self.children[-2] == "]":
752
+ # arm64 pre index
753
+ self.suffix_str = "!"
754
+ close_square_pos -= 1
755
+ else:
756
+ raise ValueError()
757
+
758
+ self.values = self.children[square_bracket_pos + 1 : close_square_pos]
759
+
760
+ def _parse_memop_paren(self):
761
+ offset = []
762
+ self.values_style = "paren"
763
+
764
+ if self.children[0] != "(":
765
+ try:
766
+ paren_pos = self.children.index("(")
767
+ except ValueError: # pylint: disable=try-except-raise
768
+ raise
769
+
770
+ if all(isinstance(item, str) for item in self.children[:paren_pos]):
771
+ # parse prefix
772
+ self.prefix = self.children[:paren_pos]
773
+ elif all(isinstance(item, Value) for item in self.children[:paren_pos]):
774
+ # parse offset
775
+ # force each piece to be rendered with its sign (+/-)
776
+ offset += self.children[:paren_pos]
777
+ # offset appears before the left parenthesis
778
+ self.offset_location = "prefix"
779
+
780
+ else:
781
+ paren_pos = 0
782
+ self.prefix = []
783
+ self.segment_selector = None
784
+
785
+ self.values = self.children[paren_pos + 1 : len(self.children) - 1]
786
+ self.offset = offset
787
+
788
+ def _render(self, formatting):
789
+ if self.prefix is None:
790
+ # we failed in parsing. use the default rendering
791
+ return super()._render(formatting)
792
+ else:
793
+ values_style = self.values_style
794
+ show_prefix = True
795
+ custom_values_str = None
796
+
797
+ if formatting is not None:
798
+ try:
799
+ values_style = formatting["values_style"][self.ident]
800
+ except KeyError:
801
+ pass
802
+
803
+ try:
804
+ show_prefix_str = formatting["show_prefix"][self.ident]
805
+ if show_prefix_str in ("false", "False"):
806
+ show_prefix = False
807
+ except KeyError:
808
+ pass
809
+
810
+ try:
811
+ custom_values_str = formatting["custom_values_str"][self.ident]
812
+ except KeyError:
813
+ pass
814
+
815
+ prefix_str = " ".join(self.prefix) + " " if show_prefix and self.prefix else ""
816
+ if custom_values_str is not None:
817
+ value_str = custom_values_str
818
+ else:
819
+ value_str = "".join(
820
+ x.render(formatting)[0] if not isinstance(x, (bytes, str)) else x for x in self.values
821
+ )
822
+
823
+ if values_style == "curly":
824
+ left_paren, right_paren = "{", "}"
825
+ elif values_style == "paren":
826
+ left_paren, right_paren = "(", ")"
827
+ else: # square
828
+ left_paren, right_paren = "[", "]"
829
+
830
+ if self.offset:
831
+ offset_str = "".join(
832
+ x.render(formatting)[0] if not isinstance(x, (bytes, str)) else x for x in self.offset
833
+ )
834
+
835
+ # combine values and offsets according to self.offset_location
836
+ if self.offset_location == "prefix":
837
+ value_str = "".join([offset_str, left_paren, value_str, right_paren])
838
+ elif self.offset_location == "before_value":
839
+ value_str = "".join([left_paren, offset_str, value_str, right_paren])
840
+ else: # after_value
841
+ value_str = "".join([left_paren, value_str, offset_str, right_paren])
842
+ else:
843
+ value_str = left_paren + value_str + right_paren
844
+
845
+ segment_selector_str = "" if self.segment_selector is None else self.segment_selector
846
+
847
+ if segment_selector_str and prefix_str:
848
+ prefix_str += " "
849
+
850
+ return [f"{prefix_str}{segment_selector_str}{value_str}{self.suffix_str}"]
851
+
852
+
853
+ class OperandPiece(DisassemblyPiece): # pylint: disable=abstract-method
854
+ # These get filled in later...
855
+ addr = None
856
+ parentop = None
857
+ ident = None
858
+
859
+
860
+ class Register(OperandPiece):
861
+ def __init__(self, reg, prefix=""):
862
+ self.reg = reg
863
+ self.prefix = prefix
864
+ self.is_ip = self.reg in {"eip", "rip", "pc"} # TODO: Support more architectures
865
+
866
+ def _render(self, formatting):
867
+ # TODO: register renaming
868
+ return [self.prefix + self.reg]
869
+
870
+ def __eq__(self, other):
871
+ return type(other) is Register and self.reg == other.reg
872
+
873
+
874
+ class Value(OperandPiece):
875
+ def __init__(self, val, render_with_sign):
876
+ self.val = val
877
+ self.render_with_sign = render_with_sign
878
+
879
+ @property
880
+ def project(self):
881
+ return self.parentop.parentinsn.project
882
+
883
+ def __eq__(self, other):
884
+ return type(other) is Value and self.val == other.val
885
+
886
+ def _render(self, formatting):
887
+ if formatting is not None:
888
+ try:
889
+ style = formatting["int_styles"][self.ident]
890
+ if style[0] == "hex":
891
+ if self.render_with_sign:
892
+ return ["%#+x" % self.val]
893
+ else:
894
+ return ["%#x" % self.val]
895
+ elif style[0] == "dec":
896
+ if self.render_with_sign:
897
+ return ["%+d" % self.val]
898
+ else:
899
+ return [str(self.val)]
900
+ elif style[0] == "label":
901
+ labeloffset = style[1]
902
+ if labeloffset == 0:
903
+ lbl = self.project.kb.labels[self.val]
904
+ return [lbl]
905
+ return [
906
+ "{}{}{:#+x}".format(
907
+ "+" if self.render_with_sign else "",
908
+ self.project.kb.labels[self.val + labeloffset],
909
+ labeloffset,
910
+ )
911
+ ]
912
+ except KeyError:
913
+ pass
914
+
915
+ # default case
916
+ try:
917
+ func = self.project.kb.functions.get_by_addr(self.val)
918
+ except KeyError:
919
+ func = None
920
+
921
+ if self.val in self.project.kb.labels:
922
+ lbl = self.project.kb.labels[self.val]
923
+ if func is not None:
924
+ # see if lbl == func.name and func.demangled_name != func.name. if so, we prioritize the
925
+ # demangled name
926
+ if lbl == func.name and func.name != func.demangled_name:
927
+ normalized_name = get_cpp_function_name(func.demangled_name, specialized=False, qualified=True)
928
+ return [normalized_name]
929
+ return [("+" if self.render_with_sign else "") + lbl]
930
+ elif func is not None:
931
+ return [func.demangled_name]
932
+ else:
933
+ if self.render_with_sign:
934
+ return ["%#+x" % self.val]
935
+ else:
936
+ return ["%#x" % self.val]
937
+
938
+
939
+ class Comment(DisassemblyPiece):
940
+ def __init__(self, addr, text):
941
+ self.addr = addr
942
+ self.text = text.split("\n")
943
+
944
+ def _render(self, formatting=None):
945
+ return [self.text]
946
+
947
+ def height(self, formatting):
948
+ lines = len(self.text)
949
+ return 0 if lines == 1 else lines
950
+
951
+
952
+ class FuncComment(DisassemblyPiece):
953
+ def __init__(self, func):
954
+ self.func = func
955
+
956
+ def _render(self, formatting=None):
957
+ return ["##", "## Function " + self.func.name, "##"]
958
+
959
+
960
+ class Disassembly(Analysis):
961
+ """
962
+ Produce formatted machine code disassembly.
963
+ """
964
+
965
+ def __init__(
966
+ self,
967
+ function: Function | None = None,
968
+ ranges: Sequence[tuple[int, int]] | None = None,
969
+ thumb: bool = False,
970
+ include_ir: bool = False,
971
+ block_bytes: bytes | None = None,
972
+ ):
973
+ self.raw_result = []
974
+ self.raw_result_map = {
975
+ "block_starts": {},
976
+ "comments": {},
977
+ "labels": {},
978
+ "instructions": {},
979
+ "hooks": {},
980
+ "ir": defaultdict(list),
981
+ }
982
+ self.block_to_insn_addrs = defaultdict(list)
983
+ self._func_cache = {}
984
+ self._include_ir = include_ir
985
+ self._block_bytes = block_bytes
986
+ self._graph = None
987
+
988
+ if function is not None:
989
+ # sort them by address, put hooks before nonhooks
990
+ self._graph = function.graph
991
+ blocks = sorted(function.graph.nodes(), key=lambda node: (node.addr, not node.is_hook))
992
+ for block in blocks:
993
+ self.parse_block(block)
994
+ elif ranges is not None:
995
+ cfg = self.project.kb.cfgs.get_most_accurate()
996
+ fallback = True
997
+ if self._block_bytes is None and cfg is not None:
998
+ try:
999
+ self._graph = cfg.graph
1000
+ for start, end in ranges:
1001
+ if start == end:
1002
+ continue
1003
+ assert start < end
1004
+
1005
+ # Grab all blocks that intersect target range
1006
+ blocks = sorted(
1007
+ [
1008
+ n.to_codenode()
1009
+ for n in self._graph.nodes()
1010
+ if not (n.addr + (n.size or 1) <= start or n.addr >= end)
1011
+ ],
1012
+ key=lambda node: (node.addr, not node.is_hook),
1013
+ )
1014
+
1015
+ # Trim blocks that are not within range
1016
+ for i, block in enumerate(blocks):
1017
+ if block.size and block.addr < start:
1018
+ delta = start - block.addr
1019
+ block_bytes = block.bytestr[delta:] if block.bytestr else None
1020
+ blocks[i] = BlockNode(block.addr + delta, block.size - delta, block_bytes)
1021
+ for i, block in enumerate(blocks):
1022
+ real_block_addr = block.addr if not block.thumb else block.addr - 1
1023
+ if block.size and real_block_addr + block.size > end:
1024
+ delta = real_block_addr + block.size - end
1025
+ block_bytes = block.bytestr[0:-delta] if block.bytestr else None
1026
+ blocks[i] = BlockNode(block.addr, block.size - delta, block_bytes)
1027
+
1028
+ for block in blocks:
1029
+ self.parse_block(block)
1030
+ fallback = False
1031
+ except KeyError:
1032
+ pass
1033
+
1034
+ if fallback:
1035
+ # CFG not available, or the block cannot be found in the CFG (e.g., the block is dynamically
1036
+ # generated). Simply disassemble the code in the given regions. In the future we may want to handle
1037
+ # this case by automatically running CFG analysis on given ranges.
1038
+ for start, end in ranges:
1039
+ self.parse_block(
1040
+ BlockNode(
1041
+ start,
1042
+ end - start,
1043
+ thumb=thumb,
1044
+ bytestr=self._block_bytes if len(ranges) == 1 else None,
1045
+ )
1046
+ )
1047
+
1048
+ def func_lookup(self, block):
1049
+ try:
1050
+ return self._func_cache[block.function.addr]
1051
+ except AttributeError:
1052
+ return None
1053
+ except KeyError:
1054
+ f = FunctionStart(block.function)
1055
+ self._func_cache[f.addr] = f
1056
+ return f
1057
+
1058
+ def _add_instruction_to_results(self, block: BlockNode, insn: DisassemblerInsn, bs: BlockStart) -> None:
1059
+ """
1060
+ Add instruction to analysis results with associated labels and comments
1061
+ """
1062
+ if insn.address in self.kb.labels:
1063
+ label = Label(insn.address, self.kb.labels[insn.address])
1064
+ self.raw_result.append(label)
1065
+ self.raw_result_map["labels"][label.addr] = label
1066
+ if insn.address in self.kb.comments:
1067
+ comment = Comment(insn.address, self.kb.comments[insn.address])
1068
+ self.raw_result.append(comment)
1069
+ self.raw_result_map["comments"][comment.addr] = comment
1070
+ instruction = Instruction(insn, bs)
1071
+ self.raw_result.append(instruction)
1072
+ self.raw_result_map["instructions"][instruction.addr] = instruction
1073
+ self.block_to_insn_addrs[block.addr].append(insn.address)
1074
+
1075
+ def _add_block_ir_to_results(self, block: BlockNode, irsb: IRSBType) -> None:
1076
+ """
1077
+ Add lifter IR for this block
1078
+ """
1079
+ addr_to_ops_map = self.raw_result_map["ir"]
1080
+ addr = block.addr
1081
+ ops = addr_to_ops_map[addr]
1082
+
1083
+ if irsb.statements is not None:
1084
+ if pcode is not None and isinstance(self.project.factory.default_engine, pcode.HeavyPcodeMixin):
1085
+ addr = None
1086
+ stmt_idx = 0
1087
+ for op in irsb._ops:
1088
+ if op.opcode == pypcode.OpCode.IMARK:
1089
+ addr = op.inputs[0].offset
1090
+ else:
1091
+ addr_to_ops_map[addr].append(IROp(addr, stmt_idx, op, irsb))
1092
+ stmt_idx += 1
1093
+ else:
1094
+ for seq, stmt in enumerate(irsb.statements):
1095
+ if isinstance(stmt, pyvex.stmt.IMark):
1096
+ addr = stmt.addr
1097
+ ops = addr_to_ops_map[addr]
1098
+ else:
1099
+ ops.append(IROp(addr, seq, stmt, irsb))
1100
+
1101
+ def parse_block(self, block: BlockNode) -> None:
1102
+ """
1103
+ Parse instructions for a given block node
1104
+ """
1105
+ func = self.func_lookup(block)
1106
+ if func and func.addr == block.addr:
1107
+ self.raw_result.append(FuncComment(block.function))
1108
+ self.raw_result.append(func)
1109
+ bs = BlockStart(block, func, self.project)
1110
+ self.raw_result.append(bs)
1111
+
1112
+ if block.is_hook:
1113
+ hook = Hook(block)
1114
+ self.raw_result.append(hook)
1115
+ self.raw_result_map["hooks"][block.addr] = hook
1116
+ elif self.project.arch.capstone_support:
1117
+ # Prefer Capstone first, where we are able to extract a bit more
1118
+ # about the operands
1119
+ if block.thumb:
1120
+ aligned_block_addr = (block.addr >> 1) << 1
1121
+ cs = self.project.arch.capstone_thumb
1122
+ else:
1123
+ aligned_block_addr = block.addr
1124
+ cs = self.project.arch.capstone
1125
+ if block.bytestr is None:
1126
+ bytestr = self.project.factory.block(aligned_block_addr, block.size).bytes
1127
+ else:
1128
+ bytestr = block.bytestr
1129
+ self.block_to_insn_addrs[block.addr] = []
1130
+ for cs_insn in cs.disasm(bytestr, block.addr):
1131
+ self._add_instruction_to_results(block, CapstoneInsn(cs_insn), bs)
1132
+ elif pcode is not None and isinstance(self.project.factory.default_engine, pcode.HeavyPcodeMixin):
1133
+ # When using the P-code engine, we can fall back on its disassembly
1134
+ # in the event that Capstone does not support it
1135
+ self.block_to_insn_addrs[block.addr] = []
1136
+ b = self.project.factory.block(block.addr, size=block.size)
1137
+ for insn in b.disassembly.insns:
1138
+ self._add_instruction_to_results(block, insn, bs)
1139
+ elif type(block) is SootBlockNode:
1140
+ for raw_stmt in block.stmts:
1141
+ stmt = SootStatement(block.addr, raw_stmt)
1142
+ self.raw_result.append(stmt)
1143
+ self.raw_result_map["instructions"][stmt.addr] = stmt
1144
+ self.block_to_insn_addrs[block.addr].append(stmt.addr)
1145
+ else:
1146
+ raise AngrTypeError(
1147
+ f"Cannot disassemble block with architecture {self.project.arch} for block type {type(block)}"
1148
+ )
1149
+
1150
+ if self._include_ir:
1151
+ b = self.project.factory.block(block.addr, size=block.size)
1152
+ self._add_block_ir_to_results(block, b.vex)
1153
+
1154
+ def render(
1155
+ self,
1156
+ formatting=None,
1157
+ show_edges: bool = True,
1158
+ show_addresses: bool = True,
1159
+ show_bytes: bool = False,
1160
+ ascii_only: bool | None = None,
1161
+ color: bool = True,
1162
+ ) -> str:
1163
+ """
1164
+ Render the disassembly to a string, with optional edges and addresses.
1165
+
1166
+ Color will be added by default, if enabled. To disable color pass an empty formatting dict.
1167
+ """
1168
+ max_bytes_per_line = 5
1169
+ bytes_width = max_bytes_per_line * 3 + 1
1170
+ a2ln = defaultdict(list)
1171
+ buf = []
1172
+
1173
+ if formatting is None:
1174
+ formatting = {
1175
+ "colors": (
1176
+ {
1177
+ "address": "gray",
1178
+ "bytes": "cyan",
1179
+ "edge": "yellow",
1180
+ Label: "bright_yellow",
1181
+ ConstantOperand: "cyan",
1182
+ MemoryOperand: "yellow",
1183
+ Comment: "gray",
1184
+ Hook: "green",
1185
+ }
1186
+ if ansi_color_enabled and color
1187
+ else {}
1188
+ ),
1189
+ "format_callback": lambda item, s: ansi_color(s, formatting["colors"].get(type(item), None)),
1190
+ }
1191
+
1192
+ def col(item: Any) -> str | None:
1193
+ try:
1194
+ return formatting["colors"][item]
1195
+ except KeyError:
1196
+ return None
1197
+
1198
+ def format_address(addr: int, color: bool = True) -> str:
1199
+ if not show_addresses:
1200
+ return ""
1201
+ a, pad = f"{addr:x}", " "
1202
+ return (ansi_color(a, col("address")) if color else a) + pad
1203
+
1204
+ def format_bytes(data: bytes, color: bool = True) -> str:
1205
+ s = " ".join(f"{x:02x}" for x in data).ljust(bytes_width)
1206
+ return ansi_color(s, col("bytes")) if color else s
1207
+
1208
+ def format_comment(text: str, color: bool = True) -> str:
1209
+ s = " ; " + text
1210
+ return ansi_color(s, col(Comment)) if color else s
1211
+
1212
+ comment = None
1213
+
1214
+ for item in self.raw_result:
1215
+ if isinstance(item, BlockStart):
1216
+ if len(buf) > 0:
1217
+ buf.append("")
1218
+ elif isinstance(item, Label):
1219
+ pad = len(format_address(item.addr, False)) * " "
1220
+ if show_bytes:
1221
+ pad += bytes_width * " "
1222
+ buf.append(pad + item.render(formatting)[0])
1223
+ elif isinstance(item, Comment):
1224
+ comment = item
1225
+ elif isinstance(item, Hook):
1226
+ a2ln[item.addr].append(len(buf))
1227
+ buf.append(format_address(item.addr) + item.render(formatting)[0])
1228
+ elif isinstance(item, Instruction):
1229
+ a2ln[item.addr].append(len(buf))
1230
+ lines = []
1231
+
1232
+ # Chop instruction bytes into line segments
1233
+ p, insn_bytes = 0, []
1234
+ while show_bytes and p < len(item.insn.bytes):
1235
+ s = item.insn.bytes[p : p + min(len(item.insn.bytes) - p, max_bytes_per_line)]
1236
+ p += len(s)
1237
+ insn_bytes.append(s)
1238
+
1239
+ # Format the instruction's address, bytes, disassembly, and comment
1240
+ s_plain = format_address(item.addr, False)
1241
+ s = format_address(item.addr)
1242
+ if show_bytes:
1243
+ bytes_column = len(s_plain)
1244
+ s_plain += format_bytes(insn_bytes[0], False)
1245
+ s += format_bytes(insn_bytes[0])
1246
+ s_plain += item.render()[0]
1247
+ s += item.render(formatting)[0]
1248
+ if comment is not None:
1249
+ comment_column = len(s_plain)
1250
+ s += format_comment(comment.text[0])
1251
+ lines.append(s)
1252
+
1253
+ # Add additional lines of instruction bytes
1254
+ for i in range(1, len(insn_bytes)):
1255
+ lines.append(" " * bytes_column + format_bytes(insn_bytes[i]))
1256
+
1257
+ # Add additional lines of comments
1258
+ if comment is not None:
1259
+ for i in range(1, len(comment.text)):
1260
+ if len(lines) <= i:
1261
+ lines.append(" " * comment_column)
1262
+ lines[i] += format_comment(comment.text[i])
1263
+ comment = None
1264
+
1265
+ buf.extend(lines)
1266
+ else:
1267
+ buf.append("".join(item.render(formatting)))
1268
+
1269
+ if self._graph is not None and show_edges and buf:
1270
+ edges_by_line = set()
1271
+ for edge in self._graph.edges.items():
1272
+ from_block, to_block = edge[0]
1273
+ if from_block.size is None:
1274
+ continue
1275
+ if to_block.addr != from_block.addr + from_block.size:
1276
+ from_addr = edge[1]["ins_addr"]
1277
+ to_addr = to_block.addr
1278
+ if not (from_addr in a2ln and to_addr in a2ln):
1279
+ continue
1280
+ for f in a2ln[from_addr]:
1281
+ for t in a2ln[to_addr]:
1282
+ edges_by_line.add((f, t))
1283
+
1284
+ # Render block edges, to a reference buffer for tracking and output buffer for display
1285
+ edge_buf = ["" for _ in buf]
1286
+ ref_buf = ["" for _ in buf]
1287
+ edge_col = col("edge")
1288
+ for f, t in sorted(edges_by_line, key=lambda e: abs(e[0] - e[1])):
1289
+ add_edge_to_buffer(edge_buf, ref_buf, f, t, lambda s: ansi_color(s, edge_col), ascii_only=ascii_only)
1290
+ add_edge_to_buffer(ref_buf, ref_buf, f, t, ascii_only=ascii_only)
1291
+ max_edge_depth = max(map(len, ref_buf))
1292
+
1293
+ # Justify edge and combine with disassembly
1294
+ for i, line in enumerate(buf):
1295
+ buf[i] = " " * (max_edge_depth - len(ref_buf[i])) + edge_buf[i] + line
1296
+
1297
+ return "\n".join(buf)
1298
+
1299
+
1300
+ from angr.analyses import AnalysesHub
1301
+
1302
+ AnalysesHub.register_default("Disassembly", Disassembly)