angr 9.2.117__py3-none-win_amd64.whl → 9.2.118__py3-none-win_amd64.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 (1317) hide show
  1. angr/__init__.py +2 -1
  2. angr/__main__.py +21 -1
  3. angr/analyses/__init__.py +4 -0
  4. angr/analyses/analysis.py +45 -45
  5. angr/analyses/backward_slice.py +15 -18
  6. angr/analyses/binary_optimizer.py +29 -34
  7. angr/analyses/bindiff.py +35 -44
  8. angr/analyses/boyscout.py +1 -0
  9. angr/analyses/callee_cleanup_finder.py +3 -4
  10. angr/analyses/calling_convention.py +98 -98
  11. angr/analyses/cdg.py +5 -12
  12. angr/analyses/cfg/__init__.py +1 -0
  13. angr/analyses/cfg/cfb.py +14 -20
  14. angr/analyses/cfg/cfg.py +2 -1
  15. angr/analyses/cfg/cfg_arch_options.py +4 -1
  16. angr/analyses/cfg/cfg_base.py +122 -165
  17. angr/analyses/cfg/cfg_emulated.py +60 -92
  18. angr/analyses/cfg/cfg_fast.py +273 -314
  19. angr/analyses/cfg/cfg_fast_soot.py +10 -17
  20. angr/analyses/cfg/cfg_job_base.py +6 -7
  21. angr/analyses/cfg/indirect_jump_resolvers/__init__.py +1 -0
  22. angr/analyses/cfg/indirect_jump_resolvers/amd64_elf_got.py +2 -3
  23. angr/analyses/cfg/indirect_jump_resolvers/amd64_pe_iat.py +2 -3
  24. angr/analyses/cfg/indirect_jump_resolvers/arm_elf_fast.py +6 -8
  25. angr/analyses/cfg/indirect_jump_resolvers/const_resolver.py +3 -5
  26. angr/analyses/cfg/indirect_jump_resolvers/default_resolvers.py +1 -0
  27. angr/analyses/cfg/indirect_jump_resolvers/jumptable.py +97 -112
  28. angr/analyses/cfg/indirect_jump_resolvers/mips_elf_fast.py +26 -32
  29. angr/analyses/cfg/indirect_jump_resolvers/propagator_utils.py +1 -0
  30. angr/analyses/cfg/indirect_jump_resolvers/resolver.py +7 -7
  31. angr/analyses/cfg/indirect_jump_resolvers/x86_elf_pic_plt.py +3 -8
  32. angr/analyses/cfg/indirect_jump_resolvers/x86_pe_iat.py +2 -3
  33. angr/analyses/cfg_slice_to_sink/__init__.py +1 -0
  34. angr/analyses/cfg_slice_to_sink/cfg_slice_to_sink.py +4 -4
  35. angr/analyses/cfg_slice_to_sink/graph.py +4 -1
  36. angr/analyses/cfg_slice_to_sink/transitions.py +4 -2
  37. angr/analyses/class_identifier.py +1 -0
  38. angr/analyses/code_tagging.py +9 -9
  39. angr/analyses/complete_calling_conventions.py +28 -36
  40. angr/analyses/congruency_check.py +6 -11
  41. angr/analyses/data_dep/__init__.py +1 -0
  42. angr/analyses/data_dep/data_dependency_analysis.py +38 -48
  43. angr/analyses/data_dep/dep_nodes.py +13 -12
  44. angr/analyses/data_dep/sim_act_location.py +3 -0
  45. angr/analyses/datagraph_meta.py +7 -7
  46. angr/analyses/ddg.py +48 -69
  47. angr/analyses/decompiler/__init__.py +3 -0
  48. angr/analyses/decompiler/ail_simplifier.py +929 -400
  49. angr/analyses/decompiler/ailgraph_walker.py +1 -0
  50. angr/analyses/decompiler/block_io_finder.py +13 -4
  51. angr/analyses/decompiler/block_similarity.py +28 -18
  52. angr/analyses/decompiler/block_simplifier.py +40 -104
  53. angr/analyses/decompiler/callsite_maker.py +124 -82
  54. angr/analyses/decompiler/ccall_rewriters/__init__.py +1 -0
  55. angr/analyses/decompiler/ccall_rewriters/amd64_ccalls.py +115 -105
  56. angr/analyses/decompiler/ccall_rewriters/rewriter_base.py +2 -1
  57. angr/analyses/decompiler/clinic.py +348 -172
  58. angr/analyses/decompiler/condition_processor.py +86 -100
  59. angr/analyses/decompiler/counters/__init__.py +5 -0
  60. angr/analyses/decompiler/counters/boolean_counter.py +27 -0
  61. angr/analyses/decompiler/{call_counter.py → counters/call_counter.py} +5 -4
  62. angr/analyses/decompiler/{expression_counters.py → counters/expression_counters.py} +5 -4
  63. angr/analyses/decompiler/counters/seq_cf_structure_counter.py +63 -0
  64. angr/analyses/decompiler/decompilation_cache.py +2 -1
  65. angr/analyses/decompiler/decompilation_options.py +1 -0
  66. angr/analyses/decompiler/decompiler.py +47 -27
  67. angr/analyses/decompiler/dephication/__init__.py +6 -0
  68. angr/analyses/decompiler/dephication/dephication_base.py +87 -0
  69. angr/analyses/decompiler/dephication/graph_dephication.py +63 -0
  70. angr/analyses/decompiler/dephication/graph_rewriting.py +116 -0
  71. angr/analyses/decompiler/dephication/graph_vvar_mapping.py +313 -0
  72. angr/analyses/decompiler/dephication/rewriting_engine.py +247 -0
  73. angr/analyses/decompiler/dephication/seqnode_dephication.py +106 -0
  74. angr/analyses/decompiler/empty_node_remover.py +1 -0
  75. angr/analyses/decompiler/expression_narrower.py +12 -17
  76. angr/analyses/decompiler/goto_manager.py +43 -4
  77. angr/analyses/decompiler/graph_region.py +19 -31
  78. angr/analyses/decompiler/jump_target_collector.py +1 -0
  79. angr/analyses/decompiler/jumptable_entry_condition_rewriter.py +1 -0
  80. angr/analyses/decompiler/optimization_passes/__init__.py +7 -3
  81. angr/analyses/decompiler/optimization_passes/base_ptr_save_simplifier.py +23 -18
  82. angr/analyses/decompiler/optimization_passes/call_stmt_rewriter.py +46 -0
  83. angr/analyses/decompiler/optimization_passes/code_motion.py +4 -2
  84. angr/analyses/decompiler/optimization_passes/const_derefs.py +36 -36
  85. angr/analyses/decompiler/optimization_passes/const_prop_reverter.py +6 -9
  86. angr/analyses/decompiler/optimization_passes/cross_jump_reverter.py +4 -3
  87. angr/analyses/decompiler/optimization_passes/deadblock_remover.py +1 -0
  88. angr/analyses/decompiler/optimization_passes/div_simplifier.py +78 -72
  89. angr/analyses/decompiler/optimization_passes/duplication_reverter/__init__.py +2 -0
  90. angr/analyses/decompiler/optimization_passes/duplication_reverter/ail_merge_graph.py +500 -0
  91. angr/analyses/decompiler/optimization_passes/duplication_reverter/duplication_reverter.py +1211 -0
  92. angr/analyses/decompiler/optimization_passes/duplication_reverter/errors.py +16 -0
  93. angr/analyses/decompiler/optimization_passes/duplication_reverter/similarity.py +126 -0
  94. angr/analyses/decompiler/optimization_passes/duplication_reverter/utils.py +169 -0
  95. angr/analyses/decompiler/optimization_passes/engine_base.py +60 -63
  96. angr/analyses/decompiler/optimization_passes/expr_op_swapper.py +6 -7
  97. angr/analyses/decompiler/optimization_passes/flip_boolean_cmp.py +1 -0
  98. angr/analyses/decompiler/optimization_passes/inlined_string_transformation_simplifier.py +88 -23
  99. angr/analyses/decompiler/optimization_passes/ite_expr_converter.py +8 -10
  100. angr/analyses/decompiler/optimization_passes/ite_region_converter.py +128 -18
  101. angr/analyses/decompiler/optimization_passes/lowered_switch_simplifier.py +142 -145
  102. angr/analyses/decompiler/optimization_passes/mod_simplifier.py +27 -23
  103. angr/analyses/decompiler/optimization_passes/multi_simplifier.py +30 -34
  104. angr/analyses/decompiler/optimization_passes/optimization_pass.py +108 -47
  105. angr/analyses/decompiler/optimization_passes/register_save_area_simplifier.py +10 -3
  106. angr/analyses/decompiler/optimization_passes/ret_addr_save_simplifier.py +5 -6
  107. angr/analyses/decompiler/optimization_passes/ret_deduplicator.py +3 -2
  108. angr/analyses/decompiler/optimization_passes/return_duplicator_base.py +125 -13
  109. angr/analyses/decompiler/optimization_passes/return_duplicator_high.py +1 -0
  110. angr/analyses/decompiler/optimization_passes/return_duplicator_low.py +3 -2
  111. angr/analyses/decompiler/optimization_passes/stack_canary_simplifier.py +52 -21
  112. angr/analyses/decompiler/optimization_passes/switch_default_case_duplicator.py +3 -2
  113. angr/analyses/decompiler/optimization_passes/win_stack_canary_simplifier.py +47 -36
  114. angr/analyses/decompiler/optimization_passes/x86_gcc_getpc_simplifier.py +2 -1
  115. angr/analyses/decompiler/peephole_optimizations/__init__.py +2 -0
  116. angr/analyses/decompiler/peephole_optimizations/a_div_const_add_a_mul_n_div_const.py +26 -22
  117. angr/analyses/decompiler/peephole_optimizations/a_mul_const_div_shr_const.py +2 -2
  118. angr/analyses/decompiler/peephole_optimizations/a_shl_const_sub_a.py +1 -0
  119. angr/analyses/decompiler/peephole_optimizations/a_sub_a_div.py +2 -2
  120. angr/analyses/decompiler/peephole_optimizations/a_sub_a_div_const_mul_const.py +1 -0
  121. angr/analyses/decompiler/peephole_optimizations/a_sub_a_sub_n.py +8 -4
  122. angr/analyses/decompiler/peephole_optimizations/arm_cmpf.py +28 -27
  123. angr/analyses/decompiler/peephole_optimizations/base.py +17 -20
  124. angr/analyses/decompiler/peephole_optimizations/basepointeroffset_add_n.py +1 -0
  125. angr/analyses/decompiler/peephole_optimizations/basepointeroffset_and_mask.py +1 -0
  126. angr/analyses/decompiler/peephole_optimizations/bitwise_or_to_logical_or.py +2 -2
  127. angr/analyses/decompiler/peephole_optimizations/bool_expr_xor_1.py +2 -2
  128. angr/analyses/decompiler/peephole_optimizations/bswap.py +29 -22
  129. angr/analyses/decompiler/peephole_optimizations/cmpord_rewriter.py +3 -4
  130. angr/analyses/decompiler/peephole_optimizations/coalesce_adjacent_shrs.py +39 -0
  131. angr/analyses/decompiler/peephole_optimizations/coalesce_same_cascading_ifs.py +2 -1
  132. angr/analyses/decompiler/peephole_optimizations/const_mull_a_shift.py +94 -29
  133. angr/analyses/decompiler/peephole_optimizations/constant_derefs.py +1 -0
  134. angr/analyses/decompiler/peephole_optimizations/conv_a_sub0_shr_and.py +48 -49
  135. angr/analyses/decompiler/peephole_optimizations/conv_shl_shr.py +1 -0
  136. angr/analyses/decompiler/peephole_optimizations/eager_eval.py +41 -34
  137. angr/analyses/decompiler/peephole_optimizations/extended_byte_and_mask.py +2 -1
  138. angr/analyses/decompiler/peephole_optimizations/inlined_strcpy.py +28 -18
  139. angr/analyses/decompiler/peephole_optimizations/inlined_strcpy_consolidation.py +8 -4
  140. angr/analyses/decompiler/peephole_optimizations/inlined_wstrcpy.py +28 -18
  141. angr/analyses/decompiler/peephole_optimizations/invert_negated_logical_conjuction_disjunction.py +32 -32
  142. angr/analyses/decompiler/peephole_optimizations/one_sub_bool.py +2 -2
  143. angr/analyses/decompiler/peephole_optimizations/remove_cascading_conversions.py +23 -3
  144. angr/analyses/decompiler/peephole_optimizations/remove_empty_if_body.py +2 -1
  145. angr/analyses/decompiler/peephole_optimizations/remove_noop_conversions.py +4 -0
  146. angr/analyses/decompiler/peephole_optimizations/remove_redundant_bitmasks.py +1 -0
  147. angr/analyses/decompiler/peephole_optimizations/remove_redundant_conversions.py +4 -6
  148. angr/analyses/decompiler/peephole_optimizations/remove_redundant_ite_branch.py +14 -13
  149. angr/analyses/decompiler/peephole_optimizations/remove_redundant_ite_comparisons.py +2 -2
  150. angr/analyses/decompiler/peephole_optimizations/remove_redundant_nots.py +1 -0
  151. angr/analyses/decompiler/peephole_optimizations/remove_redundant_reinterprets.py +3 -2
  152. angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts.py +2 -2
  153. angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts_around_comparators.py +20 -16
  154. angr/analyses/decompiler/peephole_optimizations/rewrite_bit_extractions.py +3 -3
  155. angr/analyses/decompiler/peephole_optimizations/rewrite_mips_gp_loads.py +4 -2
  156. angr/analyses/decompiler/peephole_optimizations/rol_ror.py +66 -40
  157. angr/analyses/decompiler/peephole_optimizations/sar_to_signed_div.py +64 -57
  158. angr/analyses/decompiler/peephole_optimizations/simplify_pc_relative_loads.py +14 -14
  159. angr/analyses/decompiler/peephole_optimizations/single_bit_cond_to_boolexpr.py +1 -0
  160. angr/analyses/decompiler/peephole_optimizations/single_bit_xor.py +8 -5
  161. angr/analyses/decompiler/peephole_optimizations/tidy_stack_addr.py +4 -6
  162. angr/analyses/decompiler/redundant_label_remover.py +20 -19
  163. angr/analyses/decompiler/region_identifier.py +64 -77
  164. angr/analyses/decompiler/region_simplifiers/__init__.py +1 -0
  165. angr/analyses/decompiler/region_simplifiers/cascading_cond_transformer.py +2 -1
  166. angr/analyses/decompiler/region_simplifiers/cascading_ifs.py +1 -0
  167. angr/analyses/decompiler/region_simplifiers/expr_folding.py +43 -29
  168. angr/analyses/decompiler/region_simplifiers/goto.py +1 -0
  169. angr/analyses/decompiler/region_simplifiers/if_.py +29 -36
  170. angr/analyses/decompiler/region_simplifiers/ifelse.py +1 -0
  171. angr/analyses/decompiler/region_simplifiers/loop.py +27 -13
  172. angr/analyses/decompiler/region_simplifiers/node_address_finder.py +1 -0
  173. angr/analyses/decompiler/region_simplifiers/region_simplifier.py +1 -0
  174. angr/analyses/decompiler/region_simplifiers/switch_cluster_simplifier.py +12 -16
  175. angr/analyses/decompiler/region_simplifiers/switch_expr_simplifier.py +36 -32
  176. angr/analyses/decompiler/region_walker.py +1 -0
  177. angr/analyses/decompiler/return_maker.py +1 -0
  178. angr/analyses/decompiler/seq_to_blocks.py +1 -0
  179. angr/analyses/decompiler/sequence_walker.py +5 -10
  180. angr/analyses/decompiler/ssailification/__init__.py +4 -0
  181. angr/analyses/decompiler/ssailification/rewriting.py +325 -0
  182. angr/analyses/decompiler/ssailification/rewriting_engine.py +601 -0
  183. angr/analyses/decompiler/ssailification/rewriting_state.py +60 -0
  184. angr/analyses/decompiler/ssailification/ssailification.py +213 -0
  185. angr/analyses/decompiler/ssailification/traversal.py +97 -0
  186. angr/analyses/decompiler/ssailification/traversal_engine.py +131 -0
  187. angr/analyses/decompiler/ssailification/traversal_state.py +42 -0
  188. angr/analyses/decompiler/structured_codegen/__init__.py +1 -0
  189. angr/analyses/decompiler/structured_codegen/base.py +2 -2
  190. angr/analyses/decompiler/structured_codegen/c.py +163 -158
  191. angr/analyses/decompiler/structured_codegen/dummy.py +1 -0
  192. angr/analyses/decompiler/structured_codegen/dwarf_import.py +1 -0
  193. angr/analyses/decompiler/structuring/__init__.py +1 -0
  194. angr/analyses/decompiler/structuring/dream.py +19 -36
  195. angr/analyses/decompiler/structuring/phoenix.py +199 -199
  196. angr/analyses/decompiler/structuring/recursive_structurer.py +4 -3
  197. angr/analyses/decompiler/structuring/sailr.py +5 -4
  198. angr/analyses/decompiler/structuring/structurer_base.py +26 -23
  199. angr/analyses/decompiler/structuring/structurer_nodes.py +14 -24
  200. angr/analyses/decompiler/utils.py +112 -52
  201. angr/analyses/disassembly.py +75 -77
  202. angr/analyses/disassembly_utils.py +10 -13
  203. angr/analyses/dominance_frontier.py +25 -7
  204. angr/analyses/find_objects_static.py +3 -2
  205. angr/analyses/flirt.py +7 -10
  206. angr/analyses/forward_analysis/__init__.py +1 -0
  207. angr/analyses/forward_analysis/forward_analysis.py +9 -6
  208. angr/analyses/forward_analysis/job_info.py +3 -3
  209. angr/analyses/forward_analysis/visitors/__init__.py +1 -0
  210. angr/analyses/forward_analysis/visitors/call_graph.py +1 -0
  211. angr/analyses/forward_analysis/visitors/function_graph.py +3 -2
  212. angr/analyses/forward_analysis/visitors/graph.py +9 -9
  213. angr/analyses/forward_analysis/visitors/loop.py +1 -0
  214. angr/analyses/forward_analysis/visitors/single_node_graph.py +2 -2
  215. angr/analyses/identifier/__init__.py +1 -0
  216. angr/analyses/identifier/custom_callable.py +2 -2
  217. angr/analyses/identifier/errors.py +1 -0
  218. angr/analyses/identifier/func.py +6 -3
  219. angr/analyses/identifier/functions/__init__.py +2 -1
  220. angr/analyses/identifier/functions/atoi.py +2 -4
  221. angr/analyses/identifier/functions/based_atoi.py +3 -6
  222. angr/analyses/identifier/functions/fdprintf.py +1 -0
  223. angr/analyses/identifier/functions/free.py +3 -5
  224. angr/analyses/identifier/functions/int2str.py +11 -26
  225. angr/analyses/identifier/functions/malloc.py +4 -6
  226. angr/analyses/identifier/functions/memcmp.py +2 -4
  227. angr/analyses/identifier/functions/memcpy.py +2 -2
  228. angr/analyses/identifier/functions/memset.py +2 -2
  229. angr/analyses/identifier/functions/printf.py +1 -0
  230. angr/analyses/identifier/functions/recv_until.py +3 -6
  231. angr/analyses/identifier/functions/skip_calloc.py +2 -1
  232. angr/analyses/identifier/functions/skip_realloc.py +4 -6
  233. angr/analyses/identifier/functions/skip_recv_n.py +4 -6
  234. angr/analyses/identifier/functions/snprintf.py +2 -4
  235. angr/analyses/identifier/functions/sprintf.py +1 -0
  236. angr/analyses/identifier/functions/strcasecmp.py +1 -0
  237. angr/analyses/identifier/functions/strcmp.py +2 -1
  238. angr/analyses/identifier/functions/strcpy.py +2 -2
  239. angr/analyses/identifier/functions/strlen.py +1 -0
  240. angr/analyses/identifier/functions/strncmp.py +2 -1
  241. angr/analyses/identifier/functions/strncpy.py +2 -2
  242. angr/analyses/identifier/functions/strtol.py +2 -4
  243. angr/analyses/identifier/identify.py +35 -54
  244. angr/analyses/identifier/runner.py +6 -5
  245. angr/analyses/init_finder.py +17 -17
  246. angr/analyses/loop_analysis.py +10 -14
  247. angr/analyses/loopfinder.py +9 -13
  248. angr/analyses/propagator/__init__.py +1 -0
  249. angr/analyses/propagator/engine_ail.py +159 -165
  250. angr/analyses/propagator/engine_base.py +3 -2
  251. angr/analyses/propagator/engine_vex.py +47 -48
  252. angr/analyses/propagator/outdated_definition_walker.py +18 -23
  253. angr/analyses/propagator/propagator.py +8 -12
  254. angr/analyses/propagator/tmpvar_finder.py +1 -0
  255. angr/analyses/propagator/top_checker_mixin.py +2 -4
  256. angr/analyses/propagator/values.py +1 -0
  257. angr/analyses/propagator/vex_vars.py +3 -2
  258. angr/analyses/proximity_graph.py +12 -20
  259. angr/analyses/reaching_definitions/__init__.py +5 -4
  260. angr/analyses/reaching_definitions/call_trace.py +7 -6
  261. angr/analyses/reaching_definitions/dep_graph.py +18 -23
  262. angr/analyses/reaching_definitions/engine_ail.py +89 -121
  263. angr/analyses/reaching_definitions/engine_vex.py +20 -32
  264. angr/analyses/reaching_definitions/function_handler.py +32 -33
  265. angr/analyses/reaching_definitions/function_handler_library/__init__.py +1 -0
  266. angr/analyses/reaching_definitions/function_handler_library/stdio.py +4 -6
  267. angr/analyses/reaching_definitions/function_handler_library/stdlib.py +1 -2
  268. angr/analyses/reaching_definitions/function_handler_library/string.py +2 -4
  269. angr/analyses/reaching_definitions/function_handler_library/unistd.py +1 -0
  270. angr/analyses/reaching_definitions/heap_allocator.py +7 -6
  271. angr/analyses/reaching_definitions/rd_initializer.py +27 -25
  272. angr/analyses/reaching_definitions/rd_state.py +14 -16
  273. angr/analyses/reaching_definitions/reaching_definitions.py +27 -36
  274. angr/analyses/reaching_definitions/subject.py +3 -2
  275. angr/analyses/reassembler.py +189 -253
  276. angr/analyses/s_liveness/__init__.py +2 -0
  277. angr/analyses/s_liveness/s_liveness.py +153 -0
  278. angr/analyses/s_propagator/__init__.py +2 -0
  279. angr/analyses/s_propagator/s_propagator.py +250 -0
  280. angr/analyses/s_reaching_definitions/__init__.py +2 -0
  281. angr/analyses/s_reaching_definitions/s_rda.py +479 -0
  282. angr/analyses/soot_class_hierarchy.py +15 -24
  283. angr/analyses/stack_pointer_tracker.py +83 -93
  284. angr/analyses/static_hooker.py +3 -2
  285. angr/analyses/typehoon/__init__.py +1 -0
  286. angr/analyses/typehoon/dfa.py +5 -5
  287. angr/analyses/typehoon/lifter.py +5 -4
  288. angr/analyses/typehoon/simple_solver.py +80 -64
  289. angr/analyses/typehoon/translator.py +7 -14
  290. angr/analyses/typehoon/typeconsts.py +14 -12
  291. angr/analyses/typehoon/typehoon.py +8 -10
  292. angr/analyses/typehoon/typevars.py +37 -49
  293. angr/analyses/typehoon/variance.py +1 -0
  294. angr/analyses/variable_recovery/__init__.py +1 -0
  295. angr/analyses/variable_recovery/annotations.py +1 -0
  296. angr/analyses/variable_recovery/engine_ail.py +78 -32
  297. angr/analyses/variable_recovery/engine_base.py +233 -59
  298. angr/analyses/variable_recovery/engine_vex.py +10 -11
  299. angr/analyses/variable_recovery/irsb_scanner.py +1 -0
  300. angr/analyses/variable_recovery/variable_recovery.py +14 -16
  301. angr/analyses/variable_recovery/variable_recovery_base.py +12 -14
  302. angr/analyses/variable_recovery/variable_recovery_fast.py +67 -47
  303. angr/analyses/veritesting.py +10 -16
  304. angr/analyses/vfg.py +102 -148
  305. angr/analyses/vsa_ddg.py +3 -5
  306. angr/analyses/vtable.py +6 -6
  307. angr/analyses/xrefs.py +9 -13
  308. angr/angrdb/__init__.py +4 -2
  309. angr/angrdb/db.py +51 -53
  310. angr/angrdb/models.py +1 -0
  311. angr/angrdb/serializers/__init__.py +1 -0
  312. angr/angrdb/serializers/cfg_model.py +2 -2
  313. angr/angrdb/serializers/comments.py +1 -0
  314. angr/angrdb/serializers/funcs.py +4 -3
  315. angr/angrdb/serializers/kb.py +3 -2
  316. angr/angrdb/serializers/labels.py +1 -0
  317. angr/angrdb/serializers/structured_code.py +5 -10
  318. angr/angrdb/serializers/variables.py +6 -6
  319. angr/angrdb/serializers/xrefs.py +2 -2
  320. angr/annocfg.py +17 -25
  321. angr/blade.py +19 -23
  322. angr/block.py +11 -13
  323. angr/callable.py +4 -3
  324. angr/calling_conventions.py +79 -124
  325. angr/code_location.py +12 -13
  326. angr/codenode.py +2 -1
  327. angr/concretization_strategies/__init__.py +6 -6
  328. angr/concretization_strategies/any.py +5 -4
  329. angr/concretization_strategies/any_named.py +1 -0
  330. angr/concretization_strategies/controlled_data.py +1 -0
  331. angr/concretization_strategies/eval.py +2 -2
  332. angr/concretization_strategies/logging.py +1 -0
  333. angr/concretization_strategies/max.py +6 -6
  334. angr/concretization_strategies/nonzero.py +1 -0
  335. angr/concretization_strategies/nonzero_range.py +4 -3
  336. angr/concretization_strategies/norepeats.py +2 -1
  337. angr/concretization_strategies/norepeats_range.py +1 -0
  338. angr/concretization_strategies/range.py +1 -0
  339. angr/concretization_strategies/signed_add.py +13 -9
  340. angr/concretization_strategies/single.py +2 -0
  341. angr/concretization_strategies/solutions.py +1 -0
  342. angr/concretization_strategies/unlimited_range.py +1 -0
  343. angr/distributed/__init__.py +1 -0
  344. angr/distributed/server.py +2 -2
  345. angr/distributed/worker.py +3 -3
  346. angr/engines/__init__.py +1 -0
  347. angr/engines/concrete.py +1 -0
  348. angr/engines/engine.py +4 -6
  349. angr/engines/failure.py +2 -1
  350. angr/engines/hook.py +1 -0
  351. angr/engines/light/__init__.py +1 -0
  352. angr/engines/light/data.py +221 -255
  353. angr/engines/light/engine.py +66 -74
  354. angr/engines/pcode/__init__.py +1 -0
  355. angr/engines/pcode/behavior.py +3 -3
  356. angr/engines/pcode/cc.py +1 -0
  357. angr/engines/pcode/emulate.py +13 -16
  358. angr/engines/pcode/engine.py +5 -3
  359. angr/engines/pcode/lifter.py +62 -79
  360. angr/engines/procedure.py +1 -0
  361. angr/engines/soot/__init__.py +1 -0
  362. angr/engines/soot/engine.py +41 -47
  363. angr/engines/soot/exceptions.py +3 -0
  364. angr/engines/soot/expressions/__init__.py +1 -0
  365. angr/engines/soot/expressions/arrayref.py +1 -0
  366. angr/engines/soot/expressions/base.py +4 -5
  367. angr/engines/soot/expressions/binop.py +1 -0
  368. angr/engines/soot/expressions/cast.py +1 -0
  369. angr/engines/soot/expressions/condition.py +1 -0
  370. angr/engines/soot/expressions/constants.py +1 -0
  371. angr/engines/soot/expressions/instanceOf.py +1 -0
  372. angr/engines/soot/expressions/instancefieldref.py +1 -0
  373. angr/engines/soot/expressions/invoke.py +7 -9
  374. angr/engines/soot/expressions/length.py +1 -0
  375. angr/engines/soot/expressions/local.py +1 -0
  376. angr/engines/soot/expressions/new.py +1 -0
  377. angr/engines/soot/expressions/newArray.py +1 -0
  378. angr/engines/soot/expressions/newMultiArray.py +3 -3
  379. angr/engines/soot/expressions/paramref.py +1 -0
  380. angr/engines/soot/expressions/phi.py +1 -0
  381. angr/engines/soot/expressions/staticfieldref.py +1 -0
  382. angr/engines/soot/expressions/thisref.py +1 -0
  383. angr/engines/soot/expressions/unsupported.py +1 -0
  384. angr/engines/soot/field_dispatcher.py +5 -8
  385. angr/engines/soot/method_dispatcher.py +4 -7
  386. angr/engines/soot/statements/__init__.py +4 -4
  387. angr/engines/soot/statements/assign.py +1 -0
  388. angr/engines/soot/statements/base.py +6 -7
  389. angr/engines/soot/statements/goto.py +1 -0
  390. angr/engines/soot/statements/identity.py +1 -0
  391. angr/engines/soot/statements/if_.py +1 -0
  392. angr/engines/soot/statements/invoke.py +1 -0
  393. angr/engines/soot/statements/return_.py +1 -0
  394. angr/engines/soot/statements/switch.py +1 -0
  395. angr/engines/soot/statements/throw.py +1 -0
  396. angr/engines/soot/values/__init__.py +4 -2
  397. angr/engines/soot/values/arrayref.py +8 -10
  398. angr/engines/soot/values/base.py +4 -1
  399. angr/engines/soot/values/constants.py +1 -0
  400. angr/engines/soot/values/instancefieldref.py +1 -0
  401. angr/engines/soot/values/local.py +1 -0
  402. angr/engines/soot/values/paramref.py +1 -0
  403. angr/engines/soot/values/staticfieldref.py +1 -0
  404. angr/engines/soot/values/strref.py +3 -2
  405. angr/engines/soot/values/thisref.py +1 -0
  406. angr/engines/successors.py +20 -23
  407. angr/engines/syscall.py +9 -9
  408. angr/engines/unicorn.py +12 -7
  409. angr/engines/vex/__init__.py +1 -0
  410. angr/engines/vex/claripy/__init__.py +1 -0
  411. angr/engines/vex/claripy/ccall.py +86 -112
  412. angr/engines/vex/claripy/datalayer.py +12 -16
  413. angr/engines/vex/claripy/irop.py +85 -104
  414. angr/engines/vex/heavy/__init__.py +1 -0
  415. angr/engines/vex/heavy/actions.py +1 -0
  416. angr/engines/vex/heavy/concretizers.py +8 -9
  417. angr/engines/vex/heavy/dirty.py +6 -5
  418. angr/engines/vex/heavy/heavy.py +13 -12
  419. angr/engines/vex/heavy/inspect.py +1 -0
  420. angr/engines/vex/heavy/resilience.py +2 -2
  421. angr/engines/vex/heavy/super_fastpath.py +2 -2
  422. angr/engines/vex/lifter.py +28 -35
  423. angr/engines/vex/light/__init__.py +1 -0
  424. angr/engines/vex/light/light.py +2 -4
  425. angr/engines/vex/light/resilience.py +1 -0
  426. angr/engines/vex/light/slicing.py +1 -0
  427. angr/errors.py +2 -1
  428. angr/exploration_techniques/__init__.py +3 -2
  429. angr/exploration_techniques/bucketizer.py +2 -3
  430. angr/exploration_techniques/common.py +3 -3
  431. angr/exploration_techniques/dfs.py +1 -0
  432. angr/exploration_techniques/director.py +17 -19
  433. angr/exploration_techniques/driller_core.py +2 -5
  434. angr/exploration_techniques/explorer.py +7 -3
  435. angr/exploration_techniques/lengthlimiter.py +1 -0
  436. angr/exploration_techniques/local_loop_seer.py +2 -2
  437. angr/exploration_techniques/loop_seer.py +11 -14
  438. angr/exploration_techniques/manual_mergepoint.py +3 -2
  439. angr/exploration_techniques/memory_watcher.py +1 -0
  440. angr/exploration_techniques/oppologist.py +4 -4
  441. angr/exploration_techniques/slicecutor.py +1 -0
  442. angr/exploration_techniques/spiller.py +8 -8
  443. angr/exploration_techniques/spiller_db.py +1 -0
  444. angr/exploration_techniques/stochastic.py +3 -4
  445. angr/exploration_techniques/stub_stasher.py +1 -0
  446. angr/exploration_techniques/suggestions.py +3 -2
  447. angr/exploration_techniques/symbion.py +1 -0
  448. angr/exploration_techniques/tech_builder.py +1 -0
  449. angr/exploration_techniques/threading.py +1 -0
  450. angr/exploration_techniques/timeout.py +1 -0
  451. angr/exploration_techniques/tracer.py +34 -39
  452. angr/exploration_techniques/unique.py +1 -0
  453. angr/exploration_techniques/veritesting.py +1 -0
  454. angr/factory.py +9 -9
  455. angr/flirt/__init__.py +1 -0
  456. angr/flirt/build_sig.py +8 -12
  457. angr/keyed_region.py +10 -17
  458. angr/knowledge_base/__init__.py +1 -0
  459. angr/knowledge_base/knowledge_base.py +17 -17
  460. angr/knowledge_plugins/__init__.py +1 -0
  461. angr/knowledge_plugins/callsite_prototypes.py +1 -0
  462. angr/knowledge_plugins/cfg/__init__.py +2 -0
  463. angr/knowledge_plugins/cfg/cfg_manager.py +2 -1
  464. angr/knowledge_plugins/cfg/cfg_model.py +25 -42
  465. angr/knowledge_plugins/cfg/cfg_node.py +8 -19
  466. angr/knowledge_plugins/cfg/indirect_jump.py +3 -5
  467. angr/knowledge_plugins/cfg/memory_data.py +3 -3
  468. angr/knowledge_plugins/comments.py +1 -0
  469. angr/knowledge_plugins/custom_strings.py +1 -0
  470. angr/knowledge_plugins/data.py +1 -0
  471. angr/knowledge_plugins/debug_variables.py +18 -23
  472. angr/knowledge_plugins/functions/__init__.py +1 -0
  473. angr/knowledge_plugins/functions/function.py +49 -53
  474. angr/knowledge_plugins/functions/function_manager.py +14 -14
  475. angr/knowledge_plugins/functions/function_parser.py +38 -42
  476. angr/knowledge_plugins/functions/soot_function.py +5 -6
  477. angr/knowledge_plugins/indirect_jumps.py +1 -0
  478. angr/knowledge_plugins/key_definitions/__init__.py +1 -0
  479. angr/knowledge_plugins/key_definitions/atoms.py +65 -17
  480. angr/knowledge_plugins/key_definitions/constants.py +6 -0
  481. angr/knowledge_plugins/key_definitions/definition.py +22 -25
  482. angr/knowledge_plugins/key_definitions/environment.py +18 -14
  483. angr/knowledge_plugins/key_definitions/heap_address.py +4 -3
  484. angr/knowledge_plugins/key_definitions/key_definition_manager.py +5 -4
  485. angr/knowledge_plugins/key_definitions/live_definitions.py +36 -45
  486. angr/knowledge_plugins/key_definitions/liveness.py +18 -23
  487. angr/knowledge_plugins/key_definitions/rd_model.py +29 -34
  488. angr/knowledge_plugins/key_definitions/tag.py +7 -6
  489. angr/knowledge_plugins/key_definitions/undefined.py +3 -0
  490. angr/knowledge_plugins/key_definitions/unknown_size.py +3 -0
  491. angr/knowledge_plugins/key_definitions/uses.py +21 -23
  492. angr/knowledge_plugins/labels.py +3 -2
  493. angr/knowledge_plugins/patches.py +2 -1
  494. angr/knowledge_plugins/plugin.py +2 -1
  495. angr/knowledge_plugins/propagations/__init__.py +1 -0
  496. angr/knowledge_plugins/propagations/prop_value.py +25 -27
  497. angr/knowledge_plugins/propagations/propagation_manager.py +2 -2
  498. angr/knowledge_plugins/propagations/propagation_model.py +5 -4
  499. angr/knowledge_plugins/propagations/states.py +71 -81
  500. angr/knowledge_plugins/structured_code/__init__.py +1 -0
  501. angr/knowledge_plugins/structured_code/manager.py +5 -4
  502. angr/knowledge_plugins/sync/__init__.py +1 -0
  503. angr/knowledge_plugins/sync/sync_controller.py +10 -15
  504. angr/knowledge_plugins/types.py +1 -0
  505. angr/knowledge_plugins/variables/__init__.py +1 -0
  506. angr/knowledge_plugins/variables/variable_access.py +9 -10
  507. angr/knowledge_plugins/variables/variable_manager.py +84 -55
  508. angr/knowledge_plugins/xrefs/__init__.py +1 -0
  509. angr/knowledge_plugins/xrefs/xref.py +7 -11
  510. angr/knowledge_plugins/xrefs/xref_manager.py +1 -0
  511. angr/knowledge_plugins/xrefs/xref_types.py +3 -0
  512. angr/lib/angr_native.dll +0 -0
  513. angr/misc/__init__.py +1 -0
  514. angr/misc/ansi.py +1 -0
  515. angr/misc/autoimport.py +3 -2
  516. angr/misc/bug_report.py +6 -5
  517. angr/misc/hookset.py +3 -2
  518. angr/misc/loggers.py +2 -2
  519. angr/misc/picklable_lock.py +1 -0
  520. angr/misc/plugins.py +11 -13
  521. angr/misc/range.py +3 -0
  522. angr/misc/testing.py +2 -1
  523. angr/misc/ux.py +5 -5
  524. angr/misc/weakpatch.py +1 -0
  525. angr/procedures/__init__.py +1 -0
  526. angr/procedures/cgc/_terminate.py +1 -0
  527. angr/procedures/cgc/allocate.py +1 -0
  528. angr/procedures/cgc/deallocate.py +1 -0
  529. angr/procedures/cgc/fdwait.py +1 -0
  530. angr/procedures/cgc/random.py +1 -0
  531. angr/procedures/cgc/receive.py +26 -26
  532. angr/procedures/cgc/transmit.py +1 -0
  533. angr/procedures/definitions/__init__.py +9 -10
  534. angr/procedures/definitions/cgc.py +1 -0
  535. angr/procedures/definitions/glibc.py +1 -0
  536. angr/procedures/definitions/gnulib.py +1 -0
  537. angr/procedures/definitions/libstdcpp.py +1 -0
  538. angr/procedures/definitions/linux_kernel.py +1 -0
  539. angr/procedures/definitions/linux_loader.py +1 -0
  540. angr/procedures/definitions/msvcr.py +1 -0
  541. angr/procedures/definitions/parse_syscalls_from_local_system.py +2 -1
  542. angr/procedures/definitions/parse_win32json.py +27 -30
  543. angr/procedures/definitions/types_win32.py +1 -0
  544. angr/procedures/definitions/wdk_api-ms-win-dx-d3dkmt-l1-1-4.py +1 -0
  545. angr/procedures/definitions/wdk_api-ms-win-dx-d3dkmt-l1-1-6.py +1 -0
  546. angr/procedures/definitions/wdk_clfs.py +1 -0
  547. angr/procedures/definitions/wdk_fltmgr.py +1 -0
  548. angr/procedures/definitions/wdk_fwpkclnt.py +1 -0
  549. angr/procedures/definitions/wdk_fwpuclnt.py +1 -0
  550. angr/procedures/definitions/wdk_gdi32.py +1 -0
  551. angr/procedures/definitions/wdk_hal.py +1 -0
  552. angr/procedures/definitions/wdk_ksecdd.py +1 -0
  553. angr/procedures/definitions/wdk_ndis.py +1 -0
  554. angr/procedures/definitions/wdk_ntoskrnl.py +1 -0
  555. angr/procedures/definitions/wdk_offreg.py +1 -0
  556. angr/procedures/definitions/wdk_pshed.py +1 -0
  557. angr/procedures/definitions/wdk_secur32.py +1 -0
  558. angr/procedures/definitions/wdk_vhfum.py +1 -0
  559. angr/procedures/definitions/win32_aclui.py +1 -0
  560. angr/procedures/definitions/win32_activeds.py +1 -0
  561. angr/procedures/definitions/win32_advapi32.py +1 -0
  562. angr/procedures/definitions/win32_advpack.py +1 -0
  563. angr/procedures/definitions/win32_amsi.py +1 -0
  564. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-1.py +1 -0
  565. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-3.py +1 -0
  566. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-6.py +1 -0
  567. angr/procedures/definitions/win32_api-ms-win-core-apiquery-l2-1-0.py +1 -0
  568. angr/procedures/definitions/win32_api-ms-win-core-backgroundtask-l1-1-0.py +1 -0
  569. angr/procedures/definitions/win32_api-ms-win-core-comm-l1-1-1.py +1 -0
  570. angr/procedures/definitions/win32_api-ms-win-core-comm-l1-1-2.py +1 -0
  571. angr/procedures/definitions/win32_api-ms-win-core-enclave-l1-1-1.py +1 -0
  572. angr/procedures/definitions/win32_api-ms-win-core-errorhandling-l1-1-3.py +1 -0
  573. angr/procedures/definitions/win32_api-ms-win-core-featurestaging-l1-1-0.py +1 -0
  574. angr/procedures/definitions/win32_api-ms-win-core-featurestaging-l1-1-1.py +1 -0
  575. angr/procedures/definitions/win32_api-ms-win-core-file-fromapp-l1-1-0.py +1 -0
  576. angr/procedures/definitions/win32_api-ms-win-core-handle-l1-1-0.py +1 -0
  577. angr/procedures/definitions/win32_api-ms-win-core-ioring-l1-1-0.py +1 -0
  578. angr/procedures/definitions/win32_api-ms-win-core-marshal-l1-1-0.py +1 -0
  579. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-3.py +1 -0
  580. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-4.py +1 -0
  581. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-5.py +1 -0
  582. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-6.py +1 -0
  583. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-7.py +1 -0
  584. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-8.py +1 -0
  585. angr/procedures/definitions/win32_api-ms-win-core-path-l1-1-0.py +1 -0
  586. angr/procedures/definitions/win32_api-ms-win-core-psm-appnotify-l1-1-0.py +1 -0
  587. angr/procedures/definitions/win32_api-ms-win-core-psm-appnotify-l1-1-1.py +1 -0
  588. angr/procedures/definitions/win32_api-ms-win-core-realtime-l1-1-1.py +1 -0
  589. angr/procedures/definitions/win32_api-ms-win-core-realtime-l1-1-2.py +1 -0
  590. angr/procedures/definitions/win32_api-ms-win-core-slapi-l1-1-0.py +1 -0
  591. angr/procedures/definitions/win32_api-ms-win-core-state-helpers-l1-1-0.py +1 -0
  592. angr/procedures/definitions/win32_api-ms-win-core-synch-l1-2-0.py +1 -0
  593. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-0.py +1 -0
  594. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-3.py +1 -0
  595. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-4.py +1 -0
  596. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-6.py +1 -0
  597. angr/procedures/definitions/win32_api-ms-win-core-util-l1-1-1.py +1 -0
  598. angr/procedures/definitions/win32_api-ms-win-core-winrt-error-l1-1-0.py +1 -0
  599. angr/procedures/definitions/win32_api-ms-win-core-winrt-error-l1-1-1.py +1 -0
  600. angr/procedures/definitions/win32_api-ms-win-core-winrt-l1-1-0.py +1 -0
  601. angr/procedures/definitions/win32_api-ms-win-core-winrt-registration-l1-1-0.py +1 -0
  602. angr/procedures/definitions/win32_api-ms-win-core-winrt-robuffer-l1-1-0.py +1 -0
  603. angr/procedures/definitions/win32_api-ms-win-core-winrt-roparameterizediid-l1-1-0.py +1 -0
  604. angr/procedures/definitions/win32_api-ms-win-core-winrt-string-l1-1-0.py +1 -0
  605. angr/procedures/definitions/win32_api-ms-win-core-winrt-string-l1-1-1.py +1 -0
  606. angr/procedures/definitions/win32_api-ms-win-core-wow64-l1-1-1.py +1 -0
  607. angr/procedures/definitions/win32_api-ms-win-devices-query-l1-1-0.py +1 -0
  608. angr/procedures/definitions/win32_api-ms-win-devices-query-l1-1-1.py +1 -0
  609. angr/procedures/definitions/win32_api-ms-win-dx-d3dkmt-l1-1-0.py +1 -0
  610. angr/procedures/definitions/win32_api-ms-win-gaming-deviceinformation-l1-1-0.py +1 -0
  611. angr/procedures/definitions/win32_api-ms-win-gaming-expandedresources-l1-1-0.py +1 -0
  612. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-0.py +1 -0
  613. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-1.py +1 -0
  614. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-2.py +1 -0
  615. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-3.py +1 -0
  616. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-4.py +1 -0
  617. angr/procedures/definitions/win32_api-ms-win-mm-misc-l1-1-1.py +1 -0
  618. angr/procedures/definitions/win32_api-ms-win-net-isolation-l1-1-0.py +1 -0
  619. angr/procedures/definitions/win32_api-ms-win-security-base-l1-2-2.py +1 -0
  620. angr/procedures/definitions/win32_api-ms-win-security-isolatedcontainer-l1-1-0.py +1 -0
  621. angr/procedures/definitions/win32_api-ms-win-security-isolatedcontainer-l1-1-1.py +1 -0
  622. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-3.py +1 -0
  623. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-4.py +1 -0
  624. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-5.py +1 -0
  625. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-0.py +1 -0
  626. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-1.py +1 -0
  627. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-2.py +1 -0
  628. angr/procedures/definitions/win32_api-ms-win-shcore-stream-winrt-l1-1-0.py +1 -0
  629. angr/procedures/definitions/win32_api-ms-win-wsl-api-l1-1-0.py +1 -0
  630. angr/procedures/definitions/win32_apphelp.py +1 -0
  631. angr/procedures/definitions/win32_authz.py +1 -0
  632. angr/procedures/definitions/win32_avicap32.py +1 -0
  633. angr/procedures/definitions/win32_avifil32.py +1 -0
  634. angr/procedures/definitions/win32_avrt.py +1 -0
  635. angr/procedures/definitions/win32_bcp47mrm.py +1 -0
  636. angr/procedures/definitions/win32_bcrypt.py +1 -0
  637. angr/procedures/definitions/win32_bcryptprimitives.py +1 -0
  638. angr/procedures/definitions/win32_bluetoothapis.py +1 -0
  639. angr/procedures/definitions/win32_bthprops.py +1 -0
  640. angr/procedures/definitions/win32_bthprops_cpl.py +1 -0
  641. angr/procedures/definitions/win32_cabinet.py +1 -0
  642. angr/procedures/definitions/win32_certadm.py +1 -0
  643. angr/procedures/definitions/win32_certpoleng.py +1 -0
  644. angr/procedures/definitions/win32_cfgmgr32.py +1 -0
  645. angr/procedures/definitions/win32_chakra.py +1 -0
  646. angr/procedures/definitions/win32_cldapi.py +1 -0
  647. angr/procedures/definitions/win32_clfsw32.py +1 -0
  648. angr/procedures/definitions/win32_clusapi.py +1 -0
  649. angr/procedures/definitions/win32_comctl32.py +1 -0
  650. angr/procedures/definitions/win32_comdlg32.py +1 -0
  651. angr/procedures/definitions/win32_compstui.py +1 -0
  652. angr/procedures/definitions/win32_computecore.py +1 -0
  653. angr/procedures/definitions/win32_computenetwork.py +1 -0
  654. angr/procedures/definitions/win32_computestorage.py +1 -0
  655. angr/procedures/definitions/win32_comsvcs.py +1 -0
  656. angr/procedures/definitions/win32_coremessaging.py +1 -0
  657. angr/procedures/definitions/win32_credui.py +1 -0
  658. angr/procedures/definitions/win32_crypt32.py +1 -0
  659. angr/procedures/definitions/win32_cryptnet.py +1 -0
  660. angr/procedures/definitions/win32_cryptui.py +1 -0
  661. angr/procedures/definitions/win32_cryptxml.py +1 -0
  662. angr/procedures/definitions/win32_cscapi.py +1 -0
  663. angr/procedures/definitions/win32_d2d1.py +1 -0
  664. angr/procedures/definitions/win32_d3d10.py +1 -0
  665. angr/procedures/definitions/win32_d3d10_1.py +1 -0
  666. angr/procedures/definitions/win32_d3d11.py +1 -0
  667. angr/procedures/definitions/win32_d3d12.py +1 -0
  668. angr/procedures/definitions/win32_d3d9.py +1 -0
  669. angr/procedures/definitions/win32_d3dcompiler_47.py +1 -0
  670. angr/procedures/definitions/win32_d3dcsx.py +1 -0
  671. angr/procedures/definitions/win32_davclnt.py +1 -0
  672. angr/procedures/definitions/win32_dbgeng.py +1 -0
  673. angr/procedures/definitions/win32_dbghelp.py +1 -0
  674. angr/procedures/definitions/win32_dbgmodel.py +1 -0
  675. angr/procedures/definitions/win32_dciman32.py +1 -0
  676. angr/procedures/definitions/win32_dcomp.py +1 -0
  677. angr/procedures/definitions/win32_ddraw.py +1 -0
  678. angr/procedures/definitions/win32_deviceaccess.py +1 -0
  679. angr/procedures/definitions/win32_dflayout.py +1 -0
  680. angr/procedures/definitions/win32_dhcpcsvc.py +1 -0
  681. angr/procedures/definitions/win32_dhcpcsvc6.py +1 -0
  682. angr/procedures/definitions/win32_dhcpsapi.py +1 -0
  683. angr/procedures/definitions/win32_diagnosticdataquery.py +1 -0
  684. angr/procedures/definitions/win32_dinput8.py +1 -0
  685. angr/procedures/definitions/win32_directml.py +1 -0
  686. angr/procedures/definitions/win32_dmprocessxmlfiltered.py +1 -0
  687. angr/procedures/definitions/win32_dnsapi.py +1 -0
  688. angr/procedures/definitions/win32_drt.py +1 -0
  689. angr/procedures/definitions/win32_drtprov.py +1 -0
  690. angr/procedures/definitions/win32_drttransport.py +1 -0
  691. angr/procedures/definitions/win32_dsound.py +1 -0
  692. angr/procedures/definitions/win32_dsparse.py +1 -0
  693. angr/procedures/definitions/win32_dsprop.py +1 -0
  694. angr/procedures/definitions/win32_dssec.py +1 -0
  695. angr/procedures/definitions/win32_dsuiext.py +1 -0
  696. angr/procedures/definitions/win32_dwmapi.py +1 -0
  697. angr/procedures/definitions/win32_dwrite.py +1 -0
  698. angr/procedures/definitions/win32_dxcompiler.py +1 -0
  699. angr/procedures/definitions/win32_dxcore.py +1 -0
  700. angr/procedures/definitions/win32_dxgi.py +1 -0
  701. angr/procedures/definitions/win32_dxva2.py +1 -0
  702. angr/procedures/definitions/win32_eappcfg.py +1 -0
  703. angr/procedures/definitions/win32_eappprxy.py +1 -0
  704. angr/procedures/definitions/win32_efswrt.py +1 -0
  705. angr/procedures/definitions/win32_elscore.py +1 -0
  706. angr/procedures/definitions/win32_esent.py +1 -0
  707. angr/procedures/definitions/win32_evr.py +1 -0
  708. angr/procedures/definitions/win32_faultrep.py +1 -0
  709. angr/procedures/definitions/win32_fhsvcctl.py +1 -0
  710. angr/procedures/definitions/win32_firewallapi.py +1 -0
  711. angr/procedures/definitions/win32_fltlib.py +1 -0
  712. angr/procedures/definitions/win32_fontsub.py +1 -0
  713. angr/procedures/definitions/win32_forceinline.py +1 -0
  714. angr/procedures/definitions/win32_fwpuclnt.py +1 -0
  715. angr/procedures/definitions/win32_fxsutility.py +1 -0
  716. angr/procedures/definitions/win32_gdi32.py +1 -0
  717. angr/procedures/definitions/win32_gdiplus.py +1 -0
  718. angr/procedures/definitions/win32_glu32.py +1 -0
  719. angr/procedures/definitions/win32_gpedit.py +1 -0
  720. angr/procedures/definitions/win32_hhctrl_ocx.py +1 -0
  721. angr/procedures/definitions/win32_hid.py +1 -0
  722. angr/procedures/definitions/win32_hlink.py +1 -0
  723. angr/procedures/definitions/win32_hrtfapo.py +1 -0
  724. angr/procedures/definitions/win32_httpapi.py +1 -0
  725. angr/procedures/definitions/win32_icm32.py +1 -0
  726. angr/procedures/definitions/win32_icmui.py +1 -0
  727. angr/procedures/definitions/win32_icu.py +1 -0
  728. angr/procedures/definitions/win32_ieframe.py +1 -0
  729. angr/procedures/definitions/win32_imagehlp.py +1 -0
  730. angr/procedures/definitions/win32_imgutil.py +1 -0
  731. angr/procedures/definitions/win32_imm32.py +1 -0
  732. angr/procedures/definitions/win32_infocardapi.py +1 -0
  733. angr/procedures/definitions/win32_inkobjcore.py +1 -0
  734. angr/procedures/definitions/win32_iphlpapi.py +1 -0
  735. angr/procedures/definitions/win32_iscsidsc.py +1 -0
  736. angr/procedures/definitions/win32_isolatedwindowsenvironmentutils.py +1 -0
  737. angr/procedures/definitions/win32_kernel32.py +1 -0
  738. angr/procedures/definitions/win32_kernelbase.py +1 -0
  739. angr/procedures/definitions/win32_keycredmgr.py +1 -0
  740. angr/procedures/definitions/win32_ksproxy_ax.py +1 -0
  741. angr/procedures/definitions/win32_ksuser.py +1 -0
  742. angr/procedures/definitions/win32_ktmw32.py +1 -0
  743. angr/procedures/definitions/win32_licenseprotection.py +1 -0
  744. angr/procedures/definitions/win32_loadperf.py +1 -0
  745. angr/procedures/definitions/win32_magnification.py +1 -0
  746. angr/procedures/definitions/win32_mapi32.py +1 -0
  747. angr/procedures/definitions/win32_mdmlocalmanagement.py +1 -0
  748. angr/procedures/definitions/win32_mdmregistration.py +1 -0
  749. angr/procedures/definitions/win32_mf.py +1 -0
  750. angr/procedures/definitions/win32_mfcore.py +1 -0
  751. angr/procedures/definitions/win32_mfplat.py +1 -0
  752. angr/procedures/definitions/win32_mfplay.py +1 -0
  753. angr/procedures/definitions/win32_mfreadwrite.py +1 -0
  754. angr/procedures/definitions/win32_mfsensorgroup.py +1 -0
  755. angr/procedures/definitions/win32_mfsrcsnk.py +1 -0
  756. angr/procedures/definitions/win32_mgmtapi.py +1 -0
  757. angr/procedures/definitions/win32_mi.py +1 -0
  758. angr/procedures/definitions/win32_mmdevapi.py +1 -0
  759. angr/procedures/definitions/win32_mpr.py +1 -0
  760. angr/procedures/definitions/win32_mprapi.py +1 -0
  761. angr/procedures/definitions/win32_mqrt.py +1 -0
  762. angr/procedures/definitions/win32_mrmsupport.py +1 -0
  763. angr/procedures/definitions/win32_msacm32.py +1 -0
  764. angr/procedures/definitions/win32_msajapi.py +1 -0
  765. angr/procedures/definitions/win32_mscms.py +1 -0
  766. angr/procedures/definitions/win32_mscoree.py +1 -0
  767. angr/procedures/definitions/win32_msctfmonitor.py +1 -0
  768. angr/procedures/definitions/win32_msdelta.py +1 -0
  769. angr/procedures/definitions/win32_msdmo.py +1 -0
  770. angr/procedures/definitions/win32_msdrm.py +1 -0
  771. angr/procedures/definitions/win32_msi.py +1 -0
  772. angr/procedures/definitions/win32_msimg32.py +1 -0
  773. angr/procedures/definitions/win32_mspatcha.py +1 -0
  774. angr/procedures/definitions/win32_mspatchc.py +1 -0
  775. angr/procedures/definitions/win32_msports.py +1 -0
  776. angr/procedures/definitions/win32_msrating.py +1 -0
  777. angr/procedures/definitions/win32_mssign32.py +1 -0
  778. angr/procedures/definitions/win32_mstask.py +1 -0
  779. angr/procedures/definitions/win32_msvfw32.py +1 -0
  780. angr/procedures/definitions/win32_mswsock.py +1 -0
  781. angr/procedures/definitions/win32_mtxdm.py +1 -0
  782. angr/procedures/definitions/win32_ncrypt.py +1 -0
  783. angr/procedures/definitions/win32_ndfapi.py +1 -0
  784. angr/procedures/definitions/win32_netapi32.py +1 -0
  785. angr/procedures/definitions/win32_netsh.py +1 -0
  786. angr/procedures/definitions/win32_netshell.py +1 -0
  787. angr/procedures/definitions/win32_newdev.py +1 -0
  788. angr/procedures/definitions/win32_ninput.py +1 -0
  789. angr/procedures/definitions/win32_normaliz.py +1 -0
  790. angr/procedures/definitions/win32_ntdll.py +1 -0
  791. angr/procedures/definitions/win32_ntdllk.py +1 -0
  792. angr/procedures/definitions/win32_ntdsapi.py +1 -0
  793. angr/procedures/definitions/win32_ntlanman.py +1 -0
  794. angr/procedures/definitions/win32_odbc32.py +1 -0
  795. angr/procedures/definitions/win32_odbcbcp.py +1 -0
  796. angr/procedures/definitions/win32_ole32.py +1 -0
  797. angr/procedures/definitions/win32_oleacc.py +1 -0
  798. angr/procedures/definitions/win32_oleaut32.py +1 -0
  799. angr/procedures/definitions/win32_oledlg.py +1 -0
  800. angr/procedures/definitions/win32_ondemandconnroutehelper.py +1 -0
  801. angr/procedures/definitions/win32_opengl32.py +1 -0
  802. angr/procedures/definitions/win32_opmxbox.py +1 -0
  803. angr/procedures/definitions/win32_p2p.py +1 -0
  804. angr/procedures/definitions/win32_p2pgraph.py +1 -0
  805. angr/procedures/definitions/win32_pdh.py +1 -0
  806. angr/procedures/definitions/win32_peerdist.py +1 -0
  807. angr/procedures/definitions/win32_powrprof.py +1 -0
  808. angr/procedures/definitions/win32_prntvpt.py +1 -0
  809. angr/procedures/definitions/win32_projectedfslib.py +1 -0
  810. angr/procedures/definitions/win32_propsys.py +1 -0
  811. angr/procedures/definitions/win32_psapi.py +1 -0
  812. angr/procedures/definitions/win32_quartz.py +1 -0
  813. angr/procedures/definitions/win32_query.py +1 -0
  814. angr/procedures/definitions/win32_qwave.py +1 -0
  815. angr/procedures/definitions/win32_rasapi32.py +1 -0
  816. angr/procedures/definitions/win32_rasdlg.py +1 -0
  817. angr/procedures/definitions/win32_resutils.py +1 -0
  818. angr/procedures/definitions/win32_rometadata.py +1 -0
  819. angr/procedures/definitions/win32_rpcns4.py +1 -0
  820. angr/procedures/definitions/win32_rpcproxy.py +1 -0
  821. angr/procedures/definitions/win32_rpcrt4.py +1 -0
  822. angr/procedures/definitions/win32_rstrtmgr.py +1 -0
  823. angr/procedures/definitions/win32_rtm.py +1 -0
  824. angr/procedures/definitions/win32_rtutils.py +1 -0
  825. angr/procedures/definitions/win32_rtworkq.py +1 -0
  826. angr/procedures/definitions/win32_sas.py +1 -0
  827. angr/procedures/definitions/win32_scarddlg.py +1 -0
  828. angr/procedures/definitions/win32_schannel.py +1 -0
  829. angr/procedures/definitions/win32_sechost.py +1 -0
  830. angr/procedures/definitions/win32_secur32.py +1 -0
  831. angr/procedures/definitions/win32_sensapi.py +1 -0
  832. angr/procedures/definitions/win32_sensorsutilsv2.py +1 -0
  833. angr/procedures/definitions/win32_setupapi.py +1 -0
  834. angr/procedures/definitions/win32_sfc.py +1 -0
  835. angr/procedures/definitions/win32_shdocvw.py +1 -0
  836. angr/procedures/definitions/win32_shell32.py +1 -0
  837. angr/procedures/definitions/win32_shlwapi.py +1 -0
  838. angr/procedures/definitions/win32_slc.py +1 -0
  839. angr/procedures/definitions/win32_slcext.py +1 -0
  840. angr/procedures/definitions/win32_slwga.py +1 -0
  841. angr/procedures/definitions/win32_snmpapi.py +1 -0
  842. angr/procedures/definitions/win32_spoolss.py +1 -0
  843. angr/procedures/definitions/win32_srclient.py +1 -0
  844. angr/procedures/definitions/win32_srpapi.py +1 -0
  845. angr/procedures/definitions/win32_sspicli.py +1 -0
  846. angr/procedures/definitions/win32_sti.py +1 -0
  847. angr/procedures/definitions/win32_t2embed.py +1 -0
  848. angr/procedures/definitions/win32_tapi32.py +1 -0
  849. angr/procedures/definitions/win32_tbs.py +1 -0
  850. angr/procedures/definitions/win32_tdh.py +1 -0
  851. angr/procedures/definitions/win32_tokenbinding.py +1 -0
  852. angr/procedures/definitions/win32_traffic.py +1 -0
  853. angr/procedures/definitions/win32_txfw32.py +1 -0
  854. angr/procedures/definitions/win32_ualapi.py +1 -0
  855. angr/procedures/definitions/win32_uiautomationcore.py +1 -0
  856. angr/procedures/definitions/win32_urlmon.py +1 -0
  857. angr/procedures/definitions/win32_user32.py +1 -0
  858. angr/procedures/definitions/win32_userenv.py +1 -0
  859. angr/procedures/definitions/win32_usp10.py +1 -0
  860. angr/procedures/definitions/win32_uxtheme.py +1 -0
  861. angr/procedures/definitions/win32_verifier.py +1 -0
  862. angr/procedures/definitions/win32_version.py +1 -0
  863. angr/procedures/definitions/win32_vertdll.py +1 -0
  864. angr/procedures/definitions/win32_virtdisk.py +1 -0
  865. angr/procedures/definitions/win32_vmdevicehost.py +1 -0
  866. angr/procedures/definitions/win32_vmsavedstatedumpprovider.py +1 -0
  867. angr/procedures/definitions/win32_vssapi.py +1 -0
  868. angr/procedures/definitions/win32_wcmapi.py +1 -0
  869. angr/procedures/definitions/win32_wdsbp.py +1 -0
  870. angr/procedures/definitions/win32_wdsclientapi.py +1 -0
  871. angr/procedures/definitions/win32_wdsmc.py +1 -0
  872. angr/procedures/definitions/win32_wdspxe.py +1 -0
  873. angr/procedures/definitions/win32_wdstptc.py +1 -0
  874. angr/procedures/definitions/win32_webauthn.py +1 -0
  875. angr/procedures/definitions/win32_webservices.py +1 -0
  876. angr/procedures/definitions/win32_websocket.py +1 -0
  877. angr/procedures/definitions/win32_wecapi.py +1 -0
  878. angr/procedures/definitions/win32_wer.py +1 -0
  879. angr/procedures/definitions/win32_wevtapi.py +1 -0
  880. angr/procedures/definitions/win32_winbio.py +1 -0
  881. angr/procedures/definitions/win32_windows_ai_machinelearning.py +1 -0
  882. angr/procedures/definitions/win32_windows_data_pdf.py +1 -0
  883. angr/procedures/definitions/win32_windows_media_mediacontrol.py +1 -0
  884. angr/procedures/definitions/win32_windows_networking.py +1 -0
  885. angr/procedures/definitions/win32_windows_ui_xaml.py +1 -0
  886. angr/procedures/definitions/win32_windowscodecs.py +1 -0
  887. angr/procedures/definitions/win32_winfax.py +1 -0
  888. angr/procedures/definitions/win32_winhttp.py +1 -0
  889. angr/procedures/definitions/win32_winhvemulation.py +1 -0
  890. angr/procedures/definitions/win32_winhvplatform.py +1 -0
  891. angr/procedures/definitions/win32_wininet.py +1 -0
  892. angr/procedures/definitions/win32_winml.py +1 -0
  893. angr/procedures/definitions/win32_winmm.py +1 -0
  894. angr/procedures/definitions/win32_winscard.py +1 -0
  895. angr/procedures/definitions/win32_winspool.py +1 -0
  896. angr/procedures/definitions/win32_winspool_drv.py +1 -0
  897. angr/procedures/definitions/win32_wintrust.py +1 -0
  898. angr/procedures/definitions/win32_winusb.py +1 -0
  899. angr/procedures/definitions/win32_wlanapi.py +1 -0
  900. angr/procedures/definitions/win32_wlanui.py +1 -0
  901. angr/procedures/definitions/win32_wldap32.py +1 -0
  902. angr/procedures/definitions/win32_wldp.py +1 -0
  903. angr/procedures/definitions/win32_wmvcore.py +1 -0
  904. angr/procedures/definitions/win32_wnvapi.py +1 -0
  905. angr/procedures/definitions/win32_wofutil.py +1 -0
  906. angr/procedures/definitions/win32_ws2_32.py +1 -0
  907. angr/procedures/definitions/win32_wscapi.py +1 -0
  908. angr/procedures/definitions/win32_wsclient.py +1 -0
  909. angr/procedures/definitions/win32_wsdapi.py +1 -0
  910. angr/procedures/definitions/win32_wsmsvc.py +1 -0
  911. angr/procedures/definitions/win32_wsnmp32.py +1 -0
  912. angr/procedures/definitions/win32_wtsapi32.py +1 -0
  913. angr/procedures/definitions/win32_xaudio2_8.py +1 -0
  914. angr/procedures/definitions/win32_xinput1_4.py +1 -0
  915. angr/procedures/definitions/win32_xinputuap.py +1 -0
  916. angr/procedures/definitions/win32_xmllite.py +1 -0
  917. angr/procedures/definitions/win32_xolehlp.py +1 -0
  918. angr/procedures/definitions/win32_xpsprint.py +1 -0
  919. angr/procedures/glibc/__ctype_b_loc.py +2 -3
  920. angr/procedures/glibc/__ctype_tolower_loc.py +2 -3
  921. angr/procedures/glibc/__ctype_toupper_loc.py +2 -3
  922. angr/procedures/glibc/__errno_location.py +1 -0
  923. angr/procedures/glibc/__libc_init.py +1 -0
  924. angr/procedures/glibc/__libc_start_main.py +2 -3
  925. angr/procedures/glibc/dynamic_loading.py +1 -0
  926. angr/procedures/glibc/scanf.py +1 -0
  927. angr/procedures/glibc/sscanf.py +1 -0
  928. angr/procedures/gnulib/xalloc_die.py +1 -0
  929. angr/procedures/gnulib/xstrtol_fatal.py +1 -0
  930. angr/procedures/java/__init__.py +1 -0
  931. angr/procedures/java/unconstrained.py +3 -2
  932. angr/procedures/java_io/read.py +1 -0
  933. angr/procedures/java_io/write.py +1 -0
  934. angr/procedures/java_jni/__init__.py +4 -5
  935. angr/procedures/java_jni/array_operations.py +1 -0
  936. angr/procedures/java_jni/class_and_interface_operations.py +3 -3
  937. angr/procedures/java_jni/field_access.py +3 -6
  938. angr/procedures/java_jni/global_and_local_refs.py +1 -0
  939. angr/procedures/java_jni/method_calls.py +3 -2
  940. angr/procedures/java_jni/not_implemented.py +2 -1
  941. angr/procedures/java_jni/object_operations.py +3 -4
  942. angr/procedures/java_jni/string_operations.py +1 -0
  943. angr/procedures/java_jni/version_information.py +1 -0
  944. angr/procedures/java_lang/character.py +2 -3
  945. angr/procedures/java_lang/double.py +2 -2
  946. angr/procedures/java_lang/exit.py +1 -0
  947. angr/procedures/java_lang/getsimplename.py +2 -2
  948. angr/procedures/java_lang/integer.py +1 -0
  949. angr/procedures/java_lang/load_library.py +1 -0
  950. angr/procedures/java_lang/math.py +1 -0
  951. angr/procedures/java_lang/string.py +2 -2
  952. angr/procedures/java_lang/stringbuilder.py +1 -0
  953. angr/procedures/java_lang/system.py +1 -0
  954. angr/procedures/java_util/collection.py +1 -0
  955. angr/procedures/java_util/iterator.py +1 -0
  956. angr/procedures/java_util/list.py +1 -0
  957. angr/procedures/java_util/map.py +3 -4
  958. angr/procedures/java_util/random.py +1 -0
  959. angr/procedures/java_util/scanner_nextline.py +1 -0
  960. angr/procedures/libc/abort.py +1 -0
  961. angr/procedures/libc/access.py +1 -0
  962. angr/procedures/libc/atoi.py +2 -2
  963. angr/procedures/libc/atol.py +1 -0
  964. angr/procedures/libc/calloc.py +1 -0
  965. angr/procedures/libc/closelog.py +1 -0
  966. angr/procedures/libc/err.py +1 -0
  967. angr/procedures/libc/error.py +2 -3
  968. angr/procedures/libc/exit.py +1 -0
  969. angr/procedures/libc/fclose.py +2 -3
  970. angr/procedures/libc/feof.py +1 -0
  971. angr/procedures/libc/fflush.py +1 -0
  972. angr/procedures/libc/fgetc.py +1 -0
  973. angr/procedures/libc/fgets.py +19 -19
  974. angr/procedures/libc/fopen.py +6 -8
  975. angr/procedures/libc/fprintf.py +1 -0
  976. angr/procedures/libc/fputc.py +1 -0
  977. angr/procedures/libc/fputs.py +1 -0
  978. angr/procedures/libc/fread.py +1 -0
  979. angr/procedures/libc/free.py +1 -0
  980. angr/procedures/libc/fscanf.py +2 -2
  981. angr/procedures/libc/fseek.py +3 -2
  982. angr/procedures/libc/ftell.py +1 -0
  983. angr/procedures/libc/fwrite.py +1 -0
  984. angr/procedures/libc/getchar.py +2 -2
  985. angr/procedures/libc/getdelim.py +25 -25
  986. angr/procedures/libc/getegid.py +1 -0
  987. angr/procedures/libc/geteuid.py +1 -0
  988. angr/procedures/libc/getgid.py +1 -0
  989. angr/procedures/libc/gets.py +18 -18
  990. angr/procedures/libc/getuid.py +1 -0
  991. angr/procedures/libc/malloc.py +1 -0
  992. angr/procedures/libc/memcmp.py +3 -6
  993. angr/procedures/libc/memcpy.py +1 -0
  994. angr/procedures/libc/memset.py +1 -0
  995. angr/procedures/libc/openlog.py +1 -0
  996. angr/procedures/libc/perror.py +1 -0
  997. angr/procedures/libc/printf.py +1 -0
  998. angr/procedures/libc/putchar.py +1 -0
  999. angr/procedures/libc/puts.py +1 -0
  1000. angr/procedures/libc/rand.py +1 -0
  1001. angr/procedures/libc/realloc.py +1 -0
  1002. angr/procedures/libc/rewind.py +2 -1
  1003. angr/procedures/libc/scanf.py +2 -2
  1004. angr/procedures/libc/setbuf.py +1 -0
  1005. angr/procedures/libc/setvbuf.py +1 -0
  1006. angr/procedures/libc/snprintf.py +1 -0
  1007. angr/procedures/libc/sprintf.py +1 -0
  1008. angr/procedures/libc/srand.py +1 -0
  1009. angr/procedures/libc/sscanf.py +2 -2
  1010. angr/procedures/libc/stpcpy.py +2 -2
  1011. angr/procedures/libc/strcat.py +1 -0
  1012. angr/procedures/libc/strchr.py +1 -0
  1013. angr/procedures/libc/strcmp.py +1 -0
  1014. angr/procedures/libc/strcpy.py +2 -2
  1015. angr/procedures/libc/strlen.py +35 -31
  1016. angr/procedures/libc/strncat.py +1 -0
  1017. angr/procedures/libc/strncmp.py +9 -11
  1018. angr/procedures/libc/strncpy.py +1 -0
  1019. angr/procedures/libc/strnlen.py +2 -2
  1020. angr/procedures/libc/strstr.py +8 -4
  1021. angr/procedures/libc/strtol.py +9 -9
  1022. angr/procedures/libc/strtoul.py +2 -2
  1023. angr/procedures/libc/system.py +1 -0
  1024. angr/procedures/libc/time.py +2 -2
  1025. angr/procedures/libc/tmpnam.py +1 -0
  1026. angr/procedures/libc/tolower.py +1 -0
  1027. angr/procedures/libc/toupper.py +1 -0
  1028. angr/procedures/libc/ungetc.py +1 -0
  1029. angr/procedures/libc/vsnprintf.py +1 -0
  1030. angr/procedures/libc/wchar.py +1 -0
  1031. angr/procedures/libstdcpp/_unwind_resume.py +1 -0
  1032. angr/procedures/libstdcpp/std____throw_bad_alloc.py +1 -0
  1033. angr/procedures/libstdcpp/std____throw_bad_cast.py +1 -0
  1034. angr/procedures/libstdcpp/std____throw_length_error.py +1 -0
  1035. angr/procedures/libstdcpp/std____throw_logic_error.py +1 -0
  1036. angr/procedures/libstdcpp/std__terminate.py +1 -0
  1037. angr/procedures/linux_kernel/access.py +1 -0
  1038. angr/procedures/linux_kernel/arch_prctl.py +1 -0
  1039. angr/procedures/linux_kernel/arm_user_helpers.py +1 -0
  1040. angr/procedures/linux_kernel/brk.py +1 -0
  1041. angr/procedures/linux_kernel/cwd.py +1 -0
  1042. angr/procedures/linux_kernel/fstat.py +2 -1
  1043. angr/procedures/linux_kernel/fstat64.py +2 -1
  1044. angr/procedures/linux_kernel/futex.py +3 -3
  1045. angr/procedures/linux_kernel/getegid.py +1 -0
  1046. angr/procedures/linux_kernel/geteuid.py +1 -0
  1047. angr/procedures/linux_kernel/getgid.py +1 -0
  1048. angr/procedures/linux_kernel/getpid.py +1 -0
  1049. angr/procedures/linux_kernel/getrlimit.py +3 -3
  1050. angr/procedures/linux_kernel/gettid.py +1 -0
  1051. angr/procedures/linux_kernel/getuid.py +1 -0
  1052. angr/procedures/linux_kernel/iovec.py +1 -0
  1053. angr/procedures/linux_kernel/lseek.py +1 -0
  1054. angr/procedures/linux_kernel/mmap.py +1 -0
  1055. angr/procedures/linux_kernel/mprotect.py +7 -6
  1056. angr/procedures/linux_kernel/munmap.py +1 -0
  1057. angr/procedures/linux_kernel/openat.py +3 -5
  1058. angr/procedures/linux_kernel/set_tid_address.py +1 -0
  1059. angr/procedures/linux_kernel/sigaction.py +1 -0
  1060. angr/procedures/linux_kernel/sigprocmask.py +1 -0
  1061. angr/procedures/linux_kernel/stat.py +3 -2
  1062. angr/procedures/linux_kernel/sysinfo.py +1 -0
  1063. angr/procedures/linux_kernel/tgkill.py +1 -0
  1064. angr/procedures/linux_kernel/time.py +2 -1
  1065. angr/procedures/linux_kernel/uid.py +1 -0
  1066. angr/procedures/linux_kernel/uname.py +1 -0
  1067. angr/procedures/linux_kernel/unlink.py +2 -2
  1068. angr/procedures/linux_kernel/vsyscall.py +1 -0
  1069. angr/procedures/linux_loader/_dl_initial_error_catch_tsd.py +1 -0
  1070. angr/procedures/linux_loader/_dl_rtld_lock.py +1 -0
  1071. angr/procedures/linux_loader/sim_loader.py +1 -0
  1072. angr/procedures/linux_loader/tls.py +2 -2
  1073. angr/procedures/msvcr/__getmainargs.py +1 -0
  1074. angr/procedures/msvcr/_initterm.py +1 -0
  1075. angr/procedures/msvcr/fmode.py +1 -0
  1076. angr/procedures/ntdll/exceptions.py +4 -3
  1077. angr/procedures/posix/accept.py +2 -2
  1078. angr/procedures/posix/bind.py +1 -0
  1079. angr/procedures/posix/bzero.py +1 -0
  1080. angr/procedures/posix/chroot.py +1 -0
  1081. angr/procedures/posix/close.py +2 -2
  1082. angr/procedures/posix/closedir.py +1 -0
  1083. angr/procedures/posix/dup.py +4 -3
  1084. angr/procedures/posix/fcntl.py +1 -0
  1085. angr/procedures/posix/fdopen.py +16 -19
  1086. angr/procedures/posix/fileno.py +1 -0
  1087. angr/procedures/posix/fork.py +1 -0
  1088. angr/procedures/posix/getenv.py +1 -0
  1089. angr/procedures/posix/gethostbyname.py +1 -0
  1090. angr/procedures/posix/getpass.py +1 -0
  1091. angr/procedures/posix/getsockopt.py +1 -0
  1092. angr/procedures/posix/htonl.py +2 -2
  1093. angr/procedures/posix/htons.py +2 -2
  1094. angr/procedures/posix/inet_ntoa.py +3 -5
  1095. angr/procedures/posix/listen.py +1 -0
  1096. angr/procedures/posix/mmap.py +2 -1
  1097. angr/procedures/posix/open.py +1 -0
  1098. angr/procedures/posix/opendir.py +1 -0
  1099. angr/procedures/posix/poll.py +3 -3
  1100. angr/procedures/posix/pread64.py +1 -0
  1101. angr/procedures/posix/pthread.py +3 -3
  1102. angr/procedures/posix/pwrite64.py +1 -0
  1103. angr/procedures/posix/read.py +1 -0
  1104. angr/procedures/posix/readdir.py +1 -1
  1105. angr/procedures/posix/recv.py +1 -0
  1106. angr/procedures/posix/recvfrom.py +1 -0
  1107. angr/procedures/posix/select.py +7 -7
  1108. angr/procedures/posix/send.py +2 -2
  1109. angr/procedures/posix/setsockopt.py +1 -0
  1110. angr/procedures/posix/sigaction.py +1 -0
  1111. angr/procedures/posix/sim_time.py +1 -0
  1112. angr/procedures/posix/sleep.py +1 -0
  1113. angr/procedures/posix/socket.py +2 -2
  1114. angr/procedures/posix/strcasecmp.py +1 -0
  1115. angr/procedures/posix/strdup.py +1 -0
  1116. angr/procedures/posix/strtok_r.py +32 -36
  1117. angr/procedures/posix/syslog.py +1 -0
  1118. angr/procedures/posix/tz.py +1 -0
  1119. angr/procedures/posix/unlink.py +1 -0
  1120. angr/procedures/posix/usleep.py +1 -0
  1121. angr/procedures/posix/write.py +1 -0
  1122. angr/procedures/procedure_dict.py +1 -0
  1123. angr/procedures/stubs/CallReturn.py +1 -0
  1124. angr/procedures/stubs/NoReturnUnconstrained.py +1 -0
  1125. angr/procedures/stubs/Nop.py +1 -0
  1126. angr/procedures/stubs/PathTerminator.py +1 -0
  1127. angr/procedures/stubs/Redirect.py +2 -1
  1128. angr/procedures/stubs/ReturnChar.py +1 -0
  1129. angr/procedures/stubs/ReturnUnconstrained.py +2 -1
  1130. angr/procedures/stubs/UnresolvableCallTarget.py +1 -0
  1131. angr/procedures/stubs/UnresolvableJumpTarget.py +1 -0
  1132. angr/procedures/stubs/UserHook.py +1 -0
  1133. angr/procedures/stubs/b64_decode.py +1 -0
  1134. angr/procedures/stubs/caller.py +1 -0
  1135. angr/procedures/stubs/crazy_scanf.py +1 -0
  1136. angr/procedures/stubs/format_parser.py +11 -15
  1137. angr/procedures/stubs/syscall_stub.py +6 -7
  1138. angr/procedures/testing/manyargs.py +1 -0
  1139. angr/procedures/testing/retreg.py +2 -2
  1140. angr/procedures/tracer/random.py +1 -0
  1141. angr/procedures/tracer/receive.py +4 -4
  1142. angr/procedures/tracer/transmit.py +4 -4
  1143. angr/procedures/uclibc/__uClibc_main.py +1 -0
  1144. angr/procedures/win32/EncodePointer.py +1 -0
  1145. angr/procedures/win32/ExitProcess.py +1 -0
  1146. angr/procedures/win32/GetCommandLine.py +1 -0
  1147. angr/procedures/win32/GetCurrentProcessId.py +1 -0
  1148. angr/procedures/win32/GetCurrentThreadId.py +1 -0
  1149. angr/procedures/win32/GetLastInputInfo.py +1 -0
  1150. angr/procedures/win32/GetModuleHandle.py +3 -4
  1151. angr/procedures/win32/GetProcessAffinityMask.py +1 -0
  1152. angr/procedures/win32/InterlockedExchange.py +2 -1
  1153. angr/procedures/win32/IsProcessorFeaturePresent.py +1 -0
  1154. angr/procedures/win32/VirtualAlloc.py +2 -1
  1155. angr/procedures/win32/VirtualProtect.py +1 -0
  1156. angr/procedures/win32/critical_section.py +1 -0
  1157. angr/procedures/win32/dynamic_loading.py +2 -1
  1158. angr/procedures/win32/file_handles.py +4 -4
  1159. angr/procedures/win32/gethostbyname.py +2 -2
  1160. angr/procedures/win32/heap.py +1 -0
  1161. angr/procedures/win32/is_bad_ptr.py +1 -0
  1162. angr/procedures/win32/local_storage.py +7 -6
  1163. angr/procedures/win32/mutex.py +1 -0
  1164. angr/procedures/win32/sim_time.py +7 -10
  1165. angr/procedures/win32/system_paths.py +5 -4
  1166. angr/procedures/win32_kernel/ExAllocatePool.py +1 -0
  1167. angr/procedures/win32_kernel/ExFreePoolWithTag.py +1 -0
  1168. angr/procedures/win_user32/chars.py +1 -0
  1169. angr/procedures/win_user32/keyboard.py +1 -0
  1170. angr/procedures/win_user32/messagebox.py +2 -4
  1171. angr/project.py +15 -22
  1172. angr/protos/__init__.py +1 -0
  1173. angr/serializable.py +6 -3
  1174. angr/sim_manager.py +18 -18
  1175. angr/sim_options.py +5 -7
  1176. angr/sim_procedure.py +11 -10
  1177. angr/sim_state.py +40 -54
  1178. angr/sim_state_options.py +9 -15
  1179. angr/sim_type.py +93 -123
  1180. angr/sim_variable.py +23 -38
  1181. angr/simos/__init__.py +3 -1
  1182. angr/simos/cgc.py +2 -1
  1183. angr/simos/javavm.py +77 -83
  1184. angr/simos/linux.py +53 -63
  1185. angr/simos/simos.py +13 -22
  1186. angr/simos/snimmuc_nxp.py +3 -6
  1187. angr/simos/userland.py +6 -6
  1188. angr/simos/windows.py +13 -10
  1189. angr/slicer.py +13 -11
  1190. angr/state_hierarchy.py +3 -3
  1191. angr/state_plugins/__init__.py +1 -0
  1192. angr/state_plugins/callstack.py +19 -18
  1193. angr/state_plugins/cgc.py +5 -4
  1194. angr/state_plugins/concrete.py +7 -8
  1195. angr/state_plugins/debug_variables.py +15 -17
  1196. angr/state_plugins/filesystem.py +13 -19
  1197. angr/state_plugins/gdb.py +3 -2
  1198. angr/state_plugins/globals.py +5 -1
  1199. angr/state_plugins/heap/__init__.py +1 -0
  1200. angr/state_plugins/heap/heap_base.py +1 -0
  1201. angr/state_plugins/heap/heap_brk.py +9 -6
  1202. angr/state_plugins/heap/heap_freelist.py +12 -9
  1203. angr/state_plugins/heap/heap_libc.py +1 -0
  1204. angr/state_plugins/heap/heap_ptmalloc.py +27 -36
  1205. angr/state_plugins/heap/utils.py +1 -0
  1206. angr/state_plugins/history.py +7 -10
  1207. angr/state_plugins/inspect.py +1 -0
  1208. angr/state_plugins/javavm_classloader.py +3 -2
  1209. angr/state_plugins/jni_references.py +2 -1
  1210. angr/state_plugins/libc.py +4 -4
  1211. angr/state_plugins/light_registers.py +6 -8
  1212. angr/state_plugins/log.py +1 -0
  1213. angr/state_plugins/loop_data.py +1 -0
  1214. angr/state_plugins/plugin.py +7 -8
  1215. angr/state_plugins/posix.py +14 -22
  1216. angr/state_plugins/preconstrainer.py +2 -1
  1217. angr/state_plugins/scratch.py +5 -4
  1218. angr/state_plugins/sim_action.py +15 -20
  1219. angr/state_plugins/sim_action_object.py +205 -82
  1220. angr/state_plugins/sim_event.py +1 -0
  1221. angr/state_plugins/solver.py +64 -92
  1222. angr/state_plugins/symbolizer.py +5 -6
  1223. angr/state_plugins/trace_additions.py +24 -34
  1224. angr/state_plugins/uc_manager.py +16 -9
  1225. angr/state_plugins/unicorn_engine.py +21 -37
  1226. angr/state_plugins/view.py +20 -19
  1227. angr/storage/__init__.py +1 -0
  1228. angr/storage/file.py +19 -21
  1229. angr/storage/memory_mixins/__init__.py +12 -15
  1230. angr/storage/memory_mixins/__init__.pyi +13 -14
  1231. angr/storage/memory_mixins/actions_mixin.py +1 -0
  1232. angr/storage/memory_mixins/address_concretization_mixin.py +11 -15
  1233. angr/storage/memory_mixins/bvv_conversion_mixin.py +10 -11
  1234. angr/storage/memory_mixins/clouseau_mixin.py +1 -0
  1235. angr/storage/memory_mixins/conditional_store_mixin.py +1 -0
  1236. angr/storage/memory_mixins/convenient_mappings_mixin.py +1 -0
  1237. angr/storage/memory_mixins/default_filler_mixin.py +12 -14
  1238. angr/storage/memory_mixins/dirty_addrs_mixin.py +1 -0
  1239. angr/storage/memory_mixins/hex_dumper_mixin.py +6 -9
  1240. angr/storage/memory_mixins/javavm_memory/__init__.py +1 -0
  1241. angr/storage/memory_mixins/javavm_memory/javavm_memory_mixin.py +16 -23
  1242. angr/storage/memory_mixins/keyvalue_memory/__init__.py +1 -0
  1243. angr/storage/memory_mixins/keyvalue_memory/keyvalue_memory_mixin.py +2 -1
  1244. angr/storage/memory_mixins/label_merger_mixin.py +2 -2
  1245. angr/storage/memory_mixins/multi_value_merger_mixin.py +1 -0
  1246. angr/storage/memory_mixins/name_resolution_mixin.py +12 -15
  1247. angr/storage/memory_mixins/paged_memory/page_backer_mixins.py +6 -6
  1248. angr/storage/memory_mixins/paged_memory/paged_memory_mixin.py +22 -36
  1249. angr/storage/memory_mixins/paged_memory/paged_memory_multivalue_mixin.py +1 -0
  1250. angr/storage/memory_mixins/paged_memory/pages/__init__.py +1 -2
  1251. angr/storage/memory_mixins/paged_memory/pages/cooperation.py +4 -3
  1252. angr/storage/memory_mixins/paged_memory/pages/history_tracking_mixin.py +4 -4
  1253. angr/storage/memory_mixins/paged_memory/pages/ispo_mixin.py +1 -0
  1254. angr/storage/memory_mixins/paged_memory/pages/list_page.py +12 -20
  1255. angr/storage/memory_mixins/paged_memory/pages/multi_values.py +14 -19
  1256. angr/storage/memory_mixins/paged_memory/pages/mv_list_page.py +26 -32
  1257. angr/storage/memory_mixins/paged_memory/pages/permissions_mixin.py +1 -0
  1258. angr/storage/memory_mixins/paged_memory/pages/refcount_mixin.py +2 -2
  1259. angr/storage/memory_mixins/paged_memory/pages/ultra_page.py +37 -41
  1260. angr/storage/memory_mixins/paged_memory/privileged_mixin.py +1 -0
  1261. angr/storage/memory_mixins/paged_memory/stack_allocation_mixin.py +1 -0
  1262. angr/storage/memory_mixins/regioned_memory/__init__.py +1 -0
  1263. angr/storage/memory_mixins/regioned_memory/abstract_address_descriptor.py +5 -4
  1264. angr/storage/memory_mixins/regioned_memory/abstract_merger_mixin.py +6 -21
  1265. angr/storage/memory_mixins/regioned_memory/region_category_mixin.py +1 -0
  1266. angr/storage/memory_mixins/regioned_memory/region_data.py +4 -5
  1267. angr/storage/memory_mixins/regioned_memory/region_meta_mixin.py +129 -13
  1268. angr/storage/memory_mixins/regioned_memory/regioned_address_concretization_mixin.py +2 -1
  1269. angr/storage/memory_mixins/regioned_memory/regioned_memory_mixin.py +34 -44
  1270. angr/storage/memory_mixins/regioned_memory/static_find_mixin.py +7 -9
  1271. angr/storage/memory_mixins/simple_interface_mixin.py +8 -11
  1272. angr/storage/memory_mixins/simplification_mixin.py +1 -0
  1273. angr/storage/memory_mixins/size_resolution_mixin.py +4 -3
  1274. angr/storage/memory_mixins/slotted_memory.py +3 -3
  1275. angr/storage/memory_mixins/smart_find_mixin.py +1 -0
  1276. angr/storage/memory_mixins/symbolic_merger_mixin.py +1 -0
  1277. angr/storage/memory_mixins/top_merger_mixin.py +2 -2
  1278. angr/storage/memory_mixins/underconstrained_mixin.py +12 -14
  1279. angr/storage/memory_mixins/unwrapper_mixin.py +1 -0
  1280. angr/storage/memory_object.py +30 -28
  1281. angr/storage/pcap.py +3 -3
  1282. angr/tablespecs.py +1 -0
  1283. angr/utils/__init__.py +1 -0
  1284. angr/utils/ail.py +30 -0
  1285. angr/utils/algo.py +1 -0
  1286. angr/utils/bits.py +12 -0
  1287. angr/utils/constants.py +2 -0
  1288. angr/utils/cowdict.py +3 -4
  1289. angr/utils/dynamic_dictlist.py +4 -7
  1290. angr/utils/endness.py +1 -0
  1291. angr/utils/enums_conv.py +1 -0
  1292. angr/utils/env.py +1 -0
  1293. angr/utils/formatting.py +1 -0
  1294. angr/utils/funcid.py +15 -14
  1295. angr/utils/graph.py +52 -19
  1296. angr/utils/lazy_import.py +1 -0
  1297. angr/utils/library.py +10 -13
  1298. angr/utils/loader.py +6 -6
  1299. angr/utils/mp.py +4 -3
  1300. angr/utils/orderedset.py +1 -0
  1301. angr/utils/segment_list.py +7 -9
  1302. angr/utils/ssa/__init__.py +198 -0
  1303. angr/utils/ssa/tmp_uses_collector.py +23 -0
  1304. angr/utils/ssa/vvar_uses_collector.py +37 -0
  1305. angr/utils/timing.py +2 -2
  1306. angr/utils/typing.py +1 -0
  1307. angr/vaults.py +7 -8
  1308. {angr-9.2.117.dist-info → angr-9.2.118.dist-info}/METADATA +7 -8
  1309. angr-9.2.118.dist-info/RECORD +1344 -0
  1310. {angr-9.2.117.dist-info → angr-9.2.118.dist-info}/WHEEL +1 -1
  1311. angr/analyses/decompiler/optimization_passes/spilled_register_finder.py +0 -18
  1312. angr/analyses/decompiler/seq_cf_structure_counter.py +0 -37
  1313. angr/service.py +0 -35
  1314. angr-9.2.117.dist-info/RECORD +0 -1310
  1315. {angr-9.2.117.dist-info → angr-9.2.118.dist-info}/LICENSE +0 -0
  1316. {angr-9.2.117.dist-info → angr-9.2.118.dist-info}/entry_points.txt +0 -0
  1317. {angr-9.2.117.dist-info → angr-9.2.118.dist-info}/top_level.txt +0 -0
