angr 9.2.165__cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

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

Potentially problematic release.


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

Files changed (1409) hide show
  1. angr/__init__.py +366 -0
  2. angr/__main__.py +152 -0
  3. angr/ailment/__init__.py +81 -0
  4. angr/ailment/block.py +81 -0
  5. angr/ailment/block_walker.py +845 -0
  6. angr/ailment/constant.py +3 -0
  7. angr/ailment/converter_common.py +11 -0
  8. angr/ailment/converter_pcode.py +623 -0
  9. angr/ailment/converter_vex.py +798 -0
  10. angr/ailment/expression.py +1655 -0
  11. angr/ailment/manager.py +33 -0
  12. angr/ailment/statement.py +978 -0
  13. angr/ailment/tagged_object.py +61 -0
  14. angr/ailment/utils.py +114 -0
  15. angr/analyses/__init__.py +113 -0
  16. angr/analyses/analysis.py +429 -0
  17. angr/analyses/backward_slice.py +686 -0
  18. angr/analyses/binary_optimizer.py +670 -0
  19. angr/analyses/bindiff.py +1512 -0
  20. angr/analyses/boyscout.py +76 -0
  21. angr/analyses/callee_cleanup_finder.py +74 -0
  22. angr/analyses/calling_convention/__init__.py +6 -0
  23. angr/analyses/calling_convention/calling_convention.py +1096 -0
  24. angr/analyses/calling_convention/fact_collector.py +636 -0
  25. angr/analyses/calling_convention/utils.py +60 -0
  26. angr/analyses/cdg.py +189 -0
  27. angr/analyses/cfg/__init__.py +23 -0
  28. angr/analyses/cfg/cfb.py +428 -0
  29. angr/analyses/cfg/cfg.py +74 -0
  30. angr/analyses/cfg/cfg_arch_options.py +95 -0
  31. angr/analyses/cfg/cfg_base.py +2909 -0
  32. angr/analyses/cfg/cfg_emulated.py +3451 -0
  33. angr/analyses/cfg/cfg_fast.py +5316 -0
  34. angr/analyses/cfg/cfg_fast_soot.py +662 -0
  35. angr/analyses/cfg/cfg_job_base.py +203 -0
  36. angr/analyses/cfg/indirect_jump_resolvers/__init__.py +28 -0
  37. angr/analyses/cfg/indirect_jump_resolvers/amd64_elf_got.py +62 -0
  38. angr/analyses/cfg/indirect_jump_resolvers/amd64_pe_iat.py +51 -0
  39. angr/analyses/cfg/indirect_jump_resolvers/arm_elf_fast.py +159 -0
  40. angr/analyses/cfg/indirect_jump_resolvers/const_resolver.py +339 -0
  41. angr/analyses/cfg/indirect_jump_resolvers/constant_value_manager.py +107 -0
  42. angr/analyses/cfg/indirect_jump_resolvers/default_resolvers.py +76 -0
  43. angr/analyses/cfg/indirect_jump_resolvers/jumptable.py +2367 -0
  44. angr/analyses/cfg/indirect_jump_resolvers/memload_resolver.py +81 -0
  45. angr/analyses/cfg/indirect_jump_resolvers/mips_elf_fast.py +286 -0
  46. angr/analyses/cfg/indirect_jump_resolvers/mips_elf_got.py +148 -0
  47. angr/analyses/cfg/indirect_jump_resolvers/propagator_utils.py +46 -0
  48. angr/analyses/cfg/indirect_jump_resolvers/resolver.py +74 -0
  49. angr/analyses/cfg/indirect_jump_resolvers/syscall_resolver.py +92 -0
  50. angr/analyses/cfg/indirect_jump_resolvers/x86_elf_pic_plt.py +88 -0
  51. angr/analyses/cfg/indirect_jump_resolvers/x86_pe_iat.py +47 -0
  52. angr/analyses/cfg_slice_to_sink/__init__.py +11 -0
  53. angr/analyses/cfg_slice_to_sink/cfg_slice_to_sink.py +117 -0
  54. angr/analyses/cfg_slice_to_sink/graph.py +87 -0
  55. angr/analyses/cfg_slice_to_sink/transitions.py +27 -0
  56. angr/analyses/class_identifier.py +63 -0
  57. angr/analyses/code_tagging.py +123 -0
  58. angr/analyses/codecave.py +77 -0
  59. angr/analyses/complete_calling_conventions.py +461 -0
  60. angr/analyses/congruency_check.py +377 -0
  61. angr/analyses/data_dep/__init__.py +16 -0
  62. angr/analyses/data_dep/data_dependency_analysis.py +595 -0
  63. angr/analyses/data_dep/dep_nodes.py +171 -0
  64. angr/analyses/data_dep/sim_act_location.py +49 -0
  65. angr/analyses/datagraph_meta.py +105 -0
  66. angr/analyses/ddg.py +1670 -0
  67. angr/analyses/decompiler/__init__.py +41 -0
  68. angr/analyses/decompiler/ail_simplifier.py +2085 -0
  69. angr/analyses/decompiler/ailgraph_walker.py +49 -0
  70. angr/analyses/decompiler/block_io_finder.py +302 -0
  71. angr/analyses/decompiler/block_similarity.py +196 -0
  72. angr/analyses/decompiler/block_simplifier.py +376 -0
  73. angr/analyses/decompiler/callsite_maker.py +571 -0
  74. angr/analyses/decompiler/ccall_rewriters/__init__.py +9 -0
  75. angr/analyses/decompiler/ccall_rewriters/amd64_ccalls.py +580 -0
  76. angr/analyses/decompiler/ccall_rewriters/rewriter_base.py +20 -0
  77. angr/analyses/decompiler/ccall_rewriters/x86_ccalls.py +313 -0
  78. angr/analyses/decompiler/clinic.py +3308 -0
  79. angr/analyses/decompiler/condition_processor.py +1281 -0
  80. angr/analyses/decompiler/counters/__init__.py +16 -0
  81. angr/analyses/decompiler/counters/boolean_counter.py +27 -0
  82. angr/analyses/decompiler/counters/call_counter.py +57 -0
  83. angr/analyses/decompiler/counters/expression_counters.py +77 -0
  84. angr/analyses/decompiler/counters/seq_cf_structure_counter.py +63 -0
  85. angr/analyses/decompiler/decompilation_cache.py +46 -0
  86. angr/analyses/decompiler/decompilation_options.py +275 -0
  87. angr/analyses/decompiler/decompiler.py +710 -0
  88. angr/analyses/decompiler/dephication/__init__.py +6 -0
  89. angr/analyses/decompiler/dephication/dephication_base.py +100 -0
  90. angr/analyses/decompiler/dephication/graph_dephication.py +70 -0
  91. angr/analyses/decompiler/dephication/graph_rewriting.py +112 -0
  92. angr/analyses/decompiler/dephication/graph_vvar_mapping.py +363 -0
  93. angr/analyses/decompiler/dephication/rewriting_engine.py +527 -0
  94. angr/analyses/decompiler/dephication/seqnode_dephication.py +156 -0
  95. angr/analyses/decompiler/empty_node_remover.py +212 -0
  96. angr/analyses/decompiler/expression_narrower.py +287 -0
  97. angr/analyses/decompiler/goto_manager.py +112 -0
  98. angr/analyses/decompiler/graph_region.py +426 -0
  99. angr/analyses/decompiler/jump_target_collector.py +37 -0
  100. angr/analyses/decompiler/jumptable_entry_condition_rewriter.py +67 -0
  101. angr/analyses/decompiler/label_collector.py +32 -0
  102. angr/analyses/decompiler/optimization_passes/__init__.py +151 -0
  103. angr/analyses/decompiler/optimization_passes/base_ptr_save_simplifier.py +157 -0
  104. angr/analyses/decompiler/optimization_passes/call_stmt_rewriter.py +46 -0
  105. angr/analyses/decompiler/optimization_passes/code_motion.py +362 -0
  106. angr/analyses/decompiler/optimization_passes/condition_constprop.py +219 -0
  107. angr/analyses/decompiler/optimization_passes/const_derefs.py +266 -0
  108. angr/analyses/decompiler/optimization_passes/const_prop_reverter.py +365 -0
  109. angr/analyses/decompiler/optimization_passes/cross_jump_reverter.py +106 -0
  110. angr/analyses/decompiler/optimization_passes/deadblock_remover.py +82 -0
  111. angr/analyses/decompiler/optimization_passes/determine_load_sizes.py +64 -0
  112. angr/analyses/decompiler/optimization_passes/div_simplifier.py +425 -0
  113. angr/analyses/decompiler/optimization_passes/duplication_reverter/__init__.py +5 -0
  114. angr/analyses/decompiler/optimization_passes/duplication_reverter/ail_merge_graph.py +503 -0
  115. angr/analyses/decompiler/optimization_passes/duplication_reverter/duplication_reverter.py +1218 -0
  116. angr/analyses/decompiler/optimization_passes/duplication_reverter/errors.py +16 -0
  117. angr/analyses/decompiler/optimization_passes/duplication_reverter/similarity.py +126 -0
  118. angr/analyses/decompiler/optimization_passes/duplication_reverter/utils.py +167 -0
  119. angr/analyses/decompiler/optimization_passes/eager_std_string_concatenation.py +165 -0
  120. angr/analyses/decompiler/optimization_passes/engine_base.py +500 -0
  121. angr/analyses/decompiler/optimization_passes/expr_op_swapper.py +135 -0
  122. angr/analyses/decompiler/optimization_passes/flip_boolean_cmp.py +113 -0
  123. angr/analyses/decompiler/optimization_passes/inlined_string_transformation_simplifier.py +615 -0
  124. angr/analyses/decompiler/optimization_passes/ite_expr_converter.py +224 -0
  125. angr/analyses/decompiler/optimization_passes/ite_region_converter.py +335 -0
  126. angr/analyses/decompiler/optimization_passes/lowered_switch_simplifier.py +923 -0
  127. angr/analyses/decompiler/optimization_passes/mod_simplifier.py +99 -0
  128. angr/analyses/decompiler/optimization_passes/optimization_pass.py +703 -0
  129. angr/analyses/decompiler/optimization_passes/register_save_area_simplifier.py +221 -0
  130. angr/analyses/decompiler/optimization_passes/ret_addr_save_simplifier.py +171 -0
  131. angr/analyses/decompiler/optimization_passes/ret_deduplicator.py +222 -0
  132. angr/analyses/decompiler/optimization_passes/return_duplicator_base.py +640 -0
  133. angr/analyses/decompiler/optimization_passes/return_duplicator_high.py +61 -0
  134. angr/analyses/decompiler/optimization_passes/return_duplicator_low.py +237 -0
  135. angr/analyses/decompiler/optimization_passes/stack_canary_simplifier.py +333 -0
  136. angr/analyses/decompiler/optimization_passes/switch_default_case_duplicator.py +149 -0
  137. angr/analyses/decompiler/optimization_passes/switch_reused_entry_rewriter.py +102 -0
  138. angr/analyses/decompiler/optimization_passes/tag_slicer.py +41 -0
  139. angr/analyses/decompiler/optimization_passes/win_stack_canary_simplifier.py +421 -0
  140. angr/analyses/decompiler/optimization_passes/x86_gcc_getpc_simplifier.py +88 -0
  141. angr/analyses/decompiler/peephole_optimizations/__init__.py +129 -0
  142. angr/analyses/decompiler/peephole_optimizations/a_div_const_add_a_mul_n_div_const.py +42 -0
  143. angr/analyses/decompiler/peephole_optimizations/a_mul_const_div_shr_const.py +38 -0
  144. angr/analyses/decompiler/peephole_optimizations/a_mul_const_sub_a.py +34 -0
  145. angr/analyses/decompiler/peephole_optimizations/a_shl_const_sub_a.py +34 -0
  146. angr/analyses/decompiler/peephole_optimizations/a_sub_a_div.py +25 -0
  147. angr/analyses/decompiler/peephole_optimizations/a_sub_a_shr_const_shr_const.py +37 -0
  148. angr/analyses/decompiler/peephole_optimizations/a_sub_a_sub_n.py +23 -0
  149. angr/analyses/decompiler/peephole_optimizations/arm_cmpf.py +236 -0
  150. angr/analyses/decompiler/peephole_optimizations/base.py +157 -0
  151. angr/analyses/decompiler/peephole_optimizations/basepointeroffset_add_n.py +34 -0
  152. angr/analyses/decompiler/peephole_optimizations/basepointeroffset_and_mask.py +36 -0
  153. angr/analyses/decompiler/peephole_optimizations/bitwise_or_to_logical_or.py +34 -0
  154. angr/analyses/decompiler/peephole_optimizations/bool_expr_xor_1.py +27 -0
  155. angr/analyses/decompiler/peephole_optimizations/bswap.py +142 -0
  156. angr/analyses/decompiler/peephole_optimizations/cas_intrinsics.py +115 -0
  157. angr/analyses/decompiler/peephole_optimizations/cmpord_rewriter.py +71 -0
  158. angr/analyses/decompiler/peephole_optimizations/coalesce_adjacent_shrs.py +39 -0
  159. angr/analyses/decompiler/peephole_optimizations/coalesce_same_cascading_ifs.py +28 -0
  160. angr/analyses/decompiler/peephole_optimizations/constant_derefs.py +44 -0
  161. angr/analyses/decompiler/peephole_optimizations/conv_a_sub0_shr_and.py +69 -0
  162. angr/analyses/decompiler/peephole_optimizations/conv_shl_shr.py +52 -0
  163. angr/analyses/decompiler/peephole_optimizations/eager_eval.py +447 -0
  164. angr/analyses/decompiler/peephole_optimizations/extended_byte_and_mask.py +56 -0
  165. angr/analyses/decompiler/peephole_optimizations/inlined_memcpy.py +78 -0
  166. angr/analyses/decompiler/peephole_optimizations/inlined_strcpy.py +217 -0
  167. angr/analyses/decompiler/peephole_optimizations/inlined_strcpy_consolidation.py +106 -0
  168. angr/analyses/decompiler/peephole_optimizations/inlined_wstrcpy.py +170 -0
  169. angr/analyses/decompiler/peephole_optimizations/invert_negated_logical_conjuction_disjunction.py +50 -0
  170. angr/analyses/decompiler/peephole_optimizations/modulo_simplifier.py +89 -0
  171. angr/analyses/decompiler/peephole_optimizations/one_sub_bool.py +33 -0
  172. angr/analyses/decompiler/peephole_optimizations/optimized_div_simplifier.py +356 -0
  173. angr/analyses/decompiler/peephole_optimizations/remove_cascading_conversions.py +45 -0
  174. angr/analyses/decompiler/peephole_optimizations/remove_cxx_destructor_calls.py +32 -0
  175. angr/analyses/decompiler/peephole_optimizations/remove_empty_if_body.py +46 -0
  176. angr/analyses/decompiler/peephole_optimizations/remove_noop_conversions.py +47 -0
  177. angr/analyses/decompiler/peephole_optimizations/remove_redundant_bitmasks.py +125 -0
  178. angr/analyses/decompiler/peephole_optimizations/remove_redundant_conversions.py +273 -0
  179. angr/analyses/decompiler/peephole_optimizations/remove_redundant_ite_branch.py +30 -0
  180. angr/analyses/decompiler/peephole_optimizations/remove_redundant_ite_comparisons.py +54 -0
  181. angr/analyses/decompiler/peephole_optimizations/remove_redundant_nots.py +36 -0
  182. angr/analyses/decompiler/peephole_optimizations/remove_redundant_reinterprets.py +44 -0
  183. angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts.py +95 -0
  184. angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts_around_comparators.py +44 -0
  185. angr/analyses/decompiler/peephole_optimizations/rewrite_bit_extractions.py +85 -0
  186. angr/analyses/decompiler/peephole_optimizations/rewrite_conv_mul.py +40 -0
  187. angr/analyses/decompiler/peephole_optimizations/rewrite_cxx_operator_calls.py +90 -0
  188. angr/analyses/decompiler/peephole_optimizations/rewrite_mips_gp_loads.py +49 -0
  189. angr/analyses/decompiler/peephole_optimizations/rol_ror.py +130 -0
  190. angr/analyses/decompiler/peephole_optimizations/sar_to_signed_div.py +143 -0
  191. angr/analyses/decompiler/peephole_optimizations/shl_to_mul.py +25 -0
  192. angr/analyses/decompiler/peephole_optimizations/simplify_pc_relative_loads.py +51 -0
  193. angr/analyses/decompiler/peephole_optimizations/single_bit_cond_to_boolexpr.py +82 -0
  194. angr/analyses/decompiler/peephole_optimizations/single_bit_xor.py +29 -0
  195. angr/analyses/decompiler/peephole_optimizations/tidy_stack_addr.py +131 -0
  196. angr/analyses/decompiler/peephole_optimizations/utils.py +18 -0
  197. angr/analyses/decompiler/presets/__init__.py +20 -0
  198. angr/analyses/decompiler/presets/basic.py +32 -0
  199. angr/analyses/decompiler/presets/fast.py +58 -0
  200. angr/analyses/decompiler/presets/full.py +68 -0
  201. angr/analyses/decompiler/presets/preset.py +37 -0
  202. angr/analyses/decompiler/redundant_label_remover.py +134 -0
  203. angr/analyses/decompiler/region_identifier.py +1239 -0
  204. angr/analyses/decompiler/region_simplifiers/__init__.py +5 -0
  205. angr/analyses/decompiler/region_simplifiers/cascading_cond_transformer.py +95 -0
  206. angr/analyses/decompiler/region_simplifiers/cascading_ifs.py +82 -0
  207. angr/analyses/decompiler/region_simplifiers/expr_folding.py +818 -0
  208. angr/analyses/decompiler/region_simplifiers/goto.py +178 -0
  209. angr/analyses/decompiler/region_simplifiers/if_.py +135 -0
  210. angr/analyses/decompiler/region_simplifiers/ifelse.py +91 -0
  211. angr/analyses/decompiler/region_simplifiers/loop.py +143 -0
  212. angr/analyses/decompiler/region_simplifiers/node_address_finder.py +24 -0
  213. angr/analyses/decompiler/region_simplifiers/region_simplifier.py +246 -0
  214. angr/analyses/decompiler/region_simplifiers/switch_cluster_simplifier.py +654 -0
  215. angr/analyses/decompiler/region_simplifiers/switch_expr_simplifier.py +87 -0
  216. angr/analyses/decompiler/region_walker.py +24 -0
  217. angr/analyses/decompiler/return_maker.py +72 -0
  218. angr/analyses/decompiler/seq_to_blocks.py +20 -0
  219. angr/analyses/decompiler/sequence_walker.py +257 -0
  220. angr/analyses/decompiler/ssailification/__init__.py +4 -0
  221. angr/analyses/decompiler/ssailification/rewriting.py +379 -0
  222. angr/analyses/decompiler/ssailification/rewriting_engine.py +1053 -0
  223. angr/analyses/decompiler/ssailification/rewriting_state.py +61 -0
  224. angr/analyses/decompiler/ssailification/ssailification.py +276 -0
  225. angr/analyses/decompiler/ssailification/traversal.py +124 -0
  226. angr/analyses/decompiler/ssailification/traversal_engine.py +306 -0
  227. angr/analyses/decompiler/ssailification/traversal_state.py +48 -0
  228. angr/analyses/decompiler/stack_item.py +36 -0
  229. angr/analyses/decompiler/structured_codegen/__init__.py +25 -0
  230. angr/analyses/decompiler/structured_codegen/base.py +132 -0
  231. angr/analyses/decompiler/structured_codegen/c.py +4082 -0
  232. angr/analyses/decompiler/structured_codegen/dummy.py +15 -0
  233. angr/analyses/decompiler/structured_codegen/dwarf_import.py +190 -0
  234. angr/analyses/decompiler/structuring/__init__.py +30 -0
  235. angr/analyses/decompiler/structuring/dream.py +1217 -0
  236. angr/analyses/decompiler/structuring/phoenix.py +3090 -0
  237. angr/analyses/decompiler/structuring/recursive_structurer.py +187 -0
  238. angr/analyses/decompiler/structuring/sailr.py +120 -0
  239. angr/analyses/decompiler/structuring/structurer_base.py +1066 -0
  240. angr/analyses/decompiler/structuring/structurer_nodes.py +440 -0
  241. angr/analyses/decompiler/utils.py +1118 -0
  242. angr/analyses/deobfuscator/__init__.py +18 -0
  243. angr/analyses/deobfuscator/api_obf_finder.py +325 -0
  244. angr/analyses/deobfuscator/api_obf_peephole_optimizer.py +51 -0
  245. angr/analyses/deobfuscator/api_obf_type2_finder.py +166 -0
  246. angr/analyses/deobfuscator/irsb_reg_collector.py +54 -0
  247. angr/analyses/deobfuscator/string_obf_finder.py +959 -0
  248. angr/analyses/deobfuscator/string_obf_opt_passes.py +133 -0
  249. angr/analyses/deobfuscator/string_obf_peephole_optimizer.py +47 -0
  250. angr/analyses/disassembly.py +1295 -0
  251. angr/analyses/disassembly_utils.py +101 -0
  252. angr/analyses/dominance_frontier.py +57 -0
  253. angr/analyses/fcp/__init__.py +4 -0
  254. angr/analyses/fcp/fcp.py +427 -0
  255. angr/analyses/find_objects_static.py +205 -0
  256. angr/analyses/flirt/__init__.py +47 -0
  257. angr/analyses/flirt/consts.py +160 -0
  258. angr/analyses/flirt/flirt.py +244 -0
  259. angr/analyses/flirt/flirt_function.py +20 -0
  260. angr/analyses/flirt/flirt_matcher.py +351 -0
  261. angr/analyses/flirt/flirt_module.py +32 -0
  262. angr/analyses/flirt/flirt_node.py +23 -0
  263. angr/analyses/flirt/flirt_sig.py +359 -0
  264. angr/analyses/flirt/flirt_utils.py +31 -0
  265. angr/analyses/forward_analysis/__init__.py +12 -0
  266. angr/analyses/forward_analysis/forward_analysis.py +530 -0
  267. angr/analyses/forward_analysis/job_info.py +64 -0
  268. angr/analyses/forward_analysis/visitors/__init__.py +14 -0
  269. angr/analyses/forward_analysis/visitors/call_graph.py +29 -0
  270. angr/analyses/forward_analysis/visitors/function_graph.py +86 -0
  271. angr/analyses/forward_analysis/visitors/graph.py +242 -0
  272. angr/analyses/forward_analysis/visitors/loop.py +29 -0
  273. angr/analyses/forward_analysis/visitors/single_node_graph.py +38 -0
  274. angr/analyses/identifier/__init__.py +5 -0
  275. angr/analyses/identifier/custom_callable.py +137 -0
  276. angr/analyses/identifier/errors.py +10 -0
  277. angr/analyses/identifier/func.py +60 -0
  278. angr/analyses/identifier/functions/__init__.py +37 -0
  279. angr/analyses/identifier/functions/atoi.py +73 -0
  280. angr/analyses/identifier/functions/based_atoi.py +125 -0
  281. angr/analyses/identifier/functions/fdprintf.py +123 -0
  282. angr/analyses/identifier/functions/free.py +64 -0
  283. angr/analyses/identifier/functions/int2str.py +287 -0
  284. angr/analyses/identifier/functions/malloc.py +111 -0
  285. angr/analyses/identifier/functions/memcmp.py +67 -0
  286. angr/analyses/identifier/functions/memcpy.py +89 -0
  287. angr/analyses/identifier/functions/memset.py +43 -0
  288. angr/analyses/identifier/functions/printf.py +123 -0
  289. angr/analyses/identifier/functions/recv_until.py +312 -0
  290. angr/analyses/identifier/functions/skip_calloc.py +73 -0
  291. angr/analyses/identifier/functions/skip_realloc.py +97 -0
  292. angr/analyses/identifier/functions/skip_recv_n.py +105 -0
  293. angr/analyses/identifier/functions/snprintf.py +112 -0
  294. angr/analyses/identifier/functions/sprintf.py +116 -0
  295. angr/analyses/identifier/functions/strcasecmp.py +33 -0
  296. angr/analyses/identifier/functions/strcmp.py +113 -0
  297. angr/analyses/identifier/functions/strcpy.py +43 -0
  298. angr/analyses/identifier/functions/strlen.py +27 -0
  299. angr/analyses/identifier/functions/strncmp.py +104 -0
  300. angr/analyses/identifier/functions/strncpy.py +65 -0
  301. angr/analyses/identifier/functions/strtol.py +89 -0
  302. angr/analyses/identifier/identify.py +825 -0
  303. angr/analyses/identifier/runner.py +360 -0
  304. angr/analyses/init_finder.py +289 -0
  305. angr/analyses/loop_analysis.py +349 -0
  306. angr/analyses/loopfinder.py +171 -0
  307. angr/analyses/patchfinder.py +137 -0
  308. angr/analyses/pathfinder.py +282 -0
  309. angr/analyses/propagator/__init__.py +5 -0
  310. angr/analyses/propagator/engine_base.py +62 -0
  311. angr/analyses/propagator/engine_vex.py +297 -0
  312. angr/analyses/propagator/propagator.py +361 -0
  313. angr/analyses/propagator/top_checker_mixin.py +218 -0
  314. angr/analyses/propagator/values.py +117 -0
  315. angr/analyses/propagator/vex_vars.py +68 -0
  316. angr/analyses/proximity_graph.py +444 -0
  317. angr/analyses/reaching_definitions/__init__.py +67 -0
  318. angr/analyses/reaching_definitions/call_trace.py +73 -0
  319. angr/analyses/reaching_definitions/dep_graph.py +433 -0
  320. angr/analyses/reaching_definitions/engine_ail.py +1130 -0
  321. angr/analyses/reaching_definitions/engine_vex.py +1127 -0
  322. angr/analyses/reaching_definitions/external_codeloc.py +0 -0
  323. angr/analyses/reaching_definitions/function_handler.py +638 -0
  324. angr/analyses/reaching_definitions/function_handler_library/__init__.py +12 -0
  325. angr/analyses/reaching_definitions/function_handler_library/stdio.py +269 -0
  326. angr/analyses/reaching_definitions/function_handler_library/stdlib.py +195 -0
  327. angr/analyses/reaching_definitions/function_handler_library/string.py +158 -0
  328. angr/analyses/reaching_definitions/function_handler_library/unistd.py +51 -0
  329. angr/analyses/reaching_definitions/heap_allocator.py +70 -0
  330. angr/analyses/reaching_definitions/rd_initializer.py +237 -0
  331. angr/analyses/reaching_definitions/rd_state.py +579 -0
  332. angr/analyses/reaching_definitions/reaching_definitions.py +581 -0
  333. angr/analyses/reaching_definitions/subject.py +65 -0
  334. angr/analyses/reassembler.py +2900 -0
  335. angr/analyses/s_liveness.py +203 -0
  336. angr/analyses/s_propagator.py +542 -0
  337. angr/analyses/s_reaching_definitions/__init__.py +12 -0
  338. angr/analyses/s_reaching_definitions/s_rda_model.py +136 -0
  339. angr/analyses/s_reaching_definitions/s_rda_view.py +316 -0
  340. angr/analyses/s_reaching_definitions/s_reaching_definitions.py +177 -0
  341. angr/analyses/smc.py +161 -0
  342. angr/analyses/soot_class_hierarchy.py +273 -0
  343. angr/analyses/stack_pointer_tracker.py +953 -0
  344. angr/analyses/static_hooker.py +53 -0
  345. angr/analyses/typehoon/__init__.py +5 -0
  346. angr/analyses/typehoon/dfa.py +118 -0
  347. angr/analyses/typehoon/lifter.py +122 -0
  348. angr/analyses/typehoon/simple_solver.py +1666 -0
  349. angr/analyses/typehoon/translator.py +279 -0
  350. angr/analyses/typehoon/typeconsts.py +338 -0
  351. angr/analyses/typehoon/typehoon.py +319 -0
  352. angr/analyses/typehoon/typevars.py +622 -0
  353. angr/analyses/typehoon/variance.py +11 -0
  354. angr/analyses/unpacker/__init__.py +6 -0
  355. angr/analyses/unpacker/obfuscation_detector.py +103 -0
  356. angr/analyses/unpacker/packing_detector.py +138 -0
  357. angr/analyses/variable_recovery/__init__.py +9 -0
  358. angr/analyses/variable_recovery/annotations.py +58 -0
  359. angr/analyses/variable_recovery/engine_ail.py +885 -0
  360. angr/analyses/variable_recovery/engine_base.py +1197 -0
  361. angr/analyses/variable_recovery/engine_vex.py +593 -0
  362. angr/analyses/variable_recovery/irsb_scanner.py +143 -0
  363. angr/analyses/variable_recovery/variable_recovery.py +574 -0
  364. angr/analyses/variable_recovery/variable_recovery_base.py +489 -0
  365. angr/analyses/variable_recovery/variable_recovery_fast.py +661 -0
  366. angr/analyses/veritesting.py +626 -0
  367. angr/analyses/vfg.py +1898 -0
  368. angr/analyses/vsa_ddg.py +420 -0
  369. angr/analyses/vtable.py +92 -0
  370. angr/analyses/xrefs.py +286 -0
  371. angr/angrdb/__init__.py +14 -0
  372. angr/angrdb/db.py +206 -0
  373. angr/angrdb/models.py +184 -0
  374. angr/angrdb/serializers/__init__.py +10 -0
  375. angr/angrdb/serializers/cfg_model.py +41 -0
  376. angr/angrdb/serializers/comments.py +60 -0
  377. angr/angrdb/serializers/funcs.py +61 -0
  378. angr/angrdb/serializers/kb.py +111 -0
  379. angr/angrdb/serializers/labels.py +59 -0
  380. angr/angrdb/serializers/loader.py +165 -0
  381. angr/angrdb/serializers/structured_code.py +125 -0
  382. angr/angrdb/serializers/variables.py +58 -0
  383. angr/angrdb/serializers/xrefs.py +48 -0
  384. angr/annocfg.py +317 -0
  385. angr/blade.py +431 -0
  386. angr/block.py +509 -0
  387. angr/callable.py +168 -0
  388. angr/calling_conventions.py +2580 -0
  389. angr/code_location.py +163 -0
  390. angr/codenode.py +145 -0
  391. angr/concretization_strategies/__init__.py +32 -0
  392. angr/concretization_strategies/any.py +17 -0
  393. angr/concretization_strategies/any_named.py +35 -0
  394. angr/concretization_strategies/base.py +81 -0
  395. angr/concretization_strategies/controlled_data.py +58 -0
  396. angr/concretization_strategies/eval.py +19 -0
  397. angr/concretization_strategies/logging.py +35 -0
  398. angr/concretization_strategies/max.py +25 -0
  399. angr/concretization_strategies/nonzero.py +16 -0
  400. angr/concretization_strategies/nonzero_range.py +22 -0
  401. angr/concretization_strategies/norepeats.py +37 -0
  402. angr/concretization_strategies/norepeats_range.py +37 -0
  403. angr/concretization_strategies/range.py +19 -0
  404. angr/concretization_strategies/signed_add.py +31 -0
  405. angr/concretization_strategies/single.py +15 -0
  406. angr/concretization_strategies/solutions.py +20 -0
  407. angr/concretization_strategies/unlimited_range.py +17 -0
  408. angr/distributed/__init__.py +9 -0
  409. angr/distributed/server.py +197 -0
  410. angr/distributed/worker.py +185 -0
  411. angr/emulator.py +143 -0
  412. angr/engines/__init__.py +67 -0
  413. angr/engines/concrete.py +66 -0
  414. angr/engines/engine.py +29 -0
  415. angr/engines/failure.py +27 -0
  416. angr/engines/hook.py +68 -0
  417. angr/engines/icicle.py +278 -0
  418. angr/engines/light/__init__.py +23 -0
  419. angr/engines/light/data.py +681 -0
  420. angr/engines/light/engine.py +1285 -0
  421. angr/engines/pcode/__init__.py +9 -0
  422. angr/engines/pcode/behavior.py +994 -0
  423. angr/engines/pcode/cc.py +128 -0
  424. angr/engines/pcode/emulate.py +440 -0
  425. angr/engines/pcode/engine.py +242 -0
  426. angr/engines/pcode/lifter.py +1420 -0
  427. angr/engines/procedure.py +70 -0
  428. angr/engines/soot/__init__.py +5 -0
  429. angr/engines/soot/engine.py +410 -0
  430. angr/engines/soot/exceptions.py +17 -0
  431. angr/engines/soot/expressions/__init__.py +87 -0
  432. angr/engines/soot/expressions/arrayref.py +22 -0
  433. angr/engines/soot/expressions/base.py +21 -0
  434. angr/engines/soot/expressions/binop.py +28 -0
  435. angr/engines/soot/expressions/cast.py +22 -0
  436. angr/engines/soot/expressions/condition.py +35 -0
  437. angr/engines/soot/expressions/constants.py +47 -0
  438. angr/engines/soot/expressions/instanceOf.py +15 -0
  439. angr/engines/soot/expressions/instancefieldref.py +8 -0
  440. angr/engines/soot/expressions/invoke.py +114 -0
  441. angr/engines/soot/expressions/length.py +8 -0
  442. angr/engines/soot/expressions/local.py +8 -0
  443. angr/engines/soot/expressions/new.py +16 -0
  444. angr/engines/soot/expressions/newArray.py +54 -0
  445. angr/engines/soot/expressions/newMultiArray.py +86 -0
  446. angr/engines/soot/expressions/paramref.py +8 -0
  447. angr/engines/soot/expressions/phi.py +30 -0
  448. angr/engines/soot/expressions/staticfieldref.py +8 -0
  449. angr/engines/soot/expressions/thisref.py +7 -0
  450. angr/engines/soot/expressions/unsupported.py +7 -0
  451. angr/engines/soot/field_dispatcher.py +46 -0
  452. angr/engines/soot/method_dispatcher.py +46 -0
  453. angr/engines/soot/statements/__init__.py +44 -0
  454. angr/engines/soot/statements/assign.py +30 -0
  455. angr/engines/soot/statements/base.py +79 -0
  456. angr/engines/soot/statements/goto.py +14 -0
  457. angr/engines/soot/statements/identity.py +15 -0
  458. angr/engines/soot/statements/if_.py +19 -0
  459. angr/engines/soot/statements/invoke.py +12 -0
  460. angr/engines/soot/statements/return_.py +20 -0
  461. angr/engines/soot/statements/switch.py +41 -0
  462. angr/engines/soot/statements/throw.py +15 -0
  463. angr/engines/soot/values/__init__.py +38 -0
  464. angr/engines/soot/values/arrayref.py +122 -0
  465. angr/engines/soot/values/base.py +7 -0
  466. angr/engines/soot/values/constants.py +18 -0
  467. angr/engines/soot/values/instancefieldref.py +44 -0
  468. angr/engines/soot/values/local.py +18 -0
  469. angr/engines/soot/values/paramref.py +18 -0
  470. angr/engines/soot/values/staticfieldref.py +38 -0
  471. angr/engines/soot/values/strref.py +38 -0
  472. angr/engines/soot/values/thisref.py +149 -0
  473. angr/engines/successors.py +654 -0
  474. angr/engines/syscall.py +51 -0
  475. angr/engines/unicorn.py +490 -0
  476. angr/engines/vex/__init__.py +20 -0
  477. angr/engines/vex/claripy/__init__.py +5 -0
  478. angr/engines/vex/claripy/ccall.py +2097 -0
  479. angr/engines/vex/claripy/datalayer.py +141 -0
  480. angr/engines/vex/claripy/irop.py +1276 -0
  481. angr/engines/vex/heavy/__init__.py +16 -0
  482. angr/engines/vex/heavy/actions.py +231 -0
  483. angr/engines/vex/heavy/concretizers.py +403 -0
  484. angr/engines/vex/heavy/dirty.py +466 -0
  485. angr/engines/vex/heavy/heavy.py +370 -0
  486. angr/engines/vex/heavy/inspect.py +52 -0
  487. angr/engines/vex/heavy/resilience.py +85 -0
  488. angr/engines/vex/heavy/super_fastpath.py +34 -0
  489. angr/engines/vex/lifter.py +420 -0
  490. angr/engines/vex/light/__init__.py +11 -0
  491. angr/engines/vex/light/light.py +551 -0
  492. angr/engines/vex/light/resilience.py +74 -0
  493. angr/engines/vex/light/slicing.py +52 -0
  494. angr/errors.py +609 -0
  495. angr/exploration_techniques/__init__.py +53 -0
  496. angr/exploration_techniques/base.py +126 -0
  497. angr/exploration_techniques/bucketizer.py +94 -0
  498. angr/exploration_techniques/common.py +56 -0
  499. angr/exploration_techniques/dfs.py +37 -0
  500. angr/exploration_techniques/director.py +520 -0
  501. angr/exploration_techniques/driller_core.py +100 -0
  502. angr/exploration_techniques/explorer.py +152 -0
  503. angr/exploration_techniques/lengthlimiter.py +22 -0
  504. angr/exploration_techniques/local_loop_seer.py +65 -0
  505. angr/exploration_techniques/loop_seer.py +236 -0
  506. angr/exploration_techniques/manual_mergepoint.py +82 -0
  507. angr/exploration_techniques/memory_watcher.py +43 -0
  508. angr/exploration_techniques/oppologist.py +92 -0
  509. angr/exploration_techniques/slicecutor.py +118 -0
  510. angr/exploration_techniques/spiller.py +280 -0
  511. angr/exploration_techniques/spiller_db.py +27 -0
  512. angr/exploration_techniques/stochastic.py +56 -0
  513. angr/exploration_techniques/stub_stasher.py +19 -0
  514. angr/exploration_techniques/suggestions.py +159 -0
  515. angr/exploration_techniques/tech_builder.py +49 -0
  516. angr/exploration_techniques/threading.py +69 -0
  517. angr/exploration_techniques/timeout.py +34 -0
  518. angr/exploration_techniques/tracer.py +1098 -0
  519. angr/exploration_techniques/unique.py +106 -0
  520. angr/exploration_techniques/veritesting.py +37 -0
  521. angr/factory.py +404 -0
  522. angr/flirt/__init__.py +97 -0
  523. angr/flirt/build_sig.py +305 -0
  524. angr/graph_utils.py +0 -0
  525. angr/keyed_region.py +525 -0
  526. angr/knowledge_base.py +143 -0
  527. angr/knowledge_plugins/__init__.py +43 -0
  528. angr/knowledge_plugins/callsite_prototypes.py +53 -0
  529. angr/knowledge_plugins/cfg/__init__.py +18 -0
  530. angr/knowledge_plugins/cfg/cfg_manager.py +95 -0
  531. angr/knowledge_plugins/cfg/cfg_model.py +1045 -0
  532. angr/knowledge_plugins/cfg/cfg_node.py +536 -0
  533. angr/knowledge_plugins/cfg/indirect_jump.py +65 -0
  534. angr/knowledge_plugins/cfg/memory_data.py +156 -0
  535. angr/knowledge_plugins/comments.py +16 -0
  536. angr/knowledge_plugins/custom_strings.py +38 -0
  537. angr/knowledge_plugins/data.py +22 -0
  538. angr/knowledge_plugins/debug_variables.py +216 -0
  539. angr/knowledge_plugins/functions/__init__.py +9 -0
  540. angr/knowledge_plugins/functions/function.py +1780 -0
  541. angr/knowledge_plugins/functions/function_manager.py +588 -0
  542. angr/knowledge_plugins/functions/function_parser.py +299 -0
  543. angr/knowledge_plugins/functions/soot_function.py +128 -0
  544. angr/knowledge_plugins/indirect_jumps.py +35 -0
  545. angr/knowledge_plugins/key_definitions/__init__.py +17 -0
  546. angr/knowledge_plugins/key_definitions/atoms.py +374 -0
  547. angr/knowledge_plugins/key_definitions/constants.py +29 -0
  548. angr/knowledge_plugins/key_definitions/definition.py +214 -0
  549. angr/knowledge_plugins/key_definitions/environment.py +96 -0
  550. angr/knowledge_plugins/key_definitions/heap_address.py +33 -0
  551. angr/knowledge_plugins/key_definitions/key_definition_manager.py +82 -0
  552. angr/knowledge_plugins/key_definitions/live_definitions.py +1010 -0
  553. angr/knowledge_plugins/key_definitions/liveness.py +165 -0
  554. angr/knowledge_plugins/key_definitions/rd_model.py +171 -0
  555. angr/knowledge_plugins/key_definitions/tag.py +78 -0
  556. angr/knowledge_plugins/key_definitions/undefined.py +70 -0
  557. angr/knowledge_plugins/key_definitions/unknown_size.py +86 -0
  558. angr/knowledge_plugins/key_definitions/uses.py +178 -0
  559. angr/knowledge_plugins/labels.py +110 -0
  560. angr/knowledge_plugins/obfuscations.py +37 -0
  561. angr/knowledge_plugins/patches.py +126 -0
  562. angr/knowledge_plugins/plugin.py +24 -0
  563. angr/knowledge_plugins/propagations/__init__.py +10 -0
  564. angr/knowledge_plugins/propagations/prop_value.py +191 -0
  565. angr/knowledge_plugins/propagations/propagation_manager.py +60 -0
  566. angr/knowledge_plugins/propagations/propagation_model.py +80 -0
  567. angr/knowledge_plugins/propagations/states.py +552 -0
  568. angr/knowledge_plugins/structured_code.py +63 -0
  569. angr/knowledge_plugins/types.py +88 -0
  570. angr/knowledge_plugins/variables/__init__.py +8 -0
  571. angr/knowledge_plugins/variables/variable_access.py +113 -0
  572. angr/knowledge_plugins/variables/variable_manager.py +1380 -0
  573. angr/knowledge_plugins/xrefs/__init__.py +12 -0
  574. angr/knowledge_plugins/xrefs/xref.py +150 -0
  575. angr/knowledge_plugins/xrefs/xref_manager.py +127 -0
  576. angr/knowledge_plugins/xrefs/xref_types.py +16 -0
  577. angr/misc/__init__.py +19 -0
  578. angr/misc/ansi.py +47 -0
  579. angr/misc/autoimport.py +90 -0
  580. angr/misc/bug_report.py +117 -0
  581. angr/misc/hookset.py +106 -0
  582. angr/misc/loggers.py +130 -0
  583. angr/misc/picklable_lock.py +46 -0
  584. angr/misc/plugins.py +289 -0
  585. angr/misc/telemetry.py +54 -0
  586. angr/misc/testing.py +24 -0
  587. angr/misc/ux.py +31 -0
  588. angr/procedures/__init__.py +12 -0
  589. angr/procedures/advapi32/__init__.py +0 -0
  590. angr/procedures/cgc/__init__.py +3 -0
  591. angr/procedures/cgc/_terminate.py +11 -0
  592. angr/procedures/cgc/allocate.py +75 -0
  593. angr/procedures/cgc/deallocate.py +67 -0
  594. angr/procedures/cgc/fdwait.py +65 -0
  595. angr/procedures/cgc/random.py +67 -0
  596. angr/procedures/cgc/receive.py +93 -0
  597. angr/procedures/cgc/transmit.py +65 -0
  598. angr/procedures/definitions/__init__.py +779 -0
  599. angr/procedures/definitions/cgc.py +20 -0
  600. angr/procedures/definitions/glibc.py +8372 -0
  601. angr/procedures/definitions/gnulib.py +32 -0
  602. angr/procedures/definitions/libstdcpp.py +21 -0
  603. angr/procedures/definitions/linux_kernel.py +6171 -0
  604. angr/procedures/definitions/linux_loader.py +7 -0
  605. angr/procedures/definitions/msvcr.py +16 -0
  606. angr/procedures/definitions/parse_syscalls_from_local_system.py +50 -0
  607. angr/procedures/definitions/parse_win32json.py +2553 -0
  608. angr/procedures/definitions/types_stl.py +22 -0
  609. angr/procedures/definitions/types_win32.py +34482 -0
  610. angr/procedures/definitions/wdk_api-ms-win-dx-d3dkmt-l1-1-4.py +30 -0
  611. angr/procedures/definitions/wdk_api-ms-win-dx-d3dkmt-l1-1-6.py +26 -0
  612. angr/procedures/definitions/wdk_clfs.py +140 -0
  613. angr/procedures/definitions/wdk_fltmgr.py +556 -0
  614. angr/procedures/definitions/wdk_fwpkclnt.py +30 -0
  615. angr/procedures/definitions/wdk_fwpuclnt.py +316 -0
  616. angr/procedures/definitions/wdk_gdi32.py +366 -0
  617. angr/procedures/definitions/wdk_hal.py +78 -0
  618. angr/procedures/definitions/wdk_ksecdd.py +62 -0
  619. angr/procedures/definitions/wdk_ndis.py +238 -0
  620. angr/procedures/definitions/wdk_ntoskrnl.py +3451 -0
  621. angr/procedures/definitions/wdk_offreg.py +72 -0
  622. angr/procedures/definitions/wdk_pshed.py +36 -0
  623. angr/procedures/definitions/wdk_secur32.py +40 -0
  624. angr/procedures/definitions/wdk_vhfum.py +34 -0
  625. angr/procedures/definitions/win32_aclui.py +30 -0
  626. angr/procedures/definitions/win32_activeds.py +68 -0
  627. angr/procedures/definitions/win32_advapi32.py +1684 -0
  628. angr/procedures/definitions/win32_advpack.py +124 -0
  629. angr/procedures/definitions/win32_amsi.py +38 -0
  630. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-1.py +44 -0
  631. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-3.py +34 -0
  632. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-6.py +26 -0
  633. angr/procedures/definitions/win32_api-ms-win-core-apiquery-l2-1-0.py +26 -0
  634. angr/procedures/definitions/win32_api-ms-win-core-backgroundtask-l1-1-0.py +26 -0
  635. angr/procedures/definitions/win32_api-ms-win-core-comm-l1-1-1.py +26 -0
  636. angr/procedures/definitions/win32_api-ms-win-core-comm-l1-1-2.py +26 -0
  637. angr/procedures/definitions/win32_api-ms-win-core-enclave-l1-1-1.py +30 -0
  638. angr/procedures/definitions/win32_api-ms-win-core-errorhandling-l1-1-3.py +26 -0
  639. angr/procedures/definitions/win32_api-ms-win-core-featurestaging-l1-1-0.py +34 -0
  640. angr/procedures/definitions/win32_api-ms-win-core-featurestaging-l1-1-1.py +26 -0
  641. angr/procedures/definitions/win32_api-ms-win-core-file-fromapp-l1-1-0.py +46 -0
  642. angr/procedures/definitions/win32_api-ms-win-core-handle-l1-1-0.py +26 -0
  643. angr/procedures/definitions/win32_api-ms-win-core-ioring-l1-1-0.py +48 -0
  644. angr/procedures/definitions/win32_api-ms-win-core-marshal-l1-1-0.py +32 -0
  645. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-3.py +32 -0
  646. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-4.py +26 -0
  647. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-5.py +30 -0
  648. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-6.py +32 -0
  649. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-7.py +28 -0
  650. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-8.py +30 -0
  651. angr/procedures/definitions/win32_api-ms-win-core-path-l1-1-0.py +68 -0
  652. angr/procedures/definitions/win32_api-ms-win-core-psm-appnotify-l1-1-0.py +28 -0
  653. angr/procedures/definitions/win32_api-ms-win-core-psm-appnotify-l1-1-1.py +28 -0
  654. angr/procedures/definitions/win32_api-ms-win-core-realtime-l1-1-1.py +30 -0
  655. angr/procedures/definitions/win32_api-ms-win-core-realtime-l1-1-2.py +30 -0
  656. angr/procedures/definitions/win32_api-ms-win-core-slapi-l1-1-0.py +26 -0
  657. angr/procedures/definitions/win32_api-ms-win-core-state-helpers-l1-1-0.py +26 -0
  658. angr/procedures/definitions/win32_api-ms-win-core-synch-l1-2-0.py +30 -0
  659. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-0.py +26 -0
  660. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-3.py +28 -0
  661. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-4.py +28 -0
  662. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-6.py +26 -0
  663. angr/procedures/definitions/win32_api-ms-win-core-util-l1-1-1.py +28 -0
  664. angr/procedures/definitions/win32_api-ms-win-core-winrt-error-l1-1-0.py +44 -0
  665. angr/procedures/definitions/win32_api-ms-win-core-winrt-error-l1-1-1.py +38 -0
  666. angr/procedures/definitions/win32_api-ms-win-core-winrt-l1-1-0.py +40 -0
  667. angr/procedures/definitions/win32_api-ms-win-core-winrt-registration-l1-1-0.py +24 -0
  668. angr/procedures/definitions/win32_api-ms-win-core-winrt-robuffer-l1-1-0.py +24 -0
  669. angr/procedures/definitions/win32_api-ms-win-core-winrt-roparameterizediid-l1-1-0.py +28 -0
  670. angr/procedures/definitions/win32_api-ms-win-core-winrt-string-l1-1-0.py +76 -0
  671. angr/procedures/definitions/win32_api-ms-win-core-winrt-string-l1-1-1.py +24 -0
  672. angr/procedures/definitions/win32_api-ms-win-core-wow64-l1-1-1.py +30 -0
  673. angr/procedures/definitions/win32_api-ms-win-devices-query-l1-1-0.py +42 -0
  674. angr/procedures/definitions/win32_api-ms-win-devices-query-l1-1-1.py +34 -0
  675. angr/procedures/definitions/win32_api-ms-win-dx-d3dkmt-l1-1-0.py +26 -0
  676. angr/procedures/definitions/win32_api-ms-win-gaming-deviceinformation-l1-1-0.py +26 -0
  677. angr/procedures/definitions/win32_api-ms-win-gaming-expandedresources-l1-1-0.py +30 -0
  678. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-0.py +38 -0
  679. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-1.py +28 -0
  680. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-2.py +38 -0
  681. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-3.py +28 -0
  682. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-4.py +40 -0
  683. angr/procedures/definitions/win32_api-ms-win-mm-misc-l1-1-1.py +26 -0
  684. angr/procedures/definitions/win32_api-ms-win-net-isolation-l1-1-0.py +40 -0
  685. angr/procedures/definitions/win32_api-ms-win-security-base-l1-2-2.py +26 -0
  686. angr/procedures/definitions/win32_api-ms-win-security-isolatedcontainer-l1-1-0.py +26 -0
  687. angr/procedures/definitions/win32_api-ms-win-security-isolatedcontainer-l1-1-1.py +26 -0
  688. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-3.py +26 -0
  689. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-4.py +26 -0
  690. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-5.py +28 -0
  691. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-0.py +30 -0
  692. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-1.py +36 -0
  693. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-2.py +26 -0
  694. angr/procedures/definitions/win32_api-ms-win-shcore-stream-winrt-l1-1-0.py +28 -0
  695. angr/procedures/definitions/win32_api-ms-win-wsl-api-l1-1-0.py +38 -0
  696. angr/procedures/definitions/win32_apphelp.py +26 -0
  697. angr/procedures/definitions/win32_authz.py +90 -0
  698. angr/procedures/definitions/win32_avicap32.py +32 -0
  699. angr/procedures/definitions/win32_avifil32.py +144 -0
  700. angr/procedures/definitions/win32_avrt.py +52 -0
  701. angr/procedures/definitions/win32_bcp47mrm.py +28 -0
  702. angr/procedures/definitions/win32_bcrypt.py +130 -0
  703. angr/procedures/definitions/win32_bcryptprimitives.py +28 -0
  704. angr/procedures/definitions/win32_bluetoothapis.py +106 -0
  705. angr/procedures/definitions/win32_bthprops.py +34 -0
  706. angr/procedures/definitions/win32_bthprops_cpl.py +36 -0
  707. angr/procedures/definitions/win32_cabinet.py +68 -0
  708. angr/procedures/definitions/win32_certadm.py +60 -0
  709. angr/procedures/definitions/win32_certpoleng.py +40 -0
  710. angr/procedures/definitions/win32_cfgmgr32.py +502 -0
  711. angr/procedures/definitions/win32_chakra.py +198 -0
  712. angr/procedures/definitions/win32_cldapi.py +96 -0
  713. angr/procedures/definitions/win32_clfsw32.py +142 -0
  714. angr/procedures/definitions/win32_clusapi.py +584 -0
  715. angr/procedures/definitions/win32_comctl32.py +254 -0
  716. angr/procedures/definitions/win32_comdlg32.py +66 -0
  717. angr/procedures/definitions/win32_compstui.py +32 -0
  718. angr/procedures/definitions/win32_computecore.py +132 -0
  719. angr/procedures/definitions/win32_computenetwork.py +110 -0
  720. angr/procedures/definitions/win32_computestorage.py +48 -0
  721. angr/procedures/definitions/win32_comsvcs.py +38 -0
  722. angr/procedures/definitions/win32_coremessaging.py +24 -0
  723. angr/procedures/definitions/win32_credui.py +62 -0
  724. angr/procedures/definitions/win32_crypt32.py +482 -0
  725. angr/procedures/definitions/win32_cryptnet.py +34 -0
  726. angr/procedures/definitions/win32_cryptui.py +44 -0
  727. angr/procedures/definitions/win32_cryptxml.py +62 -0
  728. angr/procedures/definitions/win32_cscapi.py +32 -0
  729. angr/procedures/definitions/win32_d2d1.py +50 -0
  730. angr/procedures/definitions/win32_d3d10.py +78 -0
  731. angr/procedures/definitions/win32_d3d10_1.py +28 -0
  732. angr/procedures/definitions/win32_d3d11.py +30 -0
  733. angr/procedures/definitions/win32_d3d12.py +40 -0
  734. angr/procedures/definitions/win32_d3d9.py +46 -0
  735. angr/procedures/definitions/win32_d3dcompiler_47.py +76 -0
  736. angr/procedures/definitions/win32_d3dcsx.py +42 -0
  737. angr/procedures/definitions/win32_davclnt.py +60 -0
  738. angr/procedures/definitions/win32_dbgeng.py +32 -0
  739. angr/procedures/definitions/win32_dbghelp.py +462 -0
  740. angr/procedures/definitions/win32_dbgmodel.py +26 -0
  741. angr/procedures/definitions/win32_dciman32.py +64 -0
  742. angr/procedures/definitions/win32_dcomp.py +48 -0
  743. angr/procedures/definitions/win32_ddraw.py +38 -0
  744. angr/procedures/definitions/win32_deviceaccess.py +26 -0
  745. angr/procedures/definitions/win32_dflayout.py +26 -0
  746. angr/procedures/definitions/win32_dhcpcsvc.py +54 -0
  747. angr/procedures/definitions/win32_dhcpcsvc6.py +36 -0
  748. angr/procedures/definitions/win32_dhcpsapi.py +416 -0
  749. angr/procedures/definitions/win32_diagnosticdataquery.py +94 -0
  750. angr/procedures/definitions/win32_dinput8.py +26 -0
  751. angr/procedures/definitions/win32_directml.py +28 -0
  752. angr/procedures/definitions/win32_dmprocessxmlfiltered.py +26 -0
  753. angr/procedures/definitions/win32_dnsapi.py +152 -0
  754. angr/procedures/definitions/win32_drt.py +56 -0
  755. angr/procedures/definitions/win32_drtprov.py +42 -0
  756. angr/procedures/definitions/win32_drttransport.py +28 -0
  757. angr/procedures/definitions/win32_dsound.py +44 -0
  758. angr/procedures/definitions/win32_dsparse.py +62 -0
  759. angr/procedures/definitions/win32_dsprop.py +38 -0
  760. angr/procedures/definitions/win32_dssec.py +32 -0
  761. angr/procedures/definitions/win32_dsuiext.py +32 -0
  762. angr/procedures/definitions/win32_dwmapi.py +86 -0
  763. angr/procedures/definitions/win32_dwrite.py +26 -0
  764. angr/procedures/definitions/win32_dxcompiler.py +28 -0
  765. angr/procedures/definitions/win32_dxcore.py +26 -0
  766. angr/procedures/definitions/win32_dxgi.py +36 -0
  767. angr/procedures/definitions/win32_dxva2.py +100 -0
  768. angr/procedures/definitions/win32_eappcfg.py +52 -0
  769. angr/procedures/definitions/win32_eappprxy.py +60 -0
  770. angr/procedures/definitions/win32_efswrt.py +28 -0
  771. angr/procedures/definitions/win32_elscore.py +34 -0
  772. angr/procedures/definitions/win32_esent.py +482 -0
  773. angr/procedures/definitions/win32_evr.py +38 -0
  774. angr/procedures/definitions/win32_faultrep.py +32 -0
  775. angr/procedures/definitions/win32_fhsvcctl.py +38 -0
  776. angr/procedures/definitions/win32_firewallapi.py +30 -0
  777. angr/procedures/definitions/win32_fltlib.py +80 -0
  778. angr/procedures/definitions/win32_fontsub.py +28 -0
  779. angr/procedures/definitions/win32_forceinline.py +30 -0
  780. angr/procedures/definitions/win32_fwpuclnt.py +408 -0
  781. angr/procedures/definitions/win32_fxsutility.py +28 -0
  782. angr/procedures/definitions/win32_gdi32.py +886 -0
  783. angr/procedures/definitions/win32_gdiplus.py +1282 -0
  784. angr/procedures/definitions/win32_glu32.py +128 -0
  785. angr/procedures/definitions/win32_gpedit.py +36 -0
  786. angr/procedures/definitions/win32_hhctrl_ocx.py +28 -0
  787. angr/procedures/definitions/win32_hid.py +114 -0
  788. angr/procedures/definitions/win32_hlink.py +80 -0
  789. angr/procedures/definitions/win32_hrtfapo.py +26 -0
  790. angr/procedures/definitions/win32_httpapi.py +110 -0
  791. angr/procedures/definitions/win32_icm32.py +66 -0
  792. angr/procedures/definitions/win32_icmui.py +28 -0
  793. angr/procedures/definitions/win32_icu.py +2074 -0
  794. angr/procedures/definitions/win32_ieframe.py +82 -0
  795. angr/procedures/definitions/win32_imagehlp.py +76 -0
  796. angr/procedures/definitions/win32_imgutil.py +42 -0
  797. angr/procedures/definitions/win32_imm32.py +188 -0
  798. angr/procedures/definitions/win32_infocardapi.py +58 -0
  799. angr/procedures/definitions/win32_inkobjcore.py +78 -0
  800. angr/procedures/definitions/win32_iphlpapi.py +426 -0
  801. angr/procedures/definitions/win32_iscsidsc.py +182 -0
  802. angr/procedures/definitions/win32_isolatedwindowsenvironmentutils.py +28 -0
  803. angr/procedures/definitions/win32_kernel32.py +3185 -0
  804. angr/procedures/definitions/win32_kernelbase.py +36 -0
  805. angr/procedures/definitions/win32_keycredmgr.py +32 -0
  806. angr/procedures/definitions/win32_ksproxy_ax.py +36 -0
  807. angr/procedures/definitions/win32_ksuser.py +40 -0
  808. angr/procedures/definitions/win32_ktmw32.py +102 -0
  809. angr/procedures/definitions/win32_licenseprotection.py +28 -0
  810. angr/procedures/definitions/win32_loadperf.py +48 -0
  811. angr/procedures/definitions/win32_magnification.py +62 -0
  812. angr/procedures/definitions/win32_mapi32.py +156 -0
  813. angr/procedures/definitions/win32_mdmlocalmanagement.py +30 -0
  814. angr/procedures/definitions/win32_mdmregistration.py +54 -0
  815. angr/procedures/definitions/win32_mf.py +148 -0
  816. angr/procedures/definitions/win32_mfcore.py +28 -0
  817. angr/procedures/definitions/win32_mfplat.py +314 -0
  818. angr/procedures/definitions/win32_mfplay.py +26 -0
  819. angr/procedures/definitions/win32_mfreadwrite.py +34 -0
  820. angr/procedures/definitions/win32_mfsensorgroup.py +44 -0
  821. angr/procedures/definitions/win32_mfsrcsnk.py +28 -0
  822. angr/procedures/definitions/win32_mgmtapi.py +42 -0
  823. angr/procedures/definitions/win32_mi.py +26 -0
  824. angr/procedures/definitions/win32_mmdevapi.py +26 -0
  825. angr/procedures/definitions/win32_mpr.py +118 -0
  826. angr/procedures/definitions/win32_mprapi.py +248 -0
  827. angr/procedures/definitions/win32_mqrt.py +92 -0
  828. angr/procedures/definitions/win32_mrmsupport.py +78 -0
  829. angr/procedures/definitions/win32_msacm32.py +108 -0
  830. angr/procedures/definitions/win32_msajapi.py +1118 -0
  831. angr/procedures/definitions/win32_mscms.py +182 -0
  832. angr/procedures/definitions/win32_mscoree.py +78 -0
  833. angr/procedures/definitions/win32_msctfmonitor.py +30 -0
  834. angr/procedures/definitions/win32_msdelta.py +56 -0
  835. angr/procedures/definitions/win32_msdmo.py +46 -0
  836. angr/procedures/definitions/win32_msdrm.py +192 -0
  837. angr/procedures/definitions/win32_msi.py +552 -0
  838. angr/procedures/definitions/win32_msimg32.py +30 -0
  839. angr/procedures/definitions/win32_mspatcha.py +56 -0
  840. angr/procedures/definitions/win32_mspatchc.py +42 -0
  841. angr/procedures/definitions/win32_msports.py +38 -0
  842. angr/procedures/definitions/win32_msrating.py +62 -0
  843. angr/procedures/definitions/win32_mssign32.py +44 -0
  844. angr/procedures/definitions/win32_mstask.py +28 -0
  845. angr/procedures/definitions/win32_msvfw32.py +110 -0
  846. angr/procedures/definitions/win32_mswsock.py +56 -0
  847. angr/procedures/definitions/win32_mtxdm.py +26 -0
  848. angr/procedures/definitions/win32_ncrypt.py +102 -0
  849. angr/procedures/definitions/win32_ndfapi.py +56 -0
  850. angr/procedures/definitions/win32_netapi32.py +436 -0
  851. angr/procedures/definitions/win32_netsh.py +40 -0
  852. angr/procedures/definitions/win32_netshell.py +28 -0
  853. angr/procedures/definitions/win32_newdev.py +46 -0
  854. angr/procedures/definitions/win32_ninput.py +84 -0
  855. angr/procedures/definitions/win32_normaliz.py +28 -0
  856. angr/procedures/definitions/win32_ntdll.py +171 -0
  857. angr/procedures/definitions/win32_ntdllk.py +26 -0
  858. angr/procedures/definitions/win32_ntdsapi.py +186 -0
  859. angr/procedures/definitions/win32_ntlanman.py +44 -0
  860. angr/procedures/definitions/win32_odbc32.py +392 -0
  861. angr/procedures/definitions/win32_odbcbcp.py +78 -0
  862. angr/procedures/definitions/win32_ole32.py +658 -0
  863. angr/procedures/definitions/win32_oleacc.py +58 -0
  864. angr/procedures/definitions/win32_oleaut32.py +834 -0
  865. angr/procedures/definitions/win32_oledlg.py +70 -0
  866. angr/procedures/definitions/win32_ondemandconnroutehelper.py +34 -0
  867. angr/procedures/definitions/win32_opengl32.py +734 -0
  868. angr/procedures/definitions/win32_opmxbox.py +30 -0
  869. angr/procedures/definitions/win32_p2p.py +240 -0
  870. angr/procedures/definitions/win32_p2pgraph.py +98 -0
  871. angr/procedures/definitions/win32_pdh.py +220 -0
  872. angr/procedures/definitions/win32_peerdist.py +80 -0
  873. angr/procedures/definitions/win32_powrprof.py +192 -0
  874. angr/procedures/definitions/win32_prntvpt.py +46 -0
  875. angr/procedures/definitions/win32_projectedfslib.py +62 -0
  876. angr/procedures/definitions/win32_propsys.py +460 -0
  877. angr/procedures/definitions/win32_psapi.py +78 -0
  878. angr/procedures/definitions/win32_quartz.py +28 -0
  879. angr/procedures/definitions/win32_query.py +32 -0
  880. angr/procedures/definitions/win32_qwave.py +46 -0
  881. angr/procedures/definitions/win32_rasapi32.py +192 -0
  882. angr/procedures/definitions/win32_rasdlg.py +36 -0
  883. angr/procedures/definitions/win32_resutils.py +264 -0
  884. angr/procedures/definitions/win32_rometadata.py +24 -0
  885. angr/procedures/definitions/win32_rpcns4.py +146 -0
  886. angr/procedures/definitions/win32_rpcproxy.py +32 -0
  887. angr/procedures/definitions/win32_rpcrt4.py +918 -0
  888. angr/procedures/definitions/win32_rstrtmgr.py +46 -0
  889. angr/procedures/definitions/win32_rtm.py +176 -0
  890. angr/procedures/definitions/win32_rtutils.py +106 -0
  891. angr/procedures/definitions/win32_rtworkq.py +90 -0
  892. angr/procedures/definitions/win32_sas.py +26 -0
  893. angr/procedures/definitions/win32_scarddlg.py +34 -0
  894. angr/procedures/definitions/win32_schannel.py +42 -0
  895. angr/procedures/definitions/win32_sechost.py +28 -0
  896. angr/procedures/definitions/win32_secur32.py +202 -0
  897. angr/procedures/definitions/win32_sensapi.py +30 -0
  898. angr/procedures/definitions/win32_sensorsutilsv2.py +104 -0
  899. angr/procedures/definitions/win32_setupapi.py +692 -0
  900. angr/procedures/definitions/win32_sfc.py +36 -0
  901. angr/procedures/definitions/win32_shdocvw.py +30 -0
  902. angr/procedures/definitions/win32_shell32.py +512 -0
  903. angr/procedures/definitions/win32_shlwapi.py +744 -0
  904. angr/procedures/definitions/win32_slc.py +88 -0
  905. angr/procedures/definitions/win32_slcext.py +32 -0
  906. angr/procedures/definitions/win32_slwga.py +26 -0
  907. angr/procedures/definitions/win32_snmpapi.py +76 -0
  908. angr/procedures/definitions/win32_spoolss.py +76 -0
  909. angr/procedures/definitions/win32_srclient.py +26 -0
  910. angr/procedures/definitions/win32_srpapi.py +46 -0
  911. angr/procedures/definitions/win32_sspicli.py +38 -0
  912. angr/procedures/definitions/win32_sti.py +26 -0
  913. angr/procedures/definitions/win32_t2embed.py +52 -0
  914. angr/procedures/definitions/win32_tapi32.py +522 -0
  915. angr/procedures/definitions/win32_tbs.py +52 -0
  916. angr/procedures/definitions/win32_tdh.py +78 -0
  917. angr/procedures/definitions/win32_tokenbinding.py +44 -0
  918. angr/procedures/definitions/win32_traffic.py +64 -0
  919. angr/procedures/definitions/win32_txfw32.py +42 -0
  920. angr/procedures/definitions/win32_ualapi.py +32 -0
  921. angr/procedures/definitions/win32_uiautomationcore.py +220 -0
  922. angr/procedures/definitions/win32_urlmon.py +178 -0
  923. angr/procedures/definitions/win32_user32.py +1551 -0
  924. angr/procedures/definitions/win32_userenv.py +112 -0
  925. angr/procedures/definitions/win32_usp10.py +104 -0
  926. angr/procedures/definitions/win32_uxtheme.py +178 -0
  927. angr/procedures/definitions/win32_verifier.py +26 -0
  928. angr/procedures/definitions/win32_version.py +52 -0
  929. angr/procedures/definitions/win32_vertdll.py +38 -0
  930. angr/procedures/definitions/win32_virtdisk.py +82 -0
  931. angr/procedures/definitions/win32_vmdevicehost.py +50 -0
  932. angr/procedures/definitions/win32_vmsavedstatedumpprovider.py +110 -0
  933. angr/procedures/definitions/win32_vssapi.py +26 -0
  934. angr/procedures/definitions/win32_wcmapi.py +34 -0
  935. angr/procedures/definitions/win32_wdsbp.py +38 -0
  936. angr/procedures/definitions/win32_wdsclientapi.py +98 -0
  937. angr/procedures/definitions/win32_wdsmc.py +36 -0
  938. angr/procedures/definitions/win32_wdspxe.py +86 -0
  939. angr/procedures/definitions/win32_wdstptc.py +50 -0
  940. angr/procedures/definitions/win32_webauthn.py +50 -0
  941. angr/procedures/definitions/win32_webservices.py +410 -0
  942. angr/procedures/definitions/win32_websocket.py +50 -0
  943. angr/procedures/definitions/win32_wecapi.py +54 -0
  944. angr/procedures/definitions/win32_wer.py +66 -0
  945. angr/procedures/definitions/win32_wevtapi.py +94 -0
  946. angr/procedures/definitions/win32_winbio.py +132 -0
  947. angr/procedures/definitions/win32_windows_ai_machinelearning.py +26 -0
  948. angr/procedures/definitions/win32_windows_data_pdf.py +24 -0
  949. angr/procedures/definitions/win32_windows_media_mediacontrol.py +40 -0
  950. angr/procedures/definitions/win32_windows_networking.py +26 -0
  951. angr/procedures/definitions/win32_windows_ui_xaml.py +28 -0
  952. angr/procedures/definitions/win32_windowscodecs.py +42 -0
  953. angr/procedures/definitions/win32_winfax.py +136 -0
  954. angr/procedures/definitions/win32_winhttp.py +136 -0
  955. angr/procedures/definitions/win32_winhvemulation.py +32 -0
  956. angr/procedures/definitions/win32_winhvplatform.py +156 -0
  957. angr/procedures/definitions/win32_wininet.py +616 -0
  958. angr/procedures/definitions/win32_winml.py +26 -0
  959. angr/procedures/definitions/win32_winmm.py +376 -0
  960. angr/procedures/definitions/win32_winscard.py +164 -0
  961. angr/procedures/definitions/win32_winspool.py +364 -0
  962. angr/procedures/definitions/win32_winspool_drv.py +368 -0
  963. angr/procedures/definitions/win32_wintrust.py +144 -0
  964. angr/procedures/definitions/win32_winusb.py +92 -0
  965. angr/procedures/definitions/win32_wlanapi.py +144 -0
  966. angr/procedures/definitions/win32_wlanui.py +26 -0
  967. angr/procedures/definitions/win32_wldap32.py +510 -0
  968. angr/procedures/definitions/win32_wldp.py +42 -0
  969. angr/procedures/definitions/win32_wmvcore.py +46 -0
  970. angr/procedures/definitions/win32_wnvapi.py +28 -0
  971. angr/procedures/definitions/win32_wofutil.py +46 -0
  972. angr/procedures/definitions/win32_ws2_32.py +344 -0
  973. angr/procedures/definitions/win32_wscapi.py +36 -0
  974. angr/procedures/definitions/win32_wsclient.py +30 -0
  975. angr/procedures/definitions/win32_wsdapi.py +88 -0
  976. angr/procedures/definitions/win32_wsmsvc.py +90 -0
  977. angr/procedures/definitions/win32_wsnmp32.py +122 -0
  978. angr/procedures/definitions/win32_wtsapi32.py +150 -0
  979. angr/procedures/definitions/win32_xaudio2_8.py +32 -0
  980. angr/procedures/definitions/win32_xinput1_4.py +38 -0
  981. angr/procedures/definitions/win32_xinputuap.py +36 -0
  982. angr/procedures/definitions/win32_xmllite.py +36 -0
  983. angr/procedures/definitions/win32_xolehlp.py +32 -0
  984. angr/procedures/definitions/win32_xpsprint.py +28 -0
  985. angr/procedures/glibc/__ctype_b_loc.py +21 -0
  986. angr/procedures/glibc/__ctype_tolower_loc.py +21 -0
  987. angr/procedures/glibc/__ctype_toupper_loc.py +21 -0
  988. angr/procedures/glibc/__errno_location.py +7 -0
  989. angr/procedures/glibc/__init__.py +3 -0
  990. angr/procedures/glibc/__libc_init.py +37 -0
  991. angr/procedures/glibc/__libc_start_main.py +301 -0
  992. angr/procedures/glibc/dynamic_loading.py +20 -0
  993. angr/procedures/glibc/scanf.py +11 -0
  994. angr/procedures/glibc/sscanf.py +6 -0
  995. angr/procedures/gnulib/__init__.py +3 -0
  996. angr/procedures/gnulib/xalloc_die.py +14 -0
  997. angr/procedures/gnulib/xstrtol_fatal.py +14 -0
  998. angr/procedures/java/__init__.py +42 -0
  999. angr/procedures/java/unconstrained.py +65 -0
  1000. angr/procedures/java_io/__init__.py +0 -0
  1001. angr/procedures/java_io/read.py +12 -0
  1002. angr/procedures/java_io/write.py +17 -0
  1003. angr/procedures/java_jni/__init__.py +482 -0
  1004. angr/procedures/java_jni/array_operations.py +312 -0
  1005. angr/procedures/java_jni/class_and_interface_operations.py +31 -0
  1006. angr/procedures/java_jni/field_access.py +173 -0
  1007. angr/procedures/java_jni/global_and_local_refs.py +57 -0
  1008. angr/procedures/java_jni/method_calls.py +365 -0
  1009. angr/procedures/java_jni/not_implemented.py +26 -0
  1010. angr/procedures/java_jni/object_operations.py +94 -0
  1011. angr/procedures/java_jni/string_operations.py +87 -0
  1012. angr/procedures/java_jni/version_information.py +12 -0
  1013. angr/procedures/java_lang/__init__.py +0 -0
  1014. angr/procedures/java_lang/character.py +30 -0
  1015. angr/procedures/java_lang/double.py +24 -0
  1016. angr/procedures/java_lang/exit.py +13 -0
  1017. angr/procedures/java_lang/getsimplename.py +18 -0
  1018. angr/procedures/java_lang/integer.py +43 -0
  1019. angr/procedures/java_lang/load_library.py +9 -0
  1020. angr/procedures/java_lang/math.py +15 -0
  1021. angr/procedures/java_lang/string.py +78 -0
  1022. angr/procedures/java_lang/stringbuilder.py +44 -0
  1023. angr/procedures/java_lang/system.py +18 -0
  1024. angr/procedures/java_util/__init__.py +0 -0
  1025. angr/procedures/java_util/collection.py +35 -0
  1026. angr/procedures/java_util/iterator.py +46 -0
  1027. angr/procedures/java_util/list.py +99 -0
  1028. angr/procedures/java_util/map.py +131 -0
  1029. angr/procedures/java_util/random.py +14 -0
  1030. angr/procedures/java_util/scanner_nextline.py +23 -0
  1031. angr/procedures/libc/__init__.py +3 -0
  1032. angr/procedures/libc/abort.py +9 -0
  1033. angr/procedures/libc/access.py +13 -0
  1034. angr/procedures/libc/atoi.py +14 -0
  1035. angr/procedures/libc/atol.py +13 -0
  1036. angr/procedures/libc/calloc.py +8 -0
  1037. angr/procedures/libc/closelog.py +10 -0
  1038. angr/procedures/libc/err.py +14 -0
  1039. angr/procedures/libc/error.py +54 -0
  1040. angr/procedures/libc/exit.py +11 -0
  1041. angr/procedures/libc/fclose.py +19 -0
  1042. angr/procedures/libc/feof.py +21 -0
  1043. angr/procedures/libc/fflush.py +16 -0
  1044. angr/procedures/libc/fgetc.py +27 -0
  1045. angr/procedures/libc/fgets.py +68 -0
  1046. angr/procedures/libc/fopen.py +63 -0
  1047. angr/procedures/libc/fprintf.py +25 -0
  1048. angr/procedures/libc/fputc.py +23 -0
  1049. angr/procedures/libc/fputs.py +24 -0
  1050. angr/procedures/libc/fread.py +24 -0
  1051. angr/procedures/libc/free.py +9 -0
  1052. angr/procedures/libc/fscanf.py +20 -0
  1053. angr/procedures/libc/fseek.py +34 -0
  1054. angr/procedures/libc/ftell.py +22 -0
  1055. angr/procedures/libc/fwrite.py +19 -0
  1056. angr/procedures/libc/getchar.py +13 -0
  1057. angr/procedures/libc/getdelim.py +99 -0
  1058. angr/procedures/libc/getegid.py +8 -0
  1059. angr/procedures/libc/geteuid.py +8 -0
  1060. angr/procedures/libc/getgid.py +8 -0
  1061. angr/procedures/libc/gets.py +68 -0
  1062. angr/procedures/libc/getuid.py +8 -0
  1063. angr/procedures/libc/malloc.py +12 -0
  1064. angr/procedures/libc/memcmp.py +69 -0
  1065. angr/procedures/libc/memcpy.py +38 -0
  1066. angr/procedures/libc/memset.py +72 -0
  1067. angr/procedures/libc/openlog.py +10 -0
  1068. angr/procedures/libc/perror.py +13 -0
  1069. angr/procedures/libc/printf.py +34 -0
  1070. angr/procedures/libc/putchar.py +13 -0
  1071. angr/procedures/libc/puts.py +19 -0
  1072. angr/procedures/libc/rand.py +8 -0
  1073. angr/procedures/libc/realloc.py +8 -0
  1074. angr/procedures/libc/rewind.py +12 -0
  1075. angr/procedures/libc/scanf.py +20 -0
  1076. angr/procedures/libc/setbuf.py +9 -0
  1077. angr/procedures/libc/setvbuf.py +7 -0
  1078. angr/procedures/libc/snprintf.py +36 -0
  1079. angr/procedures/libc/sprintf.py +25 -0
  1080. angr/procedures/libc/srand.py +7 -0
  1081. angr/procedures/libc/sscanf.py +13 -0
  1082. angr/procedures/libc/stpcpy.py +18 -0
  1083. angr/procedures/libc/strcat.py +14 -0
  1084. angr/procedures/libc/strchr.py +48 -0
  1085. angr/procedures/libc/strcmp.py +31 -0
  1086. angr/procedures/libc/strcpy.py +13 -0
  1087. angr/procedures/libc/strlen.py +114 -0
  1088. angr/procedures/libc/strncat.py +19 -0
  1089. angr/procedures/libc/strncmp.py +183 -0
  1090. angr/procedures/libc/strncpy.py +22 -0
  1091. angr/procedures/libc/strnlen.py +13 -0
  1092. angr/procedures/libc/strstr.py +101 -0
  1093. angr/procedures/libc/strtol.py +261 -0
  1094. angr/procedures/libc/strtoul.py +9 -0
  1095. angr/procedures/libc/system.py +13 -0
  1096. angr/procedures/libc/time.py +9 -0
  1097. angr/procedures/libc/tmpnam.py +20 -0
  1098. angr/procedures/libc/tolower.py +10 -0
  1099. angr/procedures/libc/toupper.py +10 -0
  1100. angr/procedures/libc/ungetc.py +20 -0
  1101. angr/procedures/libc/vsnprintf.py +17 -0
  1102. angr/procedures/libc/wchar.py +16 -0
  1103. angr/procedures/libstdcpp/__init__.py +0 -0
  1104. angr/procedures/libstdcpp/_unwind_resume.py +11 -0
  1105. angr/procedures/libstdcpp/std____throw_bad_alloc.py +13 -0
  1106. angr/procedures/libstdcpp/std____throw_bad_cast.py +13 -0
  1107. angr/procedures/libstdcpp/std____throw_length_error.py +13 -0
  1108. angr/procedures/libstdcpp/std____throw_logic_error.py +13 -0
  1109. angr/procedures/libstdcpp/std__terminate.py +13 -0
  1110. angr/procedures/linux_kernel/__init__.py +3 -0
  1111. angr/procedures/linux_kernel/access.py +18 -0
  1112. angr/procedures/linux_kernel/arch_prctl.py +34 -0
  1113. angr/procedures/linux_kernel/arm_user_helpers.py +59 -0
  1114. angr/procedures/linux_kernel/brk.py +18 -0
  1115. angr/procedures/linux_kernel/cwd.py +28 -0
  1116. angr/procedures/linux_kernel/fstat.py +138 -0
  1117. angr/procedures/linux_kernel/fstat64.py +170 -0
  1118. angr/procedures/linux_kernel/futex.py +17 -0
  1119. angr/procedures/linux_kernel/getegid.py +17 -0
  1120. angr/procedures/linux_kernel/geteuid.py +17 -0
  1121. angr/procedures/linux_kernel/getgid.py +17 -0
  1122. angr/procedures/linux_kernel/getpid.py +14 -0
  1123. angr/procedures/linux_kernel/getrlimit.py +24 -0
  1124. angr/procedures/linux_kernel/gettid.py +9 -0
  1125. angr/procedures/linux_kernel/getuid.py +17 -0
  1126. angr/procedures/linux_kernel/iovec.py +47 -0
  1127. angr/procedures/linux_kernel/lseek.py +42 -0
  1128. angr/procedures/linux_kernel/mmap.py +16 -0
  1129. angr/procedures/linux_kernel/mprotect.py +42 -0
  1130. angr/procedures/linux_kernel/munmap.py +8 -0
  1131. angr/procedures/linux_kernel/openat.py +26 -0
  1132. angr/procedures/linux_kernel/set_tid_address.py +8 -0
  1133. angr/procedures/linux_kernel/sigaction.py +19 -0
  1134. angr/procedures/linux_kernel/sigprocmask.py +23 -0
  1135. angr/procedures/linux_kernel/stat.py +23 -0
  1136. angr/procedures/linux_kernel/sysinfo.py +59 -0
  1137. angr/procedures/linux_kernel/tgkill.py +10 -0
  1138. angr/procedures/linux_kernel/time.py +34 -0
  1139. angr/procedures/linux_kernel/uid.py +30 -0
  1140. angr/procedures/linux_kernel/uname.py +29 -0
  1141. angr/procedures/linux_kernel/unlink.py +22 -0
  1142. angr/procedures/linux_kernel/vsyscall.py +16 -0
  1143. angr/procedures/linux_loader/__init__.py +3 -0
  1144. angr/procedures/linux_loader/_dl_initial_error_catch_tsd.py +7 -0
  1145. angr/procedures/linux_loader/_dl_rtld_lock.py +15 -0
  1146. angr/procedures/linux_loader/sim_loader.py +54 -0
  1147. angr/procedures/linux_loader/tls.py +40 -0
  1148. angr/procedures/msvcr/__getmainargs.py +16 -0
  1149. angr/procedures/msvcr/__init__.py +4 -0
  1150. angr/procedures/msvcr/_initterm.py +38 -0
  1151. angr/procedures/msvcr/fmode.py +31 -0
  1152. angr/procedures/ntdll/__init__.py +0 -0
  1153. angr/procedures/ntdll/exceptions.py +60 -0
  1154. angr/procedures/posix/__init__.py +3 -0
  1155. angr/procedures/posix/accept.py +29 -0
  1156. angr/procedures/posix/bind.py +13 -0
  1157. angr/procedures/posix/bzero.py +9 -0
  1158. angr/procedures/posix/chroot.py +27 -0
  1159. angr/procedures/posix/close.py +9 -0
  1160. angr/procedures/posix/closedir.py +7 -0
  1161. angr/procedures/posix/dup.py +56 -0
  1162. angr/procedures/posix/fcntl.py +10 -0
  1163. angr/procedures/posix/fdopen.py +76 -0
  1164. angr/procedures/posix/fileno.py +18 -0
  1165. angr/procedures/posix/fork.py +13 -0
  1166. angr/procedures/posix/getenv.py +35 -0
  1167. angr/procedures/posix/gethostbyname.py +43 -0
  1168. angr/procedures/posix/getpass.py +19 -0
  1169. angr/procedures/posix/getsockopt.py +11 -0
  1170. angr/procedures/posix/htonl.py +11 -0
  1171. angr/procedures/posix/htons.py +11 -0
  1172. angr/procedures/posix/inet_ntoa.py +59 -0
  1173. angr/procedures/posix/listen.py +13 -0
  1174. angr/procedures/posix/mmap.py +144 -0
  1175. angr/procedures/posix/open.py +18 -0
  1176. angr/procedures/posix/opendir.py +10 -0
  1177. angr/procedures/posix/poll.py +55 -0
  1178. angr/procedures/posix/pread64.py +46 -0
  1179. angr/procedures/posix/pthread.py +87 -0
  1180. angr/procedures/posix/pwrite64.py +46 -0
  1181. angr/procedures/posix/read.py +13 -0
  1182. angr/procedures/posix/readdir.py +62 -0
  1183. angr/procedures/posix/recv.py +13 -0
  1184. angr/procedures/posix/recvfrom.py +13 -0
  1185. angr/procedures/posix/select.py +48 -0
  1186. angr/procedures/posix/send.py +23 -0
  1187. angr/procedures/posix/setsockopt.py +9 -0
  1188. angr/procedures/posix/sigaction.py +23 -0
  1189. angr/procedures/posix/sim_time.py +48 -0
  1190. angr/procedures/posix/sleep.py +8 -0
  1191. angr/procedures/posix/socket.py +18 -0
  1192. angr/procedures/posix/strcasecmp.py +26 -0
  1193. angr/procedures/posix/strdup.py +18 -0
  1194. angr/procedures/posix/strtok_r.py +64 -0
  1195. angr/procedures/posix/syslog.py +15 -0
  1196. angr/procedures/posix/tz.py +9 -0
  1197. angr/procedures/posix/unlink.py +11 -0
  1198. angr/procedures/posix/usleep.py +8 -0
  1199. angr/procedures/posix/write.py +13 -0
  1200. angr/procedures/procedure_dict.py +50 -0
  1201. angr/procedures/stubs/CallReturn.py +13 -0
  1202. angr/procedures/stubs/NoReturnUnconstrained.py +13 -0
  1203. angr/procedures/stubs/Nop.py +7 -0
  1204. angr/procedures/stubs/PathTerminator.py +9 -0
  1205. angr/procedures/stubs/Redirect.py +18 -0
  1206. angr/procedures/stubs/ReturnChar.py +11 -0
  1207. angr/procedures/stubs/ReturnUnconstrained.py +24 -0
  1208. angr/procedures/stubs/UnresolvableCallTarget.py +9 -0
  1209. angr/procedures/stubs/UnresolvableJumpTarget.py +9 -0
  1210. angr/procedures/stubs/UserHook.py +18 -0
  1211. angr/procedures/stubs/__init__.py +3 -0
  1212. angr/procedures/stubs/b64_decode.py +15 -0
  1213. angr/procedures/stubs/caller.py +14 -0
  1214. angr/procedures/stubs/crazy_scanf.py +20 -0
  1215. angr/procedures/stubs/format_parser.py +669 -0
  1216. angr/procedures/stubs/syscall_stub.py +24 -0
  1217. angr/procedures/testing/__init__.py +3 -0
  1218. angr/procedures/testing/manyargs.py +9 -0
  1219. angr/procedures/testing/retreg.py +8 -0
  1220. angr/procedures/tracer/__init__.py +4 -0
  1221. angr/procedures/tracer/random.py +9 -0
  1222. angr/procedures/tracer/receive.py +23 -0
  1223. angr/procedures/tracer/transmit.py +26 -0
  1224. angr/procedures/uclibc/__init__.py +3 -0
  1225. angr/procedures/uclibc/__uClibc_main.py +10 -0
  1226. angr/procedures/win32/EncodePointer.py +7 -0
  1227. angr/procedures/win32/ExitProcess.py +9 -0
  1228. angr/procedures/win32/GetCommandLine.py +12 -0
  1229. angr/procedures/win32/GetCurrentProcessId.py +7 -0
  1230. angr/procedures/win32/GetCurrentThreadId.py +7 -0
  1231. angr/procedures/win32/GetLastInputInfo.py +40 -0
  1232. angr/procedures/win32/GetModuleHandle.py +29 -0
  1233. angr/procedures/win32/GetProcessAffinityMask.py +37 -0
  1234. angr/procedures/win32/InterlockedExchange.py +15 -0
  1235. angr/procedures/win32/IsProcessorFeaturePresent.py +7 -0
  1236. angr/procedures/win32/VirtualAlloc.py +114 -0
  1237. angr/procedures/win32/VirtualProtect.py +60 -0
  1238. angr/procedures/win32/__init__.py +3 -0
  1239. angr/procedures/win32/critical_section.py +12 -0
  1240. angr/procedures/win32/dynamic_loading.py +104 -0
  1241. angr/procedures/win32/file_handles.py +47 -0
  1242. angr/procedures/win32/gethostbyname.py +12 -0
  1243. angr/procedures/win32/heap.py +45 -0
  1244. angr/procedures/win32/is_bad_ptr.py +26 -0
  1245. angr/procedures/win32/local_storage.py +88 -0
  1246. angr/procedures/win32/mutex.py +11 -0
  1247. angr/procedures/win32/sim_time.py +135 -0
  1248. angr/procedures/win32/system_paths.py +35 -0
  1249. angr/procedures/win32_kernel/ExAllocatePool.py +13 -0
  1250. angr/procedures/win32_kernel/ExFreePoolWithTag.py +8 -0
  1251. angr/procedures/win32_kernel/__fastfail.py +15 -0
  1252. angr/procedures/win32_kernel/__init__.py +3 -0
  1253. angr/procedures/win_user32/__init__.py +0 -0
  1254. angr/procedures/win_user32/chars.py +15 -0
  1255. angr/procedures/win_user32/keyboard.py +14 -0
  1256. angr/procedures/win_user32/messagebox.py +49 -0
  1257. angr/project.py +847 -0
  1258. angr/protos/__init__.py +19 -0
  1259. angr/protos/cfg_pb2.py +31 -0
  1260. angr/protos/function_pb2.py +27 -0
  1261. angr/protos/primitives_pb2.py +52 -0
  1262. angr/protos/variables_pb2.py +44 -0
  1263. angr/protos/xrefs_pb2.py +25 -0
  1264. angr/py.typed +1 -0
  1265. angr/rustylib.abi3.so +0 -0
  1266. angr/serializable.py +66 -0
  1267. angr/sim_manager.py +971 -0
  1268. angr/sim_options.py +438 -0
  1269. angr/sim_procedure.py +606 -0
  1270. angr/sim_state.py +901 -0
  1271. angr/sim_state_options.py +403 -0
  1272. angr/sim_type.py +3702 -0
  1273. angr/sim_variable.py +465 -0
  1274. angr/simos/__init__.py +47 -0
  1275. angr/simos/cgc.py +153 -0
  1276. angr/simos/javavm.py +458 -0
  1277. angr/simos/linux.py +509 -0
  1278. angr/simos/simos.py +444 -0
  1279. angr/simos/snimmuc_nxp.py +149 -0
  1280. angr/simos/userland.py +163 -0
  1281. angr/simos/windows.py +601 -0
  1282. angr/simos/xbox.py +32 -0
  1283. angr/slicer.py +352 -0
  1284. angr/state_hierarchy.py +262 -0
  1285. angr/state_plugins/__init__.py +84 -0
  1286. angr/state_plugins/callstack.py +398 -0
  1287. angr/state_plugins/cgc.py +155 -0
  1288. angr/state_plugins/debug_variables.py +192 -0
  1289. angr/state_plugins/filesystem.py +463 -0
  1290. angr/state_plugins/gdb.py +148 -0
  1291. angr/state_plugins/globals.py +65 -0
  1292. angr/state_plugins/heap/__init__.py +15 -0
  1293. angr/state_plugins/heap/heap_base.py +128 -0
  1294. angr/state_plugins/heap/heap_brk.py +136 -0
  1295. angr/state_plugins/heap/heap_freelist.py +213 -0
  1296. angr/state_plugins/heap/heap_libc.py +46 -0
  1297. angr/state_plugins/heap/heap_ptmalloc.py +620 -0
  1298. angr/state_plugins/heap/utils.py +22 -0
  1299. angr/state_plugins/history.py +564 -0
  1300. angr/state_plugins/inspect.py +375 -0
  1301. angr/state_plugins/javavm_classloader.py +134 -0
  1302. angr/state_plugins/jni_references.py +95 -0
  1303. angr/state_plugins/libc.py +1263 -0
  1304. angr/state_plugins/light_registers.py +168 -0
  1305. angr/state_plugins/log.py +84 -0
  1306. angr/state_plugins/loop_data.py +92 -0
  1307. angr/state_plugins/plugin.py +170 -0
  1308. angr/state_plugins/posix.py +703 -0
  1309. angr/state_plugins/preconstrainer.py +196 -0
  1310. angr/state_plugins/scratch.py +173 -0
  1311. angr/state_plugins/sim_action.py +326 -0
  1312. angr/state_plugins/sim_action_object.py +271 -0
  1313. angr/state_plugins/sim_event.py +59 -0
  1314. angr/state_plugins/solver.py +1127 -0
  1315. angr/state_plugins/symbolizer.py +291 -0
  1316. angr/state_plugins/trace_additions.py +738 -0
  1317. angr/state_plugins/uc_manager.py +94 -0
  1318. angr/state_plugins/unicorn_engine.py +1886 -0
  1319. angr/state_plugins/view.py +340 -0
  1320. angr/storage/__init__.py +15 -0
  1321. angr/storage/file.py +1210 -0
  1322. angr/storage/memory_mixins/__init__.py +317 -0
  1323. angr/storage/memory_mixins/actions_mixin.py +72 -0
  1324. angr/storage/memory_mixins/address_concretization_mixin.py +384 -0
  1325. angr/storage/memory_mixins/bvv_conversion_mixin.py +73 -0
  1326. angr/storage/memory_mixins/clouseau_mixin.py +137 -0
  1327. angr/storage/memory_mixins/conditional_store_mixin.py +25 -0
  1328. angr/storage/memory_mixins/convenient_mappings_mixin.py +256 -0
  1329. angr/storage/memory_mixins/default_filler_mixin.py +144 -0
  1330. angr/storage/memory_mixins/dirty_addrs_mixin.py +11 -0
  1331. angr/storage/memory_mixins/hex_dumper_mixin.py +82 -0
  1332. angr/storage/memory_mixins/javavm_memory_mixin.py +392 -0
  1333. angr/storage/memory_mixins/keyvalue_memory_mixin.py +42 -0
  1334. angr/storage/memory_mixins/label_merger_mixin.py +31 -0
  1335. angr/storage/memory_mixins/memory_mixin.py +174 -0
  1336. angr/storage/memory_mixins/multi_value_merger_mixin.py +79 -0
  1337. angr/storage/memory_mixins/name_resolution_mixin.py +67 -0
  1338. angr/storage/memory_mixins/paged_memory/__init__.py +0 -0
  1339. angr/storage/memory_mixins/paged_memory/page_backer_mixins.py +266 -0
  1340. angr/storage/memory_mixins/paged_memory/paged_memory_mixin.py +743 -0
  1341. angr/storage/memory_mixins/paged_memory/paged_memory_multivalue_mixin.py +65 -0
  1342. angr/storage/memory_mixins/paged_memory/pages/__init__.py +26 -0
  1343. angr/storage/memory_mixins/paged_memory/pages/base.py +31 -0
  1344. angr/storage/memory_mixins/paged_memory/pages/cooperation.py +341 -0
  1345. angr/storage/memory_mixins/paged_memory/pages/history_tracking_mixin.py +92 -0
  1346. angr/storage/memory_mixins/paged_memory/pages/ispo_mixin.py +55 -0
  1347. angr/storage/memory_mixins/paged_memory/pages/list_page.py +338 -0
  1348. angr/storage/memory_mixins/paged_memory/pages/multi_values.py +324 -0
  1349. angr/storage/memory_mixins/paged_memory/pages/mv_list_page.py +419 -0
  1350. angr/storage/memory_mixins/paged_memory/pages/permissions_mixin.py +36 -0
  1351. angr/storage/memory_mixins/paged_memory/pages/refcount_mixin.py +52 -0
  1352. angr/storage/memory_mixins/paged_memory/pages/ultra_page.py +503 -0
  1353. angr/storage/memory_mixins/paged_memory/privileged_mixin.py +36 -0
  1354. angr/storage/memory_mixins/paged_memory/stack_allocation_mixin.py +74 -0
  1355. angr/storage/memory_mixins/regioned_memory/__init__.py +17 -0
  1356. angr/storage/memory_mixins/regioned_memory/abstract_address_descriptor.py +36 -0
  1357. angr/storage/memory_mixins/regioned_memory/abstract_merger_mixin.py +31 -0
  1358. angr/storage/memory_mixins/regioned_memory/region_category_mixin.py +9 -0
  1359. angr/storage/memory_mixins/regioned_memory/region_data.py +246 -0
  1360. angr/storage/memory_mixins/regioned_memory/region_meta_mixin.py +241 -0
  1361. angr/storage/memory_mixins/regioned_memory/regioned_address_concretization_mixin.py +119 -0
  1362. angr/storage/memory_mixins/regioned_memory/regioned_memory_mixin.py +441 -0
  1363. angr/storage/memory_mixins/regioned_memory/static_find_mixin.py +69 -0
  1364. angr/storage/memory_mixins/simple_interface_mixin.py +71 -0
  1365. angr/storage/memory_mixins/simplification_mixin.py +15 -0
  1366. angr/storage/memory_mixins/size_resolution_mixin.py +143 -0
  1367. angr/storage/memory_mixins/slotted_memory.py +140 -0
  1368. angr/storage/memory_mixins/smart_find_mixin.py +161 -0
  1369. angr/storage/memory_mixins/symbolic_merger_mixin.py +16 -0
  1370. angr/storage/memory_mixins/top_merger_mixin.py +25 -0
  1371. angr/storage/memory_mixins/underconstrained_mixin.py +67 -0
  1372. angr/storage/memory_mixins/unwrapper_mixin.py +26 -0
  1373. angr/storage/memory_object.py +195 -0
  1374. angr/tablespecs.py +91 -0
  1375. angr/unicornlib.so +0 -0
  1376. angr/utils/__init__.py +46 -0
  1377. angr/utils/ail.py +70 -0
  1378. angr/utils/algo.py +34 -0
  1379. angr/utils/bits.py +46 -0
  1380. angr/utils/constants.py +9 -0
  1381. angr/utils/cowdict.py +63 -0
  1382. angr/utils/cpp.py +17 -0
  1383. angr/utils/doms.py +149 -0
  1384. angr/utils/dynamic_dictlist.py +89 -0
  1385. angr/utils/endness.py +18 -0
  1386. angr/utils/enums_conv.py +97 -0
  1387. angr/utils/env.py +12 -0
  1388. angr/utils/formatting.py +128 -0
  1389. angr/utils/funcid.py +159 -0
  1390. angr/utils/graph.py +933 -0
  1391. angr/utils/lazy_import.py +13 -0
  1392. angr/utils/library.py +212 -0
  1393. angr/utils/loader.py +55 -0
  1394. angr/utils/mp.py +66 -0
  1395. angr/utils/orderedset.py +74 -0
  1396. angr/utils/ssa/__init__.py +457 -0
  1397. angr/utils/ssa/tmp_uses_collector.py +23 -0
  1398. angr/utils/ssa/vvar_uses_collector.py +37 -0
  1399. angr/utils/tagged_interval_map.py +112 -0
  1400. angr/utils/timing.py +74 -0
  1401. angr/utils/types.py +151 -0
  1402. angr/utils/vex.py +11 -0
  1403. angr/vaults.py +367 -0
  1404. angr-9.2.165.dist-info/METADATA +110 -0
  1405. angr-9.2.165.dist-info/RECORD +1409 -0
  1406. angr-9.2.165.dist-info/WHEEL +6 -0
  1407. angr-9.2.165.dist-info/entry_points.txt +2 -0
  1408. angr-9.2.165.dist-info/licenses/LICENSE +27 -0
  1409. angr-9.2.165.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1780 @@
