angr 9.2.103__py3-none-macosx_11_0_arm64.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.dylib +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,1694 @@
1
+ import os
2
+ import logging
3
+ import networkx
4
+ import itertools
5
+ from collections import defaultdict
6
+ from collections.abc import Iterable
7
+
8
+ from itanium_demangler import parse
9
+
10
+ from cle.backends.symbol import Symbol
11
+ from archinfo.arch_arm import get_real_address_if_arm
12
+ import claripy
13
+
14
+ from angr.block import Block
15
+ from angr.knowledge_plugins.cfg.memory_data import MemoryDataSort
16
+
17
+ from ...codenode import CodeNode, BlockNode, HookNode, SyscallNode
18
+ from ...serializable import Serializable
19
+ from ...errors import AngrValueError, SimEngineError, SimMemoryError
20
+ from ...procedures import SIM_LIBRARIES
21
+ from ...procedures.definitions import SimSyscallLibrary
22
+ from ...protos import function_pb2
23
+ from ...calling_conventions import DEFAULT_CC, default_cc
24
+ from ...misc.ux import deprecated
25
+ from .function_parser import FunctionParser
26
+
27
+ l = logging.getLogger(name=__name__)
28
+
29
+ from ...sim_type import SimTypeFunction, parse_defns
30
+ from ...calling_conventions import SimCC
31
+ from ...project import Project
32
+
33
+
34
+ class Function(Serializable):
35
+ """
36
+ A representation of a function and various information about it.
37
+ """
38
+
39
+ __slots__ = (
40
+ "transition_graph",
41
+ "_local_transition_graph",
42
+ "normalized",
43
+ "_ret_sites",
44
+ "_jumpout_sites",
45
+ "_callout_sites",
46
+ "_endpoints",
47
+ "_call_sites",
48
+ "_retout_sites",
49
+ "addr",
50
+ "_function_manager",
51
+ "is_syscall",
52
+ "_project",
53
+ "is_plt",
54
+ "addr",
55
+ "is_simprocedure",
56
+ "_name",
57
+ "is_default_name",
58
+ "from_signature",
59
+ "binary_name",
60
+ "_argument_registers",
61
+ "_argument_stack_variables",
62
+ "bp_on_stack",
63
+ "retaddr_on_stack",
64
+ "sp_delta",
65
+ "calling_convention",
66
+ "prototype",
67
+ "prototype_libname",
68
+ "_returning",
69
+ "prepared_registers",
70
+ "prepared_stack_variables",
71
+ "registers_read_afterwards",
72
+ "startpoint",
73
+ "_addr_to_block_node",
74
+ "_block_sizes",
75
+ "_block_cache",
76
+ "_local_blocks",
77
+ "_local_block_addrs",
78
+ "info",
79
+ "tags",
80
+ "is_alignment",
81
+ "is_prototype_guessed",
82
+ "ran_cca",
83
+ "_cyclomatic_complexity",
84
+ )
85
+
86
+ def __init__(
87
+ self,
88
+ function_manager,
89
+ addr,
90
+ name=None,
91
+ syscall=None,
92
+ is_simprocedure: bool | None = None,
93
+ binary_name=None,
94
+ is_plt: bool | None = None,
95
+ returning=None,
96
+ alignment=False,
97
+ ):
98
+ """
99
+ Function constructor. If the optional parameters are not provided, they will be automatically determined upon
100
+ the creation of a Function object.
101
+
102
+ :param addr: The address of the function.
103
+
104
+ The following parameters are optional.
105
+
106
+ :param str name: The name of the function.
107
+ :param bool syscall: Whether this function is a syscall or not.
108
+ :param bool is_simprocedure: Whether this function is a SimProcedure or not.
109
+ :param str binary_name: Name of the binary where this function is.
110
+ :param bool is_plt: If this function is a PLT entry.
111
+ :param bool returning: If this function returns.
112
+ :param bool alignment: If this function acts as an alignment filler. Such functions usually only contain nops.
113
+ """
114
+ self.transition_graph = networkx.classes.digraph.DiGraph()
115
+ self._local_transition_graph = None
116
+ self.normalized = False
117
+
118
+ # block nodes at whose ends the function returns
119
+ self._ret_sites: set[BlockNode] = set()
120
+ # block nodes at whose ends the function jumps out to another function (jumps outside)
121
+ self._jumpout_sites: set[BlockNode] = set()
122
+ # block nodes at whose ends the function calls out to another non-returning function
123
+ self._callout_sites: set[BlockNode] = set()
124
+ # block nodes that ends the function by returning out to another function (returns outside). This is rare.
125
+ self._retout_sites: set[BlockNode] = set()
126
+ # block nodes (basic block nodes) at whose ends the function terminates
127
+ # in theory, if everything works fine, endpoints == ret_sites | jumpout_sites | callout_sites
128
+ self._endpoints = defaultdict(set)
129
+
130
+ self._call_sites = {}
131
+ self.addr = addr
132
+ # startpoint can be None if the corresponding CFGNode is a syscall node
133
+ self.startpoint = None
134
+ self._function_manager = function_manager
135
+ self.is_syscall = None
136
+ self.is_simprocedure = False
137
+ self.is_alignment = alignment
138
+
139
+ # These properties are set by VariableManager
140
+ self.bp_on_stack = False
141
+ self.retaddr_on_stack = False
142
+ self.sp_delta = 0
143
+ # Calling convention
144
+ self.calling_convention: SimCC | None = None
145
+ # Function prototype
146
+ self.prototype: SimTypeFunction | None = None
147
+ self.prototype_libname: str | None = None
148
+ self.is_prototype_guessed: bool = True
149
+ # Whether this function returns or not. `None` means it's not determined yet
150
+ self._returning = None
151
+ self.prepared_registers = set()
152
+ self.prepared_stack_variables = set()
153
+ self.registers_read_afterwards = set()
154
+
155
+ self._addr_to_block_node = {} # map addresses to nodes. it's a cache of blocks. if a block is removed from the
156
+ # function, it may not be removed from _addr_to_block_node. if you want to list
157
+ # all blocks of a function, access .blocks.
158
+ self._block_sizes = {} # map addresses to block sizes
159
+ self._block_cache = {} # a cache of real, hard data Block objects
160
+ self._local_blocks = {} # a dict of all blocks inside the function
161
+ self._local_block_addrs = set() # a set of addresses of all blocks inside the function
162
+
163
+ self.info = {} # storing special information, like $gp values for MIPS32
164
+ self.tags = () # store function tags. can be set manually by performing CodeTagging analysis.
165
+
166
+ # Initialize _cyclomatic_complexity to None
167
+ self._cyclomatic_complexity = None
168
+
169
+ # TODO: Can we remove the following two members?
170
+ # Register offsets of those arguments passed in registers
171
+ self._argument_registers = []
172
+ # Stack offsets of those arguments passed in stack variables
173
+ self._argument_stack_variables = []
174
+
175
+ self._project: Project | None = None # will be initialized upon the first access to self.project
176
+
177
+ self.ran_cca = False # this is set by CompleteCallingConventions to avoid reprocessing failed functions
178
+
179
+ #
180
+ # Initialize unspecified properties
181
+ #
182
+
183
+ if syscall is not None:
184
+ self.is_syscall = syscall
185
+ else:
186
+ if self.project is None:
187
+ raise ValueError(
188
+ "'syscall' must be specified if you do not specify a function manager for this new function."
189
+ )
190
+
191
+ # Determine whether this function is a syscall or not
192
+ self.is_syscall = self.project.simos.is_syscall_addr(addr)
193
+
194
+ # Determine whether this function is a SimProcedure
195
+ if is_simprocedure is not None:
196
+ self.is_simprocedure = is_simprocedure
197
+ else:
198
+ if self.project is None:
199
+ raise ValueError(
200
+ "'is_simprocedure' must be specified if you do not specify a function manager for this new "
201
+ "function."
202
+ )
203
+
204
+ if self.is_syscall or self.project.is_hooked(addr):
205
+ self.is_simprocedure = True
206
+
207
+ # Determine if this function is a PLT entry
208
+ if is_plt is not None:
209
+ self.is_plt = is_plt
210
+ else:
211
+ # Whether this function is a PLT entry or not is fully relying on the PLT detection in CLE
212
+ if self.project is None:
213
+ raise ValueError(
214
+ "'is_plt' must be specified if you do not specify a function manager for this new function."
215
+ )
216
+
217
+ self.is_plt = self.project.loader.find_plt_stub_name(addr) is not None
218
+
219
+ # Determine the name of this function
220
+ if name is None:
221
+ self._name = self._get_initial_name()
222
+ else:
223
+ self.is_default_name = False
224
+ self._name = name
225
+ self.from_signature = None
226
+
227
+ # Determine the name the binary where this function is.
228
+ if binary_name is not None:
229
+ self.binary_name = binary_name
230
+ else:
231
+ self.binary_name = self._get_initial_binary_name()
232
+
233
+ # Determine returning status for SimProcedures and Syscalls
234
+ if returning is not None:
235
+ self._returning = returning
236
+ else:
237
+ if self.project is None:
238
+ raise ValueError(
239
+ "'returning' must be specified if you do not specify a function manager for this new function."
240
+ )
241
+
242
+ self._returning = self._get_initial_returning()
243
+
244
+ # Determine a calling convention
245
+ # If it is a SimProcedure it might have a CC already defined which can be used
246
+ if self.is_simprocedure and self.project is not None and self.addr in self.project._sim_procedures:
247
+ simproc = self.project._sim_procedures[self.addr]
248
+ cc = simproc.cc
249
+ if cc is None:
250
+ arch = self.project.arch
251
+ if self.project.arch.name in DEFAULT_CC:
252
+ cc = default_cc(
253
+ arch.name, platform=self.project.simos.name if self.project.simos is not None else None
254
+ )(arch)
255
+
256
+ self.calling_convention: SimCC | None = cc
257
+ else:
258
+ self.calling_convention: SimCC | None = None
259
+
260
+ @property
261
+ @deprecated(".is_alignment")
262
+ def alignment(self):
263
+ return self.is_alignment
264
+
265
+ @alignment.setter
266
+ def alignment(self, value):
267
+ self.is_alignment = value
268
+
269
+ @property
270
+ def name(self):
271
+ return self._name
272
+
273
+ @name.setter
274
+ def name(self, v):
275
+ self._name = v
276
+ self._function_manager._kb.labels[self.addr] = v
277
+
278
+ @property
279
+ def project(self):
280
+ if self._project is None:
281
+ # try to set it from function manager
282
+ if self._function_manager is not None:
283
+ self._project: Project | None = self._function_manager._kb._project
284
+ return self._project
285
+
286
+ @property
287
+ def returning(self):
288
+ return self._returning
289
+
290
+ @returning.setter
291
+ def returning(self, v):
292
+ self._returning = v
293
+
294
+ @property
295
+ def blocks(self):
296
+ """
297
+ An iterator of all local blocks in the current function.
298
+
299
+ :return: angr.lifter.Block instances.
300
+ """
301
+
302
+ for block_addr, block in self._local_blocks.items():
303
+ try:
304
+ yield self.get_block(
305
+ block_addr, size=block.size, byte_string=block.bytestr if isinstance(block, BlockNode) else None
306
+ )
307
+ except (SimEngineError, SimMemoryError):
308
+ pass
309
+
310
+ @property
311
+ def cyclomatic_complexity(self):
312
+ """
313
+ The cyclomatic complexity of the function.
314
+
315
+ Cyclomatic complexity is a software metric used to indicate the complexity of a program.
316
+ It is a quantitative measure of the number of linearly independent paths through a program's source code.
317
+ It is computed using the formula: M = E - N + 2P, where
318
+ E = the number of edges in the graph,
319
+ N = the number of nodes in the graph,
320
+ P = the number of connected components.
321
+
322
+ The cyclomatic complexity value is lazily computed and cached for future use.
323
+ Initially this value is None until it is computed for the first time
324
+
325
+ :return: The cyclomatic complexity of the function.
326
+ :rtype: int
327
+ """
328
+ if self._cyclomatic_complexity is None:
329
+ self._cyclomatic_complexity = (
330
+ self.transition_graph.number_of_edges() - self.transition_graph.number_of_nodes() + 2
331
+ )
332
+ return self._cyclomatic_complexity
333
+
334
+ @property
335
+ def xrefs(self):
336
+ """
337
+ An iterator of all xrefs of the current function.
338
+
339
+ :return: angr.knowledge_plugins.xrefs.xref.XRef instances.
340
+ """
341
+ for block in self.blocks:
342
+ yield from self._function_manager._kb.xrefs.get_xrefs_by_ins_addr_region(
343
+ block.addr, block.addr + block.size
344
+ )
345
+
346
+ @property
347
+ def block_addrs(self):
348
+ """
349
+ An iterator of all local block addresses in the current function.
350
+
351
+ :return: block addresses.
352
+ """
353
+
354
+ return self._local_blocks.keys()
355
+
356
+ @property
357
+ def block_addrs_set(self):
358
+ """
359
+ Return a set of block addresses for a better performance of inclusion tests.
360
+
361
+ :return: A set of block addresses.
362
+ :rtype: set
363
+ """
364
+
365
+ return self._local_block_addrs
366
+
367
+ def get_block(self, addr: int, size: int | None = None, byte_string: bytes | None = None):
368
+ """
369
+ Getting a block out of the current function.
370
+
371
+ :param int addr: The address of the block.
372
+ :param int size: The size of the block. This is optional. If not provided, angr will load
373
+ :param byte_string:
374
+ :return:
375
+ """
376
+ if addr in self._block_cache:
377
+ b = self._block_cache[addr]
378
+ if size is None or b.size == size:
379
+ return b
380
+ else:
381
+ # size seems to be updated. remove this cached entry from the block cache
382
+ del self._block_cache[addr]
383
+
384
+ if size is None and addr in self.block_addrs:
385
+ # we know the size
386
+ size = self._block_sizes[addr]
387
+
388
+ block = self._project.factory.block(addr, size=size, byte_string=byte_string)
389
+ if size is None:
390
+ # update block_size dict
391
+ self._block_sizes[addr] = block.size
392
+ self._block_cache[addr] = block
393
+ return block
394
+
395
+ # compatibility
396
+ _get_block = get_block
397
+
398
+ def get_block_size(self, addr: int) -> int | None:
399
+ return self._block_sizes.get(addr, None)
400
+
401
+ @property
402
+ def nodes(self) -> Iterable[CodeNode]:
403
+ return self.transition_graph.nodes()
404
+
405
+ def get_node(self, addr) -> Block:
406
+ return self._addr_to_block_node.get(addr, None)
407
+
408
+ @property
409
+ def has_unresolved_jumps(self):
410
+ for addr in self.block_addrs:
411
+ if addr in self._function_manager._kb.unresolved_indirect_jumps:
412
+ b = self._function_manager._kb._project.factory.block(addr)
413
+ if b.vex.jumpkind == "Ijk_Boring":
414
+ return True
415
+ return False
416
+
417
+ @property
418
+ def has_unresolved_calls(self):
419
+ for addr in self.block_addrs:
420
+ if addr in self._function_manager._kb.unresolved_indirect_jumps:
421
+ b = self._function_manager._kb._project.factory.block(addr)
422
+ if b.vex.jumpkind == "Ijk_Call":
423
+ return True
424
+ return False
425
+
426
+ @property
427
+ def operations(self):
428
+ """
429
+ All of the operations that are done by this functions.
430
+ """
431
+ return [op for block in self.blocks for op in block.vex.operations]
432
+
433
+ @property
434
+ def code_constants(self):
435
+ """
436
+ All of the constants that are used by this functions's code.
437
+ """
438
+ # TODO: remove link register values
439
+ return [const.value for block in self.blocks for const in block.vex.constants]
440
+
441
+ @classmethod
442
+ def _get_cmsg(cls):
443
+ return function_pb2.Function()
444
+
445
+ def serialize_to_cmessage(self):
446
+ return FunctionParser.serialize(self)
447
+
448
+ @classmethod
449
+ def parse_from_cmessage(cls, cmsg, **kwargs):
450
+ """
451
+ :param cmsg:
452
+
453
+ :return Function: The function instantiated out of the cmsg data.
454
+ """
455
+ return FunctionParser.parse_from_cmsg(cmsg, **kwargs)
456
+
457
+ def string_references(self, minimum_length=2):
458
+ """
459
+ All of the constant string references used by this function.
460
+
461
+ :param minimum_length: The minimum length of strings to find (default is 1)
462
+ :return: A generator yielding tuples of (address, string) where is address
463
+ is the location of the string in memory.
464
+ """
465
+
466
+ cfg = self._function_manager._kb.cfgs.get_most_accurate()
467
+
468
+ for x in self.xrefs:
469
+ try:
470
+ md = cfg.memory_data[x.dst]
471
+ except KeyError:
472
+ continue
473
+ if md.sort not in {MemoryDataSort.String, MemoryDataSort.UnicodeString}:
474
+ continue
475
+ if len(md.content) < minimum_length:
476
+ continue
477
+
478
+ yield (md.addr, md.content)
479
+
480
+ @property
481
+ def local_runtime_values(self):
482
+ """
483
+ Tries to find all runtime values of this function which do not come from inputs.
484
+ These values are generated by starting from a blank state and reanalyzing the basic blocks once each.
485
+ Function calls are skipped, and back edges are never taken so these values are often unreliable,
486
+ This function is good at finding simple constant addresses which the function will use or calculate.
487
+
488
+ :return: a set of constants
489
+ """
490
+ constants = set()
491
+
492
+ if not self._project.loader.main_object.contains_addr(self.addr):
493
+ return constants
494
+
495
+ # FIXME the old way was better for architectures like mips, but we need the initial irsb
496
+ # reanalyze function with a new initial state (use persistent registers)
497
+ # initial_state = self._function_manager._cfg.get_any_irsb(self.addr).initial_state
498
+ # fresh_state = self._project.factory.blank_state(mode="fastpath")
499
+ # for reg in initial_state.arch.persistent_regs + ['ip']:
500
+ # fresh_state.registers.store(reg, initial_state.registers.load(reg))
501
+
502
+ # reanalyze function with a new initial state
503
+ fresh_state = self._project.factory.blank_state(mode="fastpath")
504
+ fresh_state.regs.ip = self.addr
505
+
506
+ graph_addrs = {x.addr for x in self.graph.nodes() if isinstance(x, BlockNode)}
507
+
508
+ # process the nodes in a breadth-first order keeping track of which nodes have already been analyzed
509
+ analyzed = set()
510
+ q = [fresh_state]
511
+ analyzed.add(fresh_state.solver.eval(fresh_state.ip))
512
+ while len(q) > 0:
513
+ state = q.pop()
514
+ # make sure its in this function
515
+ if state.solver.eval(state.ip) not in graph_addrs:
516
+ continue
517
+ # don't trace into simprocedures
518
+ if self._project.is_hooked(state.solver.eval(state.ip)):
519
+ continue
520
+ # don't trace outside of the binary
521
+ if not self._project.loader.main_object.contains_addr(state.solver.eval(state.ip)):
522
+ continue
523
+ # don't trace unreachable blocks
524
+ if state.history.jumpkind in {
525
+ "Ijk_EmWarn",
526
+ "Ijk_NoDecode",
527
+ "Ijk_MapFail",
528
+ "Ijk_NoRedir",
529
+ "Ijk_SigTRAP",
530
+ "Ijk_SigSEGV",
531
+ "Ijk_ClientReq",
532
+ }:
533
+ continue
534
+
535
+ curr_ip = state.solver.eval(state.ip)
536
+
537
+ # get runtime values from logs of successors
538
+ successors = self._project.factory.successors(state)
539
+ for succ in successors.flat_successors + successors.unsat_successors:
540
+ for a in succ.history.recent_actions:
541
+ for ao in a.all_objects:
542
+ if not isinstance(ao.ast, claripy.ast.Base):
543
+ constants.add(ao.ast)
544
+ elif not ao.ast.symbolic:
545
+ constants.add(succ.solver.eval(ao.ast))
546
+
547
+ # add successors to the queue to analyze
548
+ if not succ.solver.symbolic(succ.ip):
549
+ succ_ip = succ.solver.eval(succ.ip)
550
+ if succ_ip in self and succ_ip not in analyzed:
551
+ analyzed.add(succ_ip)
552
+ q.insert(0, succ)
553
+
554
+ # force jumps to missing successors
555
+ # (this is a slightly hacky way to force it to explore all the nodes in the function)
556
+ node = self.get_node(curr_ip)
557
+ if node is None:
558
+ # the node does not exist. maybe it's not a block node.
559
+ continue
560
+ missing = {x.addr for x in list(self.graph.successors(node))} - analyzed
561
+ for succ_addr in missing:
562
+ l.info("Forcing jump to missing successor: %#x", succ_addr)
563
+ if succ_addr not in analyzed:
564
+ all_successors = (
565
+ successors.unconstrained_successors + successors.flat_successors + successors.unsat_successors
566
+ )
567
+ if len(all_successors) > 0:
568
+ # set the ip of a copied successor to the successor address
569
+ succ = all_successors[0].copy()
570
+ succ.ip = succ_addr
571
+ analyzed.add(succ_addr)
572
+ q.insert(0, succ)
573
+ else:
574
+ l.warning("Could not reach successor: %#x", succ_addr)
575
+
576
+ return constants
577
+
578
+ @property
579
+ def num_arguments(self):
580
+ return len(self._argument_registers) + len(self._argument_stack_variables)
581
+
582
+ def __contains__(self, val):
583
+ if isinstance(val, int):
584
+ return val in self._block_sizes
585
+ else:
586
+ return False
587
+
588
+ def __str__(self):
589
+ s = f"Function {self.name} [{self.addr:#x}]\n"
590
+ s += " Syscall: %s\n" % self.is_syscall
591
+ s += " SP difference: %d\n" % self.sp_delta
592
+ s += " Has return: %s\n" % self.has_return
593
+ s += " Returning: %s\n" % ("Unknown" if self.returning is None else self.returning)
594
+ s += " Alignment: %s\n" % (self.alignment)
595
+ s += f" Arguments: reg: {self._argument_registers}, stack: {self._argument_stack_variables}\n"
596
+ s += " Blocks: [%s]\n" % ", ".join(["%#x" % i for i in self.block_addrs])
597
+ s += " Cyclomatic Complexity: %s\n" % self.cyclomatic_complexity
598
+ s += " Calling convention: %s" % self.calling_convention
599
+ return s
600
+
601
+ def __repr__(self):
602
+ if self.is_syscall:
603
+ return "<Syscall function {} ({})>".format(
604
+ self.name, hex(self.addr) if isinstance(self.addr, int) else self.addr
605
+ )
606
+ return f"<Function {self.name} ({hex(self.addr) if isinstance(self.addr, int) else self.addr})>"
607
+
608
+ def __setstate__(self, state):
609
+ for k, v in state.items():
610
+ setattr(self, k, v)
611
+
612
+ def __getstate__(self):
613
+ # self._local_transition_graph is a cache. don't pickle it
614
+ d = {k: getattr(self, k) for k in self.__slots__}
615
+ d["_local_transition_graph"] = None
616
+ d["_project"] = None
617
+ d["_function_manager"] = None
618
+ d["_block_cache"] = {}
619
+ return d
620
+
621
+ @property
622
+ def endpoints(self):
623
+ return list(itertools.chain(*self._endpoints.values()))
624
+
625
+ @property
626
+ def endpoints_with_type(self):
627
+ return self._endpoints
628
+
629
+ @property
630
+ def ret_sites(self):
631
+ return list(self._ret_sites)
632
+
633
+ @property
634
+ def jumpout_sites(self):
635
+ return list(self._jumpout_sites)
636
+
637
+ @property
638
+ def retout_sites(self):
639
+ return list(self._retout_sites)
640
+
641
+ @property
642
+ def callout_sites(self):
643
+ return list(self._callout_sites)
644
+
645
+ @property
646
+ def size(self):
647
+ return sum([b.size for b in self.blocks])
648
+
649
+ @property
650
+ def binary(self):
651
+ """
652
+ Get the object this function belongs to.
653
+ :return: The object this function belongs to.
654
+ """
655
+
656
+ return self._project.loader.find_object_containing(self.addr, membership_check=False)
657
+
658
+ @property
659
+ def offset(self) -> int:
660
+ """
661
+ :return: the function's binary offset (i.e., non-rebased address)
662
+ """
663
+ return self.addr - self.binary.mapped_base
664
+
665
+ @property
666
+ def symbol(self) -> None | Symbol:
667
+ """
668
+ :return: the function's Symbol, if any
669
+ """
670
+ return self.binary.loader.find_symbol(self.addr)
671
+
672
+ @property
673
+ def pseudocode(self) -> str:
674
+ """
675
+ :return: the function's pseudocode
676
+ """
677
+ dec = self.project.analyses.Decompiler(self, cfg=self._function_manager._kb.cfgs.get_most_accurate())
678
+ return dec.codegen.text
679
+
680
+ def add_jumpout_site(self, node):
681
+ """
682
+ Add a custom jumpout site.
683
+
684
+ :param node: The address of the basic block that control flow leaves during this transition.
685
+ :return: None
686
+ """
687
+
688
+ self._register_nodes(True, node)
689
+ self._jumpout_sites.add(node)
690
+ self._add_endpoint(node, "transition")
691
+
692
+ def add_retout_site(self, node):
693
+ """
694
+ Add a custom retout site.
695
+
696
+ Retout (returning to outside of the function) sites are very rare. It mostly occurs during CFG recovery when we
697
+ incorrectly identify the beginning of a function in the first iteration, and then correctly identify that
698
+ function later in the same iteration (function alignments can lead to this bizarre case). We will mark all edges
699
+ going out of the header of that function as a outside edge, because all successors now belong to the
700
+ incorrectly-identified function. This identification error will be fixed in the second iteration of CFG
701
+ recovery. However, we still want to keep track of jumpouts/retouts during the first iteration so other logic in
702
+ CFG recovery still work.
703
+
704
+ :param node: The address of the basic block that control flow leaves the current function after a call.
705
+ :return: None
706
+ """
707
+
708
+ self._register_nodes(True, node)
709
+ self._retout_sites.add(node)
710
+ self._add_endpoint(node, "return")
711
+
712
+ def _get_initial_name(self):
713
+ """
714
+ Determine the most suitable name of the function.
715
+
716
+ :return: The initial function name.
717
+ :rtype: string
718
+ """
719
+
720
+ name = None
721
+ addr = self.addr
722
+
723
+ self.is_default_name = False
724
+ # Try to get a name from existing labels
725
+ if self._function_manager is not None:
726
+ if addr in self._function_manager._kb.labels:
727
+ name = self._function_manager._kb.labels[addr]
728
+
729
+ # try to get the name from a hook
730
+ if name is None and self.project is not None:
731
+ project = self.project
732
+ if project.is_hooked(addr):
733
+ hooker = project.hooked_by(addr)
734
+ name = hooker.display_name
735
+ elif project.simos.is_syscall_addr(addr):
736
+ syscall_inst = project.simos.syscall_from_addr(addr)
737
+ name = syscall_inst.display_name
738
+
739
+ # generate an IDA-style sub_X name
740
+ if name is None:
741
+ self.is_default_name = True
742
+ name = "sub_%x" % addr
743
+
744
+ return name
745
+
746
+ def _get_initial_binary_name(self):
747
+ """
748
+ Determine the name of the binary where this function is.
749
+
750
+ :return: None
751
+ """
752
+
753
+ binary_name = None
754
+
755
+ # if this function is a simprocedure but not a syscall, use its library name as
756
+ # its binary name
757
+ # if it is a syscall, fall back to use self.binary.binary which explicitly says cle##kernel
758
+ if self.project and self.is_simprocedure and not self.is_syscall:
759
+ hooker = self.project.hooked_by(self.addr)
760
+ if hooker is not None:
761
+ binary_name = hooker.library_name
762
+
763
+ if binary_name is None and self.binary is not None and self.binary.binary:
764
+ binary_name = os.path.basename(self.binary.binary)
765
+
766
+ return binary_name
767
+
768
+ def _get_initial_returning(self):
769
+ """
770
+ Determine if this function returns or not *if it is hooked by a SimProcedure or a user hook*.
771
+
772
+ :return: True if the hooker returns, False otherwise.
773
+ :rtype: bool
774
+ """
775
+
776
+ hooker = None
777
+ if self.is_syscall:
778
+ hooker = self.project.simos.syscall_from_addr(self.addr)
779
+ elif self.is_simprocedure:
780
+ hooker = self.project.hooked_by(self.addr)
781
+ if hooker:
782
+ if hasattr(hooker, "DYNAMIC_RET") and hooker.DYNAMIC_RET:
783
+ return True
784
+ elif hasattr(hooker, "NO_RET"):
785
+ return not hooker.NO_RET
786
+
787
+ # Cannot determine
788
+ return None
789
+
790
+ def _clear_transition_graph(self):
791
+ self._block_cache = {}
792
+ self._block_sizes = {}
793
+ self._addr_to_block_node = {}
794
+ self._local_blocks = {}
795
+ self._local_block_addrs = set()
796
+ self.startpoint = None
797
+ self.transition_graph = networkx.classes.digraph.DiGraph()
798
+ self._local_transition_graph = None
799
+
800
+ self._ret_sites = set()
801
+ self._jumpout_sites = set()
802
+ self._callout_sites = set()
803
+ self._retout_sites = set()
804
+ self._endpoints = defaultdict(set)
805
+ self._call_sites = {}
806
+
807
+ def _confirm_fakeret(self, src, dst):
808
+ if src not in self.transition_graph or dst not in self.transition_graph[src]:
809
+ raise AngrValueError(f"FakeRet edge ({src}, {dst}) is not in transition graph.")
810
+
811
+ data = self.transition_graph[src][dst]
812
+
813
+ if "type" not in data or data["type"] != "fake_return":
814
+ raise AngrValueError(f"Edge ({src}, {dst}) is not a FakeRet edge")
815
+
816
+ # it's confirmed. register the node if needed
817
+ if "outside" not in data or data["outside"] is False:
818
+ self._register_nodes(True, dst)
819
+
820
+ self.transition_graph[src][dst]["confirmed"] = True
821
+
822
+ def _transit_to(self, from_node, to_node, outside=False, ins_addr=None, stmt_idx=None, is_exception=False):
823
+ """
824
+ Registers an edge between basic blocks in this function's transition graph.
825
+ Arguments are CodeNode objects.
826
+
827
+ :param from_node The address of the basic block that control
828
+ flow leaves during this transition.
829
+ :param to_node The address of the basic block that control
830
+ flow enters during this transition.
831
+ :param bool outside: If this is a transition to another function, e.g. tail call optimization
832
+ :return: None
833
+ """
834
+
835
+ if outside:
836
+ self._register_nodes(True, from_node)
837
+ if to_node is not None:
838
+ self._register_nodes(False, to_node)
839
+
840
+ self._jumpout_sites.add(from_node)
841
+ else:
842
+ if to_node is not None:
843
+ self._register_nodes(True, from_node, to_node)
844
+ else:
845
+ self._register_nodes(True, from_node)
846
+
847
+ type_ = "transition" if not is_exception else "exception"
848
+ if to_node is not None:
849
+ self.transition_graph.add_edge(
850
+ from_node, to_node, type=type_, outside=outside, ins_addr=ins_addr, stmt_idx=stmt_idx
851
+ )
852
+
853
+ if outside:
854
+ # this node is an endpoint of the current function
855
+ self._add_endpoint(from_node, type_)
856
+
857
+ # clear the cache
858
+ self._local_transition_graph = None
859
+
860
+ def _call_to(self, from_node, to_func, ret_node, stmt_idx=None, ins_addr=None, return_to_outside=False):
861
+ """
862
+ Registers an edge between the caller basic block and callee function.
863
+
864
+ :param from_addr: The basic block that control flow leaves during the transition.
865
+ :type from_addr: angr.knowledge.CodeNode
866
+ :param to_func: The function that we are calling
867
+ :type to_func: Function
868
+ :param ret_node The basic block that control flow should return to after the
869
+ function call.
870
+ :type to_func: angr.knowledge.CodeNode or None
871
+ :param stmt_idx: Statement ID of this call.
872
+ :type stmt_idx: int, str or None
873
+ :param ins_addr: Instruction address of this call.
874
+ :type ins_addr: int or None
875
+ """
876
+
877
+ self._register_nodes(True, from_node)
878
+
879
+ if to_func.is_syscall:
880
+ self.transition_graph.add_edge(from_node, to_func, type="syscall", stmt_idx=stmt_idx, ins_addr=ins_addr)
881
+ else:
882
+ self.transition_graph.add_edge(from_node, to_func, type="call", stmt_idx=stmt_idx, ins_addr=ins_addr)
883
+ if ret_node is not None:
884
+ self._fakeret_to(from_node, ret_node, to_outside=return_to_outside)
885
+
886
+ self._local_transition_graph = None
887
+
888
+ def _fakeret_to(self, from_node, to_node, confirmed=None, to_outside=False):
889
+ self._register_nodes(True, from_node)
890
+
891
+ if confirmed is None:
892
+ self.transition_graph.add_edge(from_node, to_node, type="fake_return", outside=to_outside)
893
+ else:
894
+ self.transition_graph.add_edge(
895
+ from_node, to_node, type="fake_return", confirmed=confirmed, outside=to_outside
896
+ )
897
+ if confirmed:
898
+ self._register_nodes(not to_outside, to_node)
899
+
900
+ self._local_transition_graph = None
901
+
902
+ def _remove_fakeret(self, from_node, to_node):
903
+ self.transition_graph.remove_edge(from_node, to_node)
904
+
905
+ self._local_transition_graph = None
906
+
907
+ def _return_from_call(self, from_func, to_node, to_outside=False):
908
+ self.transition_graph.add_edge(from_func, to_node, type="return", to_outside=to_outside)
909
+ for _, _, data in self.transition_graph.in_edges(to_node, data=True):
910
+ if "type" in data and data["type"] == "fake_return":
911
+ data["confirmed"] = True
912
+
913
+ self._local_transition_graph = None
914
+
915
+ def _update_local_blocks(self, node: CodeNode):
916
+ self._local_blocks[node.addr] = node
917
+ self._local_block_addrs.add(node.addr)
918
+
919
+ def _update_addr_to_block_cache(self, node: BlockNode):
920
+ if node.addr not in self._addr_to_block_node:
921
+ self._addr_to_block_node[node.addr] = node
922
+
923
+ def _register_nodes(self, is_local, *nodes):
924
+ if not isinstance(is_local, bool):
925
+ raise AngrValueError('_register_nodes(): the "is_local" parameter must be a bool')
926
+
927
+ for node in nodes:
928
+ if node.addr not in self:
929
+ # only add each node once
930
+ self.transition_graph.add_node(node)
931
+
932
+ if not isinstance(node, CodeNode):
933
+ continue
934
+ node._graph = self.transition_graph
935
+ if self._block_sizes.get(node.addr, 0) == 0:
936
+ self._block_sizes[node.addr] = node.size
937
+ if node.addr == self.addr:
938
+ if self.startpoint is None or not self.startpoint.is_hook:
939
+ self.startpoint = node
940
+ if is_local and node.addr not in self._local_blocks:
941
+ self._update_local_blocks(node)
942
+ # add BlockNodes to the addr_to_block_node cache if not already there
943
+ if isinstance(node, BlockNode):
944
+ self._update_addr_to_block_cache(node)
945
+ # else:
946
+ # # checks that we don't have multiple block nodes at a single address
947
+ # assert node == self._addr_to_block_node[node.addr]
948
+
949
+ def _add_return_site(self, return_site):
950
+ """
951
+ Registers a basic block as a site for control flow to return from this function.
952
+
953
+ :param CodeNode return_site: The block node that ends with a return.
954
+ """
955
+ self._register_nodes(True, return_site)
956
+
957
+ self._ret_sites.add(return_site)
958
+ # A return site must be an endpoint of the function - you cannot continue execution of the current function
959
+ # after returning
960
+ self._add_endpoint(return_site, "return")
961
+
962
+ def _add_call_site(self, call_site_addr, call_target_addr, retn_addr):
963
+ """
964
+ Registers a basic block as calling a function and returning somewhere.
965
+
966
+ :param call_site_addr: The address of a basic block that ends in a call.
967
+ :param call_target_addr: The address of the target of said call.
968
+ :param retn_addr: The address that said call will return to.
969
+ """
970
+ self._call_sites[call_site_addr] = (call_target_addr, retn_addr)
971
+
972
+ def _add_endpoint(self, endpoint_node, sort):
973
+ """
974
+ Registers an endpoint with a type of `sort`. The type can be one of the following:
975
+ - call: calling a function that does not return
976
+ - return: returning from the current function
977
+ - transition: a jump/branch targeting a different function
978
+
979
+ It is possible for a block to act as two different sorts of endpoints. For example, consider the following
980
+ block:
981
+
982
+ .text:0000000000024350 mov eax, 1
983
+ .text:0000000000024355 lock xadd [rdi+4], eax
984
+ .text:000000000002435A retn
985
+
986
+ VEX code:
987
+ 00 | ------ IMark(0x424350, 5, 0) ------
988
+ 01 | PUT(rax) = 0x0000000000000001
989
+ 02 | PUT(rip) = 0x0000000000424355
990
+ 03 | ------ IMark(0x424355, 5, 0) ------
991
+ 04 | t11 = GET:I64(rdi)
992
+ 05 | t10 = Add64(t11,0x0000000000000004)
993
+ 06 | t0 = LDle:I32(t10)
994
+ 07 | t2 = Add32(t0,0x00000001)
995
+ 08 | t(4,4294967295) = CASle(t10 :: (t0,None)->(t2,None))
996
+ 09 | t14 = CasCmpNE32(t4,t0)
997
+ 10 | if (t14) { PUT(rip) = 0x424355; Ijk_Boring }
998
+ 11 | PUT(cc_op) = 0x0000000000000003
999
+ 12 | t15 = 32Uto64(t0)
1000
+ 13 | PUT(cc_dep1) = t15
1001
+ 14 | PUT(cc_dep2) = 0x0000000000000001
1002
+ 15 | t17 = 32Uto64(t0)
1003
+ 16 | PUT(rax) = t17
1004
+ 17 | PUT(rip) = 0x000000000042435a
1005
+ 18 | ------ IMark(0x42435a, 1, 0) ------
1006
+ 19 | t6 = GET:I64(rsp)
1007
+ 20 | t7 = LDle:I64(t6)
1008
+ 21 | t8 = Add64(t6,0x0000000000000008)
1009
+ 22 | PUT(rsp) = t8
1010
+ 23 | t18 = Sub64(t8,0x0000000000000080)
1011
+ 24 | ====== AbiHint(0xt18, 128, t7) ======
1012
+ NEXT: PUT(rip) = t7; Ijk_Ret
1013
+
1014
+ This block acts as both a return endpoint and a transition endpoint (transitioning to 0x424355).
1015
+
1016
+ :param endpoint_node: The endpoint node.
1017
+ :param sort: Type of the endpoint.
1018
+ :return: None
1019
+ """
1020
+
1021
+ self._endpoints[sort].add(endpoint_node)
1022
+
1023
+ def mark_nonreturning_calls_endpoints(self):
1024
+ """
1025
+ Iterate through all call edges in transition graph. For each call a non-returning function, mark the source
1026
+ basic block as an endpoint.
1027
+
1028
+ This method should only be executed once all functions are recovered and analyzed by CFG recovery, so we know
1029
+ whether each function returns or not.
1030
+
1031
+ :return: None
1032
+ """
1033
+
1034
+ for src, dst, data in self.transition_graph.edges(data=True):
1035
+ if "type" in data and data["type"] == "call":
1036
+ func_addr = dst.addr
1037
+ if func_addr in self._function_manager:
1038
+ function = self._function_manager[func_addr]
1039
+ if function.returning is False:
1040
+ # the target function does not return
1041
+ the_node = self.get_node(src.addr)
1042
+ self._callout_sites.add(the_node)
1043
+ self._add_endpoint(the_node, "call")
1044
+
1045
+ def get_call_sites(self) -> Iterable[int]:
1046
+ """
1047
+ Gets a list of all the basic blocks that end in calls.
1048
+
1049
+ :return: A view of the addresses of the blocks that end in calls.
1050
+ """
1051
+ return self._call_sites.keys()
1052
+
1053
+ def get_call_target(self, callsite_addr):
1054
+ """
1055
+ Get the target of a call.
1056
+
1057
+ :param callsite_addr: The address of a basic block that ends in a call.
1058
+ :return: The target of said call, or None if callsite_addr is not a
1059
+ callsite.
1060
+ """
1061
+ if callsite_addr in self._call_sites:
1062
+ return self._call_sites[callsite_addr][0]
1063
+ return None
1064
+
1065
+ def get_call_return(self, callsite_addr):
1066
+ """
1067
+ Get the hypothetical return address of a call.
1068
+
1069
+ :param callsite_addr: The address of the basic block that ends in a call.
1070
+ :return: The likely return target of said call, or None if callsite_addr
1071
+ is not a callsite.
1072
+ """
1073
+ if callsite_addr in self._call_sites:
1074
+ return self._call_sites[callsite_addr][1]
1075
+ return None
1076
+
1077
+ @property
1078
+ def graph(self):
1079
+ """
1080
+ Get a local transition graph. A local transition graph is a transition graph that only contains nodes that
1081
+ belong to the current function. All edges, except for the edges going out from the current function or coming
1082
+ from outside the current function, are included.
1083
+
1084
+ The generated graph is cached in self._local_transition_graph.
1085
+
1086
+ :return: A local transition graph.
1087
+ :rtype: networkx.DiGraph
1088
+ """
1089
+
1090
+ if self._local_transition_graph is not None:
1091
+ return self._local_transition_graph
1092
+
1093
+ g = networkx.classes.digraph.DiGraph()
1094
+ if self.startpoint is not None:
1095
+ g.add_node(self.startpoint)
1096
+ for block in self._local_blocks.values():
1097
+ g.add_node(block)
1098
+ for src, dst, data in self.transition_graph.edges(data=True):
1099
+ if "type" in data:
1100
+ if data["type"] in ("transition", "exception") and ("outside" not in data or data["outside"] is False):
1101
+ g.add_edge(src, dst, **data)
1102
+ elif data["type"] == "fake_return" and ("outside" not in data or data["outside"] is False):
1103
+ g.add_edge(src, dst, **data)
1104
+
1105
+ self._local_transition_graph = g
1106
+
1107
+ return g
1108
+
1109
+ def graph_ex(self, exception_edges=True):
1110
+ """
1111
+ Get a local transition graph with a custom configuration. A local transition graph is a transition graph that
1112
+ only contains nodes that belong to the current function. This method allows user to exclude certain types of
1113
+ edges together with the nodes that are only reachable through such edges, such as exception edges.
1114
+
1115
+ The generated graph is not cached.
1116
+
1117
+ :param bool exception_edges: Should exception edges and the nodes that are only reachable through exception
1118
+ edges be kept.
1119
+ :return: A local transition graph with a special configuration.
1120
+ :rtype: networkx.DiGraph
1121
+ """
1122
+
1123
+ # graph_ex() should not impact any already cached graph
1124
+ old_cached_graph = self._local_transition_graph
1125
+ graph = self.graph
1126
+ self._local_transition_graph = old_cached_graph # restore the cached graph
1127
+
1128
+ # fast path
1129
+ if exception_edges:
1130
+ return graph
1131
+
1132
+ # BFS on local graph but ignoring certain types of graphs
1133
+ g = networkx.classes.digraph.DiGraph()
1134
+ queue = [n for n in graph if n is self.startpoint or graph.in_degree[n] == 0]
1135
+ traversed = set(queue)
1136
+
1137
+ while queue:
1138
+ node = queue.pop(0)
1139
+
1140
+ g.add_node(node)
1141
+ for _, dst, edge_data in graph.out_edges(node, data=True):
1142
+ edge_type = edge_data.get("type", None)
1143
+ if not exception_edges and edge_type == "exception":
1144
+ # ignore this edge
1145
+ continue
1146
+ g.add_edge(node, dst, **edge_data)
1147
+
1148
+ if dst not in traversed:
1149
+ traversed.add(dst)
1150
+ queue.append(dst)
1151
+
1152
+ return g
1153
+
1154
+ def transition_graph_ex(self, exception_edges=True):
1155
+ """
1156
+ Get a transition graph with a custom configuration. This method allows user to exclude certain types of edges
1157
+ together with the nodes that are only reachable through such edges, such as exception edges.
1158
+
1159
+ The generated graph is not cached.
1160
+
1161
+ :param bool exception_edges: Should exception edges and the nodes that are only reachable through exception
1162
+ edges be kept.
1163
+ :return: A local transition graph with a special configuration.
1164
+ :rtype: networkx.DiGraph
1165
+ """
1166
+
1167
+ graph = self.transition_graph
1168
+
1169
+ # fast path
1170
+ if exception_edges:
1171
+ return graph
1172
+
1173
+ # BFS on local graph but ignoring certain types of graphs
1174
+ g = networkx.classes.digraph.DiGraph()
1175
+ queue = [n for n in graph if n is self.startpoint or graph.in_degree[n] == 0]
1176
+ traversed = set(queue)
1177
+
1178
+ while queue:
1179
+ node = queue.pop(0)
1180
+ traversed.add(node)
1181
+
1182
+ g.add_node(node)
1183
+ for _, dst, edge_data in graph.out_edges(node, data=True):
1184
+ edge_type = edge_data.get("type", None)
1185
+ if not exception_edges and edge_type == "exception":
1186
+ # ignore this edge
1187
+ continue
1188
+ g.add_edge(node, dst, **edge_data)
1189
+
1190
+ if dst not in traversed:
1191
+ traversed.add(dst)
1192
+ queue.append(dst)
1193
+
1194
+ return g
1195
+
1196
+ def subgraph(self, ins_addrs):
1197
+ """
1198
+ Generate a sub control flow graph of instruction addresses based on self.graph
1199
+
1200
+ :param iterable ins_addrs: A collection of instruction addresses that should be included in the subgraph.
1201
+ :return networkx.DiGraph: A subgraph.
1202
+ """
1203
+
1204
+ # find all basic blocks that include those instructions
1205
+ blocks = []
1206
+ block_addr_to_insns = {}
1207
+
1208
+ for b in self._local_blocks.values():
1209
+ # TODO: should I call get_blocks?
1210
+ block = self.get_block(b.addr, size=b.size, byte_string=b.bytestr)
1211
+ common_insns = set(block.instruction_addrs).intersection(ins_addrs)
1212
+ if common_insns:
1213
+ blocks.append(b)
1214
+ block_addr_to_insns[b.addr] = sorted(common_insns)
1215
+
1216
+ # subgraph = networkx.subgraph(self.graph, blocks)
1217
+ subgraph = self.graph.subgraph(blocks).copy()
1218
+ g = networkx.classes.digraph.DiGraph()
1219
+
1220
+ for n in subgraph.nodes():
1221
+ insns = block_addr_to_insns[n.addr]
1222
+
1223
+ in_edges = subgraph.in_edges(n)
1224
+ # out_edges = subgraph.out_edges(n)
1225
+ if len(in_edges) > 1:
1226
+ # the first instruction address should be included
1227
+ if n.addr not in insns:
1228
+ insns = [n.addr] + insns
1229
+
1230
+ for src, _ in in_edges:
1231
+ last_instr = block_addr_to_insns[src.addr][-1]
1232
+ g.add_edge(last_instr, insns[0])
1233
+
1234
+ for i in range(0, len(insns) - 1):
1235
+ g.add_edge(insns[i], insns[i + 1])
1236
+
1237
+ return g
1238
+
1239
+ def instruction_size(self, insn_addr):
1240
+ """
1241
+ Get the size of the instruction specified by `insn_addr`.
1242
+
1243
+ :param int insn_addr: Address of the instruction
1244
+ :return int: Size of the instruction in bytes, or None if the instruction is not found.
1245
+ """
1246
+
1247
+ for block in self.blocks:
1248
+ if insn_addr in block.instruction_addrs:
1249
+ index = block.instruction_addrs.index(insn_addr)
1250
+ if index == len(block.instruction_addrs) - 1:
1251
+ # the very last instruction
1252
+ size = block.addr + block.size - insn_addr
1253
+ else:
1254
+ size = block.instruction_addrs[index + 1] - insn_addr
1255
+ return size
1256
+
1257
+ return None
1258
+
1259
+ def addr_to_instruction_addr(self, addr):
1260
+ """
1261
+ Obtain the address of the instruction that covers @addr.
1262
+
1263
+ :param int addr: An address.
1264
+ :return: Address of the instruction that covers @addr, or None if this addr is not covered by any
1265
+ instruction of this function.
1266
+ :rtype: int or None
1267
+ """
1268
+
1269
+ # TODO: Replace the linear search with binary search
1270
+ for b in self.blocks:
1271
+ if b.addr <= addr < b.addr + b.size:
1272
+ # found it
1273
+ for i, instr_addr in enumerate(b.instruction_addrs):
1274
+ if i < len(b.instruction_addrs) - 1 and instr_addr <= addr < b.instruction_addrs[i + 1]:
1275
+ return instr_addr
1276
+ elif i == len(b.instruction_addrs) - 1 and instr_addr <= addr:
1277
+ return instr_addr
1278
+ # Not covered by any instruction... why?
1279
+ return None
1280
+ return None
1281
+
1282
+ def dbg_print(self):
1283
+ """
1284
+ Returns a representation of the list of basic blocks in this function.
1285
+ """
1286
+ return "[%s]" % (", ".join(("%#08x" % n.addr) for n in self.transition_graph.nodes()))
1287
+
1288
+ def dbg_draw(self, filename):
1289
+ """
1290
+ Draw the graph and save it to a PNG file.
1291
+ """
1292
+ import matplotlib.pyplot as pyplot # pylint: disable=import-error
1293
+ from networkx.drawing.nx_agraph import graphviz_layout # pylint: disable=import-error
1294
+
1295
+ tmp_graph = networkx.classes.digraph.DiGraph()
1296
+ for from_block, to_block in self.transition_graph.edges():
1297
+ node_a = "%#08x" % from_block.addr
1298
+ node_b = "%#08x" % to_block.addr
1299
+ if node_b in self._ret_sites:
1300
+ node_b += "[Ret]"
1301
+ if node_a in self._call_sites:
1302
+ node_a += "[Call]"
1303
+ tmp_graph.add_edge(node_a, node_b)
1304
+ pos = graphviz_layout(tmp_graph, prog="fdp") # pylint: disable=no-member
1305
+ networkx.draw(tmp_graph, pos, node_size=1200)
1306
+ pyplot.savefig(filename)
1307
+
1308
+ def _add_argument_register(self, reg_offset):
1309
+ """
1310
+ Registers a register offset as being used as an argument to the function.
1311
+
1312
+ :param reg_offset: The offset of the register to register.
1313
+ """
1314
+ if reg_offset in self._function_manager._arg_registers and reg_offset not in self._argument_registers:
1315
+ self._argument_registers.append(reg_offset)
1316
+
1317
+ def _add_argument_stack_variable(self, stack_var_offset):
1318
+ if stack_var_offset not in self._argument_stack_variables:
1319
+ self._argument_stack_variables.append(stack_var_offset)
1320
+
1321
+ @property
1322
+ def arguments(self):
1323
+ if self.calling_convention is None:
1324
+ return self._argument_registers + self._argument_stack_variables
1325
+ else:
1326
+ if self.prototype is None:
1327
+ return []
1328
+ return self.calling_convention.arg_locs(self.prototype)
1329
+
1330
+ @property
1331
+ def has_return(self):
1332
+ return len(self._ret_sites) > 0
1333
+
1334
+ @property
1335
+ def callable(self):
1336
+ return self._project.factory.callable(self.addr)
1337
+
1338
+ def normalize(self):
1339
+ """
1340
+ Make sure all basic blocks in the transition graph of this function do not overlap. You will end up with a CFG
1341
+ that IDA Pro generates.
1342
+
1343
+ This method does not touch the CFG result. You may call CFG{Emulated, Fast}.normalize() for that matter.
1344
+
1345
+ :return: None
1346
+ """
1347
+
1348
+ # let's put a check here
1349
+ if self.startpoint is None:
1350
+ # this function is empty
1351
+ l.debug("Unexpected error: %s does not have any blocks. normalize() fails.", repr(self))
1352
+ return
1353
+
1354
+ graph = self.transition_graph
1355
+ end_addresses = defaultdict(list)
1356
+
1357
+ for block in self.nodes:
1358
+ if isinstance(block, BlockNode):
1359
+ end_addr = block.addr + block.size
1360
+ end_addresses[end_addr].append(block)
1361
+
1362
+ while any(len(x) > 1 for x in end_addresses.values()):
1363
+ end_addr, all_nodes = next((end_addr, x) for (end_addr, x) in end_addresses.items() if len(x) > 1)
1364
+
1365
+ all_nodes = sorted(all_nodes, key=lambda node: node.size)
1366
+ smallest_node = all_nodes[0]
1367
+ other_nodes = all_nodes[1:]
1368
+
1369
+ is_outside_node = False
1370
+ if smallest_node not in graph:
1371
+ is_outside_node = True
1372
+
1373
+ # Break other nodes
1374
+ for n in other_nodes:
1375
+ new_size = get_real_address_if_arm(self._project.arch, smallest_node.addr) - get_real_address_if_arm(
1376
+ self._project.arch, n.addr
1377
+ )
1378
+ if new_size == 0:
1379
+ # This is the node that has the same size as the smallest one
1380
+ continue
1381
+
1382
+ new_end_addr = n.addr + new_size
1383
+
1384
+ # Does it already exist?
1385
+ new_node = None
1386
+ if new_end_addr in end_addresses:
1387
+ nodes = [i for i in end_addresses[new_end_addr] if i.addr == n.addr]
1388
+ if len(nodes) > 0:
1389
+ new_node = nodes[0]
1390
+
1391
+ if new_node is None:
1392
+ # TODO: Do this correctly for hook nodes
1393
+ # Create a new one
1394
+ new_node = BlockNode(n.addr, new_size, graph=graph, thumb=n.thumb)
1395
+ self._block_sizes[n.addr] = new_size
1396
+ self._addr_to_block_node[n.addr] = new_node
1397
+ # Put the newnode into end_addresses
1398
+ end_addresses[new_end_addr].append(new_node)
1399
+
1400
+ # Modify the CFG
1401
+ original_predecessors = list(graph.in_edges([n], data=True))
1402
+ original_successors = list(graph.out_edges([n], data=True))
1403
+
1404
+ for _, d, data in original_successors:
1405
+ ins_addr = data.get("ins_addr", data.get("pseudo_ins_addr", None))
1406
+ if ins_addr is not None and ins_addr < d.addr:
1407
+ continue
1408
+ if d not in graph[smallest_node]:
1409
+ if d is n:
1410
+ graph.add_edge(smallest_node, new_node, **data)
1411
+ else:
1412
+ graph.add_edge(smallest_node, d, **data)
1413
+
1414
+ for p, _, _ in original_predecessors:
1415
+ graph.remove_edge(p, n)
1416
+ graph.remove_node(n)
1417
+
1418
+ # update local_blocks
1419
+ if n.addr in self._local_blocks and self._local_blocks[n.addr].size != new_node.size:
1420
+ del self._local_blocks[n.addr]
1421
+ self._local_blocks[n.addr] = new_node
1422
+
1423
+ # update block_cache and block_sizes
1424
+ if (n.addr in self._block_cache and self._block_cache[n.addr].size != new_node.size) or (
1425
+ n.addr in self._block_sizes and self._block_sizes[n.addr] != new_node.size
1426
+ ):
1427
+ # the cache needs updating
1428
+ self._block_cache.pop(n.addr, None)
1429
+ self._block_sizes[n.addr] = new_node.size
1430
+
1431
+ for p, _, data in original_predecessors:
1432
+ if p not in other_nodes:
1433
+ graph.add_edge(p, new_node, **data)
1434
+
1435
+ # We should find the correct successor
1436
+ new_successors = [i for i in all_nodes if i.addr == smallest_node.addr]
1437
+ if new_successors:
1438
+ new_successor = new_successors[0]
1439
+ graph.add_edge(
1440
+ new_node,
1441
+ new_successor,
1442
+ type="transition",
1443
+ outside=is_outside_node,
1444
+ # it's named "pseudo_ins_addr" because we have no way to know what the actual last
1445
+ # instruction is at this moment (without re-lifting the block, which would be a
1446
+ # waste of time).
1447
+ pseudo_ins_addr=new_node.addr + new_node.size - 1,
1448
+ )
1449
+ else:
1450
+ # We gotta create a new one
1451
+ l.error("normalize(): Please report it to Fish/maybe john.")
1452
+
1453
+ end_addresses[end_addr] = [smallest_node]
1454
+
1455
+ # Rebuild startpoint
1456
+ if self.startpoint.size != self._block_sizes[self.startpoint.addr]:
1457
+ self.startpoint = self.get_node(self.startpoint.addr)
1458
+
1459
+ # Clear the cache
1460
+ self._local_transition_graph = None
1461
+
1462
+ self.normalized = True
1463
+
1464
+ def find_declaration(self, ignore_binary_name: bool = False, binary_name_hint: str = None) -> bool:
1465
+ """
1466
+ Find the most likely function declaration from the embedded collection of prototypes, set it to self.prototype,
1467
+ and update self.calling_convention with the declaration.
1468
+
1469
+ :param ignore_binary_name: Do not rely on the executable or library where the function belongs to determine
1470
+ its source library. This is useful when working on statically linked binaries
1471
+ (because all functions will belong to the main executable). We will search for all
1472
+ libraries in angr to find the first declaration match.
1473
+ :param binary_name_hint: Substring of the library name where this function might be originally coming from.
1474
+ Useful for FLIRT-identified functions in statically linked binaries.
1475
+ :return: True if a declaration is found and self.prototype and self.calling_convention are
1476
+ updated. False if we fail to find a matching function declaration, in which case
1477
+ self.prototype or self.calling_convention will be kept untouched.
1478
+ """
1479
+
1480
+ if not ignore_binary_name:
1481
+ # determine the library name
1482
+ if not self.is_plt:
1483
+ binary_name = self.binary_name
1484
+ if binary_name not in SIM_LIBRARIES:
1485
+ return False
1486
+ else:
1487
+ binary_name = None
1488
+ # PLT entries must have the same declaration as their jump targets
1489
+ # Try to determine which library this PLT entry will jump to
1490
+ edges = self.transition_graph.edges()
1491
+ if len(edges) == 0:
1492
+ return False
1493
+ node = next(iter(edges))[1]
1494
+ if len(edges) == 1 and (type(node) is HookNode or type(node) is SyscallNode):
1495
+ target = node.addr
1496
+ if target in self._function_manager:
1497
+ target_func = self._function_manager[target]
1498
+ binary_name = target_func.binary_name
1499
+
1500
+ # cannot determine the binary name. since we are forced to respect binary name, we give up in this case.
1501
+ if binary_name is None:
1502
+ return False
1503
+
1504
+ lib = SIM_LIBRARIES.get(binary_name, None)
1505
+ libraries = set()
1506
+ if lib is not None:
1507
+ libraries.add(lib)
1508
+
1509
+ else:
1510
+ # try all libraries or all libraries that match the given library name hint
1511
+ libraries = set()
1512
+ for lib_name, lib in SIM_LIBRARIES.items():
1513
+ # TODO: Add support for syscall libraries. Note that syscall libraries have different function
1514
+ # prototypes for .has_prototype() and .get_prototype()...
1515
+ if not isinstance(lib, SimSyscallLibrary):
1516
+ if binary_name_hint:
1517
+ if binary_name_hint.lower() in lib_name.lower():
1518
+ libraries.add(lib)
1519
+ else:
1520
+ libraries.add(lib)
1521
+
1522
+ if not libraries:
1523
+ return False
1524
+
1525
+ name_variants = [self.name]
1526
+ # remove "_" prefixes
1527
+ if self.name.startswith("_"):
1528
+ name_variants.append(self.name[1:])
1529
+ if self.name.startswith("__"):
1530
+ name_variants.append(self.name[2:])
1531
+ # special handling for libc
1532
+ if self.name.startswith("__libc_"):
1533
+ name_variants.append(self.name[7:])
1534
+
1535
+ for library in libraries:
1536
+ for name in name_variants:
1537
+ if isinstance(library, SimSyscallLibrary):
1538
+ # FIXME: we don't support getting declaration from a syscall library yet. we don't have the concept
1539
+ # of abi at this point.
1540
+ continue
1541
+ if not library.has_prototype(name):
1542
+ continue
1543
+
1544
+ proto = library.get_prototype(name)
1545
+ if self.project is None:
1546
+ # we need to get arch from self.project
1547
+ l.warning(
1548
+ "Function %s does not have .project set. A possible prototype is found, but we cannot set it "
1549
+ "without .project.arch."
1550
+ )
1551
+ return False
1552
+ self.prototype = proto.with_arch(self.project.arch)
1553
+ self.prototype_libname = library.name
1554
+
1555
+ # update self.calling_convention if necessary
1556
+ if self.calling_convention is None:
1557
+ if self.project.arch.name in library.default_ccs:
1558
+ self.calling_convention = library.default_ccs[self.project.arch.name](self.project.arch)
1559
+ elif self.project.arch.name in DEFAULT_CC:
1560
+ self.calling_convention = default_cc(
1561
+ self.project.arch.name,
1562
+ platform=self.project.simos.name if self.project.simos is not None else None,
1563
+ )(self.project.arch)
1564
+
1565
+ return True
1566
+
1567
+ return False
1568
+
1569
+ @staticmethod
1570
+ def _addr_to_funcloc(addr):
1571
+ # FIXME
1572
+ if isinstance(addr, tuple):
1573
+ return addr[0]
1574
+ else: # int, long
1575
+ return addr
1576
+
1577
+ @property
1578
+ def demangled_name(self):
1579
+ if self.name[0:2] == "_Z":
1580
+ try:
1581
+ ast = parse(self.name)
1582
+ except (NotImplementedError, KeyError): # itanium demangler is not the most robust package in the world
1583
+ return self.name
1584
+ if ast:
1585
+ return ast.__str__()
1586
+ return self.name
1587
+
1588
+ def get_unambiguous_name(self, display_name: str | None = None) -> str:
1589
+ """
1590
+ Get a disambiguated function name.
1591
+
1592
+ :param display_name: Name to display, otherwise the function name.
1593
+ :return: The function name in the form:
1594
+ ::<name> when the function binary is the main object.
1595
+ ::<obj>::<name> when the function binary is not the main object.
1596
+ ::<addr>::<name> when the function binary is an unnamed non-main object, or when multiple functions with
1597
+ the same name are defined in the function binary.
1598
+ """
1599
+ must_disambiguate_by_addr = self.binary is not self.project.loader.main_object and self.binary_name is None
1600
+
1601
+ # If there are multiple functions with the same name in the same object, disambiguate by address
1602
+ if not must_disambiguate_by_addr:
1603
+ for func in self._function_manager.get_by_name(self.name):
1604
+ if func is not self and func.binary is self.binary:
1605
+ must_disambiguate_by_addr = True
1606
+ break
1607
+
1608
+ separator = "::"
1609
+ n = separator
1610
+ if must_disambiguate_by_addr:
1611
+ n += hex(self.addr) + separator
1612
+ elif self.binary is not self.project.loader.main_object:
1613
+ n += self.binary_name + separator
1614
+ return n + (display_name or self.name)
1615
+
1616
+ def apply_definition(self, definition: str, calling_convention: SimCC | type[SimCC] | None = None) -> None:
1617
+ if not definition.endswith(";"):
1618
+ definition += ";"
1619
+ func_def = parse_defns(definition, arch=self.project.arch)
1620
+ if len(func_def.keys()) > 1:
1621
+ raise Exception("Too many definitions: %s " % list(func_def.keys()))
1622
+
1623
+ name: str
1624
+ ty: SimTypeFunction
1625
+ name, ty = func_def.popitem()
1626
+ self.name = name
1627
+ self.prototype = ty.with_arch(self.project.arch)
1628
+ # setup the calling convention
1629
+ # If a SimCC object is passed assume that this is sane and just use it
1630
+ if isinstance(calling_convention, SimCC):
1631
+ self.calling_convention = calling_convention
1632
+
1633
+ # If it is a subclass of SimCC we can instantiate it
1634
+ elif isinstance(calling_convention, type) and issubclass(calling_convention, SimCC):
1635
+ self.calling_convention = calling_convention(self.project.arch)
1636
+
1637
+ # If none is specified default to something
1638
+ elif calling_convention is None:
1639
+ self.calling_convention = self.project.factory.cc()
1640
+
1641
+ else:
1642
+ raise TypeError("calling_convention has to be one of: [SimCC, type(SimCC), None]")
1643
+
1644
+ def functions_reachable(self) -> set["Function"]:
1645
+ """
1646
+ :return: The set of all functions that can be reached from the function represented by self.
1647
+ """
1648
+ called = set()
1649
+
1650
+ def _find_called(function_address):
1651
+ successors = set(self._function_manager.callgraph.successors(function_address)) - called
1652
+ for s in successors:
1653
+ called.add(s)
1654
+ _find_called(s)
1655
+
1656
+ _find_called(self.addr)
1657
+ return {self._function_manager.function(a) for a in called}
1658
+
1659
+ def copy(self):
1660
+ func = Function(self._function_manager, self.addr, name=self.name, syscall=self.is_syscall)
1661
+ func.transition_graph = networkx.DiGraph(self.transition_graph)
1662
+ func.normalized = self.normalized
1663
+ func._ret_sites = self._ret_sites.copy()
1664
+ func._jumpout_sites = self._jumpout_sites.copy()
1665
+ func._retout_sites = self._retout_sites.copy()
1666
+ func._endpoints = self._endpoints.copy()
1667
+ func._call_sites = self._call_sites.copy()
1668
+ func._project = self._project
1669
+ func.is_plt = self.is_plt
1670
+ func.is_simprocedure = self.is_simprocedure
1671
+ func.binary_name = self.binary_name
1672
+ func.bp_on_stack = self.bp_on_stack
1673
+ func.retaddr_on_stack = self.retaddr_on_stack
1674
+ func.sp_delta = self.sp_delta
1675
+ func.calling_convention = self.calling_convention
1676
+ func.prototype = self.prototype
1677
+ func._returning = self._returning
1678
+ func.alignment = self.is_alignment
1679
+ func.startpoint = self.startpoint
1680
+ func._addr_to_block_node = self._addr_to_block_node.copy()
1681
+ func._block_sizes = self._block_sizes.copy()
1682
+ func._block_cache = self._block_cache.copy()
1683
+ func._local_blocks = self._local_blocks.copy()
1684
+ func._local_block_addrs = self._local_block_addrs.copy()
1685
+ func.info = self.info.copy()
1686
+ func.tags = self.tags
1687
+
1688
+ return func
1689
+
1690
+ def pp(self, **kwargs):
1691
+ """
1692
+ Pretty-print the function disassembly.
1693
+ """
1694
+ print(self.project.analyses.Disassembly(self).render(**kwargs))