@@ -1,10 +1,10 @@
1
1
  # pylint:disable=superfluous-parens,too-many-boolean-expressions,line-too-long
2
+ from __future__ import annotations
2
3
  import itertools
3
4
  import logging
4
5
  import math
5
6
  import re
6
7
  import string
7
- from typing import DefaultDict
8
8
  from collections import defaultdict, OrderedDict
9
9
  from enum import Enum, unique
10
10
 
@@ -293,7 +293,7 @@ class FunctionEdge:
293
293
  )
294
294
 
295
295
  def apply(self, cfg):
296
- raise NotImplementedError()
296
+ raise NotImplementedError
297
297
 
298
298
 
299
299
  class FunctionTransitionEdge(FunctionEdge):
@@ -499,10 +499,7 @@ class CFGJob:
499
499
  def __repr__(self):
500
500
  if isinstance(self.addr, SootAddressDescriptor):
501
501
  return f"<CFGJob {self.addr}>"
502
- else:
503
- return "<CFGJob{} {:#08x} @ func {:#08x}>".format(
504
- " syscall" if self.syscall else "", self.addr, self.func_addr
505
- )
502
+ return "<CFGJob{} {:#08x} @ func {:#08x}>".format(" syscall" if self.syscall else "", self.addr, self.func_addr)
506
503
 