1
+ # pylint:disable=too-many-boolean-expressions
2
+ from __future__ import annotations
3
+ import os
4
+ import logging
5
+ import itertools
6
+ from collections import defaultdict
7
+ from collections.abc import Iterable
8
+ import contextlib
9
+ from typing import overload
10
+
11
+ import networkx
12
+ import pydemumble
13
+
14
+ from cle.backends.symbol import Symbol
15
+ from archinfo.arch_arm import get_real_address_if_arm
16
+ import claripy
17
+
18
+ from angr.knowledge_plugins.cfg.memory_data import MemoryDataSort
19
+ from angr.codenode import CodeNode, BlockNode, HookNode, SyscallNode
20
+ from angr.serializable import Serializable
21
+ from angr.errors import AngrValueError, SimEngineError, SimMemoryError
22
+ from angr.procedures import SIM_LIBRARIES
23
+ from angr.procedures.definitions import SimSyscallLibrary
24
+ from angr.protos import function_pb2
25
+ from angr.calling_conventions import DEFAULT_CC, default_cc
26
+ from angr.sim_type import SimTypeFunction, parse_defns
27
+ from angr.calling_conventions import SimCC
28
+ from angr.project import Project
29
+ from angr.utils.library import get_cpp_function_name
30
+ from .function_parser import FunctionParser
31
+
32
+ l = logging.getLogger(name=__name__)
33
+
34
+
35
+ class Function(Serializable):
36
+ """
37
+ A representation of a function and various information about it.
38
+ """
39
+
40
+ __slots__ = (
41
+ "_addr_to_block_node",
42
+ "_argument_registers",
43
+ "_argument_stack_variables",
44
+ "_block_sizes",
45
+ "_call_sites",
46
+ "_callout_sites",
47
+ "_cyclomatic_complexity",
48
+ "_endpoints",
49
+ "_function_manager",
50
+ "_jumpout_sites",
51
+ "_local_block_addrs",
52
+ "_local_blocks",
53
+ "_local_transition_graph",
54
+ "_name",
55
+ "_project",
56
+ "_ret_sites",
57
+ "_retout_sites",
58
+ "_returning",
59
+ "addr",
60
+ "addr",
61
+ "binary_name",
62
+ "bp_on_stack",
63
+ "calling_convention",
64
+ "from_signature",
65
+ "info",
66
+ "is_alignment",
67
+ "is_default_name",
68
+ "is_plt",
69
+ "is_prototype_guessed",
70
+ "is_simprocedure",
71
+ "is_syscall",
72
+ "normalized",
73
+ "previous_names",
74
+ "prototype",
75
+ "prototype_libname",
76
+ "ran_cca",
77
+ "retaddr_on_stack",
78
+ "sp_delta",
79
+ "startpoint",
80
+ "tags",
81
+ "transition_graph",
82
+ )
83
+
84
+ def __init__(
85
+ self,
86
+ function_manager,
87
+ addr,
88
+ name=None,
89
+ syscall=None,
90
+ is_simprocedure: bool | None = None,
91
+ binary_name=None,
92
+ is_plt: bool | None = None,
93
+ returning=None,
94
+ alignment=False,
95
+ calling_convention: SimCC | None = None,
96
+ prototype: SimTypeFunction | None = None,
97
+ prototype_libname: str | None = None,
98
+ is_prototype_guessed: bool = True,
99
+ ):
100
+ """
101
+ Function constructor. If the optional parameters are not provided, they will be automatically determined upon
102
+ the creation of a Function object.
103
+
104
+ :param addr: The address of the function.
105
+
106
+ The following parameters are optional.
107
+
108
+ :param str name: The name of the function.
109
+ :param bool syscall: Whether this function is a syscall or not.
110
+ :param bool is_simprocedure: Whether this function is a SimProcedure or not.
111
+ :param str binary_name: Name of the binary where this function is.
112
+ :param bool is_plt: If this function is a PLT entry.
113
+ :param bool returning: If this function returns.
114
+ :param bool alignment: If this function acts as an alignment filler. Such functions usually only contain nops.
115
+ """
116
+ self.transition_graph = networkx.classes.digraph.DiGraph()
117
+ self._local_transition_graph = None
118
+ self.normalized = False
119
+
120
+ # block nodes at whose ends the function returns
121
+ self._ret_sites: set[BlockNode] = set()
122
+ # block nodes at whose ends the function jumps out to another function (jumps outside)
123
+ self._jumpout_sites: set[BlockNode] = set()
124
+ # block nodes at whose ends the function calls out to another non-returning function
125
+ self._callout_sites: set[BlockNode] = set()
126
+ # block nodes that ends the function by returning out to another function (returns outside). This is rare.
127
+ self._retout_sites: set[BlockNode] = set()
128
+ # block nodes (basic block nodes) at whose ends the function terminates
129
+ # in theory, if everything works fine, endpoints == ret_sites | jumpout_sites | callout_sites
130
+ self._endpoints: defaultdict[str, set[BlockNode]] = defaultdict(set)
131
+
132
+ self._call_sites = {}
133
+ self.addr = addr
134
+ # startpoint can be None if the corresponding CFGNode is a syscall node
135
+ self.startpoint = None
136
+ self._function_manager = function_manager
137
+ self.is_syscall = None
138
+ self.is_simprocedure = False
139
+ self.is_alignment = alignment
140
+
141
+ # These properties are set by VariableManager
142
+ self.bp_on_stack = False
143
+ self.retaddr_on_stack = False
144
+ self.sp_delta = 0
145
+ # Calling convention
146
+ self.calling_convention = calling_convention
147
+ # Function prototype
148
+ self.prototype = prototype
149
+ self.prototype_libname = prototype_libname
150
+ self.is_prototype_guessed = is_prototype_guessed
151
+ # Whether this function returns or not. `None` means it's not determined yet
152
+ self._returning = None
153
+
154
+ self._addr_to_block_node = {} # map addresses to nodes. it's a cache of blocks. if a block is removed from the
155
+ # function, it may not be removed from _addr_to_block_node. if you want to list
156
+ # all blocks of a function, access .blocks.
157
+ self._block_sizes = {} # map addresses to block sizes
158
+ self._local_blocks = {} # a dict of all blocks inside the function
159
+ self._local_block_addrs = set() # a set of addresses of all blocks inside the function
160
+
161
+ self.info = {} # storing special information, like $gp values for MIPS32
162
+ self.tags = () # store function tags. can be set manually by performing CodeTagging analysis.
163
+
164
+ # Initialize _cyclomatic_complexity to None
165
+ self._cyclomatic_complexity = None
166
+
167
+ # TODO: Can we remove the following two members?
168
+ # Register offsets of those arguments passed in registers
169
+ self._argument_registers = []
170
+ # Stack offsets of those arguments passed in stack variables
171
+ self._argument_stack_variables = []
172
+
173
+ self._project: Project | None = None # will be initialized upon the first access to self.project
174
+
175
+ self.ran_cca = False # this is set by CompleteCallingConventions to avoid reprocessing failed functions
176
+
177
+ #
178
+ # Initialize unspecified properties
179
+ #
180
+
181
+ if syscall is not None:
182
+ self.is_syscall = syscall
183
+ else:
184
+ if self.project is None:
185
+ raise ValueError(
186
+ "'syscall' must be specified if you do not specify a function manager for this new function."
187
+ )
188
+
189
+ # Determine whether this function is a syscall or not
190
+ self.is_syscall = self.project.simos.is_syscall_addr(addr)
191
+
192
+ # Determine whether this function is a SimProcedure
193
+ if is_simprocedure is not None:
194
+ self.is_simprocedure = is_simprocedure
195
+ else:
196
+ if self.project is None:
197
+ raise ValueError(
198
+ "'is_simprocedure' must be specified if you do not specify a function manager for this new "
199
+ "function."
200
+ )
201
+
202
+ if self.is_syscall or self.project.is_hooked(addr):
203
+ self.is_simprocedure = True
204
+
205
+ # Determine if this function is a PLT entry
206
+ if is_plt is not None:
207
+ self.is_plt = is_plt
208
+ else:
209
+ if self._function_manager is not None:
210
+ # use the faster cached version
211
+ self.is_plt = self._function_manager.is_plt_cached(addr)
212
+ else:
213
+ # Whether this function is a PLT entry or not is primarily relying on the PLT detection in CLE; it may
214
+ # also be updated (to True) during CFG recovery.
215
+ if self.project is None:
216
+ raise ValueError(
217
+ "'is_plt' must be specified if you do not specify a function manager for this new function."
218
+ )
219
+ self.is_plt = self.project.loader.find_plt_stub_name(addr) is not None
220
+
221
+ # Determine the name of this function
222
+ if name is None:
223
+ self._name = self._get_initial_name()
224
+ else:
225
+ self.is_default_name = False
226
+ self._name = name
227
+ self.previous_names = []
228
+ self.from_signature: str | None = None
229
+
230
+ # Determine the name the binary where this function is.
231
+ if binary_name is not None:
232
+ self.binary_name = binary_name
233
+ else:
234
+ self.binary_name = self._get_initial_binary_name()
235
+
236
+ # Determine returning status for SimProcedures and Syscalls
237
+ if returning is not None:
238
+ self._returning = returning
239
+ else:
240
+ if self.project is None:
241
+ raise ValueError(
242
+ "'returning' must be specified if you do not specify a function manager for this new function."
243
+ )
244
+
245
+ self._returning = self._get_initial_returning()
246
+
247
+ self._init_prototype_and_calling_convention()
248
+
249
+ @property
250
+ def name(self):
251
+ return self._name
252
+
253
+ @name.setter
254
+ def name(self, v):
255
+ self.previous_names.append(self._name)
256
+ self._name = v
257
+ self._function_manager._kb.labels[self.addr] = v
258
+
259
+ @property
260
+ def project(self):
261
+ if self._project is None and self._function_manager is not None:
262
+ # try to set it from function manager
263
+ self._project: Project | None = self._function_manager._kb._project
264
+ return self._project
265
+
266
+ @property
267
+ def returning(self):
268
+ return self._returning
269
+
270
+ @returning.setter
271
+ def returning(self, v):
272
+ self._returning = v
273
+
274
+ @property
275
+ def blocks(self):
276
+ """
277
+ An iterator of all local blocks in the current function.
278
+
279
+ :return: angr.lifter.Block instances.
280
+ """
281
+
282
+ for block_addr, block in self._local_blocks.items():
283
+ with contextlib.suppress(SimEngineError, SimMemoryError):
284
+ yield self.get_block(
285
+ block_addr, size=block.size, byte_string=block.bytestr if isinstance(block, BlockNode) else None
286
+ )
287
+
288
+ @property
289
+ def cyclomatic_complexity(self):
290
+ """
291
+ The cyclomatic complexity of the function.
292
+
293
+ Cyclomatic complexity is a software metric used to indicate the complexity of a program.
294
+ It is a quantitative measure of the number of linearly independent paths through a program's source code.
295
+ It is computed using the formula: M = E - N + 2P, where
296
+ E = the number of edges in the graph,
297
+ N = the number of nodes in the graph,
298
+ P = the number of connected components.
299
+
300
+ The cyclomatic complexity value is lazily computed and cached for future use.
301
+ Initially this value is None until it is computed for the first time
302
+
303
+ :return: The cyclomatic complexity of the function.
304
+ :rtype: int
305
+ """
306
+ if self._cyclomatic_complexity is None:
307
+ self._cyclomatic_complexity = (
308
+ self.transition_graph.number_of_edges() - self.transition_graph.number_of_nodes() + 2
309
+ )
310
+ return self._cyclomatic_complexity
311
+
312
+ @property
313
+ def xrefs(self):
314
+ """
315
+ An iterator of all xrefs of the current function.
316
+
317
+ :return: angr.knowledge_plugins.xrefs.xref.XRef instances.
318
+ """
319
+ for block in self.blocks:
320
+ yield from self._function_manager._kb.xrefs.get_xrefs_by_ins_addr_region(
321
+ block.addr, block.addr + block.size
322
+ )
323
+
324
+ @property
325
+ def block_addrs(self):
326
+ """
327
+ An iterator of all local block addresses in the current function.
328
+
329
+ :return: block addresses.
330
+ """
331
+
332
+ return self._local_blocks.keys()
333
+
334
+ @property
335
+ def block_addrs_set(self):
336
+ """
337
+ Return a set of block addresses for a better performance of inclusion tests.
338
+
339
+ :return: A set of block addresses.
340
+ :rtype: set
341
+ """
342
+
343
+ return self._local_block_addrs
344
+
345
+ def get_block(self, addr: int, size: int | None = None, byte_string: bytes | None = None):
346
+ """
347
+ Getting a block out of the current function.
348
+
349
+ :param int addr: The address of the block.
350
+ :param int size: The size of the block. This is optional. If not provided, angr will load
351
+ :param byte_string:
352
+ :return:
353
+ """
354
+ if size is None and addr in self.block_addrs:
355
+ # we know the size
356
+ size = self._block_sizes[addr]
357
+
358
+ assert self.project is not None
359
+ block = self.project.factory.block(addr, size=size, byte_string=byte_string)
360
+ if size is None:
361
+ # update block_size dict
362
+ self._block_sizes[addr] = block.size
363
+ return block
364
+
365
+ # compatibility
366
+ _get_block = get_block
367
+
368
+ def get_block_size(self, addr: int) -> int | None:
369
+ return self._block_sizes.get(addr, None)
370
+
371
+ @property
372
+ def nodes(self) -> Iterable[CodeNode]:
373
+ return self.transition_graph.nodes()
374
+
375
+ def get_node(self, addr) -> BlockNode | None:
376
+ return self._addr_to_block_node.get(addr, None)
377
+
378
+ @property
379
+ def has_unresolved_jumps(self):
380
+ for addr in self.block_addrs:
381
+ if addr in self._function_manager._kb.unresolved_indirect_jumps:
382
+ b = self._function_manager._kb._project.factory.block(addr)
383
+ if b.vex.jumpkind == "Ijk_Boring":
384
+ return True
385
+ return False
386
+
387
+ @property
388
+ def has_unresolved_calls(self):
389
+ for addr in self.block_addrs:
390
+ if addr in self._function_manager._kb.unresolved_indirect_jumps:
391
+ b = self._function_manager._kb._project.factory.block(addr)
392
+ if b.vex.jumpkind == "Ijk_Call":
393
+ return True
394
+ return False
395
+
396
+ @property
397
+ def operations(self):
398
+ """
399
+ All of the operations that are done by this functions.
400
+ """
401
+ return [op for block in self.blocks for op in block.vex.operations]
402
+
403
+ @property
404
+ def code_constants(self):
405
+ """
406
+ All of the constants that are used by this functions's code.
407
+ """
408
+ # TODO: remove link register values
409
+ return [const.value for block in self.blocks for const in block.vex.constants]
410
+
411
+ @classmethod
412
+ def _get_cmsg(cls):
413
+ return function_pb2.Function() # pylint:disable=no-member
414
+
415
+ def serialize_to_cmessage(self):
416
+ return FunctionParser.serialize(self)
417
+
418
+ @classmethod
419
+ def parse_from_cmessage(cls, cmsg, **kwargs):
420
+ """
421
+ :param cmsg:
422
+
423
+ :return Function: The function instantiated out of the cmsg data.
424
+ """
425
+ return FunctionParser.parse_from_cmsg(cmsg, **kwargs)
426
+
427
+ def string_references(self, minimum_length=2):
428
+ """
429
+ All of the constant string references used by this function.
430
+
431
+ :param minimum_length: The minimum length of strings to find (default is 1)
432
+ :return: A generator yielding tuples of (address, string) where is address
433
+ is the location of the string in memory.
434
+ """
435
+
436
+ cfg = self._function_manager._kb.cfgs.get_most_accurate()
437
+
438
+ for x in self.xrefs:
439
+ try:
440
+ md = cfg.memory_data[x.dst]
441
+ except KeyError:
442
+ continue
443
+ if md.sort not in {MemoryDataSort.String, MemoryDataSort.UnicodeString}:
444
+ continue
445
+ if len(md.content) < minimum_length:
446
+ continue
447
+
448
+ yield (md.addr, md.content)
449
+
450
+ @property
451
+ def local_runtime_values(self):
452
+ """
453
+ Tries to find all runtime values of this function which do not come from inputs.
454
+ These values are generated by starting from a blank state and reanalyzing the basic blocks once each.
455
+ Function calls are skipped, and back edges are never taken so these values are often unreliable,
456
+ This function is good at finding simple constant addresses which the function will use or calculate.
457
+
458
+ :return: a set of constants
459
+ """
460
+ constants = set()
461
+
462
+ assert self.project is not None
463
+ if not self.project.loader.main_object.contains_addr(self.addr):
464
+ return constants
465
+
466
+ # FIXME the old way was better for architectures like mips, but we need the initial irsb
467
+ # reanalyze function with a new initial state (use persistent registers)
468
+ # initial_state = self._function_manager._cfg.get_any_irsb(self.addr).initial_state
469
+ # fresh_state = self.project.factory.blank_state(mode="fastpath")
470
+ # for reg in initial_state.arch.persistent_regs + ['ip']:
471
+ # fresh_state.registers.store(reg, initial_state.registers.load(reg))
472
+
473
+ # reanalyze function with a new initial state
474
+ fresh_state = self.project.factory.blank_state(mode="fastpath")
475
+ fresh_state.regs.ip = self.addr
476
+
477
+ graph_addrs = {x.addr for x in self.graph.nodes() if isinstance(x, BlockNode)}
478
+
479
+ # process the nodes in a breadth-first order keeping track of which nodes have already been analyzed
480
+ analyzed = set()
481
+ q = [fresh_state]
482
+ analyzed.add(fresh_state.solver.eval(fresh_state.ip))
483
+ while len(q) > 0:
484
+ state = q.pop()
485
+ # make sure its in this function
486
+ if state.solver.eval(state.ip) not in graph_addrs:
487
+ continue
488
+ # don't trace into simprocedures
489
+ if self.project.is_hooked(state.solver.eval(state.ip)):
490
+ continue
491
+ # don't trace outside of the binary
492
+ if not self.project.loader.main_object.contains_addr(state.solver.eval(state.ip)):
493
+ continue
494
+ # don't trace unreachable blocks
495
+ if state.history.jumpkind in {
496
+ "Ijk_EmWarn",
497
+ "Ijk_NoDecode",
498
+ "Ijk_MapFail",
499
+ "Ijk_NoRedir",
500
+ "Ijk_SigTRAP",
501
+ "Ijk_SigSEGV",
502
+ "Ijk_ClientReq",
503
+ }:
504
+ continue
505
+
506
+ curr_ip = state.solver.eval(state.ip)
507
+
508
+ # get runtime values from logs of successors
509
+ successors = self.project.factory.successors(state)
510
+ for succ in successors.flat_successors + successors.unsat_successors:
511
+ for a in succ.history.recent_actions:
512
+ for ao in a.all_objects:
513
+ if not isinstance(ao.ast, claripy.ast.Base):
514
+ constants.add(ao.ast)
515
+ elif not ao.ast.symbolic:
516
+ constants.add(succ.solver.eval(ao.ast))
517
+
518
+ # add successors to the queue to analyze
519
+ if not succ.solver.symbolic(succ.ip):
520
+ succ_ip = succ.solver.eval(succ.ip)
521
+ if succ_ip in self and succ_ip not in analyzed:
522
+ analyzed.add(succ_ip)
523
+ q.insert(0, succ)
524
+
525
+ # force jumps to missing successors
526
+ # (this is a slightly hacky way to force it to explore all the nodes in the function)
527
+ node = self.get_node(curr_ip)
528
+ if node is None:
529
+ # the node does not exist. maybe it's not a block node.
530
+ continue
531
+ missing = {x.addr for x in list(self.graph.successors(node))} - analyzed
532
+ for succ_addr in missing:
533
+ l.info("Forcing jump to missing successor: %#x", succ_addr)
534
+ if succ_addr not in analyzed:
535
+ all_successors = (
536
+ successors.unconstrained_successors + successors.flat_successors + successors.unsat_successors
537
+ )
538
+ if len(all_successors) > 0:
539
+ # set the ip of a copied successor to the successor address
540
+ succ = all_successors[0].copy()
541
+ succ.ip = succ_addr
542
+ analyzed.add(succ_addr)
543
+ q.insert(0, succ)
544
+ else:
545
+ l.warning("Could not reach successor: %#x", succ_addr)
546
+
547
+ return constants
548
+
549
+ @property
550
+ def num_arguments(self):
551
+ return len(self._argument_registers) + len(self._argument_stack_variables)
552
+
553
+ def __contains__(self, val):
554
+ if isinstance(val, int):
555
+ return val in self._block_sizes
556
+ return False
557
+
558
+ def __str__(self):
559
+ return (
560
+ f"Function {self.name} [{self.addr:#x}]\n"
561
+ f" Syscall: {self.is_syscall}\n"
562
+ f" SP difference: {self.sp_delta}\n"
563
+ f" Has return: {self.has_return}\n"
564
+ f" Returning: {'Unknown' if self.returning is None else self.returning}\n"
565
+ f" Alignment: {self.is_alignment}\n"
566
+ f" Arguments: reg: {self._argument_registers}, stack: {self._argument_stack_variables}\n"
567
+ f" Blocks: [{', '.join(f'{i:#x}' for i in self.block_addrs)}]\n"
568
+ f" Cyclomatic Complexity: {self.cyclomatic_complexity}\n"
569
+ f" Calling convention: {self.calling_convention}"
570
+ )
571
+
572
+ def __repr__(self):
573
+ if self.is_syscall:
574
+ return f"<Syscall function {self.name} ({hex(self.addr) if isinstance(self.addr, int) else self.addr})>"
575
+ return f"<Function {self.name} ({hex(self.addr) if isinstance(self.addr, int) else self.addr})>"
576
+
577
+ def __setstate__(self, state):
578
+ for k, v in state.items():
579
+ setattr(self, k, v)
580
+
581
+ def __getstate__(self):
582
+ # self._local_transition_graph is a cache. don't pickle it
583
+ d = {k: getattr(self, k) for k in self.__slots__}
584
+ d["_local_transition_graph"] = None
585
+ d["_project"] = None
586
+ d["_function_manager"] = None
587
+ return d
588
+
589
+ @property
590
+ def endpoints(self):
591
+ return list(itertools.chain(*self._endpoints.values()))
592
+
593
+ @property
594
+ def endpoints_with_type(self):
595
+ return self._endpoints
596
+
597
+ @property
598
+ def ret_sites(self):
599
+ return list(self._ret_sites)
600
+
601
+ @property
602
+ def jumpout_sites(self):
603
+ return list(self._jumpout_sites)
604
+
605
+ @property
606
+ def retout_sites(self):
607
+ return list(self._retout_sites)
608
+
609
+ @property
610
+ def callout_sites(self):
611
+ return list(self._callout_sites)
612
+
613
+ @property
614
+ def size(self):
615
+ return sum(self._block_sizes[addr] for addr in self._local_blocks)
616
+
617
+ @property
618
+ def binary(self):
619
+ """
620
+ Get the object this function belongs to.
621
+ :return: The object this function belongs to.
622
+ """
623
+ assert self.project is not None
624
+ return self.project.loader.find_object_containing(self.addr, membership_check=False)
625
+
626
+ @property
627
+ def offset(self) -> int:
628
+ """
629
+ :return: the function's binary offset (i.e., non-rebased address)
630
+ """
631
+ return self.addr - self.binary.mapped_base
632
+
633
+ @property
634
+ def symbol(self) -> None | Symbol:
635
+ """
636
+ :return: the function's Symbol, if any
637
+ """
638
+ return self.binary.loader.find_symbol(self.addr)
639
+
640
+ @property
641
+ def pseudocode(self) -> str | None:
642
+ """
643
+ :return: the function's pseudocode
644
+ """
645
+ dec = self.project.analyses.Decompiler(self, cfg=self._function_manager._kb.cfgs.get_most_accurate())
646
+ return dec.codegen.text if dec.codegen else None
647
+
648
+ def add_jumpout_site(self, node: CodeNode):
649
+ """
650
+ Add a custom jumpout site.
651
+
652
+ :param node: The address of the basic block that control flow leaves during this transition.
653
+ :return: None
654
+ """
655
+
656
+ node = self._register_node(True, node)
657
+ self._jumpout_sites.add(node)
658
+ self._add_endpoint(node, "transition")
659
+
660
+ def add_retout_site(self, node: CodeNode):
661
+ """
662
+ Add a custom retout site.
663
+
664
+ Retout (returning to outside of the function) sites are very rare. It mostly occurs during CFG recovery when we
665
+ incorrectly identify the beginning of a function in the first iteration, and then correctly identify that
666
+ function later in the same iteration (function alignments can lead to this bizarre case). We will mark all edges
667
+ going out of the header of that function as a outside edge, because all successors now belong to the
668
+ incorrectly-identified function. This identification error will be fixed in the second iteration of CFG
669
+ recovery. However, we still want to keep track of jumpouts/retouts during the first iteration so other logic in
670
+ CFG recovery still work.
671
+
672
+ :param node: The address of the basic block that control flow leaves the current function after a call.
673
+ :return: None
674
+ """
675
+
676
+ node = self._register_node(True, node)
677
+ self._retout_sites.add(node)
678
+ self._add_endpoint(node, "return")
679
+
680
+ def _get_initial_name(self):
681
+ """
682
+ Determine the most suitable name of the function.
683
+
684
+ :return: The initial function name.
685
+ :rtype: string
686
+ """
687
+
688
+ name = None
689
+ addr = self.addr
690
+
691
+ self.is_default_name = False
692
+ # Try to get a name from existing labels
693
+ if self._function_manager is not None and addr in self._function_manager._kb.labels:
694
+ name = self._function_manager._kb.labels[addr]
695
+
696
+ # try to get the name from a hook
697
+ if name is None and self.project is not None:
698
+ project = self.project
699
+ if project.is_hooked(addr):
700
+ hooker = project.hooked_by(addr)
701
+ if hooker is not None:
702
+ name = hooker.display_name
703
+ elif project.simos.is_syscall_addr(addr):
704
+ syscall_inst = project.simos.syscall_from_addr(addr)
705
+ if syscall_inst is not None:
706
+ name = syscall_inst.display_name
707
+
708
+ # generate an IDA-style sub_X name
709
+ if name is None:
710
+ self.is_default_name = True
711
+ name = f"sub_{addr:x}"
712
+
713
+ return name
714
+
715
+ def _get_initial_binary_name(self) -> str | None:
716
+ """
717
+ Determine the name of the binary where this function is.
718
+
719
+ :return: None
720
+ """
721
+
722
+ binary_name = None
723
+
724
+ # if this function is a simprocedure but not a syscall, use its library name as
725
+ # its binary name
726
+ # if it is a syscall, fall back to use self.binary.binary which explicitly says cle##kernel
727
+ if self.project and self.is_simprocedure and not self.is_syscall:
728
+ hooker = self.project.hooked_by(self.addr)
729
+ if hooker is not None:
730
+ binary_name = hooker.library_name
731
+
732
+ if binary_name is None:
733
+ if self._function_manager is not None:
734
+ # use the faster cached version
735
+ binary_name = self._function_manager.get_binary_name_cached(self.addr)
736
+ else:
737
+ if self.binary is not None and self.binary.binary:
738
+ binary_name = os.path.basename(self.binary.binary)
739
+
740
+ return binary_name
741
+
742
+ def _get_initial_returning(self):
743
+ """
744
+ Determine if this function returns or not *if it is hooked by a SimProcedure or a user hook*.
745
+
746
+ :return: True if the hooker returns, False otherwise.
747
+ :rtype: bool
748
+ """
749
+
750
+ hooker = None
751
+ if self.is_syscall:
752
+ hooker = self.project.simos.syscall_from_addr(self.addr)
753
+ elif self.is_simprocedure:
754
+ hooker = self.project.hooked_by(self.addr)
755
+ if hooker:
756
+ if hasattr(hooker, "DYNAMIC_RET") and hooker.DYNAMIC_RET:
757
+ return True
758
+ if hasattr(hooker, "NO_RET"):
759
+ return not hooker.NO_RET
760
+
761
+ # Cannot determine
762
+ return None
763
+
764
+ def _init_prototype_and_calling_convention(self) -> None:
765
+ """
766
+ Initialize prototype and calling convention from a SimProcedure, if available.
767
+ """
768
+ hooker = None
769
+ if self.is_syscall and self.project is not None and self.project.simos.is_syscall_addr(self.addr):
770
+ hooker = self.project.simos.syscall_from_addr(self.addr)
771
+ elif self.is_simprocedure and self.project is not None:
772
+ hooker = self.project.hooked_by(self.addr)
773
+ if hooker is None or hooker.guessed_prototype:
774
+ return
775
+
776
+ if hooker.prototype:
777
+ self.prototype_libname = hooker.library_name
778
+ self.prototype = hooker.prototype
779
+ self.is_prototype_guessed = False
780
+
781
+ cc = hooker.cc
782
+ if cc is None and self.project is not None:
783
+ arch = self.project.arch
784
+ if arch.name in DEFAULT_CC:
785
+ cc_cls = default_cc(
786
+ arch.name, platform=self.project.simos.name if self.project.simos is not None else None
787
+ )
788
+ if cc_cls is not None:
789
+ cc = cc_cls(arch)
790
+ self.calling_convention = cc
791
+
792
+ def _clear_transition_graph(self):
793
+ self._block_sizes = {}
794
+ self._addr_to_block_node = {}
795
+ self._local_blocks = {}
796
+ self._local_block_addrs = set()
797
+ self.startpoint = None
798
+ self.transition_graph = networkx.classes.digraph.DiGraph()
799
+ self._local_transition_graph = None
800
+
801
+ self._ret_sites = set()
802
+ self._jumpout_sites = set()
803
+ self._callout_sites = set()
804
+ self._retout_sites = set()
805
+ self._endpoints = defaultdict(set)
806
+ self._call_sites = {}
807
+
808
+ def _confirm_fakeret(self, src, dst):
809
+ if src not in self.transition_graph or dst not in self.transition_graph[src]:
810
+ raise AngrValueError(f"FakeRet edge ({src}, {dst}) is not in transition graph.")
811
+
812
+ data = self.transition_graph[src][dst]
813
+
814
+ if "type" not in data or data["type"] != "fake_return":
815
+ raise AngrValueError(f"Edge ({src}, {dst}) is not a FakeRet edge")
816
+
817
+ # it's confirmed. register the node if needed
818
+ if "outside" not in data or data["outside"] is False:
819
+ dst = self._register_node(True, dst)
820
+
821
+ self.transition_graph[src][dst]["confirmed"] = True
822
+
823
+ def _transit_to(
824
+ self, from_node: CodeNode, to_node, outside=False, ins_addr=None, stmt_idx=None, is_exception=False
825
+ ):
826
+ """
827
+ Registers an edge between basic blocks in this function's transition graph.
828
+ Arguments are CodeNode objects.
829
+
830
+ :param from_node The address of the basic block that control
831
+ flow leaves during this transition.
832
+ :param to_node The address of the basic block that control
833
+ flow enters during this transition.
834
+ :param bool outside: If this is a transition to another function, e.g. tail call optimization
835
+ :return: None
836
+ """
837
+
838
+ if outside:
839
+ from_node = self._register_node(True, from_node)
840
+ if to_node is not None:
841
+ to_node = self._register_node(False, to_node)
842
+
843
+ self._jumpout_sites.add(from_node)
844
+ else:
845
+ from_node = self._register_node(True, from_node)
846
+ if to_node is not None:
847
+ to_node = self._register_node(True, to_node)
848
+
849
+ type_ = "transition" if not is_exception else "exception"
850
+ if to_node is not None:
851
+ self.transition_graph.add_edge(
852
+ from_node, to_node, type=type_, outside=outside, ins_addr=ins_addr, stmt_idx=stmt_idx
853
+ )
854
+
855
+ if outside:
856
+ # this node is an endpoint of the current function
857
+ self._add_endpoint(from_node, type_)
858
+
859
+ # clear the cache
860
+ self._local_transition_graph = None
861
+
862
+ def _call_to(self, from_node, to_func, ret_node, stmt_idx=None, ins_addr=None, return_to_outside=False):
863
+ """
864
+ Registers an edge between the caller basic block and callee function.
865
+
866
+ :param from_addr: The basic block that control flow leaves during the transition.
867
+ :type from_addr: angr.knowledge.CodeNode
868
+ :param to_func: The function that we are calling
869
+ :type to_func: Function
870
+ :param ret_node The basic block that control flow should return to after the
871
+ function call.
872
+ :type to_func: angr.knowledge.CodeNode or None
873
+ :param stmt_idx: Statement ID of this call.
874
+ :type stmt_idx: int, str or None
875
+ :param ins_addr: Instruction address of this call.
876
+ :type ins_addr: int or None
877
+ """
878
+
879
+ from_node = self._register_node(True, from_node)
880
+
881
+ if to_func.is_syscall:
882
+ self.transition_graph.add_edge(from_node, to_func, type="syscall", stmt_idx=stmt_idx, ins_addr=ins_addr)
883
+ else:
884
+ self.transition_graph.add_edge(from_node, to_func, type="call", stmt_idx=stmt_idx, ins_addr=ins_addr)
885
+ if ret_node is not None:
886
+ ret_node = self._register_node(return_to_outside is False, ret_node)
887
+ self._fakeret_to(from_node, ret_node, to_outside=return_to_outside)
888
+
889
+ self._local_transition_graph = None
890
+
891
+ def _fakeret_to(self, from_node, to_node, confirmed=None, to_outside=False):
892
+ from_node = self._register_node(True, from_node)
893
+ if confirmed:
894
+ to_node = self._register_node(not to_outside, to_node)
895
+
896
+ if confirmed is None:
897
+ self.transition_graph.add_edge(from_node, to_node, type="fake_return", outside=to_outside)
898
+ else:
899
+ self.transition_graph.add_edge(
900
+ from_node, to_node, type="fake_return", confirmed=confirmed, outside=to_outside
901
+ )
902
+
903
+ self._local_transition_graph = None
904
+
905
+ def _remove_fakeret(self, from_node, to_node):
906
+ self.transition_graph.remove_edge(from_node, to_node)
907
+
908
+ self._local_transition_graph = None
909
+
910
+ def _return_from_call(self, from_func, to_node, to_outside=False):
911
+ self.transition_graph.add_edge(from_func, to_node, type="return", to_outside=to_outside)
912
+ for _, _, data in self.transition_graph.in_edges(to_node, data=True):
913
+ if "type" in data and data["type"] == "fake_return":
914
+ data["confirmed"] = True
915
+
916
+ self._local_transition_graph = None
917
+
918
+ def _update_local_blocks(self, node: CodeNode):
919
+ if node.addr not in self._local_blocks or self._local_blocks[node.addr] != node:
920
+ self._local_blocks[node.addr] = node
921
+ self._local_block_addrs.add(node.addr)
922
+
923
+ def _update_addr_to_block_cache(self, node: BlockNode):
924
+ if node.addr not in self._addr_to_block_node:
925
+ self._addr_to_block_node[node.addr] = node
926
+
927
+ @overload
928
+ def _register_node(self, is_local: bool, node: CodeNode) -> CodeNode: ...
929
+
930
+ @overload
931
+ def _register_node(self, is_local: bool, node: Function) -> Function: ...
932
+
933
+ def _register_node(self, is_local: bool, node: CodeNode | Function) -> CodeNode | Function:
934
+ # if the node already exists and is the same, we reuse the existing node
935
+ if is_local and self._local_blocks.get(node.addr, None) == node:
936
+ return self._local_blocks[node.addr]
937
+
938
+ if node.addr not in self and node not in self.transition_graph:
939
+ # only add each node to the graph once
940
+ self.transition_graph.add_node(node)
941
+
942
+ if not isinstance(node, CodeNode):
943
+ # function and other things bail here
944
+ return node
945
+
946
+ # this is either a new node or a different node at the same address
947
+ node._graph = self.transition_graph
948
+ if self._block_sizes.get(node.addr, 0) == 0:
949
+ self._block_sizes[node.addr] = node.size
950
+ if node.addr == self.addr and (self.startpoint is None or not self.startpoint.is_hook):
951
+ self.startpoint = node
952
+ if is_local and node.addr not in self._local_blocks:
953
+ self._update_local_blocks(node)
954
+ # add BlockNodes to the addr_to_block_node cache if not already there
955
+ if isinstance(node, BlockNode):
956
+ self._update_addr_to_block_cache(node)
957
+ # else:
958
+ # # checks that we don't have multiple block nodes at a single address
959
+ # assert node == self._addr_to_block_node[node.addr]
960
+ return node
961
+
962
+ def _add_return_site(self, return_site: CodeNode):
963
+ """
964
+ Registers a basic block as a site for control flow to return from this function.
965
+
966
+ :param return_site: The block node that ends with a return.
967
+ """
968
+ return_site = self._register_node(True, return_site)
969
+
970
+ self._ret_sites.add(return_site)
971
+ # A return site must be an endpoint of the function - you cannot continue execution of the current function
972
+ # after returning
973
+ self._add_endpoint(return_site, "return")
974
+
975
+ def _add_call_site(self, call_site_addr, call_target_addr, retn_addr):
976
+ """
977
+ Registers a basic block as calling a function and returning somewhere.
978
+
979
+ :param call_site_addr: The address of a basic block that ends in a call.
980
+ :param call_target_addr: The address of the target of said call.
981
+ :param retn_addr: The address that said call will return to.
982
+ """
983
+ self._call_sites[call_site_addr] = (call_target_addr, retn_addr)
984
+
985
+ def _add_endpoint(self, endpoint_node, sort):
986
+ """
987
+ Registers an endpoint with a type of `sort`. The type can be one of the following:
988
+ - call: calling a function that does not return
989
+ - return: returning from the current function
990
+ - transition: a jump/branch targeting a different function
991
+
992
+ It is possible for a block to act as two different sorts of endpoints. For example, consider the following
993
+ block:
994
+
995
+ .text:0000000000024350 mov eax, 1
996
+ .text:0000000000024355 lock xadd [rdi+4], eax
997
+ .text:000000000002435A retn
998
+
999
+ VEX code:
1000
+ 00 | ------ IMark(0x424350, 5, 0) ------
1001
+ 01 | PUT(rax) = 0x0000000000000001
1002
+ 02 | PUT(rip) = 0x0000000000424355
1003
+ 03 | ------ IMark(0x424355, 5, 0) ------
1004
+ 04 | t11 = GET:I64(rdi)
1005
+ 05 | t10 = Add64(t11,0x0000000000000004)
1006
+ 06 | t0 = LDle:I32(t10)
1007
+ 07 | t2 = Add32(t0,0x00000001)
1008
+ 08 | t(4,4294967295) = CASle(t10 :: (t0,None)->(t2,None))
1009
+ 09 | t14 = CasCmpNE32(t4,t0)
1010
+ 10 | if (t14) { PUT(rip) = 0x424355; Ijk_Boring }
1011
+ 11 | PUT(cc_op) = 0x0000000000000003
1012
+ 12 | t15 = 32Uto64(t0)
1013
+ 13 | PUT(cc_dep1) = t15
1014
+ 14 | PUT(cc_dep2) = 0x0000000000000001
1015
+ 15 | t17 = 32Uto64(t0)
1016
+ 16 | PUT(rax) = t17
1017
+ 17 | PUT(rip) = 0x000000000042435a
1018
+ 18 | ------ IMark(0x42435a, 1, 0) ------
1019
+ 19 | t6 = GET:I64(rsp)
1020
+ 20 | t7 = LDle:I64(t6)
1021
+ 21 | t8 = Add64(t6,0x0000000000000008)
1022
+ 22 | PUT(rsp) = t8
1023
+ 23 | t18 = Sub64(t8,0x0000000000000080)
1024
+ 24 | ====== AbiHint(0xt18, 128, t7) ======
1025
+ NEXT: PUT(rip) = t7; Ijk_Ret
1026
+
1027
+ This block acts as both a return endpoint and a transition endpoint (transitioning to 0x424355).
1028
+
1029
+ :param endpoint_node: The endpoint node.
1030
+ :param sort: Type of the endpoint.
1031
+ :return: None
1032
+ """
1033
+
1034
+ self._endpoints[sort].add(endpoint_node)
1035
+
1036
+ def mark_nonreturning_calls_endpoints(self):
1037
+ """
1038
+ Iterate through all call edges in transition graph. For each call a non-returning function, mark the source
1039
+ basic block as an endpoint.
1040
+
1041
+ This method should only be executed once all functions are recovered and analyzed by CFG recovery, so we know
1042
+ whether each function returns or not.
1043
+
1044
+ :return: None
1045
+ """
1046
+
1047
+ for src, dst, data in self.transition_graph.edges(data=True):
1048
+ if "type" in data and data["type"] == "call":
1049
+ func_addr = dst.addr
1050
+ if func_addr in self._function_manager:
1051
+ function = self._function_manager[func_addr]
1052
+ if function.returning is False:
1053
+ # the target function does not return
1054
+ the_node = self.get_node(src.addr)
1055
+ if the_node is not None:
1056
+ self._callout_sites.add(the_node)
1057
+ self._add_endpoint(the_node, "call")
1058
+
1059
+ def get_call_sites(self) -> Iterable[int]:
1060
+ """
1061
+ Gets a list of all the basic blocks that end in calls.
1062
+
1063
+ :return: A view of the addresses of the blocks that end in calls.
1064
+ """
1065
+ return self._call_sites.keys()
1066
+
1067
+ def get_call_target(self, callsite_addr):
1068
+ """
1069
+ Get the target of a call.
1070
+
1071
+ :param callsite_addr: The address of a basic block that ends in a call.
1072
+ :return: The target of said call, or None if callsite_addr is not a
1073
+ callsite.
1074
+ """
1075
+ if callsite_addr in self._call_sites:
1076
+ return self._call_sites[callsite_addr][0]
1077
+ return None
1078
+
1079
+ def get_call_return(self, callsite_addr):
1080
+ """
1081
+ Get the hypothetical return address of a call.
1082
+
1083
+ :param callsite_addr: The address of the basic block that ends in a call.
1084
+ :return: The likely return target of said call, or None if callsite_addr
1085
+ is not a callsite.
1086
+ """
1087
+ if callsite_addr in self._call_sites:
1088
+ return self._call_sites[callsite_addr][1]
1089
+ return None
1090
+
1091
+ @property
1092
+ def graph(self):
1093
+ """
1094
+ Get a local transition graph. A local transition graph is a transition graph that only contains nodes that
1095
+ belong to the current function. All edges, except for the edges going out from the current function or coming
1096
+ from outside the current function, are included.
1097
+
1098
+ The generated graph is cached in self._local_transition_graph.
1099
+
1100
+ :return: A local transition graph.
1101
+ :rtype: networkx.DiGraph
1102
+ """
1103
+
1104
+ if self._local_transition_graph is not None:
1105
+ return self._local_transition_graph
1106
+
1107
+ g = networkx.classes.digraph.DiGraph()
1108
+ if self.startpoint is not None:
1109
+ g.add_node(self.startpoint)
1110
+ for block in self._local_blocks.values():
1111
+ g.add_node(block)
1112
+ for src, dst, data in self.transition_graph.edges(data=True):
1113
+ if "type" in data and (
1114
+ (data["type"] in ("transition", "exception") and ("outside" not in data or data["outside"] is False))
1115
+ or (data["type"] == "fake_return" and ("outside" not in data or data["outside"] is False))
1116
+ ):
1117
+ g.add_edge(src, dst, **data)
1118
+
1119
+ self._local_transition_graph = g
1120
+
1121
+ return g
1122
+
1123
+ def graph_ex(self, exception_edges=True):
1124
+ """
1125
+ Get a local transition graph with a custom configuration. A local transition graph is a transition graph that
1126
+ only contains nodes that belong to the current function. This method allows user to exclude certain types of
1127
+ edges together with the nodes that are only reachable through such edges, such as exception edges.
1128
+
1129
+ The generated graph is not cached.
1130
+
1131
+ :param bool exception_edges: Should exception edges and the nodes that are only reachable through exception
1132
+ edges be kept.
1133
+ :return: A local transition graph with a special configuration.
1134
+ :rtype: networkx.DiGraph
1135
+ """
1136
+
1137
+ # graph_ex() should not impact any already cached graph
1138
+ old_cached_graph = self._local_transition_graph
1139
+ graph = self.graph
1140
+ self._local_transition_graph = old_cached_graph # restore the cached graph
1141
+
1142
+ # fast path
1143
+ if exception_edges:
1144
+ return graph
1145
+
1146
+ # BFS on local graph but ignoring certain types of graphs
1147
+ g = networkx.classes.digraph.DiGraph()
1148
+ queue = [n for n in graph if n is self.startpoint or graph.in_degree[n] == 0]
1149
+ traversed = set(queue)
1150
+
1151
+ while queue:
1152
+ node = queue.pop(0)
1153
+
1154
+ g.add_node(node)
1155
+ for _, dst, edge_data in graph.out_edges(node, data=True):
1156
+ edge_type = edge_data.get("type", None)
1157
+ if not exception_edges and edge_type == "exception":
1158
+ # ignore this edge
1159
+ continue
1160
+ g.add_edge(node, dst, **edge_data)
1161
+
1162
+ if dst not in traversed:
1163
+ traversed.add(dst)
1164
+ queue.append(dst)
1165
+
1166
+ return g
1167
+
1168
+ def transition_graph_ex(self, exception_edges=True):
1169
+ """
1170
+ Get a transition graph with a custom configuration. This method allows user to exclude certain types of edges
1171
+ together with the nodes that are only reachable through such edges, such as exception edges.
1172
+
1173
+ The generated graph is not cached.
1174
+
1175
+ :param bool exception_edges: Should exception edges and the nodes that are only reachable through exception
1176
+ edges be kept.
1177
+ :return: A local transition graph with a special configuration.
1178
+ :rtype: networkx.DiGraph
1179
+ """
1180
+
1181
+ graph = self.transition_graph
1182
+
1183
+ # fast path
1184
+ if exception_edges:
1185
+ return graph
1186
+
1187
+ # BFS on local graph but ignoring certain types of graphs
1188
+ g = networkx.classes.digraph.DiGraph()
1189
+ queue = [n for n in graph if n is self.startpoint or graph.in_degree[n] == 0]
1190
+ traversed = set(queue)
1191
+
1192
+ while queue:
1193
+ node = queue.pop(0)
1194
+ traversed.add(node)
1195
+
1196
+ g.add_node(node)
1197
+ for _, dst, edge_data in graph.out_edges(node, data=True):
1198
+ edge_type = edge_data.get("type", None)
1199
+ if not exception_edges and edge_type == "exception":
1200
+ # ignore this edge
1201
+ continue
1202
+ g.add_edge(node, dst, **edge_data)
1203
+
1204
+ if dst not in traversed:
1205
+ traversed.add(dst)
1206
+ queue.append(dst)
1207
+
1208
+ return g
1209
+
1210
+ def subgraph(self, ins_addrs):
1211
+ """
1212
+ Generate a sub control flow graph of instruction addresses based on self.graph
1213
+
1214
+ :param iterable ins_addrs: A collection of instruction addresses that should be included in the subgraph.
1215
+ :return networkx.DiGraph: A subgraph.
1216
+ """
1217
+
1218
+ # find all basic blocks that include those instructions
1219
+ blocks = []
1220
+ block_addr_to_insns = {}
1221
+
1222
+ for b in self._local_blocks.values():
1223
+ # TODO: should I call get_blocks?
1224
+ block = self.get_block(b.addr, size=b.size, byte_string=b.bytestr)
1225
+ common_insns = set(block.instruction_addrs).intersection(ins_addrs)
1226
+ if common_insns:
1227
+ blocks.append(b)
1228
+ block_addr_to_insns[b.addr] = sorted(common_insns)
1229
+
1230
+ # subgraph = networkx.subgraph(self.graph, blocks)
1231
+ subgraph = self.graph.subgraph(blocks).copy()
1232
+ g = networkx.classes.digraph.DiGraph()
1233
+
1234
+ for n in subgraph.nodes():
1235
+ insns = block_addr_to_insns[n.addr]
1236
+
1237
+ in_edges = subgraph.in_edges(n)
1238
+ # out_edges = subgraph.out_edges(n)
1239
+ # the first instruction address should be included
1240
+ if len(in_edges) > 1 and n.addr not in insns:
1241
+ insns = [n.addr, *insns]
1242
+
1243
+ for src, _ in in_edges:
1244
+ last_instr = block_addr_to_insns[src.addr][-1]
1245
+ g.add_edge(last_instr, insns[0])
1246
+
1247
+ for i in range(len(insns) - 1):
1248
+ g.add_edge(insns[i], insns[i + 1])
1249
+
1250
+ return g
1251
+
1252
+ def instruction_size(self, insn_addr):
1253
+ """
1254
+ Get the size of the instruction specified by `insn_addr`.
1255
+
1256
+ :param int insn_addr: Address of the instruction
1257
+ :return int: Size of the instruction in bytes, or None if the instruction is not found.
1258
+ """
1259
+
1260
+ for block in self.blocks:
1261
+ if insn_addr in block.instruction_addrs:
1262
+ index = block.instruction_addrs.index(insn_addr)
1263
+ if index == len(block.instruction_addrs) - 1:
1264
+ # the very last instruction
1265
+ size = block.addr + block.size - insn_addr
1266
+ else:
1267
+ size = block.instruction_addrs[index + 1] - insn_addr
1268
+ return size
1269
+
1270
+ return None
1271
+
1272
+ def addr_to_instruction_addr(self, addr):
1273
+ """
1274
+ Obtain the address of the instruction that covers @addr.
1275
+
1276
+ :param int addr: An address.
1277
+ :return: Address of the instruction that covers @addr, or None if this addr is not covered by any
1278
+ instruction of this function.
1279
+ :rtype: int or None
1280
+ """
1281
+
1282
+ # TODO: Replace the linear search with binary search
1283
+ for b in self.blocks:
1284
+ if b.addr <= addr < b.addr + b.size:
1285
+ # found it
1286
+ for i, instr_addr in enumerate(b.instruction_addrs):
1287
+ if (i < len(b.instruction_addrs) - 1 and instr_addr <= addr < b.instruction_addrs[i + 1]) or (
1288
+ i == len(b.instruction_addrs) - 1 and instr_addr <= addr
1289
+ ):
1290
+ return instr_addr
1291
+ # Not covered by any instruction... why?
1292
+ return None
1293
+ return None
1294
+
1295
+ def dbg_print(self):
1296
+ """
1297
+ Returns a representation of the list of basic blocks in this function.
1298
+ """
1299
+ return "[{}]".format(", ".join((f"{n.addr:#08x}") for n in self.transition_graph.nodes()))
1300
+
1301
+ def dbg_draw(self, filename):
1302
+ """
1303
+ Draw the graph and save it to a PNG file.
1304
+ """
1305
+ import matplotlib.pyplot as pyplot # pylint: disable=import-error,import-outside-toplevel
1306
+ from networkx.drawing.nx_agraph import graphviz_layout # pylint: disable=import-error,import-outside-toplevel
1307
+
1308
+ tmp_graph = networkx.classes.digraph.DiGraph()
1309
+ for from_block, to_block in self.transition_graph.edges():
1310
+ node_a = f"{from_block.addr:#08x}"
1311
+ node_b = f"{to_block.addr:#08x}"
1312
+ if node_b in self._ret_sites:
1313
+ node_b += "[Ret]"
1314
+ if node_a in self._call_sites:
1315
+ node_a += "[Call]"
1316
+ tmp_graph.add_edge(node_a, node_b)
1317
+ pos = graphviz_layout(tmp_graph, prog="fdp") # pylint: disable=no-member
1318
+ networkx.draw(tmp_graph, pos, node_size=1200)
1319
+ pyplot.savefig(filename)
1320
+
1321
+ def _add_argument_register(self, reg_offset):
1322
+ """
1323
+ Registers a register offset as being used as an argument to the function.
1324
+
1325
+ :param reg_offset: The offset of the register to register.
1326
+ """
1327
+ if reg_offset in self._function_manager._arg_registers and reg_offset not in self._argument_registers:
1328
+ self._argument_registers.append(reg_offset)
1329
+
1330
+ def _add_argument_stack_variable(self, stack_var_offset):
1331
+ if stack_var_offset not in self._argument_stack_variables:
1332
+ self._argument_stack_variables.append(stack_var_offset)
1333
+
1334
+ @property
1335
+ def arguments(self):
1336
+ if self.calling_convention is None:
1337
+ return self._argument_registers + self._argument_stack_variables
1338
+ if self.prototype is None:
1339
+ return []
1340
+ return self.calling_convention.arg_locs(self.prototype)
1341
+
1342
+ @property
1343
+ def has_return(self):
1344
+ return len(self._ret_sites) > 0
1345
+
1346
+ @property
1347
+ def callable(self):
1348
+ assert self.project is not None
1349
+ return self.project.factory.callable(self.addr)
1350
+
1351
+ def normalize(self):
1352
+ """
1353
+ Make sure all basic blocks in the transition graph of this function do not overlap. You will end up with a CFG
1354
+ that IDA Pro generates.
1355
+
1356
+ This method does not touch the CFG result. You may call CFG{Emulated, Fast}.normalize() for that matter.
1357
+
1358
+ :return: None
1359
+ """
1360
+ assert self.project is not None
1361
+
1362
+ # let's put a check here
1363
+ if self.startpoint is None:
1364
+ # this function is empty
1365
+ l.debug("Unexpected error: %s does not have any blocks. normalize() fails.", repr(self))
1366
+ return
1367
+
1368
+ graph = self.transition_graph
1369
+ end_addresses: defaultdict[int, list[BlockNode]] = defaultdict(list)
1370
+
1371
+ for block in self.nodes:
1372
+ if isinstance(block, BlockNode):
1373
+ end_addr = block.addr + block.size
1374
+ end_addresses[end_addr].append(block)
1375
+
1376
+ while any(len(x) > 1 for x in end_addresses.values()):
1377
+ end_addr, all_nodes = next((end_addr, x) for (end_addr, x) in end_addresses.items() if len(x) > 1)
1378
+
1379
+ all_nodes = sorted(all_nodes, key=lambda node: node.size)
1380
+ smallest_node = all_nodes[0]
1381
+ other_nodes = all_nodes[1:]
1382
+
1383
+ is_outside_node = False
1384
+ if smallest_node not in graph:
1385
+ is_outside_node = True
1386
+
1387
+ # Break other nodes
1388
+ for n in other_nodes:
1389
+ new_size = get_real_address_if_arm(self.project.arch, smallest_node.addr) - get_real_address_if_arm(
1390
+ self.project.arch, n.addr
1391
+ )
1392
+ if new_size == 0:
1393
+ # This is the node that has the same size as the smallest one
1394
+ continue
1395
+
1396
+ new_end_addr = n.addr + new_size
1397
+
1398
+ # Does it already exist?
1399
+ new_node = None
1400
+ if new_end_addr in end_addresses:
1401
+ nodes = [i for i in end_addresses[new_end_addr] if i.addr == n.addr]
1402
+ if len(nodes) > 0:
1403
+ new_node = nodes[0]
1404
+
1405
+ if new_node is None:
1406
+ # TODO: Do this correctly for hook nodes
1407
+ # Create a new one
1408
+ new_node = BlockNode(n.addr, new_size, graph=graph, thumb=n.thumb)
1409
+ self._block_sizes[n.addr] = new_size
1410
+ self._addr_to_block_node[n.addr] = new_node
1411
+ # Put the newnode into end_addresses
1412
+ end_addresses[new_end_addr].append(new_node)
1413
+
1414
+ # Modify the CFG
1415
+ original_predecessors = list(graph.in_edges([n], data=True))
1416
+ original_successors = list(graph.out_edges([n], data=True))
1417
+
1418
+ for _, d, data in original_successors:
1419
+ ins_addr = data.get("ins_addr", None)
1420
+ if ins_addr is not None and ins_addr < d.addr:
1421
+ continue
1422
+ if d not in graph[smallest_node]:
1423
+ if d is n:
1424
+ graph.add_edge(smallest_node, new_node, **data)
1425
+ else:
1426
+ graph.add_edge(smallest_node, d, **data)
1427
+
1428
+ for p, _, _ in original_predecessors:
1429
+ graph.remove_edge(p, n)
1430
+ graph.remove_node(n)
1431
+
1432
+ # update local_blocks
1433
+ if n.addr in self._local_blocks and self._local_blocks[n.addr].size != new_node.size:
1434
+ del self._local_blocks[n.addr]
1435
+ self._local_blocks[n.addr] = new_node
1436
+
1437
+ # update block_cache and block_sizes
1438
+ if n.addr in self._block_sizes and self._block_sizes[n.addr] != new_node.size:
1439
+ # the cache needs updating
1440
+ self._block_sizes[n.addr] = new_node.size
1441
+
1442
+ for p, _, data in original_predecessors:
1443
+ if p not in other_nodes:
1444
+ graph.add_edge(p, new_node, **data)
1445
+
1446
+ # We should find the correct successor
1447
+ new_successors = [i for i in all_nodes if i.addr == smallest_node.addr]
1448
+ if new_successors:
1449
+ new_successor = new_successors[0]
1450
+ new_ins_addrs = self.project.factory.block(new_node.addr, size=new_node.size).instruction_addrs
1451
+ if self.project.arch.branch_delay_slot and len(new_ins_addrs) >= 2:
1452
+ new_ins_addr = new_ins_addrs[-2]
1453
+ elif len(new_ins_addrs) >= 1:
1454
+ new_ins_addr = new_ins_addrs[-1]
1455
+ else:
1456
+ # the new node is somehow not decode-able
1457
+ new_ins_addr = new_node.addr + new_node.size - 1
1458
+ graph.add_edge(
1459
+ new_node,
1460
+ new_successor,
1461
+ type="transition",
1462
+ outside=is_outside_node,
1463
+ ins_addr=new_ins_addr,
1464
+ )
1465
+ else:
1466
+ # We gotta create a new one
1467
+ l.error("normalize(): Please report it to Fish.")
1468
+
1469
+ # update endpoints
1470
+ for sortset in self._endpoints.values():
1471
+ if n in sortset:
1472
+ sortset.remove(n)
1473
+ sortset.add(smallest_node)
1474
+
1475
+ end_addresses[end_addr] = [smallest_node]
1476
+
1477
+ # Rebuild startpoint
1478
+ if self.startpoint.size != self._block_sizes[self.startpoint.addr]:
1479
+ self.startpoint = self.get_node(self.startpoint.addr)
1480
+
1481
+ # Clear the cache
1482
+ self._local_transition_graph = None
1483
+
1484
+ self.normalized = True
1485
+
1486
+ def find_declaration(self, ignore_binary_name: bool = False, binary_name_hint: str | None = None) -> bool:
1487
+ """
1488
+ Find the most likely function declaration from the embedded collection of prototypes, set it to self.prototype,
1489
+ and update self.calling_convention with the declaration.
1490
+
1491
+ :param ignore_binary_name: Do not rely on the executable or library where the function belongs to determine
1492
+ its source library. This is useful when working on statically linked binaries
1493
+ (because all functions will belong to the main executable). We will search for all
1494
+ libraries in angr to find the first declaration match.
1495
+ :param binary_name_hint: Substring of the library name where this function might be originally coming from.
1496
+ Useful for FLIRT-identified functions in statically linked binaries.
1497
+ :return: True if a declaration is found and self.prototype and self.calling_convention are
1498
+ updated. False if we fail to find a matching function declaration, in which case
1499
+ self.prototype or self.calling_convention will be kept untouched.
1500
+ """
1501
+
1502
+ if not ignore_binary_name:
1503
+ # determine the library name
1504
+ if not self.is_plt:
1505
+ binary_name = self.binary_name
1506
+ if binary_name not in SIM_LIBRARIES:
1507
+ return False
1508
+ else:
1509
+ binary_name = None
1510
+ # PLT entries must have the same declaration as their jump targets
1511
+ # Try to determine which library this PLT entry will jump to
1512
+ edges = self.transition_graph.edges()
1513
+ if len(edges) == 0:
1514
+ return False
1515
+ node = next(iter(edges))[1]
1516
+ if len(edges) == 1 and (type(node) is HookNode or type(node) is SyscallNode):
1517
+ target = node.addr
1518
+ if target in self._function_manager:
1519
+ target_func = self._function_manager[target]
1520
+ binary_name = target_func.binary_name
1521
+
1522
+ # cannot determine the binary name. since we are forced to respect binary name, we give up in this case.
1523
+ if binary_name is None:
1524
+ return False
1525
+
1526
+ lib = SIM_LIBRARIES.get(binary_name, None)
1527
+ libraries = set()
1528
+ if lib is not None:
1529
+ libraries.update(lib)
1530
+
1531
+ else:
1532
+ # try all libraries or all libraries that match the given library name hint
1533
+ libraries = set()
1534
+ for lib_name, libs in SIM_LIBRARIES.items():
1535
+ # TODO: Add support for syscall libraries. Note that syscall libraries have different function
1536
+ # prototypes for .has_prototype() and .get_prototype()...
1537
+ for lib in libs:
1538
+ if not isinstance(lib, SimSyscallLibrary):
1539
+ if binary_name_hint:
1540
+ if binary_name_hint.lower() in lib_name.lower():
1541
+ libraries.add(lib)
1542
+ else:
1543
+ libraries.add(lib)
1544
+
1545
+ if not libraries:
1546
+ return False
1547
+
1548
+ name_variants = [self.name]
1549
+ # remove "_" prefixes
1550
+ if self.name.startswith("_"):
1551
+ name_variants.append(self.name[1:])
1552
+ if self.name.startswith("__"):
1553
+ name_variants.append(self.name[2:])
1554
+ # special handling for libc
1555
+ if self.name.startswith("__libc_"):
1556
+ name_variants.append(self.name[7:])
1557
+
1558
+ for library in libraries:
1559
+ for name in name_variants:
1560
+ if isinstance(library, SimSyscallLibrary):
1561
+ # FIXME: we don't support getting declaration from a syscall library yet. we don't have the concept
1562
+ # of abi at this point.
1563
+ continue
1564
+ if not library.has_prototype(name):
1565
+ continue
1566
+
1567
+ proto = library.get_prototype(name)
1568
+ if self.project is None:
1569
+ # we need to get arch from self.project
1570
+ l.warning(
1571
+ "Function %s does not have .project set. A possible prototype is found, but we cannot set it "
1572
+ "without .project.arch."
1573
+ )
1574
+ return False
1575
+ self.prototype = proto.with_arch(self.project.arch)
1576
+ self.prototype_libname = library.name
1577
+
1578
+ # update self.calling_convention if necessary
1579
+ if self.calling_convention is None:
1580
+ if self.project.arch.name in library.default_ccs:
1581
+ self.calling_convention = library.default_ccs[self.project.arch.name](self.project.arch)
1582
+ elif self.project.arch.name in DEFAULT_CC:
1583
+ self.calling_convention = default_cc(
1584
+ self.project.arch.name,
1585
+ platform=self.project.simos.name if self.project.simos is not None else None,
1586
+ )(self.project.arch)
1587
+
1588
+ return True
1589
+
1590
+ return False
1591
+
1592
+ @staticmethod
1593
+ def _addr_to_funcloc(addr):
1594
+ # FIXME
1595
+ if isinstance(addr, tuple):
1596
+ return addr[0]
1597
+ # int, long
1598
+ return addr
1599
+
1600
+ def is_rust_function(self):
1601
+ ast = pydemumble.demangle(self.name)
1602
+ if ast:
1603
+ nodes = ast.split("::")
1604
+ if len(nodes) >= 2:
1605
+ last_node = nodes[-1]
1606
+ return (
1607
+ len(last_node) == 17
1608
+ and last_node.startswith("h")
1609
+ and all(c in "0123456789abcdef" for c in last_node[1:])
1610
+ )
1611
+ return False
1612
+
1613
+ @staticmethod
1614
+ def _rust_fmt_node(node):
1615
+ result = []
1616
+ rest = node
1617
+ if rest.startswith("_$"):
1618
+ rest = rest[1:]
1619
+ while True:
1620
+ if rest.startswith("."):
1621
+ if len(rest) > 1 and rest[1] == ".":
1622
+ result.append("::")
1623
+ rest = rest[2:]
1624
+ else:
1625
+ result.append(".")
1626
+ rest = rest[1:]
1627
+ elif rest.startswith("$"):
1628
+ if "$" in rest[1:]:
1629
+ escape, rest = rest[1:].split("$", 1)
1630
+ else:
1631
+ break
1632
+
1633
+ unescaped = {"SP": "@", "BP": "*", "RF": "&", "LT": "<", "GT": ">", "LP": "(", "RP": ")", "C": ","}.get(
1634
+ escape
1635
+ )
1636
+
1637
+ if unescaped is None and escape.startswith("u"):
1638
+ digits = escape[1:]
1639
+ if all(c in "0123456789abcdef" for c in digits):
1640
+ c = chr(int(digits, 16))
1641
+ if ord(c) >= 32 and ord(c) != 127:
1642
+ result.append(c)
1643
+ continue
1644
+ if unescaped:
1645
+ result.append(unescaped)
1646
+ else:
1647
+ break
1648
+ else:
1649
+ idx = min((rest.find(c) for c in "$." if c in rest), default=len(rest))
1650
+ result.append(rest[:idx])
1651
+ rest = rest[idx:]
1652
+ if not rest:
1653
+ break
1654
+ return "".join(result)
1655
+
1656
+ @property
1657
+ def demangled_name(self):
1658
+ ast = pydemumble.demangle(self.name)
1659
+ if self.is_rust_function():
1660
+ nodes = ast.split("::")[:-1]
1661
+ ast = "::".join([Function._rust_fmt_node(node) for node in nodes])
1662
+ return ast if ast else self.name
1663
+
1664
+ @property
1665
+ def short_name(self):
1666
+ if self.is_rust_function():
1667
+ ast = pydemumble.demangle(self.name)
1668
+ return Function._rust_fmt_node(ast.split("::")[-2])
1669
+ func_name = get_cpp_function_name(self.demangled_name)
1670
+ return func_name.split("::")[-1]
1671
+
1672
+ def get_unambiguous_name(self, display_name: str | None = None) -> str:
1673
+ """
1674
+ Get a disambiguated function name.
1675
+
1676
+ :param display_name: Name to display, otherwise the function name.
1677
+ :return: The function name in the form:
1678
+ ::<name> when the function binary is the main object.
1679
+ ::<obj>::<name> when the function binary is not the main object.
1680
+ ::<addr>::<name> when the function binary is an unnamed non-main object, or when multiple functions with
1681
+ the same name are defined in the function binary.
1682
+ """
1683
+ assert self.project is not None
1684
+ must_disambiguate_by_addr = self.binary is not self.project.loader.main_object and self.binary_name is None
1685
+
1686
+ # If there are multiple functions with the same name in the same object, disambiguate by address
1687
+ if not must_disambiguate_by_addr:
1688
+ for func in self._function_manager.get_by_name(self.name):
1689
+ if func is not self and func.binary is self.binary:
1690
+ must_disambiguate_by_addr = True
1691
+ break
1692
+
1693
+ separator = "::"
1694
+ n = separator
1695
+ if must_disambiguate_by_addr:
1696
+ n += hex(self.addr) + separator
1697
+ elif self.binary is not self.project.loader.main_object and self.binary_name is not None:
1698
+ n += self.binary_name + separator
1699
+ return n + (display_name or self.name)
1700
+
1701
+ def apply_definition(self, definition: str, calling_convention: SimCC | type[SimCC] | None = None) -> None:
1702
+ assert self.project is not None
1703
+ if not definition.endswith(";"):
1704
+ definition += ";"
1705
+ func_def = parse_defns(definition, arch=self.project.arch)
1706
+ if len(func_def.keys()) > 1:
1707
+ raise Exception(f"Too many definitions: {list(func_def.keys())} ")
1708
+
1709
+ name: str
1710
+ ty: SimTypeFunction
1711
+ name, ty = func_def.popitem()
1712
+ self.name = name
1713
+ self.prototype = ty.with_arch(self.project.arch)
1714
+ # setup the calling convention
1715
+ # If a SimCC object is passed assume that this is sane and just use it
1716
+ if isinstance(calling_convention, SimCC):
1717
+ self.calling_convention = calling_convention
1718
+
1719
+ # If it is a subclass of SimCC we can instantiate it
1720
+ elif isinstance(calling_convention, type) and issubclass(calling_convention, SimCC):
1721
+ self.calling_convention = calling_convention(self.project.arch)
1722
+
1723
+ # If none is specified default to something
1724
+ elif calling_convention is None:
1725
+ self.calling_convention = self.project.factory.cc()
1726
+
1727
+ else:
1728
+ raise TypeError("calling_convention has to be one of: [SimCC, type(SimCC), None]")
1729
+
1730
+ def functions_reachable(self) -> set[Function]:
1731
+ """
1732
+ :return: The set of all functions that can be reached from the function represented by self.
1733
+ """
1734
+ called = set()
1735
+
1736
+ def _find_called(function_address):
1737
+ successors = set(self._function_manager.callgraph.successors(function_address)) - called
1738
+ for s in successors:
1739
+ called.add(s)
1740
+ _find_called(s)
1741
+
1742
+ _find_called(self.addr)
1743
+ return {self._function_manager.function(a) for a in called}
1744
+
1745
+ def copy(self):
1746
+ func = Function(self._function_manager, self.addr, name=self.name, syscall=self.is_syscall)
1747
+ func.transition_graph = networkx.DiGraph(self.transition_graph)
1748
+ func.normalized = self.normalized
1749
+ func._ret_sites = self._ret_sites.copy()
1750
+ func._jumpout_sites = self._jumpout_sites.copy()
1751
+ func._retout_sites = self._retout_sites.copy()
1752
+ func._endpoints = self._endpoints.copy()
1753
+ func._call_sites = self._call_sites.copy()
1754
+ func._project = self._project
1755
+ func.previous_names = list(self.previous_names)
1756
+ func.is_plt = self.is_plt
1757
+ func.is_simprocedure = self.is_simprocedure
1758
+ func.binary_name = self.binary_name
1759
+ func.bp_on_stack = self.bp_on_stack
1760
+ func.retaddr_on_stack = self.retaddr_on_stack
1761
+ func.sp_delta = self.sp_delta
1762
+ func.calling_convention = self.calling_convention
1763
+ func.prototype = self.prototype
1764
+ func._returning = self._returning
1765
+ func.is_alignment = self.is_alignment
1766
+ func.startpoint = self.startpoint
1767
+ func._addr_to_block_node = self._addr_to_block_node.copy()
1768
+ func._block_sizes = self._block_sizes.copy()
1769
+ func._local_blocks = self._local_blocks.copy()
1770
+ func._local_block_addrs = self._local_block_addrs.copy()
1771
+ func.info = self.info.copy()
1772
+ func.tags = self.tags
1773
+
1774
+ return func
1775
+
1776
+ def pp(self, **kwargs):
1777
+ """
1778
+ Pretty-print the function disassembly.
1779
+ """
1780
+ print(self.project.analyses.Disassembly(self).render(**kwargs))