507
504
  def __eq__(self, other):
508
505
  return (
@@ -872,10 +869,10 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
872
869
  size = len(data)
873
870
 
874
871
  data = bytes(pyvex.ffi.buffer(data, size))
875
- for x in range(0, 256):
872
+ for x in range(256):
876
873
  p_x = float(data.count(x)) / size
877
874
  if p_x > 0:
878
- entropy += -p_x * math.log(p_x, 2)
875
+ entropy += -p_x * math.log2(p_x)
879
876
  return entropy
880
877
 
881
878
  #
@@ -937,9 +934,8 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
937
934
  if self._seg_list.has_blocks:
938
935
  curr_addr = self._seg_list.next_free_pos(curr_addr)
939
936
 
940
- if alignment is not None:
941
- if curr_addr % alignment > 0:
942
- curr_addr = curr_addr - (curr_addr % alignment) + alignment
937
+ if alignment is not None and curr_addr % alignment > 0:
938
+ curr_addr = curr_addr - (curr_addr % alignment) + alignment
943
939
 
944
940
  # Make sure curr_addr exists in binary
945
941
  accepted = False
@@ -1010,15 +1006,12 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
1010
1006
  if is_arm_arch(self.project.arch):
1011
1007
  # little endian
1012
1008
  sz_bytes = bytes(sz)
1013
- if self.project.arch.memory_endness == Endness.LE:
1014
- if b"\x70\x47" in sz_bytes: # bx lr
1015
- return 0
1016
- if self.project.arch.memory_endness == Endness.BE:
1017
- if b"\x47\x70" in sz_bytes: # bx lr
1018
- return 0
1009
+ if self.project.arch.memory_endness == Endness.LE and b"\x70\x47" in sz_bytes: # bx lr
1010
+ return 0
1011
+ if self.project.arch.memory_endness == Endness.BE and b"\x47\x70" in sz_bytes: # bx lr
1012
+ return 0
1019
1013
  l.debug("Got a string of %d chars", len(sz))
1020
- string_length = len(sz) + 1
1021
- return string_length
1014
+ return len(sz) + 1
1022
1015
 
1023
1016
  # no string is found
1024
1017
  return 0
@@ -1051,8 +1044,7 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
1051
1044
 
1052
1045
  if sz and is_sz:
1053
1046
  l.debug("Got a wide-string of %d wide chars", len(sz))
1054
- string_length = len(sz) + 2
1055
- return string_length
1047
+ return len(sz) + 2
1056
1048
 
1057
1049
  # no wide string is found
1058
1050
  return 0
@@ -1084,8 +1076,7 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
1084
1076
 
1085
1077
  if repeating_length >= threshold:
1086
1078
  return repeating_length
1087
- else:
1088
- return 0
1079
+ return 0
1089
1080
 
1090
1081
  def _next_code_addr_core(self):
1091
1082
  """
@@ -1132,7 +1123,7 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
1132
1123
  start_addr = start_addr - start_addr % instr_alignment + instr_alignment
1133
1124
  # trickiness: aligning the start_addr may create a new address that is outside any mapped region.
1134
1125
  if not self._inside_regions(start_addr):
1135
- raise ContinueScanningNotification()
1126
+ raise ContinueScanningNotification
1136
1127
 
1137
1128
  return start_addr
1138
1129
 
@@ -1230,7 +1221,7 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
1230
1221
  # should record all exits from a single function, and then add
1231
1222
  # necessary calling edges in our call map during the post-processing
1232
1223
  # phase.
1233
- self._function_exits: DefaultDict[int, set[int]] = defaultdict(set)
1224
+ self._function_exits: defaultdict[int, set[int]] = defaultdict(set)
1234
1225
 
1235
1226
  # Create an initial state. Store it to self so we can use it globally.
1236
1227
  self._initial_state = self.project.factory.blank_state(
@@ -1257,16 +1248,16 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
1257
1248
  starting_points |= set(self._extra_function_starts)
1258
1249
 
1259
1250
  # Sort it
1260
- sorted_starting_points: list[int] = sorted(list(starting_points), reverse=False)
1251
+ sorted_starting_points: list[int] = sorted(starting_points, reverse=False)
1261
1252
 
1262
1253
  if self._start_at_entry and self.project.entry is not None and self._inside_regions(self.project.entry):
1263
1254
  if self.project.entry not in starting_points:
1264
1255
  # make sure self.project.entry is inserted
1265
- sorted_starting_points = [self.project.entry] + sorted_starting_points
1256
+ sorted_starting_points = [self.project.entry, *sorted_starting_points]
1266
1257
  else:
1267
1258
  # make sure project.entry is the first item
1268
1259
  sorted_starting_points.remove(self.project.entry)
1269
- sorted_starting_points = [self.project.entry] + sorted_starting_points
1260
+ sorted_starting_points = [self.project.entry, *sorted_starting_points]
1270
1261
 
1271
1262
  # Create jobs for all starting points
1272
1263
  for sp in sorted_starting_points:
@@ -1316,7 +1307,7 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
1316
1307
  if cfg_node is not None:
1317
1308
  self._graph_add_edge(cfg_node, job.src_node, job.jumpkind, job.src_ins_addr, job.src_stmt_idx)
1318
1309
  job.apply_function_edges(self, clear=True)
1319
- raise AngrSkipJobNotice()
1310
+ raise AngrSkipJobNotice
1320
1311
 
1321
1312
  # Do not calculate progress if the user doesn't care about the progress at all
1322
1313
  if self._show_progressbar or self._progress_callback:
@@ -1382,12 +1373,8 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
1382
1373
  # do nothing
1383
1374
  filtered_successors.append(successor)
1384
1375
  continue
1385
- if addr % 2 == 1:
1386
- # THUMB mode - test if there is an existing ARM function
1387
- addr_to_test = addr - 1
1388
- else:
1389
- # ARM mode - test if there is an existing THUMB function
1390
- addr_to_test = addr + 1
1376
+ # THUMB mode?
1377
+ addr_to_test = addr - 1 if addr % 2 == 1 else addr + 1
1391
1378
  if self.functions.contains_addr(addr_to_test):
1392
1379
  # oops. skip it
1393
1380
  continue
@@ -1486,10 +1473,7 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
1486
1473
  return
1487
1474
 
1488
1475
  if self._force_complete_scan or self._force_smart_scan:
1489
- if self._force_smart_scan:
1490
- addr = self._next_code_addr_smart()
1491
- else:
1492
- addr = self._next_code_addr()
1476
+ addr = self._next_code_addr_smart() if self._force_smart_scan else self._next_code_addr()
1493
1477
 
1494
1478
  if addr is None:
1495
1479
  l.debug("Force-scan jumping failed")
@@ -1574,24 +1558,22 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
1574
1558
  callsites_to_functions = defaultdict(list) # callsites to functions mapping
1575
1559
 
1576
1560
  for src, dst, data in all_edges:
1577
- if "type" in data:
1578
- if data["type"] == "call":
1579
- callsites_to_functions[src.addr].append(dst.addr)
1561
+ if "type" in data and data["type"] == "call":
1562
+ callsites_to_functions[src.addr].append(dst.addr)
1580
1563
 
1581
1564
  edges_to_remove = []
1582
1565
  for src, dst, data in all_edges:
1583
- if "type" in data:
1584
- if data["type"] == "fake_return" and data.get("confirmed", False) is False:
1585
- # Get all possible functions being called here
1586
- target_funcs = [
1587
- self.functions.function(addr=func_addr) for func_addr in callsites_to_functions[src.addr]
1588
- ]
1589
- if target_funcs and all(t is not None and t.returning is False for t in target_funcs):
1590
- # Remove this edge
1591
- edges_to_remove.append((src, dst))
1592
- else:
1593
- # Mark this edge as confirmed
1594
- f._confirm_fakeret(src, dst)
1566
+ if "type" in data and data["type"] == "fake_return" and data.get("confirmed", False) is False:
1567
+ # Get all possible functions being called here
1568
+ target_funcs = [
1569
+ self.functions.function(addr=func_addr) for func_addr in callsites_to_functions[src.addr]
1570
+ ]
1571
+ if target_funcs and all(t is not None and t.returning is False for t in target_funcs):
1572
+ # Remove this edge
1573
+ edges_to_remove.append((src, dst))
1574
+ else:
1575
+ # Mark this edge as confirmed
1576
+ f._confirm_fakeret(src, dst)
1595
1577
 
1596
1578
  for edge in edges_to_remove:
1597
1579
  f.transition_graph.remove_edge(*edge)
@@ -1614,20 +1596,19 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
1614
1596
  # make return edges
1615
1597
  self._make_return_edges()
1616
1598
 
1617
- if self.project.arch.name != "Soot":
1618
- if self.project.loader.main_object.sections:
1619
- # this binary has sections
1620
- # make sure we have data entries assigned at the beginning of each data section
1621
- for sec in self.project.loader.main_object.sections:
1622
- if sec.memsize > 0 and not sec.is_executable and sec.is_readable:
1623
- for seg in self.project.loader.main_object.segments:
1624
- if seg.vaddr <= sec.vaddr < seg.vaddr + seg.memsize:
1625
- break
1626
- else:
1627
- continue
1599
+ if self.project.arch.name != "Soot" and self.project.loader.main_object.sections:
1600
+ # this binary has sections
1601
+ # make sure we have data entries assigned at the beginning of each data section
1602
+ for sec in self.project.loader.main_object.sections:
1603
+ if sec.memsize > 0 and not sec.is_executable and sec.is_readable:
1604
+ for seg in self.project.loader.main_object.segments:
1605
+ if seg.vaddr <= sec.vaddr < seg.vaddr + seg.memsize:
1606
+ break
1607
+ else:
1608
+ continue
1628
1609
 
1629
- if sec.vaddr not in self.model.memory_data:
1630
- self.model.memory_data[sec.vaddr] = MemoryData(sec.vaddr, 0, MemoryDataSort.Unknown)
1610
+ if sec.vaddr not in self.model.memory_data:
1611
+ self.model.memory_data[sec.vaddr] = MemoryData(sec.vaddr, 0, MemoryDataSort.Unknown)
1631
1612
 
1632
1613
  # If they asked for it, give it to them. All of it.
1633
1614
  if self._cross_references:
@@ -1717,14 +1698,11 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
1717
1698
  security_check_cookie_found = True
1718
1699
  func.is_default_name = False
1719
1700
  func.name = "_security_check_cookie"
1720
- elif not security_init_cookie_found and is_function_security_init_cookie(
1721
- func, self.project, security_cookie_addr
1722
- ):
1723
- security_init_cookie_found = True
1724
- func.is_default_name = False
1725
- func.name = "_security_init_cookie"
1726
- elif not security_init_cookie_found and is_function_security_init_cookie_win8(
1727
- func, self.project, security_cookie_addr
1701
+ elif (
1702
+ not security_init_cookie_found
1703
+ and is_function_security_init_cookie(func, self.project, security_cookie_addr)
1704
+ or not security_init_cookie_found
1705
+ and is_function_security_init_cookie_win8(func, self.project, security_cookie_addr)
1728
1706
  ):
1729
1707
  security_init_cookie_found = True
1730
1708
  func.is_default_name = False
@@ -1739,12 +1717,15 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
1739
1717
  start_func = self.functions.get_by_addr(self.project.entry)
1740
1718
  if start_func is not None:
1741
1719
  for callee in start_func.transition_graph:
1742
- if isinstance(callee, Function):
1743
- if not security_init_cookie_found and is_function_likely_security_init_cookie(callee):
1744
- security_init_cookie_found = True
1745
- callee.is_default_name = False
1746
- callee.name = "_security_init_cookie"
1747
- break
1720
+ if (
1721
+ isinstance(callee, Function)
1722
+ and not security_init_cookie_found
1723
+ and is_function_likely_security_init_cookie(callee)
1724
+ ):
1725
+ security_init_cookie_found = True
1726
+ callee.is_default_name = False
1727
+ callee.name = "_security_init_cookie"
1728
+ break
1748
1729
 
1749
1730
  def _post_process_string_references(self) -> None:
1750
1731
  """
@@ -1758,11 +1739,11 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
1758
1739
  MAX_STRING_SIZE = 256
1759
1740
  UPDATE_RATIO = 0.5
1760
1741
 
1761
- all_memory_data = sorted(list(self.model.memory_data.items()), key=lambda x: x[0]) # sorted by addr
1742
+ all_memory_data = sorted(self.model.memory_data.items(), key=lambda x: x[0]) # sorted by addr
1762
1743
  to_update: dict[int, bytes] = {}
1763
1744
  total_string_refs: int = 0
1764
1745
  for i, (addr, md) in enumerate(all_memory_data):
1765
- if not md.sort == MemoryDataSort.String:
1746
+ if md.sort != MemoryDataSort.String:
1766
1747
  continue
1767
1748
  total_string_refs += 1
1768
1749
  if md.content is None:
@@ -1941,9 +1922,8 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
1941
1922
  # If we have traced it before, don't trace it anymore
1942
1923
  if addr in self._traced_addresses:
1943
1924
  return []
1944
- else:
1945
- # Mark the address as traced
1946
- self._traced_addresses.add(addr)
1925
+ # Mark the address as traced
1926
+ self._traced_addresses.add(addr)
1947
1927
 
1948
1928
  entries: list[CFGJob] = []
1949
1929
 
@@ -1992,20 +1972,20 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
1992
1972
  None,
1993
1973
  None,
1994
1974
  )
1995
- if namehint:
1996
- if addr_ not in self.kb.labels or self.kb.labels[addr_] in {
1975
+ if namehint and (
1976
+ addr_ not in self.kb.labels
1977
+ or self.kb.labels[addr_]
1978
+ in {
1997
1979
  "_ftext",
1998
- }:
1999
- unique_label = self.kb.labels.get_unique_label(namehint)
2000
- self.kb.labels[addr_] = unique_label
1980
+ }
1981
+ ):
1982
+ unique_label = self.kb.labels.get_unique_label(namehint)
1983
+ self.kb.labels[addr_] = unique_label
2001
1984
 
2002
1985
  # determine if this procedure returns
2003
- if procedure.DYNAMIC_RET:
2004
- # whether this procedure returns or not depends on the context
2005
- # the procedure may return, but we will determine if we are inserting a fake_ret edge at each call site
2006
- proc_returns = True
2007
- else:
2008
- proc_returns = not procedure.NO_RET
1986
+ # whether this procedure returns or not depends on the context
1987
+ # the procedure may return, but we will determine if we are inserting a fake_ret edge at each call site
1988
+ proc_returns = procedure.DYNAMIC_RET or not procedure.NO_RET
2009
1989
 
2010
1990
  if proc_returns:
2011
1991
  # it returns
@@ -2048,34 +2028,34 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
2048
2028
  if self.functions.get_by_addr(function_addr).returning is not True:
2049
2029
  self._updated_nonreturning_functions.add(function_addr)
2050
2030
 
2051
- if current_func_addr != function_addr:
2052
- # the function address is updated by _generate_cfgnode() because the CFG node has been assigned to a
2053
- # different function (`function_addr`) before. this can happen when the beginning block of a function is
2054
- # first reached through a direct jump (as the result of tail-call optimization) and then reached through a
2055
- # call.
2056
- # this is very likely to be fixed during the second phase of CFG traversal, so we can just let it be.
2057
- # however, extra call edges pointing to the expected function address (`current_func_addr`) will lead to
2058
- # the creation of an empty function in function manager, and because the function is empty, we cannot
2059
- # determine if the function will return or not!
2060
- # assuming tail-call optimization is what is causing this situation, and if the original function has been
2061
- # determined to be returning, we update the newly created function's returning status here.
2062
- # this is still a hack. the complete solution is to record this situation and account for it when CFGBase
2063
- # analyzes the returning status of each function. we will cross that bridge when we encounter such cases.
2064
- if self.kb.functions[function_addr].returning is not None and self.kb.functions.contains_addr(
2065
- current_func_addr
2066
- ):
2067
- self.kb.functions[current_func_addr].returning = self.kb.functions[function_addr].returning
2068
- if self.kb.functions[current_func_addr].returning:
2069
- self._pending_jobs.add_returning_function(current_func_addr)
2031
+ # the function address is updated by _generate_cfgnode() because the CFG node has been assigned to a
2032
+ # different function (`function_addr`) before. this can happen when the beginning block of a function is
2033
+ # first reached through a direct jump (as the result of tail-call optimization) and then reached through a
2034
+ # call.
2035
+ # this is very likely to be fixed during the second phase of CFG traversal, so we can just let it be.
2036
+ # however, extra call edges pointing to the expected function address (`current_func_addr`) will lead to
2037
+ # the creation of an empty function in function manager, and because the function is empty, we cannot
2038
+ # determine if the function will return or not!
2039
+ # assuming tail-call optimization is what is causing this situation, and if the original function has been
2040
+ # determined to be returning, we update the newly created function's returning status here.
2041
+ # this is still a hack. the complete solution is to record this situation and account for it when CFGBase
2042
+ # analyzes the returning status of each function. we will cross that bridge when we encounter such cases.
2043
+ if (
2044
+ current_func_addr != function_addr
2045
+ and self.kb.functions[function_addr].returning is not None
2046
+ and self.kb.functions.contains_addr(current_func_addr)
2047
+ ):
2048
+ self.kb.functions[current_func_addr].returning = self.kb.functions[function_addr].returning
2049
+ if self.kb.functions[current_func_addr].returning:
2050
+ self._pending_jobs.add_returning_function(current_func_addr)
2070
2051
 
2071
2052
  # If we have traced it before, don't trace it anymore
2072
2053
  real_addr = get_real_address_if_arm(self.project.arch, addr)
2073
2054
  if real_addr in self._traced_addresses:
2074
2055
  # the address has been traced before
2075
2056
  return []
2076
- else:
2077
- # Mark the address as traced
2078
- self._traced_addresses.add(real_addr)
2057
+ # Mark the address as traced
2058
+ self._traced_addresses.add(real_addr)
2079
2059
 
2080
2060
  # irsb cannot be None here, but we add a check for resilience
2081
2061
  if irsb is None:
@@ -2466,10 +2446,7 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
2466
2446
  except AngrUnsupportedSyscallError:
2467
2447
  target_addr = self._unresolvable_call_target_addr
2468
2448
 
2469
- if isinstance(target_addr, SootAddressDescriptor):
2470
- new_function_addr = target_addr.method
2471
- else:
2472
- new_function_addr = target_addr
2449
+ new_function_addr = target_addr.method if isinstance(target_addr, SootAddressDescriptor) else target_addr
2473
2450
 
2474
2451
  if irsb is None:
2475
2452
  return_site = None
@@ -2642,7 +2619,7 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
2642
2619
  if target_func_addr is None:
2643
2620
  target_func_addr = current_function_addr
2644
2621
 
2645
- to_outside = not target_func_addr == current_function_addr
2622
+ to_outside = target_func_addr != current_function_addr
2646
2623
 
2647
2624
  return to_outside, target_func_addr
2648
2625
 
@@ -2674,12 +2651,11 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
2674
2651
  data_type_str = ref.data_type_str
2675
2652
  is_store = False
2676
2653
 
2677
- if ref.data_size:
2678
- # special logic: we do not call occupy for storing attempts in executable memory regions
2679
- if not is_store or (is_store and not self._addr_in_exec_memory_regions(ref.data_addr)):
2680
- self._seg_list.occupy(ref.data_addr, ref.data_size, "unknown")
2681
- if assumption is not None:
2682
- assumption.add_data_seg(ref.data_addr, ref.data_size)
2654
+ # special logic: we do not call occupy for storing attempts in executable memory regions
2655
+ if ref.data_size and (not is_store or not self._addr_in_exec_memory_regions(ref.data_addr)):
2656
+ self._seg_list.occupy(ref.data_addr, ref.data_size, "unknown")
2657
+ if assumption is not None:
2658
+ assumption.add_data_seg(ref.data_addr, ref.data_size)
2683
2659
 
2684
2660
  self._add_data_reference(
2685
2661
  irsb_addr,
@@ -2714,17 +2690,20 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
2714
2690
  data_type=MemoryDataSort.Unknown,
2715
2691
  )
2716
2692
 
2717
- if sec_2nd.is_executable and not self._seg_list.is_occupied(v):
2718
- if v % self.project.arch.instruction_alignment == 0:
2719
- # create a new CFG job
2720
- ce = CFGJob(
2721
- v,
2722
- v,
2723
- "Ijk_Boring",
2724
- job_type=CFGJobType.DATAREF_HINTS,
2725
- )
2726
- self._pending_jobs.add_job(ce)
2727
- self._register_analysis_job(v, ce)
2693
+ if (
2694
+ sec_2nd.is_executable
2695
+ and not self._seg_list.is_occupied(v)
2696
+ and v % self.project.arch.instruction_alignment == 0
2697
+ ):
2698
+ # create a new CFG job
2699
+ ce = CFGJob(
2700
+ v,
2701
+ v,
2702
+ "Ijk_Boring",
2703
+ job_type=CFGJobType.DATAREF_HINTS,
2704
+ )
2705
+ self._pending_jobs.add_job(ce)
2706
+ self._register_analysis_job(v, ce)
2728
2707
 
2729
2708
  return
2730
2709
 
@@ -2945,11 +2924,10 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
2945
2924
  )
2946
2925
  self.kb.xrefs.add_xref(cr)
2947
2926
 
2948
- if is_arm_arch(self.project.arch):
2949
- if (irsb_addr & 1) == 1 and data_addr == (insn_addr & 0xFFFF_FFFF_FFFF_FFFE) + 4:
2950
- return
2951
- elif data_addr == insn_addr + 8:
2952
- return
2927
+ if is_arm_arch(self.project.arch) and (
2928
+ (irsb_addr & 1) == 1 and data_addr == (insn_addr & 0xFFFF_FFFF_FFFF_FFFE) + 4 or data_addr == insn_addr + 8
2929
+ ):
2930
+ return
2953
2931
  self.insn_addr_to_memory_data[insn_addr] = self.model.memory_data[data_addr]
2954
2932
 
2955
2933
  # Indirect jumps processing
@@ -2968,10 +2946,11 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
2968
2946
  """
2969
2947
 
2970
2948
  # is the address identified by CLE as a PLT stub?
2971
- if self.project.loader.all_elf_objects:
2972
- # restrict this heuristics to ELF files only
2973
- if not any(addr in obj.reverse_plt for obj in self.project.loader.all_elf_objects):
2974
- return False
2949
+ # restrict this heuristics to ELF files only
2950
+ if self.project.loader.all_elf_objects and not any(
2951
+ addr in obj.reverse_plt for obj in self.project.loader.all_elf_objects
2952
+ ):
2953
+ return False
2975
2954
 
2976
2955
  # Make sure the IRSB has statements
2977
2956
  if not irsb.has_statements:
@@ -2981,7 +2960,7 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
2981
2960
  simsucc = self.project.factory.default_engine.process(self._initial_state, irsb, force_addr=addr)
2982
2961
  if len(simsucc.successors) == 1:
2983
2962
  ip = simsucc.successors[0].ip
2984
- if claripy.backends.concrete.convert(ip) is not ip:
2963
+ if isinstance(ip, claripy.ast.Base):
2985
2964
  target_addr = ip.concrete_value
2986
2965
  obj = self.project.loader.find_object_containing(target_addr, membership_check=False)
2987
2966
  if (obj is not None and obj is not self.project.loader.main_object) or self.project.is_hooked(
@@ -3473,7 +3452,7 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
3473
3452
  self._model.add_node(new_node.addr, new_node)
3474
3453
 
3475
3454
  # the function starting at this point is probably totally incorrect
3476
- # hopefull future call to `make_functions()` will correct everything
3455
+ # hopefully, a future call to `make_functions()` will correct everything
3477
3456
  if node.addr in self.kb.functions:
3478
3457
  del self.kb.functions[node.addr]
3479
3458
 
@@ -3481,11 +3460,14 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
3481
3460
  # add functions back
3482
3461
  self._function_add_node(node, node.addr)
3483
3462
  successor_node = self.model.get_any_node(successor_node_addr)
3484
- if successor_node and successor_node.function_address == node.addr:
3485
- # if there is absolutely no predecessors to successor_node, we'd like to add it as a new function
3486
- # so that it will not be left behind
3487
- if not list(self.graph.predecessors(successor_node)):
3488
- self._function_add_node(successor_node, successor_node_addr)
3463
+ # if there is absolutely no predecessors to successor_node, we'd like to add it as a new function
3464
+ # so that it will not be left behind
3465
+ if (
3466
+ successor_node
3467
+ and successor_node.function_address == node.addr
3468
+ and not list(self.graph.predecessors(successor_node))
3469
+ ):
3470
+ self._function_add_node(successor_node, successor_node_addr)
3489
3471
 
3490
3472
  # if node.addr in self.kb.functions.callgraph:
3491
3473
  # self.kb.functions.callgraph.remove_node(node.addr)
@@ -3946,30 +3928,29 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
3946
3928
  tmps[stmt.tmp] = initial_sp
3947
3929
  elif data.offset == lr_offset:
3948
3930
  tmps[stmt.tmp] = initial_lr
3949
- elif isinstance(data, pyvex.IRExpr.Binop):
3950
- if data.op == "Iop_Sub32":
3951
- arg0, arg1 = data.args
3952
- if isinstance(arg0, pyvex.IRExpr.RdTmp) and isinstance(arg1, pyvex.IRExpr.Const):
3953
- if arg0.tmp in tmps:
3954
- tmps[stmt.tmp] = tmps[arg0.tmp] - arg1.con.value
3931
+ elif isinstance(data, pyvex.IRExpr.Binop) and data.op == "Iop_Sub32":
3932
+ arg0, arg1 = data.args
3933
+ if (
3934
+ isinstance(arg0, pyvex.IRExpr.RdTmp)
3935
+ and isinstance(arg1, pyvex.IRExpr.Const)
3936
+ and arg0.tmp in tmps
3937
+ ):
3938
+ tmps[stmt.tmp] = tmps[arg0.tmp] - arg1.con.value
3955
3939
 
3956
3940
  elif isinstance(stmt, (pyvex.IRStmt.Store, pyvex.IRStmt.StoreG)):
3957
3941
  data = stmt.data
3958
3942
  storing_lr = False
3959
- if isinstance(data, pyvex.IRExpr.RdTmp):
3960
- if data.tmp in tmps:
3961
- val = tmps[data.tmp]
3962
- if val == initial_lr:
3963
- # we are storing LR to somewhere
3964
- storing_lr = True
3965
- if storing_lr:
3966
- if isinstance(stmt.addr, pyvex.IRExpr.RdTmp):
3967
- if stmt.addr.tmp in tmps:
3968
- storing_addr = tmps[stmt.addr.tmp]
3969
-
3970
- function.info["lr_saved_on_stack"] = True
3971
- function.info["lr_on_stack_offset"] = storing_addr - initial_sp
3972
- break
3943
+ if isinstance(data, pyvex.IRExpr.RdTmp) and data.tmp in tmps:
3944
+ val = tmps[data.tmp]
3945
+ if val == initial_lr:
3946
+ # we are storing LR to somewhere
3947
+ storing_lr = True
3948
+ if storing_lr and isinstance(stmt.addr, pyvex.IRExpr.RdTmp) and stmt.addr.tmp in tmps:
3949
+ storing_addr = tmps[stmt.addr.tmp]
3950
+
3951
+ function.info["lr_saved_on_stack"] = True
3952
+ function.info["lr_on_stack_offset"] = storing_addr - initial_sp
3953
+ break
3973
3954
 
3974
3955
  if "lr_saved_on_stack" not in function.info:
3975
3956
  function.info["lr_saved_on_stack"] = False
@@ -4004,18 +3985,22 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
4004
3985
  # only support Add
4005
3986
  if data.op == "Iop_Add32":
4006
3987
  arg0, arg1 = data.args
4007
- if isinstance(arg0, pyvex.IRExpr.RdTmp) and isinstance(arg1, pyvex.IRExpr.Const):
4008
- if arg0.tmp in tmps:
4009
- tmps[stmt.tmp] = tmps[arg0.tmp] + arg1.con.value
4010
- elif isinstance(data, pyvex.IRExpr.Load):
4011
- if isinstance(data.addr, pyvex.IRExpr.RdTmp):
4012
- if data.addr.tmp in tmps:
4013
- tmps[stmt.tmp] = ("load", tmps[data.addr.tmp])
3988
+ if (
3989
+ isinstance(arg0, pyvex.IRExpr.RdTmp)
3990
+ and isinstance(arg1, pyvex.IRExpr.Const)
3991
+ and arg0.tmp in tmps
3992
+ ):
3993
+ tmps[stmt.tmp] = tmps[arg0.tmp] + arg1.con.value
3994
+ elif (
3995
+ isinstance(data, pyvex.IRExpr.Load)
3996
+ and isinstance(data.addr, pyvex.IRExpr.RdTmp)
3997
+ and data.addr.tmp in tmps
3998
+ ):
3999
+ tmps[stmt.tmp] = ("load", tmps[data.addr.tmp])
4014
4000
  elif isinstance(stmt, pyvex.IRStmt.Put):
4015
- if stmt.offset == sp_offset and isinstance(stmt.data, pyvex.IRExpr.RdTmp):
4016
- if stmt.data.tmp in tmps:
4017
- # loading things into sp
4018
- last_sp = tmps[stmt.data.tmp]
4001
+ if stmt.offset == sp_offset and isinstance(stmt.data, pyvex.IRExpr.RdTmp) and stmt.data.tmp in tmps:
4002
+ # loading things into sp
4003
+ last_sp = tmps[stmt.data.tmp]
4019
4004
 
4020
4005
  if last_sp is not None and isinstance(tmp_irsb.next, pyvex.IRExpr.RdTmp):
4021
4006
  val = tmps.get(tmp_irsb.next.tmp, None)
@@ -4023,10 +4008,7 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
4023
4008
  if isinstance(val, tuple) and val[0] == "load":
4024
4009
  # the value comes from memory
4025
4010
  memory_addr = val[1]
4026
- if isinstance(last_sp, int):
4027
- lr_on_stack_offset = memory_addr - last_sp
4028
- else:
4029
- lr_on_stack_offset = memory_addr - last_sp[1]
4011
+ lr_on_stack_offset = memory_addr - last_sp if isinstance(last_sp, int) else memory_addr - last_sp[1]
4030
4012
 
4031
4013
  if lr_on_stack_offset == function.info["lr_on_stack_offset"]:
4032
4014
  # the jumpkind should be Ret instead of boring
@@ -4093,7 +4075,7 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
4093
4075
  func = self.kb.functions.get_by_addr(current_function_addr)
4094
4076
  pc_reg = return_from_func.info["get_pc"]
4095
4077
  # the crazy thing is that GCC-generated code may adjust the register value accordingly after
4096
- # returning! we must take into account the added offset (in the followin example, 0x8d36)
4078
+ # returning! we must take into account the added offset (in the following example, 0x8d36)
4097
4079
  #
4098
4080
  # e.g.
4099
4081
  # 000011A1 call __x86_get_pc_thunk_bx
@@ -4172,10 +4154,7 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
4172
4154
 
4173
4155
  is_x86_x64_arch = self.project.arch.name in ("X86", "AMD64")
4174
4156
 
4175
- if is_arm_arch(self.project.arch):
4176
- real_addr = addr & (~1)
4177
- else:
4178
- real_addr = addr
4157
+ real_addr = addr & ~1 if is_arm_arch(self.project.arch) else addr
4179
4158
 
4180
4159
  # extra check for ARM
4181
4160
  if is_arm_arch(self.project.arch) and self._seg_list.occupied_by_sort(addr) == "code":
@@ -4231,10 +4210,7 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
4231
4210
  next_func.addr & (~1) if is_arm_arch(self.project.arch) else next_func.addr
4232
4211
  ) - real_addr
4233
4212
  if distance_to_func != 0:
4234
- if distance is None:
4235
- distance = distance_to_func
4236
- else:
4237
- distance = min(distance, distance_to_func)
4213
+ distance = distance_to_func if distance is None else min(distance, distance_to_func)
4238
4214
 
4239
4215
  # in the end, check the distance between `addr` and the closest occupied region in segment list
4240
4216
  next_noncode_addr = self._seg_list.next_pos_with_sort_not_in(addr, {"code"}, max_distance=distance)
@@ -4312,53 +4288,51 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
4312
4288
  except SimTranslationError:
4313
4289
  nodecode = True
4314
4290
 
4315
- if cfg_job.job_type == CFGJobType.COMPLETE_SCANNING:
4316
- # special logic during the complete scanning phase
4317
-
4318
- if is_arm_arch(self.project.arch):
4319
- # it's way too easy to incorrectly disassemble THUMB code contains 0x4f as ARM code svc?? #????
4320
- # if we get a single block that getting decoded to svc?? under ARM mode, we treat it as nodecode
4321
- if addr % 4 == 0 and irsb.jumpkind == "Ijk_Sys_syscall":
4322
- if (
4323
- lifted_block.capstone.insns
4324
- and lifted_block.capstone.insns[-1].mnemonic.startswith("svc")
4325
- and lifted_block.capstone.insns[-1].operands[0].imm > 255
4326
- ):
4327
- nodecode = True
4291
+ # special logic during the complete scanning phase
4292
+ if cfg_job.job_type == CFGJobType.COMPLETE_SCANNING and is_arm_arch(self.project.arch):
4293
+ # it's way too easy to incorrectly disassemble THUMB code contains 0x4f as ARM code svc?? #????
4294
+ # if we get a single block that getting decoded to svc?? under ARM mode, we treat it as nodecode
4295
+ if (
4296
+ addr % 4 == 0
4297
+ and irsb.jumpkind == "Ijk_Sys_syscall"
4298
+ and (
4299
+ lifted_block.capstone.insns
4300
+ and lifted_block.capstone.insns[-1].mnemonic.startswith("svc")
4301
+ and lifted_block.capstone.insns[-1].operands[0].imm > 255
4302
+ )
4303
+ ):
4304
+ nodecode = True
4328
4305
 
4329
- if (nodecode or irsb.size == 0 or irsb.jumpkind == "Ijk_NoDecode") and switch_mode_on_nodecode:
4330
- # maybe the current mode is wrong?
4331
- nodecode = False
4332
- if addr % 2 == 0:
4333
- addr_0 = addr + 1
4334
- else:
4335
- addr_0 = addr - 1
4306
+ if (nodecode or irsb.size == 0 or irsb.jumpkind == "Ijk_NoDecode") and switch_mode_on_nodecode:
4307
+ # maybe the current mode is wrong?
4308
+ nodecode = False
4309
+ addr_0 = addr + 1 if addr % 2 == 0 else addr - 1
4336
4310
 
4337
- if addr_0 in self._nodes:
4338
- # it has been analyzed before
4339
- cfg_node = self._nodes[addr_0]
4340
- irsb = cfg_node.irsb
4341
- return addr_0, cfg_node.function_address, cfg_node, irsb
4311
+ if addr_0 in self._nodes:
4312
+ # it has been analyzed before
4313
+ cfg_node = self._nodes[addr_0]
4314
+ irsb = cfg_node.irsb
4315
+ return addr_0, cfg_node.function_address, cfg_node, irsb
4342
4316
 
4343
- try:
4344
- lifted_block = self._lift(
4345
- addr_0,
4346
- size=distance,
4347
- collect_data_refs=True,
4348
- strict_block_end=True,
4349
- load_from_ro_regions=True,
4350
- initial_regs=initial_regs,
4351
- )
4352
- irsb = lifted_block.vex_nostmt
4353
- irsb_string = lifted_block.bytes[: irsb.size]
4354
- except SimTranslationError:
4355
- nodecode = True
4317
+ try:
4318
+ lifted_block = self._lift(
4319
+ addr_0,
4320
+ size=distance,
4321
+ collect_data_refs=True,
4322
+ strict_block_end=True,
4323
+ load_from_ro_regions=True,
4324
+ initial_regs=initial_regs,
4325
+ )
4326
+ irsb = lifted_block.vex_nostmt
4327
+ irsb_string = lifted_block.bytes[: irsb.size]
4328
+ except SimTranslationError:
4329
+ nodecode = True
4356
4330
 
4357
- if not (nodecode or irsb.size == 0 or irsb.jumpkind == "Ijk_NoDecode"):
4358
- # it is decodeable
4359
- if current_function_addr == addr:
4360
- current_function_addr = addr_0
4361
- addr = addr_0
4331
+ if not (nodecode or irsb.size == 0 or irsb.jumpkind == "Ijk_NoDecode"):
4332
+ # it is decodeable
4333
+ if current_function_addr == addr:
4334
+ current_function_addr = addr_0
4335
+ addr = addr_0
4362
4336
 
4363
4337
  is_thumb = False
4364
4338
  if is_arm_arch(self.project.arch) and addr % 2 == 1:
@@ -4416,10 +4390,7 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
4416
4390
  return None, None, None, None
4417
4391
 
4418
4392
  # we still occupy that location since it cannot be decoded anyways
4419
- if irsb is None:
4420
- irsb_size = 0
4421
- else:
4422
- irsb_size = irsb.size
4393
+ irsb_size = 0 if irsb is None else irsb.size
4423
4394
 
4424
4395
  # the default case
4425
4396
  valid_ins = False
@@ -4544,7 +4515,7 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
4544
4515
  For MIPS32 simulates a new state where the global pointer is 0xffffffff
4545
4516
  from current address after three steps if the first successor does not
4546
4517
  adjust this value updates this function address (in function manager)
4547
- to use a conrete global pointer
4518
+ to use a concrete global pointer
4548
4519
 
4549
4520
  :param addr: irsb address
4550
4521
  :param cfg_node: The corresponding CFG node object.
@@ -4567,38 +4538,35 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
4567
4538
  # do a bunch of checks to avoid unnecessary simulation from happening
4568
4539
  self._arm_track_read_lr_from_stack(irsb, self.functions[func_addr])
4569
4540
 
4570
- if self._arch_options.pattern_match_ifuncs:
4571
- # e.g.
4572
- # memcpy_ifunc:
4573
- # tst.w r0, #0x1000
4574
- # movw r3, #0xe80
4575
- # movt r3, #0x10 -> 0x100e80
4576
- # movw r0, #0x1380
4577
- # movt r0, #0x10 -> 0x101380
4578
- # it ne
4579
- # movne r0, r3
4580
- # bx lr
4581
-
4582
- if (
4583
- addr % 2 == 1
4584
- and len(cfg_node.byte_string) == 26
4585
- and irsb.instructions == 8
4586
- and irsb.jumpkind == "Ijk_Ret"
4587
- ):
4588
- block = self.project.factory.block(addr, opt_level=1, cross_insn_opt=True, collect_data_refs=True)
4589
- insn_mnemonics = [insn.mnemonic for insn in block.capstone.insns]
4590
- if insn_mnemonics == ["tst.w", "movw", "movt", "movw", "movt", "it", "movne", "bx"]:
4591
- # extract data refs with vex-optimization enabled
4592
- added_addrs = set()
4593
- for ref in block.vex_nostmt.data_refs:
4594
- if ref.data_addr not in added_addrs:
4595
- sec = self.project.loader.find_section_containing(ref.data_addr)
4596
- if sec is not None and sec.is_executable:
4597
- job = CFGJob(
4598
- ref.data_addr, ref.data_addr, "Ijk_Call", job_type=CFGJobType.IFUNC_HINTS
4599
- )
4600
- self._insert_job(job)
4601
- added_addrs.add(ref.data_addr)
4541
+ # e.g.
4542
+ # memcpy_ifunc:
4543
+ # tst.w r0, #0x1000
4544
+ # movw r3, #0xe80
4545
+ # movt r3, #0x10 -> 0x100e80
4546
+ # movw r0, #0x1380
4547
+ # movt r0, #0x10 -> 0x101380
4548
+ # it ne
4549
+ # movne r0, r3
4550
+ # bx lr
4551
+ if (
4552
+ self._arch_options.pattern_match_ifuncs
4553
+ and addr % 2 == 1
4554
+ and len(cfg_node.byte_string) == 26
4555
+ and irsb.instructions == 8
4556
+ and irsb.jumpkind == "Ijk_Ret"
4557
+ ):
4558
+ block = self.project.factory.block(addr, opt_level=1, cross_insn_opt=True, collect_data_refs=True)
4559
+ insn_mnemonics = [insn.mnemonic for insn in block.capstone.insns]
4560
+ if insn_mnemonics == ["tst.w", "movw", "movt", "movw", "movt", "it", "movne", "bx"]:
4561
+ # extract data refs with vex-optimization enabled
4562
+ added_addrs = set()
4563
+ for ref in block.vex_nostmt.data_refs:
4564
+ if ref.data_addr not in added_addrs:
4565
+ sec = self.project.loader.find_section_containing(ref.data_addr)
4566
+ if sec is not None and sec.is_executable:
4567
+ job = CFGJob(ref.data_addr, ref.data_addr, "Ijk_Call", job_type=CFGJobType.IFUNC_HINTS)
4568
+ self._insert_job(job)
4569
+ added_addrs.add(ref.data_addr)
4602
4570
 
4603
4571
  # detect if there are instructions that set r4 as a constant value
4604
4572
  if (addr & 1) == 0 and addr == func_addr and irsb.size > 0:
@@ -4694,13 +4662,12 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
4694
4662
  and len(insn.operands) == 2
4695
4663
  and insn.operands[0].type == capstone.x86.X86_OP_REG
4696
4664
  and insn.operands[1].type == capstone.x86.X86_OP_MEM
4665
+ ) and (
4666
+ insn.operands[0].reg == capstone.x86.X86_REG_RBP
4667
+ and insn.operands[1].mem.base == capstone.x86.X86_REG_RSP
4697
4668
  ):
4698
- if (
4699
- insn.operands[0].reg == capstone.x86.X86_REG_RBP
4700
- and insn.operands[1].mem.base == capstone.x86.X86_REG_RSP
4701
- ):
4702
- rbp_as_gpr = False
4703
- break
4669
+ rbp_as_gpr = False
4670
+ break
4704
4671
  func = self.kb.functions.get_by_addr(func_addr)
4705
4672
  func.info["bp_as_gpr"] = rbp_as_gpr
4706
4673
 
@@ -4763,16 +4730,14 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
4763
4730
  Statement 5 should not introduce a new exit in the CFG.
4764
4731
  """
4765
4732
 
4766
- if (
4733
+ return bool(
4767
4734
  not self.project.arch.branch_delay_slot
4768
4735
  and irsb.instruction_addresses
4769
4736
  and branch_ins_addr != irsb.instruction_addresses[-1]
4770
4737
  and isinstance(exit_stmt.dst, pyvex.const.IRConst)
4771
4738
  and exit_stmt.dst.value == branch_ins_addr
4772
4739
  and exit_stmt.jumpkind == "Ijk_Boring"
4773
- ):
4774
- return True
4775
- return False
4740
+ )
4776
4741
 
4777
4742
  def _remove_jobs_by_source_node_addr(self, addr: int):
4778
4743
  self._remove_job(lambda j: j.src_node is not None and j.src_node.addr == addr)
@@ -4981,25 +4946,23 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
4981
4946
  edges = list(callee_func.transition_graph.edges())
4982
4947
  if len(edges) == 1:
4983
4948
  target_func = edges[0][1]
4984
- if isinstance(target_func, (HookNode, Function)):
4985
- if self.project.is_hooked(target_func.addr):
4986
- hooker = self.project.hooked_by(target_func.addr)
4987
- if hooker.DYNAMIC_RET:
4988
- return self._is_call_returning(callsite_cfgnode, target_func.addr)
4949
+ if isinstance(target_func, (HookNode, Function)) and self.project.is_hooked(target_func.addr):
4950
+ hooker = self.project.hooked_by(target_func.addr)
4951
+ if hooker.DYNAMIC_RET:
4952
+ return self._is_call_returning(callsite_cfgnode, target_func.addr)
4989
4953
 
4990
4954
  if self.project.is_hooked(callee_func_addr):
4991
4955
  hooker = self.project.hooked_by(callee_func_addr)
4992
- if hooker is not None:
4993
- if hooker.DYNAMIC_RET:
4994
- parent_nodes = list(self.graph.predecessors(callsite_cfgnode))
4995
- parent_node = parent_nodes[0] if parent_nodes else None
4996
- blocks_ahead = []
4997
- if parent_node is not None:
4998
- blocks_ahead.append(self._lift(parent_node.addr).vex)
4999
- blocks_ahead.append(self._lift(callsite_cfgnode.addr).vex)
5000
- hooker.project = self.project
5001
- hooker.arch = self.project.arch
5002
- return hooker.dynamic_returns(blocks_ahead)
4956
+ if hooker is not None and hooker.DYNAMIC_RET:
4957
+ parent_nodes = list(self.graph.predecessors(callsite_cfgnode))
4958
+ parent_node = parent_nodes[0] if parent_nodes else None
4959
+ blocks_ahead = []
4960
+ if parent_node is not None:
4961
+ blocks_ahead.append(self._lift(parent_node.addr).vex)
4962
+ blocks_ahead.append(self._lift(callsite_cfgnode.addr).vex)
4963
+ hooker.project = self.project
4964
+ hooker.arch = self.project.arch
4965
+ return hooker.dynamic_returns(blocks_ahead)
5003
4966
 
5004
4967
  if callee_func is not None:
5005
4968
  return callee_func.returning
@@ -5007,8 +4970,7 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
5007
4970
 
5008
4971
  def _lift(self, addr, *args, opt_level=1, cross_insn_opt=False, **kwargs): # pylint:disable=arguments-differ
5009
4972
  kwargs["extra_stop_points"] = set(self._known_thunks)
5010
- b = super()._lift(addr, *args, opt_level=opt_level, cross_insn_opt=cross_insn_opt, **kwargs)
5011
- return b
4973
+ return super()._lift(addr, *args, opt_level=opt_level, cross_insn_opt=cross_insn_opt, **kwargs)
5012
4974
 
5013
4975
  #
5014
4976
  # Public methods
@@ -5031,9 +4993,7 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
5031
4993
  return n
5032
4994
 
5033
4995
  def output(self):
5034
- s = "%s" % self._graph.edges(data=True)
5035
-
5036
- return s
4996
+ return f"{self._graph.edges(data=True)}"
5037
4997
 
5038
4998
  @deprecated(replacement="angr.analyses.CFB")
5039
4999
  def generate_code_cover(self):
@@ -5046,8 +5006,7 @@ class CFGFast(ForwardAnalysis[CFGNode, CFGNode, CFGJob, int], CFGBase): # pylin
5046
5006
  size = cfg_node.size
5047
5007
  lst.append((cfg_node.addr, size))
5048
5008
 
5049
- lst = sorted(lst, key=lambda x: x[0])
5050
- return lst
5009
+ return sorted(lst, key=lambda x: x[0])
5051
5010
 
5052
5011
 
5053
5012
  AnalysesHub.register_default("CFGFast", CFGFast)