angr 9.2.103__py3-none-macosx_11_0_arm64.whl

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

Potentially problematic release.


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

Files changed (1300) hide show
  1. angr/__init__.py +153 -0
  2. angr/__main__.py +59 -0
  3. angr/analyses/__init__.py +46 -0
  4. angr/analyses/analysis.py +359 -0
  5. angr/analyses/backward_slice.py +691 -0
  6. angr/analyses/binary_optimizer.py +683 -0
  7. angr/analyses/bindiff.py +1251 -0
  8. angr/analyses/boyscout.py +77 -0
  9. angr/analyses/callee_cleanup_finder.py +75 -0
  10. angr/analyses/calling_convention.py +956 -0
  11. angr/analyses/cdg.py +197 -0
  12. angr/analyses/cfg/__init__.py +11 -0
  13. angr/analyses/cfg/cfb.py +436 -0
  14. angr/analyses/cfg/cfg.py +73 -0
  15. angr/analyses/cfg/cfg_arch_options.py +82 -0
  16. angr/analyses/cfg/cfg_base.py +2917 -0
  17. angr/analyses/cfg/cfg_emulated.py +3570 -0
  18. angr/analyses/cfg/cfg_fast.py +5053 -0
  19. angr/analyses/cfg/cfg_fast_soot.py +669 -0
  20. angr/analyses/cfg/cfg_job_base.py +204 -0
  21. angr/analyses/cfg/indirect_jump_resolvers/__init__.py +8 -0
  22. angr/analyses/cfg/indirect_jump_resolvers/amd64_elf_got.py +63 -0
  23. angr/analyses/cfg/indirect_jump_resolvers/amd64_pe_iat.py +52 -0
  24. angr/analyses/cfg/indirect_jump_resolvers/arm_elf_fast.py +151 -0
  25. angr/analyses/cfg/indirect_jump_resolvers/const_resolver.py +141 -0
  26. angr/analyses/cfg/indirect_jump_resolvers/default_resolvers.py +68 -0
  27. angr/analyses/cfg/indirect_jump_resolvers/jumptable.py +2368 -0
  28. angr/analyses/cfg/indirect_jump_resolvers/mips_elf_fast.py +517 -0
  29. angr/analyses/cfg/indirect_jump_resolvers/propagator_utils.py +26 -0
  30. angr/analyses/cfg/indirect_jump_resolvers/resolver.py +74 -0
  31. angr/analyses/cfg/indirect_jump_resolvers/x86_elf_pic_plt.py +93 -0
  32. angr/analyses/cfg/indirect_jump_resolvers/x86_pe_iat.py +51 -0
  33. angr/analyses/cfg_slice_to_sink/__init__.py +2 -0
  34. angr/analyses/cfg_slice_to_sink/cfg_slice_to_sink.py +117 -0
  35. angr/analyses/cfg_slice_to_sink/graph.py +84 -0
  36. angr/analyses/cfg_slice_to_sink/transitions.py +25 -0
  37. angr/analyses/class_identifier.py +62 -0
  38. angr/analyses/code_tagging.py +123 -0
  39. angr/analyses/complete_calling_conventions.py +424 -0
  40. angr/analyses/congruency_check.py +384 -0
  41. angr/analyses/data_dep/__init__.py +2 -0
  42. angr/analyses/data_dep/data_dependency_analysis.py +605 -0
  43. angr/analyses/data_dep/dep_nodes.py +170 -0
  44. angr/analyses/data_dep/sim_act_location.py +46 -0
  45. angr/analyses/datagraph_meta.py +105 -0
  46. angr/analyses/ddg.py +1695 -0
  47. angr/analyses/decompiler/__init__.py +13 -0
  48. angr/analyses/decompiler/ail_simplifier.py +1408 -0
  49. angr/analyses/decompiler/ailgraph_walker.py +48 -0
  50. angr/analyses/decompiler/block_io_finder.py +293 -0
  51. angr/analyses/decompiler/block_similarity.py +188 -0
  52. angr/analyses/decompiler/block_simplifier.py +434 -0
  53. angr/analyses/decompiler/call_counter.py +43 -0
  54. angr/analyses/decompiler/callsite_maker.py +403 -0
  55. angr/analyses/decompiler/ccall_rewriters/__init__.py +6 -0
  56. angr/analyses/decompiler/ccall_rewriters/amd64_ccalls.py +489 -0
  57. angr/analyses/decompiler/ccall_rewriters/rewriter_base.py +19 -0
  58. angr/analyses/decompiler/clinic.py +2166 -0
  59. angr/analyses/decompiler/condition_processor.py +1184 -0
  60. angr/analyses/decompiler/decompilation_cache.py +38 -0
  61. angr/analyses/decompiler/decompilation_options.py +274 -0
  62. angr/analyses/decompiler/decompiler.py +544 -0
  63. angr/analyses/decompiler/empty_node_remover.py +211 -0
  64. angr/analyses/decompiler/expression_counters.py +76 -0
  65. angr/analyses/decompiler/expression_narrower.py +92 -0
  66. angr/analyses/decompiler/goto_manager.py +73 -0
  67. angr/analyses/decompiler/graph_region.py +413 -0
  68. angr/analyses/decompiler/jump_target_collector.py +36 -0
  69. angr/analyses/decompiler/jumptable_entry_condition_rewriter.py +66 -0
  70. angr/analyses/decompiler/optimization_passes/__init__.py +108 -0
  71. angr/analyses/decompiler/optimization_passes/base_ptr_save_simplifier.py +144 -0
  72. angr/analyses/decompiler/optimization_passes/code_motion.py +360 -0
  73. angr/analyses/decompiler/optimization_passes/const_derefs.py +265 -0
  74. angr/analyses/decompiler/optimization_passes/cross_jump_reverter.py +108 -0
  75. angr/analyses/decompiler/optimization_passes/deadblock_remover.py +73 -0
  76. angr/analyses/decompiler/optimization_passes/div_simplifier.py +391 -0
  77. angr/analyses/decompiler/optimization_passes/engine_base.py +303 -0
  78. angr/analyses/decompiler/optimization_passes/expr_op_swapper.py +136 -0
  79. angr/analyses/decompiler/optimization_passes/flip_boolean_cmp.py +91 -0
  80. angr/analyses/decompiler/optimization_passes/inlined_string_transformation_simplifier.py +386 -0
  81. angr/analyses/decompiler/optimization_passes/ite_expr_converter.py +226 -0
  82. angr/analyses/decompiler/optimization_passes/ite_region_converter.py +189 -0
  83. angr/analyses/decompiler/optimization_passes/lowered_switch_simplifier.py +757 -0
  84. angr/analyses/decompiler/optimization_passes/mod_simplifier.py +86 -0
  85. angr/analyses/decompiler/optimization_passes/multi_simplifier.py +227 -0
  86. angr/analyses/decompiler/optimization_passes/optimization_pass.py +397 -0
  87. angr/analyses/decompiler/optimization_passes/register_save_area_simplifier.py +198 -0
  88. angr/analyses/decompiler/optimization_passes/ret_addr_save_simplifier.py +172 -0
  89. angr/analyses/decompiler/optimization_passes/ret_deduplicator.py +219 -0
  90. angr/analyses/decompiler/optimization_passes/return_duplicator_base.py +448 -0
  91. angr/analyses/decompiler/optimization_passes/return_duplicator_high.py +57 -0
  92. angr/analyses/decompiler/optimization_passes/return_duplicator_low.py +121 -0
  93. angr/analyses/decompiler/optimization_passes/spilled_register_finder.py +18 -0
  94. angr/analyses/decompiler/optimization_passes/stack_canary_simplifier.py +293 -0
  95. angr/analyses/decompiler/optimization_passes/switch_default_case_duplicator.py +110 -0
  96. angr/analyses/decompiler/optimization_passes/win_stack_canary_simplifier.py +281 -0
  97. angr/analyses/decompiler/optimization_passes/x86_gcc_getpc_simplifier.py +87 -0
  98. angr/analyses/decompiler/peephole_optimizations/__init__.py +69 -0
  99. angr/analyses/decompiler/peephole_optimizations/a_div_const_add_a_mul_n_div_const.py +38 -0
  100. angr/analyses/decompiler/peephole_optimizations/a_mul_const_div_shr_const.py +38 -0
  101. angr/analyses/decompiler/peephole_optimizations/a_shl_const_sub_a.py +31 -0
  102. angr/analyses/decompiler/peephole_optimizations/a_sub_a_div.py +25 -0
  103. angr/analyses/decompiler/peephole_optimizations/a_sub_a_div_const_mul_const.py +56 -0
  104. angr/analyses/decompiler/peephole_optimizations/a_sub_a_sub_n.py +19 -0
  105. angr/analyses/decompiler/peephole_optimizations/arm_cmpf.py +235 -0
  106. angr/analyses/decompiler/peephole_optimizations/base.py +120 -0
  107. angr/analyses/decompiler/peephole_optimizations/basepointeroffset_add_n.py +33 -0
  108. angr/analyses/decompiler/peephole_optimizations/basepointeroffset_and_mask.py +35 -0
  109. angr/analyses/decompiler/peephole_optimizations/bitwise_or_to_logical_or.py +34 -0
  110. angr/analyses/decompiler/peephole_optimizations/bool_expr_xor_1.py +27 -0
  111. angr/analyses/decompiler/peephole_optimizations/bswap.py +131 -0
  112. angr/analyses/decompiler/peephole_optimizations/cmpord_rewriter.py +72 -0
  113. angr/analyses/decompiler/peephole_optimizations/coalesce_same_cascading_ifs.py +27 -0
  114. angr/analyses/decompiler/peephole_optimizations/const_mull_a_shift.py +91 -0
  115. angr/analyses/decompiler/peephole_optimizations/constant_derefs.py +43 -0
  116. angr/analyses/decompiler/peephole_optimizations/conv_a_sub0_shr_and.py +70 -0
  117. angr/analyses/decompiler/peephole_optimizations/conv_shl_shr.py +51 -0
  118. angr/analyses/decompiler/peephole_optimizations/eager_eval.py +225 -0
  119. angr/analyses/decompiler/peephole_optimizations/extended_byte_and_mask.py +55 -0
  120. angr/analyses/decompiler/peephole_optimizations/inlined_strcpy.py +146 -0
  121. angr/analyses/decompiler/peephole_optimizations/inlined_strcpy_consolidation.py +102 -0
  122. angr/analyses/decompiler/peephole_optimizations/inlined_wstrcpy.py +159 -0
  123. angr/analyses/decompiler/peephole_optimizations/invert_negated_logical_conjuction_disjunction.py +50 -0
  124. angr/analyses/decompiler/peephole_optimizations/one_sub_bool.py +33 -0
  125. angr/analyses/decompiler/peephole_optimizations/remove_cascading_conversions.py +19 -0
  126. angr/analyses/decompiler/peephole_optimizations/remove_empty_if_body.py +45 -0
  127. angr/analyses/decompiler/peephole_optimizations/remove_noop_conversions.py +26 -0
  128. angr/analyses/decompiler/peephole_optimizations/remove_redundant_bitmasks.py +48 -0
  129. angr/analyses/decompiler/peephole_optimizations/remove_redundant_conversions.py +160 -0
  130. angr/analyses/decompiler/peephole_optimizations/remove_redundant_ite_branch.py +29 -0
  131. angr/analyses/decompiler/peephole_optimizations/remove_redundant_ite_comparisons.py +54 -0
  132. angr/analyses/decompiler/peephole_optimizations/remove_redundant_nots.py +17 -0
  133. angr/analyses/decompiler/peephole_optimizations/remove_redundant_reinterprets.py +43 -0
  134. angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts.py +44 -0
  135. angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts_around_comparators.py +40 -0
  136. angr/analyses/decompiler/peephole_optimizations/rewrite_bit_extractions.py +85 -0
  137. angr/analyses/decompiler/peephole_optimizations/rewrite_mips_gp_loads.py +47 -0
  138. angr/analyses/decompiler/peephole_optimizations/rol_ror.py +77 -0
  139. angr/analyses/decompiler/peephole_optimizations/sar_to_signed_div.py +105 -0
  140. angr/analyses/decompiler/peephole_optimizations/simplify_pc_relative_loads.py +37 -0
  141. angr/analyses/decompiler/peephole_optimizations/single_bit_cond_to_boolexpr.py +52 -0
  142. angr/analyses/decompiler/peephole_optimizations/single_bit_xor.py +26 -0
  143. angr/analyses/decompiler/peephole_optimizations/tidy_stack_addr.py +133 -0
  144. angr/analyses/decompiler/redundant_label_remover.py +116 -0
  145. angr/analyses/decompiler/region_identifier.py +1098 -0
  146. angr/analyses/decompiler/region_simplifiers/__init__.py +1 -0
  147. angr/analyses/decompiler/region_simplifiers/cascading_cond_transformer.py +93 -0
  148. angr/analyses/decompiler/region_simplifiers/cascading_ifs.py +81 -0
  149. angr/analyses/decompiler/region_simplifiers/expr_folding.py +606 -0
  150. angr/analyses/decompiler/region_simplifiers/goto.py +177 -0
  151. angr/analyses/decompiler/region_simplifiers/if_.py +142 -0
  152. angr/analyses/decompiler/region_simplifiers/ifelse.py +90 -0
  153. angr/analyses/decompiler/region_simplifiers/loop.py +135 -0
  154. angr/analyses/decompiler/region_simplifiers/node_address_finder.py +23 -0
  155. angr/analyses/decompiler/region_simplifiers/region_simplifier.py +211 -0
  156. angr/analyses/decompiler/region_simplifiers/switch_cluster_simplifier.py +644 -0
  157. angr/analyses/decompiler/region_simplifiers/switch_expr_simplifier.py +83 -0
  158. angr/analyses/decompiler/region_walker.py +23 -0
  159. angr/analyses/decompiler/return_maker.py +70 -0
  160. angr/analyses/decompiler/seq_to_blocks.py +19 -0
  161. angr/analyses/decompiler/sequence_walker.py +235 -0
  162. angr/analyses/decompiler/structured_codegen/__init__.py +10 -0
  163. angr/analyses/decompiler/structured_codegen/base.py +132 -0
  164. angr/analyses/decompiler/structured_codegen/c.py +3811 -0
  165. angr/analyses/decompiler/structured_codegen/dummy.py +14 -0
  166. angr/analyses/decompiler/structured_codegen/dwarf_import.py +186 -0
  167. angr/analyses/decompiler/structuring/__init__.py +15 -0
  168. angr/analyses/decompiler/structuring/dream.py +1225 -0
  169. angr/analyses/decompiler/structuring/phoenix.py +2546 -0
  170. angr/analyses/decompiler/structuring/recursive_structurer.py +186 -0
  171. angr/analyses/decompiler/structuring/structurer_base.py +954 -0
  172. angr/analyses/decompiler/structuring/structurer_nodes.py +414 -0
  173. angr/analyses/decompiler/utils.py +787 -0
  174. angr/analyses/disassembly.py +1302 -0
  175. angr/analyses/disassembly_utils.py +104 -0
  176. angr/analyses/dominance_frontier.py +39 -0
  177. angr/analyses/find_objects_static.py +203 -0
  178. angr/analyses/flirt.py +185 -0
  179. angr/analyses/forward_analysis/__init__.py +2 -0
  180. angr/analyses/forward_analysis/forward_analysis.py +527 -0
  181. angr/analyses/forward_analysis/job_info.py +64 -0
  182. angr/analyses/forward_analysis/visitors/__init__.py +4 -0
  183. angr/analyses/forward_analysis/visitors/call_graph.py +28 -0
  184. angr/analyses/forward_analysis/visitors/function_graph.py +85 -0
  185. angr/analyses/forward_analysis/visitors/graph.py +250 -0
  186. angr/analyses/forward_analysis/visitors/loop.py +28 -0
  187. angr/analyses/forward_analysis/visitors/single_node_graph.py +38 -0
  188. angr/analyses/identifier/__init__.py +1 -0
  189. angr/analyses/identifier/custom_callable.py +138 -0
  190. angr/analyses/identifier/errors.py +9 -0
  191. angr/analyses/identifier/func.py +57 -0
  192. angr/analyses/identifier/functions/__init__.py +36 -0
  193. angr/analyses/identifier/functions/atoi.py +75 -0
  194. angr/analyses/identifier/functions/based_atoi.py +128 -0
  195. angr/analyses/identifier/functions/fdprintf.py +122 -0
  196. angr/analyses/identifier/functions/free.py +64 -0
  197. angr/analyses/identifier/functions/int2str.py +302 -0
  198. angr/analyses/identifier/functions/malloc.py +113 -0
  199. angr/analyses/identifier/functions/memcmp.py +69 -0
  200. angr/analyses/identifier/functions/memcpy.py +89 -0
  201. angr/analyses/identifier/functions/memset.py +43 -0
  202. angr/analyses/identifier/functions/printf.py +122 -0
  203. angr/analyses/identifier/functions/recv_until.py +315 -0
  204. angr/analyses/identifier/functions/skip_calloc.py +72 -0
  205. angr/analyses/identifier/functions/skip_realloc.py +99 -0
  206. angr/analyses/identifier/functions/skip_recv_n.py +107 -0
  207. angr/analyses/identifier/functions/snprintf.py +114 -0
  208. angr/analyses/identifier/functions/sprintf.py +115 -0
  209. angr/analyses/identifier/functions/strcasecmp.py +32 -0
  210. angr/analyses/identifier/functions/strcmp.py +112 -0
  211. angr/analyses/identifier/functions/strcpy.py +43 -0
  212. angr/analyses/identifier/functions/strlen.py +26 -0
  213. angr/analyses/identifier/functions/strncmp.py +103 -0
  214. angr/analyses/identifier/functions/strncpy.py +65 -0
  215. angr/analyses/identifier/functions/strtol.py +91 -0
  216. angr/analyses/identifier/identify.py +848 -0
  217. angr/analyses/identifier/runner.py +359 -0
  218. angr/analyses/init_finder.py +264 -0
  219. angr/analyses/loop_analysis.py +353 -0
  220. angr/analyses/loopfinder.py +174 -0
  221. angr/analyses/propagator/__init__.py +1 -0
  222. angr/analyses/propagator/engine_ail.py +1560 -0
  223. angr/analyses/propagator/engine_base.py +53 -0
  224. angr/analyses/propagator/engine_vex.py +328 -0
  225. angr/analyses/propagator/outdated_definition_walker.py +158 -0
  226. angr/analyses/propagator/propagator.py +422 -0
  227. angr/analyses/propagator/tmpvar_finder.py +17 -0
  228. angr/analyses/propagator/top_checker_mixin.py +14 -0
  229. angr/analyses/propagator/values.py +116 -0
  230. angr/analyses/propagator/vex_vars.py +67 -0
  231. angr/analyses/proximity_graph.py +452 -0
  232. angr/analyses/reaching_definitions/__init__.py +65 -0
  233. angr/analyses/reaching_definitions/call_trace.py +72 -0
  234. angr/analyses/reaching_definitions/dep_graph.py +392 -0
  235. angr/analyses/reaching_definitions/engine_ail.py +1172 -0
  236. angr/analyses/reaching_definitions/engine_vex.py +1102 -0
  237. angr/analyses/reaching_definitions/external_codeloc.py +0 -0
  238. angr/analyses/reaching_definitions/function_handler.py +603 -0
  239. angr/analyses/reaching_definitions/heap_allocator.py +69 -0
  240. angr/analyses/reaching_definitions/rd_initializer.py +235 -0
  241. angr/analyses/reaching_definitions/rd_state.py +613 -0
  242. angr/analyses/reaching_definitions/reaching_definitions.py +594 -0
  243. angr/analyses/reaching_definitions/subject.py +64 -0
  244. angr/analyses/reassembler.py +2970 -0
  245. angr/analyses/soot_class_hierarchy.py +283 -0
  246. angr/analyses/stack_pointer_tracker.py +832 -0
  247. angr/analyses/static_hooker.py +51 -0
  248. angr/analyses/typehoon/__init__.py +1 -0
  249. angr/analyses/typehoon/dfa.py +108 -0
  250. angr/analyses/typehoon/lifter.py +91 -0
  251. angr/analyses/typehoon/simple_solver.py +1258 -0
  252. angr/analyses/typehoon/translator.py +242 -0
  253. angr/analyses/typehoon/typeconsts.py +294 -0
  254. angr/analyses/typehoon/typehoon.py +239 -0
  255. angr/analyses/typehoon/typevars.py +565 -0
  256. angr/analyses/typehoon/variance.py +10 -0
  257. angr/analyses/variable_recovery/__init__.py +2 -0
  258. angr/analyses/variable_recovery/annotations.py +57 -0
  259. angr/analyses/variable_recovery/engine_ail.py +746 -0
  260. angr/analyses/variable_recovery/engine_base.py +962 -0
  261. angr/analyses/variable_recovery/engine_vex.py +580 -0
  262. angr/analyses/variable_recovery/irsb_scanner.py +131 -0
  263. angr/analyses/variable_recovery/variable_recovery.py +552 -0
  264. angr/analyses/variable_recovery/variable_recovery_base.py +452 -0
  265. angr/analyses/variable_recovery/variable_recovery_fast.py +589 -0
  266. angr/analyses/veritesting.py +635 -0
  267. angr/analyses/vfg.py +1945 -0
  268. angr/analyses/vsa_ddg.py +423 -0
  269. angr/analyses/vtable.py +92 -0
  270. angr/analyses/xrefs.py +263 -0
  271. angr/angrdb/__init__.py +9 -0
  272. angr/angrdb/db.py +208 -0
  273. angr/angrdb/models.py +183 -0
  274. angr/angrdb/serializers/__init__.py +2 -0
  275. angr/angrdb/serializers/cfg_model.py +41 -0
  276. angr/angrdb/serializers/comments.py +59 -0
  277. angr/angrdb/serializers/funcs.py +60 -0
  278. angr/angrdb/serializers/kb.py +110 -0
  279. angr/angrdb/serializers/labels.py +58 -0
  280. angr/angrdb/serializers/loader.py +81 -0
  281. angr/angrdb/serializers/structured_code.py +128 -0
  282. angr/angrdb/serializers/variables.py +58 -0
  283. angr/angrdb/serializers/xrefs.py +48 -0
  284. angr/annocfg.py +320 -0
  285. angr/blade.py +430 -0
  286. angr/block.py +506 -0
  287. angr/callable.py +162 -0
  288. angr/calling_conventions.py +2383 -0
  289. angr/code_location.py +168 -0
  290. angr/codenode.py +140 -0
  291. angr/concretization_strategies/__init__.py +97 -0
  292. angr/concretization_strategies/any.py +15 -0
  293. angr/concretization_strategies/any_named.py +32 -0
  294. angr/concretization_strategies/controlled_data.py +54 -0
  295. angr/concretization_strategies/eval.py +18 -0
  296. angr/concretization_strategies/logging.py +32 -0
  297. angr/concretization_strategies/max.py +24 -0
  298. angr/concretization_strategies/nonzero.py +14 -0
  299. angr/concretization_strategies/nonzero_range.py +20 -0
  300. angr/concretization_strategies/norepeats.py +35 -0
  301. angr/concretization_strategies/norepeats_range.py +35 -0
  302. angr/concretization_strategies/range.py +17 -0
  303. angr/concretization_strategies/signed_add.py +24 -0
  304. angr/concretization_strategies/single.py +12 -0
  305. angr/concretization_strategies/solutions.py +18 -0
  306. angr/concretization_strategies/unlimited_range.py +15 -0
  307. angr/distributed/__init__.py +3 -0
  308. angr/distributed/server.py +198 -0
  309. angr/distributed/worker.py +183 -0
  310. angr/engines/__init__.py +41 -0
  311. angr/engines/concrete.py +178 -0
  312. angr/engines/engine.py +212 -0
  313. angr/engines/failure.py +27 -0
  314. angr/engines/hook.py +67 -0
  315. angr/engines/light/__init__.py +2 -0
  316. angr/engines/light/data.py +715 -0
  317. angr/engines/light/engine.py +1441 -0
  318. angr/engines/pcode/__init__.py +2 -0
  319. angr/engines/pcode/behavior.py +995 -0
  320. angr/engines/pcode/cc.py +123 -0
  321. angr/engines/pcode/emulate.py +446 -0
  322. angr/engines/pcode/engine.py +256 -0
  323. angr/engines/pcode/lifter.py +1423 -0
  324. angr/engines/procedure.py +71 -0
  325. angr/engines/soot/__init__.py +1 -0
  326. angr/engines/soot/engine.py +415 -0
  327. angr/engines/soot/exceptions.py +14 -0
  328. angr/engines/soot/expressions/__init__.py +56 -0
  329. angr/engines/soot/expressions/arrayref.py +21 -0
  330. angr/engines/soot/expressions/base.py +22 -0
  331. angr/engines/soot/expressions/binop.py +27 -0
  332. angr/engines/soot/expressions/cast.py +21 -0
  333. angr/engines/soot/expressions/condition.py +34 -0
  334. angr/engines/soot/expressions/constants.py +45 -0
  335. angr/engines/soot/expressions/instanceOf.py +11 -0
  336. angr/engines/soot/expressions/instancefieldref.py +7 -0
  337. angr/engines/soot/expressions/invoke.py +117 -0
  338. angr/engines/soot/expressions/length.py +7 -0
  339. angr/engines/soot/expressions/local.py +7 -0
  340. angr/engines/soot/expressions/new.py +15 -0
  341. angr/engines/soot/expressions/newArray.py +51 -0
  342. angr/engines/soot/expressions/newMultiArray.py +84 -0
  343. angr/engines/soot/expressions/paramref.py +7 -0
  344. angr/engines/soot/expressions/phi.py +29 -0
  345. angr/engines/soot/expressions/staticfieldref.py +7 -0
  346. angr/engines/soot/expressions/thisref.py +6 -0
  347. angr/engines/soot/expressions/unsupported.py +6 -0
  348. angr/engines/soot/field_dispatcher.py +49 -0
  349. angr/engines/soot/method_dispatcher.py +49 -0
  350. angr/engines/soot/statements/__init__.py +30 -0
  351. angr/engines/soot/statements/assign.py +29 -0
  352. angr/engines/soot/statements/base.py +80 -0
  353. angr/engines/soot/statements/goto.py +11 -0
  354. angr/engines/soot/statements/identity.py +14 -0
  355. angr/engines/soot/statements/if_.py +16 -0
  356. angr/engines/soot/statements/invoke.py +11 -0
  357. angr/engines/soot/statements/return_.py +19 -0
  358. angr/engines/soot/statements/switch.py +38 -0
  359. angr/engines/soot/statements/throw.py +12 -0
  360. angr/engines/soot/values/__init__.py +24 -0
  361. angr/engines/soot/values/arrayref.py +124 -0
  362. angr/engines/soot/values/base.py +4 -0
  363. angr/engines/soot/values/constants.py +17 -0
  364. angr/engines/soot/values/instancefieldref.py +42 -0
  365. angr/engines/soot/values/local.py +17 -0
  366. angr/engines/soot/values/paramref.py +17 -0
  367. angr/engines/soot/values/staticfieldref.py +37 -0
  368. angr/engines/soot/values/strref.py +37 -0
  369. angr/engines/soot/values/thisref.py +148 -0
  370. angr/engines/successors.py +540 -0
  371. angr/engines/syscall.py +53 -0
  372. angr/engines/unicorn.py +483 -0
  373. angr/engines/vex/__init__.py +4 -0
  374. angr/engines/vex/claripy/__init__.py +1 -0
  375. angr/engines/vex/claripy/ccall.py +2097 -0
  376. angr/engines/vex/claripy/datalayer.py +149 -0
  377. angr/engines/vex/claripy/irop.py +1279 -0
  378. angr/engines/vex/heavy/__init__.py +5 -0
  379. angr/engines/vex/heavy/actions.py +237 -0
  380. angr/engines/vex/heavy/concretizers.py +394 -0
  381. angr/engines/vex/heavy/dirty.py +467 -0
  382. angr/engines/vex/heavy/heavy.py +379 -0
  383. angr/engines/vex/heavy/inspect.py +51 -0
  384. angr/engines/vex/heavy/resilience.py +85 -0
  385. angr/engines/vex/heavy/super_fastpath.py +34 -0
  386. angr/engines/vex/lifter.py +424 -0
  387. angr/engines/vex/light/__init__.py +3 -0
  388. angr/engines/vex/light/light.py +555 -0
  389. angr/engines/vex/light/resilience.py +73 -0
  390. angr/engines/vex/light/slicing.py +51 -0
  391. angr/errors.py +604 -0
  392. angr/exploration_techniques/__init__.py +176 -0
  393. angr/exploration_techniques/bucketizer.py +96 -0
  394. angr/exploration_techniques/common.py +56 -0
  395. angr/exploration_techniques/dfs.py +34 -0
  396. angr/exploration_techniques/director.py +523 -0
  397. angr/exploration_techniques/driller_core.py +102 -0
  398. angr/exploration_techniques/explorer.py +146 -0
  399. angr/exploration_techniques/lengthlimiter.py +20 -0
  400. angr/exploration_techniques/local_loop_seer.py +64 -0
  401. angr/exploration_techniques/loop_seer.py +239 -0
  402. angr/exploration_techniques/manual_mergepoint.py +80 -0
  403. angr/exploration_techniques/memory_watcher.py +40 -0
  404. angr/exploration_techniques/oppologist.py +93 -0
  405. angr/exploration_techniques/slicecutor.py +115 -0
  406. angr/exploration_techniques/spiller.py +282 -0
  407. angr/exploration_techniques/spiller_db.py +27 -0
  408. angr/exploration_techniques/stochastic.py +57 -0
  409. angr/exploration_techniques/suggestions.py +156 -0
  410. angr/exploration_techniques/symbion.py +78 -0
  411. angr/exploration_techniques/tech_builder.py +47 -0
  412. angr/exploration_techniques/threading.py +77 -0
  413. angr/exploration_techniques/timeout.py +31 -0
  414. angr/exploration_techniques/tracer.py +1101 -0
  415. angr/exploration_techniques/unique.py +104 -0
  416. angr/exploration_techniques/veritesting.py +36 -0
  417. angr/factory.py +385 -0
  418. angr/flirt/__init__.py +126 -0
  419. angr/flirt/build_sig.py +316 -0
  420. angr/graph_utils.py +0 -0
  421. angr/keyed_region.py +532 -0
  422. angr/knowledge_base/__init__.py +1 -0
  423. angr/knowledge_base/knowledge_base.py +145 -0
  424. angr/knowledge_plugins/__init__.py +18 -0
  425. angr/knowledge_plugins/callsite_prototypes.py +52 -0
  426. angr/knowledge_plugins/cfg/__init__.py +16 -0
  427. angr/knowledge_plugins/cfg/cfg_manager.py +94 -0
  428. angr/knowledge_plugins/cfg/cfg_model.py +1057 -0
  429. angr/knowledge_plugins/cfg/cfg_node.py +541 -0
  430. angr/knowledge_plugins/cfg/indirect_jump.py +67 -0
  431. angr/knowledge_plugins/cfg/memory_data.py +156 -0
  432. angr/knowledge_plugins/comments.py +15 -0
  433. angr/knowledge_plugins/custom_strings.py +37 -0
  434. angr/knowledge_plugins/data.py +21 -0
  435. angr/knowledge_plugins/debug_variables.py +221 -0
  436. angr/knowledge_plugins/functions/__init__.py +2 -0
  437. angr/knowledge_plugins/functions/function.py +1694 -0
  438. angr/knowledge_plugins/functions/function_manager.py +501 -0
  439. angr/knowledge_plugins/functions/function_parser.py +295 -0
  440. angr/knowledge_plugins/functions/soot_function.py +131 -0
  441. angr/knowledge_plugins/indirect_jumps.py +34 -0
  442. angr/knowledge_plugins/key_definitions/__init__.py +16 -0
  443. angr/knowledge_plugins/key_definitions/atoms.py +314 -0
  444. angr/knowledge_plugins/key_definitions/constants.py +23 -0
  445. angr/knowledge_plugins/key_definitions/definition.py +217 -0
  446. angr/knowledge_plugins/key_definitions/environment.py +92 -0
  447. angr/knowledge_plugins/key_definitions/heap_address.py +32 -0
  448. angr/knowledge_plugins/key_definitions/key_definition_manager.py +81 -0
  449. angr/knowledge_plugins/key_definitions/live_definitions.py +1074 -0
  450. angr/knowledge_plugins/key_definitions/liveness.py +170 -0
  451. angr/knowledge_plugins/key_definitions/rd_model.py +176 -0
  452. angr/knowledge_plugins/key_definitions/tag.py +77 -0
  453. angr/knowledge_plugins/key_definitions/undefined.py +67 -0
  454. angr/knowledge_plugins/key_definitions/unknown_size.py +83 -0
  455. angr/knowledge_plugins/key_definitions/uses.py +180 -0
  456. angr/knowledge_plugins/labels.py +109 -0
  457. angr/knowledge_plugins/patches.py +125 -0
  458. angr/knowledge_plugins/plugin.py +23 -0
  459. angr/knowledge_plugins/propagations/__init__.py +2 -0
  460. angr/knowledge_plugins/propagations/prop_value.py +193 -0
  461. angr/knowledge_plugins/propagations/propagation_manager.py +60 -0
  462. angr/knowledge_plugins/propagations/propagation_model.py +74 -0
  463. angr/knowledge_plugins/propagations/states.py +1064 -0
  464. angr/knowledge_plugins/structured_code/__init__.py +1 -0
  465. angr/knowledge_plugins/structured_code/manager.py +59 -0
  466. angr/knowledge_plugins/sync/__init__.py +1 -0
  467. angr/knowledge_plugins/sync/sync_controller.py +329 -0
  468. angr/knowledge_plugins/types.py +87 -0
  469. angr/knowledge_plugins/variables/__init__.py +1 -0
  470. angr/knowledge_plugins/variables/variable_access.py +114 -0
  471. angr/knowledge_plugins/variables/variable_manager.py +1191 -0
  472. angr/knowledge_plugins/xrefs/__init__.py +3 -0
  473. angr/knowledge_plugins/xrefs/xref.py +157 -0
  474. angr/knowledge_plugins/xrefs/xref_manager.py +122 -0
  475. angr/knowledge_plugins/xrefs/xref_types.py +13 -0
  476. angr/lib/angr_native.dylib +0 -0
  477. angr/misc/__init__.py +8 -0
  478. angr/misc/ansi.py +46 -0
  479. angr/misc/autoimport.py +89 -0
  480. angr/misc/bug_report.py +125 -0
  481. angr/misc/hookset.py +106 -0
  482. angr/misc/import_hooks.py +63 -0
  483. angr/misc/loggers.py +130 -0
  484. angr/misc/picklable_lock.py +45 -0
  485. angr/misc/plugins.py +291 -0
  486. angr/misc/range.py +21 -0
  487. angr/misc/testing.py +23 -0
  488. angr/misc/ux.py +31 -0
  489. angr/misc/weakpatch.py +58 -0
  490. angr/procedures/__init__.py +2 -0
  491. angr/procedures/advapi32/__init__.py +0 -0
  492. angr/procedures/cgc/__init__.py +3 -0
  493. angr/procedures/cgc/_terminate.py +10 -0
  494. angr/procedures/cgc/allocate.py +76 -0
  495. angr/procedures/cgc/deallocate.py +59 -0
  496. angr/procedures/cgc/fdwait.py +62 -0
  497. angr/procedures/cgc/random.py +60 -0
  498. angr/procedures/cgc/receive.py +91 -0
  499. angr/procedures/cgc/transmit.py +63 -0
  500. angr/procedures/definitions/__init__.py +784 -0
  501. angr/procedures/definitions/cgc.py +19 -0
  502. angr/procedures/definitions/glibc.py +8384 -0
  503. angr/procedures/definitions/gnulib.py +35 -0
  504. angr/procedures/definitions/libstdcpp.py +20 -0
  505. angr/procedures/definitions/linux_kernel.py +6167 -0
  506. angr/procedures/definitions/linux_loader.py +6 -0
  507. angr/procedures/definitions/msvcr.py +15 -0
  508. angr/procedures/definitions/parse_syscalls_from_local_system.py +49 -0
  509. angr/procedures/definitions/parse_win32json.py +2556 -0
  510. angr/procedures/definitions/types_win32.py +34481 -0
  511. angr/procedures/definitions/wdk_api-ms-win-dx-d3dkmt-l1-1-4.py +44 -0
  512. angr/procedures/definitions/wdk_api-ms-win-dx-d3dkmt-l1-1-6.py +40 -0
  513. angr/procedures/definitions/wdk_clfs.py +154 -0
  514. angr/procedures/definitions/wdk_fltmgr.py +570 -0
  515. angr/procedures/definitions/wdk_fwpkclnt.py +44 -0
  516. angr/procedures/definitions/wdk_fwpuclnt.py +330 -0
  517. angr/procedures/definitions/wdk_gdi32.py +380 -0
  518. angr/procedures/definitions/wdk_hal.py +92 -0
  519. angr/procedures/definitions/wdk_ksecdd.py +76 -0
  520. angr/procedures/definitions/wdk_ndis.py +252 -0
  521. angr/procedures/definitions/wdk_ntoskrnl.py +3463 -0
  522. angr/procedures/definitions/wdk_offreg.py +86 -0
  523. angr/procedures/definitions/wdk_pshed.py +50 -0
  524. angr/procedures/definitions/wdk_secur32.py +54 -0
  525. angr/procedures/definitions/wdk_vhfum.py +48 -0
  526. angr/procedures/definitions/win32_aclui.py +44 -0
  527. angr/procedures/definitions/win32_activeds.py +82 -0
  528. angr/procedures/definitions/win32_advapi32.py +1698 -0
  529. angr/procedures/definitions/win32_advpack.py +138 -0
  530. angr/procedures/definitions/win32_amsi.py +52 -0
  531. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-1.py +58 -0
  532. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-3.py +48 -0
  533. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-6.py +40 -0
  534. angr/procedures/definitions/win32_api-ms-win-core-apiquery-l2-1-0.py +40 -0
  535. angr/procedures/definitions/win32_api-ms-win-core-backgroundtask-l1-1-0.py +40 -0
  536. angr/procedures/definitions/win32_api-ms-win-core-comm-l1-1-1.py +40 -0
  537. angr/procedures/definitions/win32_api-ms-win-core-comm-l1-1-2.py +40 -0
  538. angr/procedures/definitions/win32_api-ms-win-core-enclave-l1-1-1.py +44 -0
  539. angr/procedures/definitions/win32_api-ms-win-core-errorhandling-l1-1-3.py +40 -0
  540. angr/procedures/definitions/win32_api-ms-win-core-featurestaging-l1-1-0.py +48 -0
  541. angr/procedures/definitions/win32_api-ms-win-core-featurestaging-l1-1-1.py +40 -0
  542. angr/procedures/definitions/win32_api-ms-win-core-file-fromapp-l1-1-0.py +60 -0
  543. angr/procedures/definitions/win32_api-ms-win-core-handle-l1-1-0.py +40 -0
  544. angr/procedures/definitions/win32_api-ms-win-core-ioring-l1-1-0.py +62 -0
  545. angr/procedures/definitions/win32_api-ms-win-core-marshal-l1-1-0.py +46 -0
  546. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-3.py +46 -0
  547. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-4.py +40 -0
  548. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-5.py +44 -0
  549. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-6.py +46 -0
  550. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-7.py +42 -0
  551. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-8.py +44 -0
  552. angr/procedures/definitions/win32_api-ms-win-core-path-l1-1-0.py +82 -0
  553. angr/procedures/definitions/win32_api-ms-win-core-psm-appnotify-l1-1-0.py +42 -0
  554. angr/procedures/definitions/win32_api-ms-win-core-psm-appnotify-l1-1-1.py +42 -0
  555. angr/procedures/definitions/win32_api-ms-win-core-realtime-l1-1-1.py +44 -0
  556. angr/procedures/definitions/win32_api-ms-win-core-realtime-l1-1-2.py +44 -0
  557. angr/procedures/definitions/win32_api-ms-win-core-slapi-l1-1-0.py +40 -0
  558. angr/procedures/definitions/win32_api-ms-win-core-state-helpers-l1-1-0.py +40 -0
  559. angr/procedures/definitions/win32_api-ms-win-core-synch-l1-2-0.py +44 -0
  560. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-0.py +40 -0
  561. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-3.py +42 -0
  562. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-4.py +42 -0
  563. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-6.py +40 -0
  564. angr/procedures/definitions/win32_api-ms-win-core-util-l1-1-1.py +42 -0
  565. angr/procedures/definitions/win32_api-ms-win-core-winrt-error-l1-1-0.py +43 -0
  566. angr/procedures/definitions/win32_api-ms-win-core-winrt-error-l1-1-1.py +37 -0
  567. angr/procedures/definitions/win32_api-ms-win-core-winrt-l1-1-0.py +39 -0
  568. angr/procedures/definitions/win32_api-ms-win-core-winrt-registration-l1-1-0.py +23 -0
  569. angr/procedures/definitions/win32_api-ms-win-core-winrt-robuffer-l1-1-0.py +23 -0
  570. angr/procedures/definitions/win32_api-ms-win-core-winrt-roparameterizediid-l1-1-0.py +27 -0
  571. angr/procedures/definitions/win32_api-ms-win-core-winrt-string-l1-1-0.py +75 -0
  572. angr/procedures/definitions/win32_api-ms-win-core-winrt-string-l1-1-1.py +23 -0
  573. angr/procedures/definitions/win32_api-ms-win-core-wow64-l1-1-1.py +44 -0
  574. angr/procedures/definitions/win32_api-ms-win-devices-query-l1-1-0.py +56 -0
  575. angr/procedures/definitions/win32_api-ms-win-devices-query-l1-1-1.py +48 -0
  576. angr/procedures/definitions/win32_api-ms-win-dx-d3dkmt-l1-1-0.py +40 -0
  577. angr/procedures/definitions/win32_api-ms-win-gaming-deviceinformation-l1-1-0.py +40 -0
  578. angr/procedures/definitions/win32_api-ms-win-gaming-expandedresources-l1-1-0.py +44 -0
  579. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-0.py +52 -0
  580. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-1.py +42 -0
  581. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-2.py +52 -0
  582. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-3.py +42 -0
  583. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-4.py +54 -0
  584. angr/procedures/definitions/win32_api-ms-win-mm-misc-l1-1-1.py +40 -0
  585. angr/procedures/definitions/win32_api-ms-win-net-isolation-l1-1-0.py +54 -0
  586. angr/procedures/definitions/win32_api-ms-win-security-base-l1-2-2.py +40 -0
  587. angr/procedures/definitions/win32_api-ms-win-security-isolatedcontainer-l1-1-0.py +40 -0
  588. angr/procedures/definitions/win32_api-ms-win-security-isolatedcontainer-l1-1-1.py +40 -0
  589. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-3.py +40 -0
  590. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-4.py +40 -0
  591. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-5.py +42 -0
  592. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-0.py +44 -0
  593. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-1.py +50 -0
  594. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-2.py +40 -0
  595. angr/procedures/definitions/win32_api-ms-win-shcore-stream-winrt-l1-1-0.py +27 -0
  596. angr/procedures/definitions/win32_api-ms-win-wsl-api-l1-1-0.py +52 -0
  597. angr/procedures/definitions/win32_apphelp.py +40 -0
  598. angr/procedures/definitions/win32_authz.py +104 -0
  599. angr/procedures/definitions/win32_avicap32.py +46 -0
  600. angr/procedures/definitions/win32_avifil32.py +158 -0
  601. angr/procedures/definitions/win32_avrt.py +66 -0
  602. angr/procedures/definitions/win32_bcp47mrm.py +42 -0
  603. angr/procedures/definitions/win32_bcrypt.py +144 -0
  604. angr/procedures/definitions/win32_bcryptprimitives.py +42 -0
  605. angr/procedures/definitions/win32_bluetoothapis.py +120 -0
  606. angr/procedures/definitions/win32_bthprops.py +33 -0
  607. angr/procedures/definitions/win32_bthprops_cpl.py +50 -0
  608. angr/procedures/definitions/win32_cabinet.py +82 -0
  609. angr/procedures/definitions/win32_certadm.py +74 -0
  610. angr/procedures/definitions/win32_certpoleng.py +54 -0
  611. angr/procedures/definitions/win32_cfgmgr32.py +516 -0
  612. angr/procedures/definitions/win32_chakra.py +212 -0
  613. angr/procedures/definitions/win32_cldapi.py +110 -0
  614. angr/procedures/definitions/win32_clfsw32.py +156 -0
  615. angr/procedures/definitions/win32_clusapi.py +598 -0
  616. angr/procedures/definitions/win32_comctl32.py +268 -0
  617. angr/procedures/definitions/win32_comdlg32.py +80 -0
  618. angr/procedures/definitions/win32_compstui.py +46 -0
  619. angr/procedures/definitions/win32_computecore.py +146 -0
  620. angr/procedures/definitions/win32_computenetwork.py +124 -0
  621. angr/procedures/definitions/win32_computestorage.py +62 -0
  622. angr/procedures/definitions/win32_comsvcs.py +52 -0
  623. angr/procedures/definitions/win32_coremessaging.py +23 -0
  624. angr/procedures/definitions/win32_credui.py +76 -0
  625. angr/procedures/definitions/win32_crypt32.py +496 -0
  626. angr/procedures/definitions/win32_cryptnet.py +48 -0
  627. angr/procedures/definitions/win32_cryptui.py +58 -0
  628. angr/procedures/definitions/win32_cryptxml.py +76 -0
  629. angr/procedures/definitions/win32_cscapi.py +46 -0
  630. angr/procedures/definitions/win32_d2d1.py +64 -0
  631. angr/procedures/definitions/win32_d3d10.py +92 -0
  632. angr/procedures/definitions/win32_d3d10_1.py +42 -0
  633. angr/procedures/definitions/win32_d3d11.py +44 -0
  634. angr/procedures/definitions/win32_d3d12.py +54 -0
  635. angr/procedures/definitions/win32_d3d9.py +60 -0
  636. angr/procedures/definitions/win32_d3dcompiler_47.py +90 -0
  637. angr/procedures/definitions/win32_d3dcsx.py +56 -0
  638. angr/procedures/definitions/win32_davclnt.py +74 -0
  639. angr/procedures/definitions/win32_dbgeng.py +46 -0
  640. angr/procedures/definitions/win32_dbghelp.py +476 -0
  641. angr/procedures/definitions/win32_dbgmodel.py +40 -0
  642. angr/procedures/definitions/win32_dciman32.py +78 -0
  643. angr/procedures/definitions/win32_dcomp.py +62 -0
  644. angr/procedures/definitions/win32_ddraw.py +52 -0
  645. angr/procedures/definitions/win32_deviceaccess.py +40 -0
  646. angr/procedures/definitions/win32_dflayout.py +40 -0
  647. angr/procedures/definitions/win32_dhcpcsvc.py +68 -0
  648. angr/procedures/definitions/win32_dhcpcsvc6.py +50 -0
  649. angr/procedures/definitions/win32_dhcpsapi.py +430 -0
  650. angr/procedures/definitions/win32_diagnosticdataquery.py +108 -0
  651. angr/procedures/definitions/win32_dinput8.py +40 -0
  652. angr/procedures/definitions/win32_directml.py +42 -0
  653. angr/procedures/definitions/win32_dmprocessxmlfiltered.py +40 -0
  654. angr/procedures/definitions/win32_dnsapi.py +166 -0
  655. angr/procedures/definitions/win32_drt.py +70 -0
  656. angr/procedures/definitions/win32_drtprov.py +56 -0
  657. angr/procedures/definitions/win32_drttransport.py +42 -0
  658. angr/procedures/definitions/win32_dsound.py +58 -0
  659. angr/procedures/definitions/win32_dsparse.py +76 -0
  660. angr/procedures/definitions/win32_dsprop.py +52 -0
  661. angr/procedures/definitions/win32_dssec.py +46 -0
  662. angr/procedures/definitions/win32_dsuiext.py +46 -0
  663. angr/procedures/definitions/win32_dwmapi.py +100 -0
  664. angr/procedures/definitions/win32_dwrite.py +40 -0
  665. angr/procedures/definitions/win32_dxcompiler.py +42 -0
  666. angr/procedures/definitions/win32_dxcore.py +40 -0
  667. angr/procedures/definitions/win32_dxgi.py +50 -0
  668. angr/procedures/definitions/win32_dxva2.py +114 -0
  669. angr/procedures/definitions/win32_eappcfg.py +66 -0
  670. angr/procedures/definitions/win32_eappprxy.py +74 -0
  671. angr/procedures/definitions/win32_efswrt.py +42 -0
  672. angr/procedures/definitions/win32_elscore.py +48 -0
  673. angr/procedures/definitions/win32_esent.py +496 -0
  674. angr/procedures/definitions/win32_evr.py +52 -0
  675. angr/procedures/definitions/win32_faultrep.py +46 -0
  676. angr/procedures/definitions/win32_fhsvcctl.py +52 -0
  677. angr/procedures/definitions/win32_firewallapi.py +44 -0
  678. angr/procedures/definitions/win32_fltlib.py +94 -0
  679. angr/procedures/definitions/win32_fontsub.py +42 -0
  680. angr/procedures/definitions/win32_forceinline.py +44 -0
  681. angr/procedures/definitions/win32_fwpuclnt.py +422 -0
  682. angr/procedures/definitions/win32_fxsutility.py +42 -0
  683. angr/procedures/definitions/win32_gdi32.py +900 -0
  684. angr/procedures/definitions/win32_gdiplus.py +1296 -0
  685. angr/procedures/definitions/win32_glu32.py +142 -0
  686. angr/procedures/definitions/win32_gpedit.py +50 -0
  687. angr/procedures/definitions/win32_hhctrl_ocx.py +42 -0
  688. angr/procedures/definitions/win32_hid.py +128 -0
  689. angr/procedures/definitions/win32_hlink.py +94 -0
  690. angr/procedures/definitions/win32_hrtfapo.py +40 -0
  691. angr/procedures/definitions/win32_httpapi.py +124 -0
  692. angr/procedures/definitions/win32_icm32.py +80 -0
  693. angr/procedures/definitions/win32_icmui.py +42 -0
  694. angr/procedures/definitions/win32_icu.py +2088 -0
  695. angr/procedures/definitions/win32_ieframe.py +96 -0
  696. angr/procedures/definitions/win32_imagehlp.py +90 -0
  697. angr/procedures/definitions/win32_imgutil.py +56 -0
  698. angr/procedures/definitions/win32_imm32.py +202 -0
  699. angr/procedures/definitions/win32_infocardapi.py +72 -0
  700. angr/procedures/definitions/win32_inkobjcore.py +92 -0
  701. angr/procedures/definitions/win32_iphlpapi.py +440 -0
  702. angr/procedures/definitions/win32_iscsidsc.py +196 -0
  703. angr/procedures/definitions/win32_isolatedwindowsenvironmentutils.py +42 -0
  704. angr/procedures/definitions/win32_kernel32.py +3199 -0
  705. angr/procedures/definitions/win32_kernelbase.py +50 -0
  706. angr/procedures/definitions/win32_keycredmgr.py +46 -0
  707. angr/procedures/definitions/win32_ksproxy_ax.py +50 -0
  708. angr/procedures/definitions/win32_ksuser.py +54 -0
  709. angr/procedures/definitions/win32_ktmw32.py +116 -0
  710. angr/procedures/definitions/win32_licenseprotection.py +42 -0
  711. angr/procedures/definitions/win32_loadperf.py +62 -0
  712. angr/procedures/definitions/win32_magnification.py +76 -0
  713. angr/procedures/definitions/win32_mapi32.py +170 -0
  714. angr/procedures/definitions/win32_mdmlocalmanagement.py +44 -0
  715. angr/procedures/definitions/win32_mdmregistration.py +68 -0
  716. angr/procedures/definitions/win32_mf.py +162 -0
  717. angr/procedures/definitions/win32_mfcore.py +42 -0
  718. angr/procedures/definitions/win32_mfplat.py +328 -0
  719. angr/procedures/definitions/win32_mfplay.py +40 -0
  720. angr/procedures/definitions/win32_mfreadwrite.py +48 -0
  721. angr/procedures/definitions/win32_mfsensorgroup.py +58 -0
  722. angr/procedures/definitions/win32_mfsrcsnk.py +42 -0
  723. angr/procedures/definitions/win32_mgmtapi.py +56 -0
  724. angr/procedures/definitions/win32_mi.py +40 -0
  725. angr/procedures/definitions/win32_mmdevapi.py +40 -0
  726. angr/procedures/definitions/win32_mpr.py +132 -0
  727. angr/procedures/definitions/win32_mprapi.py +262 -0
  728. angr/procedures/definitions/win32_mqrt.py +106 -0
  729. angr/procedures/definitions/win32_mrmsupport.py +92 -0
  730. angr/procedures/definitions/win32_msacm32.py +122 -0
  731. angr/procedures/definitions/win32_msajapi.py +1132 -0
  732. angr/procedures/definitions/win32_mscms.py +196 -0
  733. angr/procedures/definitions/win32_mscoree.py +92 -0
  734. angr/procedures/definitions/win32_msctfmonitor.py +44 -0
  735. angr/procedures/definitions/win32_msdelta.py +70 -0
  736. angr/procedures/definitions/win32_msdmo.py +60 -0
  737. angr/procedures/definitions/win32_msdrm.py +206 -0
  738. angr/procedures/definitions/win32_msi.py +566 -0
  739. angr/procedures/definitions/win32_msimg32.py +44 -0
  740. angr/procedures/definitions/win32_mspatcha.py +70 -0
  741. angr/procedures/definitions/win32_mspatchc.py +56 -0
  742. angr/procedures/definitions/win32_msports.py +52 -0
  743. angr/procedures/definitions/win32_msrating.py +76 -0
  744. angr/procedures/definitions/win32_mssign32.py +58 -0
  745. angr/procedures/definitions/win32_mstask.py +42 -0
  746. angr/procedures/definitions/win32_msvfw32.py +124 -0
  747. angr/procedures/definitions/win32_mswsock.py +70 -0
  748. angr/procedures/definitions/win32_mtxdm.py +40 -0
  749. angr/procedures/definitions/win32_ncrypt.py +116 -0
  750. angr/procedures/definitions/win32_ndfapi.py +70 -0
  751. angr/procedures/definitions/win32_netapi32.py +450 -0
  752. angr/procedures/definitions/win32_netsh.py +54 -0
  753. angr/procedures/definitions/win32_netshell.py +42 -0
  754. angr/procedures/definitions/win32_newdev.py +60 -0
  755. angr/procedures/definitions/win32_ninput.py +98 -0
  756. angr/procedures/definitions/win32_normaliz.py +42 -0
  757. angr/procedures/definitions/win32_ntdll.py +185 -0
  758. angr/procedures/definitions/win32_ntdllk.py +40 -0
  759. angr/procedures/definitions/win32_ntdsapi.py +200 -0
  760. angr/procedures/definitions/win32_ntlanman.py +58 -0
  761. angr/procedures/definitions/win32_odbc32.py +406 -0
  762. angr/procedures/definitions/win32_odbcbcp.py +92 -0
  763. angr/procedures/definitions/win32_ole32.py +672 -0
  764. angr/procedures/definitions/win32_oleacc.py +72 -0
  765. angr/procedures/definitions/win32_oleaut32.py +848 -0
  766. angr/procedures/definitions/win32_oledlg.py +84 -0
  767. angr/procedures/definitions/win32_ondemandconnroutehelper.py +48 -0
  768. angr/procedures/definitions/win32_opengl32.py +748 -0
  769. angr/procedures/definitions/win32_opmxbox.py +44 -0
  770. angr/procedures/definitions/win32_p2p.py +254 -0
  771. angr/procedures/definitions/win32_p2pgraph.py +112 -0
  772. angr/procedures/definitions/win32_pdh.py +234 -0
  773. angr/procedures/definitions/win32_peerdist.py +94 -0
  774. angr/procedures/definitions/win32_powrprof.py +206 -0
  775. angr/procedures/definitions/win32_prntvpt.py +60 -0
  776. angr/procedures/definitions/win32_projectedfslib.py +76 -0
  777. angr/procedures/definitions/win32_propsys.py +474 -0
  778. angr/procedures/definitions/win32_psapi.py +92 -0
  779. angr/procedures/definitions/win32_quartz.py +42 -0
  780. angr/procedures/definitions/win32_query.py +46 -0
  781. angr/procedures/definitions/win32_qwave.py +60 -0
  782. angr/procedures/definitions/win32_rasapi32.py +206 -0
  783. angr/procedures/definitions/win32_rasdlg.py +50 -0
  784. angr/procedures/definitions/win32_resutils.py +278 -0
  785. angr/procedures/definitions/win32_rometadata.py +23 -0
  786. angr/procedures/definitions/win32_rpcns4.py +160 -0
  787. angr/procedures/definitions/win32_rpcproxy.py +46 -0
  788. angr/procedures/definitions/win32_rpcrt4.py +932 -0
  789. angr/procedures/definitions/win32_rstrtmgr.py +60 -0
  790. angr/procedures/definitions/win32_rtm.py +190 -0
  791. angr/procedures/definitions/win32_rtutils.py +120 -0
  792. angr/procedures/definitions/win32_rtworkq.py +104 -0
  793. angr/procedures/definitions/win32_sas.py +40 -0
  794. angr/procedures/definitions/win32_scarddlg.py +48 -0
  795. angr/procedures/definitions/win32_schannel.py +56 -0
  796. angr/procedures/definitions/win32_sechost.py +42 -0
  797. angr/procedures/definitions/win32_secur32.py +216 -0
  798. angr/procedures/definitions/win32_sensapi.py +44 -0
  799. angr/procedures/definitions/win32_sensorsutilsv2.py +118 -0
  800. angr/procedures/definitions/win32_setupapi.py +706 -0
  801. angr/procedures/definitions/win32_sfc.py +50 -0
  802. angr/procedures/definitions/win32_shdocvw.py +44 -0
  803. angr/procedures/definitions/win32_shell32.py +526 -0
  804. angr/procedures/definitions/win32_shlwapi.py +758 -0
  805. angr/procedures/definitions/win32_slc.py +102 -0
  806. angr/procedures/definitions/win32_slcext.py +46 -0
  807. angr/procedures/definitions/win32_slwga.py +40 -0
  808. angr/procedures/definitions/win32_snmpapi.py +90 -0
  809. angr/procedures/definitions/win32_spoolss.py +90 -0
  810. angr/procedures/definitions/win32_srclient.py +40 -0
  811. angr/procedures/definitions/win32_srpapi.py +60 -0
  812. angr/procedures/definitions/win32_sspicli.py +52 -0
  813. angr/procedures/definitions/win32_sti.py +40 -0
  814. angr/procedures/definitions/win32_t2embed.py +66 -0
  815. angr/procedures/definitions/win32_tapi32.py +536 -0
  816. angr/procedures/definitions/win32_tbs.py +66 -0
  817. angr/procedures/definitions/win32_tdh.py +92 -0
  818. angr/procedures/definitions/win32_tokenbinding.py +58 -0
  819. angr/procedures/definitions/win32_traffic.py +78 -0
  820. angr/procedures/definitions/win32_txfw32.py +56 -0
  821. angr/procedures/definitions/win32_ualapi.py +46 -0
  822. angr/procedures/definitions/win32_uiautomationcore.py +234 -0
  823. angr/procedures/definitions/win32_urlmon.py +192 -0
  824. angr/procedures/definitions/win32_user32.py +1565 -0
  825. angr/procedures/definitions/win32_userenv.py +126 -0
  826. angr/procedures/definitions/win32_usp10.py +118 -0
  827. angr/procedures/definitions/win32_uxtheme.py +192 -0
  828. angr/procedures/definitions/win32_verifier.py +40 -0
  829. angr/procedures/definitions/win32_version.py +66 -0
  830. angr/procedures/definitions/win32_vertdll.py +52 -0
  831. angr/procedures/definitions/win32_virtdisk.py +96 -0
  832. angr/procedures/definitions/win32_vmdevicehost.py +64 -0
  833. angr/procedures/definitions/win32_vmsavedstatedumpprovider.py +124 -0
  834. angr/procedures/definitions/win32_vssapi.py +40 -0
  835. angr/procedures/definitions/win32_wcmapi.py +48 -0
  836. angr/procedures/definitions/win32_wdsbp.py +52 -0
  837. angr/procedures/definitions/win32_wdsclientapi.py +112 -0
  838. angr/procedures/definitions/win32_wdsmc.py +50 -0
  839. angr/procedures/definitions/win32_wdspxe.py +100 -0
  840. angr/procedures/definitions/win32_wdstptc.py +64 -0
  841. angr/procedures/definitions/win32_webauthn.py +64 -0
  842. angr/procedures/definitions/win32_webservices.py +424 -0
  843. angr/procedures/definitions/win32_websocket.py +64 -0
  844. angr/procedures/definitions/win32_wecapi.py +68 -0
  845. angr/procedures/definitions/win32_wer.py +80 -0
  846. angr/procedures/definitions/win32_wevtapi.py +108 -0
  847. angr/procedures/definitions/win32_winbio.py +146 -0
  848. angr/procedures/definitions/win32_windows_ai_machinelearning.py +40 -0
  849. angr/procedures/definitions/win32_windows_data_pdf.py +23 -0
  850. angr/procedures/definitions/win32_windows_media_mediacontrol.py +54 -0
  851. angr/procedures/definitions/win32_windows_networking.py +40 -0
  852. angr/procedures/definitions/win32_windows_ui_xaml.py +42 -0
  853. angr/procedures/definitions/win32_windowscodecs.py +56 -0
  854. angr/procedures/definitions/win32_winfax.py +150 -0
  855. angr/procedures/definitions/win32_winhttp.py +150 -0
  856. angr/procedures/definitions/win32_winhvemulation.py +46 -0
  857. angr/procedures/definitions/win32_winhvplatform.py +170 -0
  858. angr/procedures/definitions/win32_wininet.py +630 -0
  859. angr/procedures/definitions/win32_winml.py +40 -0
  860. angr/procedures/definitions/win32_winmm.py +390 -0
  861. angr/procedures/definitions/win32_winscard.py +178 -0
  862. angr/procedures/definitions/win32_winspool.py +363 -0
  863. angr/procedures/definitions/win32_winspool_drv.py +382 -0
  864. angr/procedures/definitions/win32_wintrust.py +158 -0
  865. angr/procedures/definitions/win32_winusb.py +106 -0
  866. angr/procedures/definitions/win32_wlanapi.py +158 -0
  867. angr/procedures/definitions/win32_wlanui.py +40 -0
  868. angr/procedures/definitions/win32_wldap32.py +524 -0
  869. angr/procedures/definitions/win32_wldp.py +56 -0
  870. angr/procedures/definitions/win32_wmvcore.py +60 -0
  871. angr/procedures/definitions/win32_wnvapi.py +42 -0
  872. angr/procedures/definitions/win32_wofutil.py +60 -0
  873. angr/procedures/definitions/win32_ws2_32.py +358 -0
  874. angr/procedures/definitions/win32_wscapi.py +50 -0
  875. angr/procedures/definitions/win32_wsclient.py +44 -0
  876. angr/procedures/definitions/win32_wsdapi.py +102 -0
  877. angr/procedures/definitions/win32_wsmsvc.py +104 -0
  878. angr/procedures/definitions/win32_wsnmp32.py +136 -0
  879. angr/procedures/definitions/win32_wtsapi32.py +164 -0
  880. angr/procedures/definitions/win32_xaudio2_8.py +46 -0
  881. angr/procedures/definitions/win32_xinput1_4.py +52 -0
  882. angr/procedures/definitions/win32_xinputuap.py +35 -0
  883. angr/procedures/definitions/win32_xmllite.py +50 -0
  884. angr/procedures/definitions/win32_xolehlp.py +46 -0
  885. angr/procedures/definitions/win32_xpsprint.py +42 -0
  886. angr/procedures/glibc/__ctype_b_loc.py +22 -0
  887. angr/procedures/glibc/__ctype_tolower_loc.py +22 -0
  888. angr/procedures/glibc/__ctype_toupper_loc.py +22 -0
  889. angr/procedures/glibc/__errno_location.py +6 -0
  890. angr/procedures/glibc/__init__.py +3 -0
  891. angr/procedures/glibc/__libc_init.py +36 -0
  892. angr/procedures/glibc/__libc_start_main.py +294 -0
  893. angr/procedures/glibc/dynamic_loading.py +19 -0
  894. angr/procedures/glibc/scanf.py +10 -0
  895. angr/procedures/glibc/sscanf.py +5 -0
  896. angr/procedures/gnulib/__init__.py +3 -0
  897. angr/procedures/gnulib/xalloc_die.py +13 -0
  898. angr/procedures/gnulib/xstrtol_fatal.py +13 -0
  899. angr/procedures/java/__init__.py +38 -0
  900. angr/procedures/java/unconstrained.py +64 -0
  901. angr/procedures/java_io/__init__.py +0 -0
  902. angr/procedures/java_io/read.py +11 -0
  903. angr/procedures/java_io/write.py +16 -0
  904. angr/procedures/java_jni/__init__.py +475 -0
  905. angr/procedures/java_jni/array_operations.py +309 -0
  906. angr/procedures/java_jni/class_and_interface_operations.py +31 -0
  907. angr/procedures/java_jni/field_access.py +176 -0
  908. angr/procedures/java_jni/global_and_local_refs.py +56 -0
  909. angr/procedures/java_jni/method_calls.py +364 -0
  910. angr/procedures/java_jni/not_implemented.py +25 -0
  911. angr/procedures/java_jni/object_operations.py +95 -0
  912. angr/procedures/java_jni/string_operations.py +86 -0
  913. angr/procedures/java_jni/version_information.py +11 -0
  914. angr/procedures/java_lang/__init__.py +0 -0
  915. angr/procedures/java_lang/character.py +31 -0
  916. angr/procedures/java_lang/double.py +24 -0
  917. angr/procedures/java_lang/exit.py +12 -0
  918. angr/procedures/java_lang/getsimplename.py +15 -0
  919. angr/procedures/java_lang/integer.py +42 -0
  920. angr/procedures/java_lang/load_library.py +8 -0
  921. angr/procedures/java_lang/math.py +14 -0
  922. angr/procedures/java_lang/string.py +78 -0
  923. angr/procedures/java_lang/stringbuilder.py +43 -0
  924. angr/procedures/java_lang/system.py +17 -0
  925. angr/procedures/java_util/__init__.py +0 -0
  926. angr/procedures/java_util/collection.py +34 -0
  927. angr/procedures/java_util/iterator.py +45 -0
  928. angr/procedures/java_util/list.py +98 -0
  929. angr/procedures/java_util/map.py +132 -0
  930. angr/procedures/java_util/random.py +11 -0
  931. angr/procedures/java_util/scanner_nextline.py +22 -0
  932. angr/procedures/libc/__init__.py +3 -0
  933. angr/procedures/libc/abort.py +8 -0
  934. angr/procedures/libc/access.py +10 -0
  935. angr/procedures/libc/atoi.py +14 -0
  936. angr/procedures/libc/atol.py +12 -0
  937. angr/procedures/libc/calloc.py +7 -0
  938. angr/procedures/libc/closelog.py +9 -0
  939. angr/procedures/libc/err.py +13 -0
  940. angr/procedures/libc/error.py +55 -0
  941. angr/procedures/libc/exit.py +10 -0
  942. angr/procedures/libc/fclose.py +20 -0
  943. angr/procedures/libc/feof.py +19 -0
  944. angr/procedures/libc/fflush.py +15 -0
  945. angr/procedures/libc/fgetc.py +24 -0
  946. angr/procedures/libc/fgets.py +68 -0
  947. angr/procedures/libc/fopen.py +64 -0
  948. angr/procedures/libc/fprintf.py +24 -0
  949. angr/procedures/libc/fputc.py +22 -0
  950. angr/procedures/libc/fputs.py +23 -0
  951. angr/procedures/libc/fread.py +22 -0
  952. angr/procedures/libc/free.py +8 -0
  953. angr/procedures/libc/fscanf.py +20 -0
  954. angr/procedures/libc/fseek.py +32 -0
  955. angr/procedures/libc/ftell.py +21 -0
  956. angr/procedures/libc/fwrite.py +18 -0
  957. angr/procedures/libc/getchar.py +13 -0
  958. angr/procedures/libc/getdelim.py +96 -0
  959. angr/procedures/libc/getegid.py +7 -0
  960. angr/procedures/libc/geteuid.py +7 -0
  961. angr/procedures/libc/getgid.py +7 -0
  962. angr/procedures/libc/gets.py +66 -0
  963. angr/procedures/libc/getuid.py +7 -0
  964. angr/procedures/libc/malloc.py +11 -0
  965. angr/procedures/libc/memcmp.py +69 -0
  966. angr/procedures/libc/memcpy.py +37 -0
  967. angr/procedures/libc/memset.py +69 -0
  968. angr/procedures/libc/openlog.py +9 -0
  969. angr/procedures/libc/perror.py +12 -0
  970. angr/procedures/libc/printf.py +33 -0
  971. angr/procedures/libc/putchar.py +12 -0
  972. angr/procedures/libc/puts.py +16 -0
  973. angr/procedures/libc/rand.py +7 -0
  974. angr/procedures/libc/realloc.py +7 -0
  975. angr/procedures/libc/rewind.py +11 -0
  976. angr/procedures/libc/scanf.py +20 -0
  977. angr/procedures/libc/setbuf.py +8 -0
  978. angr/procedures/libc/setvbuf.py +6 -0
  979. angr/procedures/libc/snprintf.py +33 -0
  980. angr/procedures/libc/sprintf.py +22 -0
  981. angr/procedures/libc/srand.py +6 -0
  982. angr/procedures/libc/sscanf.py +13 -0
  983. angr/procedures/libc/stpcpy.py +18 -0
  984. angr/procedures/libc/strcat.py +13 -0
  985. angr/procedures/libc/strchr.py +44 -0
  986. angr/procedures/libc/strcmp.py +28 -0
  987. angr/procedures/libc/strcpy.py +13 -0
  988. angr/procedures/libc/strlen.py +99 -0
  989. angr/procedures/libc/strncat.py +18 -0
  990. angr/procedures/libc/strncmp.py +180 -0
  991. angr/procedures/libc/strncpy.py +18 -0
  992. angr/procedures/libc/strnlen.py +13 -0
  993. angr/procedures/libc/strstr.py +94 -0
  994. angr/procedures/libc/strtol.py +263 -0
  995. angr/procedures/libc/strtoul.py +9 -0
  996. angr/procedures/libc/system.py +12 -0
  997. angr/procedures/libc/time.py +9 -0
  998. angr/procedures/libc/tmpnam.py +19 -0
  999. angr/procedures/libc/tolower.py +7 -0
  1000. angr/procedures/libc/toupper.py +7 -0
  1001. angr/procedures/libc/ungetc.py +19 -0
  1002. angr/procedures/libc/vsnprintf.py +16 -0
  1003. angr/procedures/libc/wchar.py +15 -0
  1004. angr/procedures/libstdcpp/__init__.py +0 -0
  1005. angr/procedures/libstdcpp/_unwind_resume.py +10 -0
  1006. angr/procedures/libstdcpp/std____throw_bad_alloc.py +12 -0
  1007. angr/procedures/libstdcpp/std____throw_bad_cast.py +12 -0
  1008. angr/procedures/libstdcpp/std____throw_length_error.py +12 -0
  1009. angr/procedures/libstdcpp/std____throw_logic_error.py +12 -0
  1010. angr/procedures/libstdcpp/std__terminate.py +12 -0
  1011. angr/procedures/linux_kernel/__init__.py +3 -0
  1012. angr/procedures/linux_kernel/access.py +17 -0
  1013. angr/procedures/linux_kernel/arch_prctl.py +33 -0
  1014. angr/procedures/linux_kernel/arm_user_helpers.py +58 -0
  1015. angr/procedures/linux_kernel/brk.py +17 -0
  1016. angr/procedures/linux_kernel/cwd.py +27 -0
  1017. angr/procedures/linux_kernel/fstat.py +137 -0
  1018. angr/procedures/linux_kernel/fstat64.py +169 -0
  1019. angr/procedures/linux_kernel/futex.py +17 -0
  1020. angr/procedures/linux_kernel/getegid.py +16 -0
  1021. angr/procedures/linux_kernel/geteuid.py +16 -0
  1022. angr/procedures/linux_kernel/getgid.py +16 -0
  1023. angr/procedures/linux_kernel/getpid.py +13 -0
  1024. angr/procedures/linux_kernel/getrlimit.py +24 -0
  1025. angr/procedures/linux_kernel/gettid.py +8 -0
  1026. angr/procedures/linux_kernel/getuid.py +16 -0
  1027. angr/procedures/linux_kernel/iovec.py +43 -0
  1028. angr/procedures/linux_kernel/lseek.py +39 -0
  1029. angr/procedures/linux_kernel/mmap.py +15 -0
  1030. angr/procedures/linux_kernel/mprotect.py +41 -0
  1031. angr/procedures/linux_kernel/munmap.py +7 -0
  1032. angr/procedures/linux_kernel/openat.py +28 -0
  1033. angr/procedures/linux_kernel/set_tid_address.py +7 -0
  1034. angr/procedures/linux_kernel/sigaction.py +16 -0
  1035. angr/procedures/linux_kernel/sigprocmask.py +20 -0
  1036. angr/procedures/linux_kernel/stat.py +22 -0
  1037. angr/procedures/linux_kernel/sysinfo.py +58 -0
  1038. angr/procedures/linux_kernel/tgkill.py +7 -0
  1039. angr/procedures/linux_kernel/time.py +30 -0
  1040. angr/procedures/linux_kernel/uid.py +29 -0
  1041. angr/procedures/linux_kernel/uname.py +28 -0
  1042. angr/procedures/linux_kernel/unlink.py +22 -0
  1043. angr/procedures/linux_kernel/vsyscall.py +15 -0
  1044. angr/procedures/linux_loader/__init__.py +3 -0
  1045. angr/procedures/linux_loader/_dl_initial_error_catch_tsd.py +6 -0
  1046. angr/procedures/linux_loader/_dl_rtld_lock.py +14 -0
  1047. angr/procedures/linux_loader/sim_loader.py +53 -0
  1048. angr/procedures/linux_loader/tls.py +40 -0
  1049. angr/procedures/msvcr/__getmainargs.py +15 -0
  1050. angr/procedures/msvcr/__init__.py +4 -0
  1051. angr/procedures/msvcr/_initterm.py +37 -0
  1052. angr/procedures/msvcr/fmode.py +28 -0
  1053. angr/procedures/ntdll/__init__.py +0 -0
  1054. angr/procedures/ntdll/exceptions.py +57 -0
  1055. angr/procedures/posix/__init__.py +3 -0
  1056. angr/procedures/posix/accept.py +29 -0
  1057. angr/procedures/posix/bind.py +12 -0
  1058. angr/procedures/posix/bzero.py +6 -0
  1059. angr/procedures/posix/chroot.py +26 -0
  1060. angr/procedures/posix/close.py +9 -0
  1061. angr/procedures/posix/closedir.py +6 -0
  1062. angr/procedures/posix/dup.py +55 -0
  1063. angr/procedures/posix/fcntl.py +9 -0
  1064. angr/procedures/posix/fdopen.py +77 -0
  1065. angr/procedures/posix/fileno.py +17 -0
  1066. angr/procedures/posix/fork.py +10 -0
  1067. angr/procedures/posix/getenv.py +34 -0
  1068. angr/procedures/posix/gethostbyname.py +42 -0
  1069. angr/procedures/posix/getpass.py +18 -0
  1070. angr/procedures/posix/getsockopt.py +10 -0
  1071. angr/procedures/posix/htonl.py +11 -0
  1072. angr/procedures/posix/htons.py +11 -0
  1073. angr/procedures/posix/inet_ntoa.py +61 -0
  1074. angr/procedures/posix/listen.py +12 -0
  1075. angr/procedures/posix/mmap.py +140 -0
  1076. angr/procedures/posix/open.py +17 -0
  1077. angr/procedures/posix/opendir.py +9 -0
  1078. angr/procedures/posix/poll.py +54 -0
  1079. angr/procedures/posix/pread64.py +45 -0
  1080. angr/procedures/posix/pthread.py +87 -0
  1081. angr/procedures/posix/pwrite64.py +45 -0
  1082. angr/procedures/posix/read.py +12 -0
  1083. angr/procedures/posix/readdir.py +59 -0
  1084. angr/procedures/posix/recv.py +12 -0
  1085. angr/procedures/posix/recvfrom.py +12 -0
  1086. angr/procedures/posix/select.py +46 -0
  1087. angr/procedures/posix/send.py +22 -0
  1088. angr/procedures/posix/setsockopt.py +8 -0
  1089. angr/procedures/posix/sigaction.py +20 -0
  1090. angr/procedures/posix/sim_time.py +45 -0
  1091. angr/procedures/posix/sleep.py +7 -0
  1092. angr/procedures/posix/socket.py +18 -0
  1093. angr/procedures/posix/strcasecmp.py +23 -0
  1094. angr/procedures/posix/strdup.py +17 -0
  1095. angr/procedures/posix/strtok_r.py +65 -0
  1096. angr/procedures/posix/syslog.py +15 -0
  1097. angr/procedures/posix/tz.py +8 -0
  1098. angr/procedures/posix/unlink.py +10 -0
  1099. angr/procedures/posix/usleep.py +7 -0
  1100. angr/procedures/posix/write.py +12 -0
  1101. angr/procedures/procedure_dict.py +48 -0
  1102. angr/procedures/stubs/CallReturn.py +12 -0
  1103. angr/procedures/stubs/NoReturnUnconstrained.py +12 -0
  1104. angr/procedures/stubs/Nop.py +6 -0
  1105. angr/procedures/stubs/PathTerminator.py +8 -0
  1106. angr/procedures/stubs/Redirect.py +15 -0
  1107. angr/procedures/stubs/ReturnChar.py +10 -0
  1108. angr/procedures/stubs/ReturnUnconstrained.py +24 -0
  1109. angr/procedures/stubs/UnresolvableCallTarget.py +8 -0
  1110. angr/procedures/stubs/UnresolvableJumpTarget.py +8 -0
  1111. angr/procedures/stubs/UserHook.py +15 -0
  1112. angr/procedures/stubs/__init__.py +3 -0
  1113. angr/procedures/stubs/b64_decode.py +12 -0
  1114. angr/procedures/stubs/caller.py +13 -0
  1115. angr/procedures/stubs/crazy_scanf.py +17 -0
  1116. angr/procedures/stubs/format_parser.py +677 -0
  1117. angr/procedures/stubs/syscall_stub.py +26 -0
  1118. angr/procedures/testing/__init__.py +3 -0
  1119. angr/procedures/testing/manyargs.py +8 -0
  1120. angr/procedures/testing/retreg.py +8 -0
  1121. angr/procedures/tracer/__init__.py +4 -0
  1122. angr/procedures/tracer/random.py +8 -0
  1123. angr/procedures/tracer/receive.py +21 -0
  1124. angr/procedures/tracer/transmit.py +24 -0
  1125. angr/procedures/uclibc/__init__.py +3 -0
  1126. angr/procedures/uclibc/__uClibc_main.py +9 -0
  1127. angr/procedures/win32/EncodePointer.py +6 -0
  1128. angr/procedures/win32/ExitProcess.py +8 -0
  1129. angr/procedures/win32/GetCommandLine.py +11 -0
  1130. angr/procedures/win32/GetCurrentProcessId.py +6 -0
  1131. angr/procedures/win32/GetCurrentThreadId.py +6 -0
  1132. angr/procedures/win32/GetLastInputInfo.py +37 -0
  1133. angr/procedures/win32/GetModuleHandle.py +30 -0
  1134. angr/procedures/win32/GetProcessAffinityMask.py +34 -0
  1135. angr/procedures/win32/InterlockedExchange.py +14 -0
  1136. angr/procedures/win32/IsProcessorFeaturePresent.py +6 -0
  1137. angr/procedures/win32/VirtualAlloc.py +113 -0
  1138. angr/procedures/win32/VirtualProtect.py +59 -0
  1139. angr/procedures/win32/__init__.py +3 -0
  1140. angr/procedures/win32/critical_section.py +11 -0
  1141. angr/procedures/win32/dynamic_loading.py +103 -0
  1142. angr/procedures/win32/file_handles.py +47 -0
  1143. angr/procedures/win32/gethostbyname.py +10 -0
  1144. angr/procedures/win32/heap.py +42 -0
  1145. angr/procedures/win32/is_bad_ptr.py +25 -0
  1146. angr/procedures/win32/local_storage.py +85 -0
  1147. angr/procedures/win32/mutex.py +10 -0
  1148. angr/procedures/win32/sim_time.py +135 -0
  1149. angr/procedures/win32/system_paths.py +34 -0
  1150. angr/procedures/win32_kernel/ExAllocatePool.py +12 -0
  1151. angr/procedures/win32_kernel/ExFreePoolWithTag.py +7 -0
  1152. angr/procedures/win32_kernel/__init__.py +3 -0
  1153. angr/procedures/win_user32/__init__.py +0 -0
  1154. angr/procedures/win_user32/chars.py +12 -0
  1155. angr/procedures/win_user32/keyboard.py +13 -0
  1156. angr/procedures/win_user32/messagebox.py +49 -0
  1157. angr/project.py +834 -0
  1158. angr/protos/__init__.py +13 -0
  1159. angr/protos/cfg_pb2.py +31 -0
  1160. angr/protos/function_pb2.py +37 -0
  1161. angr/protos/primitives_pb2.py +124 -0
  1162. angr/protos/variables_pb2.py +126 -0
  1163. angr/protos/xrefs_pb2.py +34 -0
  1164. angr/py.typed +1 -0
  1165. angr/serializable.py +63 -0
  1166. angr/service.py +35 -0
  1167. angr/sim_manager.py +971 -0
  1168. angr/sim_options.py +444 -0
  1169. angr/sim_procedure.py +606 -0
  1170. angr/sim_state.py +1003 -0
  1171. angr/sim_state_options.py +409 -0
  1172. angr/sim_type.py +3372 -0
  1173. angr/sim_variable.py +562 -0
  1174. angr/simos/__init__.py +31 -0
  1175. angr/simos/cgc.py +152 -0
  1176. angr/simos/javavm.py +471 -0
  1177. angr/simos/linux.py +519 -0
  1178. angr/simos/simos.py +450 -0
  1179. angr/simos/snimmuc_nxp.py +152 -0
  1180. angr/simos/userland.py +163 -0
  1181. angr/simos/windows.py +562 -0
  1182. angr/slicer.py +353 -0
  1183. angr/state_hierarchy.py +262 -0
  1184. angr/state_plugins/__init__.py +29 -0
  1185. angr/state_plugins/callstack.py +404 -0
  1186. angr/state_plugins/cgc.py +153 -0
  1187. angr/state_plugins/concrete.py +297 -0
  1188. angr/state_plugins/debug_variables.py +194 -0
  1189. angr/state_plugins/filesystem.py +469 -0
  1190. angr/state_plugins/gdb.py +146 -0
  1191. angr/state_plugins/globals.py +62 -0
  1192. angr/state_plugins/heap/__init__.py +5 -0
  1193. angr/state_plugins/heap/heap_base.py +126 -0
  1194. angr/state_plugins/heap/heap_brk.py +134 -0
  1195. angr/state_plugins/heap/heap_freelist.py +210 -0
  1196. angr/state_plugins/heap/heap_libc.py +45 -0
  1197. angr/state_plugins/heap/heap_ptmalloc.py +646 -0
  1198. angr/state_plugins/heap/utils.py +21 -0
  1199. angr/state_plugins/history.py +548 -0
  1200. angr/state_plugins/inspect.py +376 -0
  1201. angr/state_plugins/javavm_classloader.py +133 -0
  1202. angr/state_plugins/jni_references.py +93 -0
  1203. angr/state_plugins/libc.py +1263 -0
  1204. angr/state_plugins/light_registers.py +170 -0
  1205. angr/state_plugins/log.py +85 -0
  1206. angr/state_plugins/loop_data.py +92 -0
  1207. angr/state_plugins/plugin.py +155 -0
  1208. angr/state_plugins/posix.py +709 -0
  1209. angr/state_plugins/preconstrainer.py +195 -0
  1210. angr/state_plugins/scratch.py +175 -0
  1211. angr/state_plugins/sim_action.py +334 -0
  1212. angr/state_plugins/sim_action_object.py +148 -0
  1213. angr/state_plugins/sim_event.py +58 -0
  1214. angr/state_plugins/solver.py +1129 -0
  1215. angr/state_plugins/symbolizer.py +292 -0
  1216. angr/state_plugins/trace_additions.py +752 -0
  1217. angr/state_plugins/uc_manager.py +85 -0
  1218. angr/state_plugins/unicorn_engine.py +1899 -0
  1219. angr/state_plugins/view.py +341 -0
  1220. angr/storage/__init__.py +9 -0
  1221. angr/storage/file.py +1219 -0
  1222. angr/storage/memory_mixins/__init__.py +393 -0
  1223. angr/storage/memory_mixins/__init__.pyi +49 -0
  1224. angr/storage/memory_mixins/actions_mixin.py +69 -0
  1225. angr/storage/memory_mixins/address_concretization_mixin.py +388 -0
  1226. angr/storage/memory_mixins/bvv_conversion_mixin.py +74 -0
  1227. angr/storage/memory_mixins/clouseau_mixin.py +131 -0
  1228. angr/storage/memory_mixins/conditional_store_mixin.py +24 -0
  1229. angr/storage/memory_mixins/convenient_mappings_mixin.py +257 -0
  1230. angr/storage/memory_mixins/default_filler_mixin.py +146 -0
  1231. angr/storage/memory_mixins/dirty_addrs_mixin.py +9 -0
  1232. angr/storage/memory_mixins/hex_dumper_mixin.py +85 -0
  1233. angr/storage/memory_mixins/javavm_memory/__init__.py +1 -0
  1234. angr/storage/memory_mixins/javavm_memory/javavm_memory_mixin.py +394 -0
  1235. angr/storage/memory_mixins/keyvalue_memory/__init__.py +1 -0
  1236. angr/storage/memory_mixins/keyvalue_memory/keyvalue_memory_mixin.py +36 -0
  1237. angr/storage/memory_mixins/label_merger_mixin.py +31 -0
  1238. angr/storage/memory_mixins/multi_value_merger_mixin.py +68 -0
  1239. angr/storage/memory_mixins/name_resolution_mixin.py +70 -0
  1240. angr/storage/memory_mixins/paged_memory/__init__.py +0 -0
  1241. angr/storage/memory_mixins/paged_memory/page_backer_mixins.py +266 -0
  1242. angr/storage/memory_mixins/paged_memory/paged_memory_mixin.py +750 -0
  1243. angr/storage/memory_mixins/paged_memory/paged_memory_multivalue_mixin.py +63 -0
  1244. angr/storage/memory_mixins/paged_memory/pages/__init__.py +33 -0
  1245. angr/storage/memory_mixins/paged_memory/pages/cooperation.py +330 -0
  1246. angr/storage/memory_mixins/paged_memory/pages/history_tracking_mixin.py +87 -0
  1247. angr/storage/memory_mixins/paged_memory/pages/ispo_mixin.py +53 -0
  1248. angr/storage/memory_mixins/paged_memory/pages/list_page.py +346 -0
  1249. angr/storage/memory_mixins/paged_memory/pages/multi_values.py +290 -0
  1250. angr/storage/memory_mixins/paged_memory/pages/mv_list_page.py +434 -0
  1251. angr/storage/memory_mixins/paged_memory/pages/permissions_mixin.py +33 -0
  1252. angr/storage/memory_mixins/paged_memory/pages/refcount_mixin.py +51 -0
  1253. angr/storage/memory_mixins/paged_memory/pages/ultra_page.py +468 -0
  1254. angr/storage/memory_mixins/paged_memory/privileged_mixin.py +36 -0
  1255. angr/storage/memory_mixins/paged_memory/stack_allocation_mixin.py +73 -0
  1256. angr/storage/memory_mixins/regioned_memory/__init__.py +6 -0
  1257. angr/storage/memory_mixins/regioned_memory/abstract_address_descriptor.py +35 -0
  1258. angr/storage/memory_mixins/regioned_memory/abstract_merger_mixin.py +43 -0
  1259. angr/storage/memory_mixins/regioned_memory/region_category_mixin.py +7 -0
  1260. angr/storage/memory_mixins/regioned_memory/region_data.py +245 -0
  1261. angr/storage/memory_mixins/regioned_memory/region_meta_mixin.py +125 -0
  1262. angr/storage/memory_mixins/regioned_memory/regioned_address_concretization_mixin.py +118 -0
  1263. angr/storage/memory_mixins/regioned_memory/regioned_memory_mixin.py +462 -0
  1264. angr/storage/memory_mixins/regioned_memory/static_find_mixin.py +70 -0
  1265. angr/storage/memory_mixins/simple_interface_mixin.py +73 -0
  1266. angr/storage/memory_mixins/simplification_mixin.py +13 -0
  1267. angr/storage/memory_mixins/size_resolution_mixin.py +140 -0
  1268. angr/storage/memory_mixins/slotted_memory.py +140 -0
  1269. angr/storage/memory_mixins/smart_find_mixin.py +159 -0
  1270. angr/storage/memory_mixins/symbolic_merger_mixin.py +12 -0
  1271. angr/storage/memory_mixins/top_merger_mixin.py +24 -0
  1272. angr/storage/memory_mixins/underconstrained_mixin.py +67 -0
  1273. angr/storage/memory_mixins/unwrapper_mixin.py +26 -0
  1274. angr/storage/memory_object.py +194 -0
  1275. angr/storage/pcap.py +65 -0
  1276. angr/tablespecs.py +90 -0
  1277. angr/utils/__init__.py +33 -0
  1278. angr/utils/algo.py +33 -0
  1279. angr/utils/constants.py +7 -0
  1280. angr/utils/cowdict.py +64 -0
  1281. angr/utils/dynamic_dictlist.py +92 -0
  1282. angr/utils/enums_conv.py +80 -0
  1283. angr/utils/env.py +11 -0
  1284. angr/utils/formatting.py +124 -0
  1285. angr/utils/funcid.py +133 -0
  1286. angr/utils/graph.py +822 -0
  1287. angr/utils/lazy_import.py +12 -0
  1288. angr/utils/library.py +214 -0
  1289. angr/utils/loader.py +55 -0
  1290. angr/utils/mp.py +64 -0
  1291. angr/utils/segment_list.py +558 -0
  1292. angr/utils/timing.py +45 -0
  1293. angr/utils/typing.py +17 -0
  1294. angr/vaults.py +370 -0
  1295. angr-9.2.103.dist-info/LICENSE +24 -0
  1296. angr-9.2.103.dist-info/METADATA +119 -0
  1297. angr-9.2.103.dist-info/RECORD +1300 -0
  1298. angr-9.2.103.dist-info/WHEEL +5 -0
  1299. angr-9.2.103.dist-info/entry_points.txt +2 -0
  1300. angr-9.2.103.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1251 @@
1
+ import logging
2
+ import math
3
+ import types
4
+ from collections import deque, defaultdict
5
+
6
+ import networkx
7
+
8
+ from typing import TYPE_CHECKING
9
+
10
+ if TYPE_CHECKING:
11
+ from angr.knowledge_plugins import Function
12
+
13
+ from . import Analysis, CFGEmulated
14
+
15
+ from ..errors import SimEngineError, SimMemoryError
16
+
17
+ # todo include an explanation of the algorithm
18
+ # todo include a method that detects any change other than constants
19
+ # todo use function names / string references where available
20
+
21
+ l = logging.getLogger(name=__name__)
22
+
23
+ # basic block changes
24
+ DIFF_TYPE = "type"
25
+ DIFF_VALUE = "value"
26
+
27
+
28
+ # exception for trying find basic block changes
29
+ class UnmatchedStatementsException(Exception):
30
+ pass
31
+
32
+
33
+ # statement difference classes
34
+ class Difference:
35
+ def __init__(self, diff_type, value_a, value_b):
36
+ self.type = diff_type
37
+ self.value_a = value_a
38
+ self.value_b = value_b
39
+
40
+
41
+ class ConstantChange:
42
+ def __init__(self, offset, value_a, value_b):
43
+ self.offset = offset
44
+ self.value_a = value_a
45
+ self.value_b = value_b
46
+
47
+
48
+ # helper methods
49
+ def _euclidean_dist(vector_a, vector_b):
50
+ """
51
+ :param vector_a: A list of numbers.
52
+ :param vector_b: A list of numbers.
53
+ :returns: The euclidean distance between the two vectors.
54
+ """
55
+ dist = 0
56
+ for x, y in zip(vector_a, vector_b):
57
+ dist += (x - y) * (x - y)
58
+ return math.sqrt(dist)
59
+
60
+
61
+ def _get_closest_matches(input_attributes, target_attributes):
62
+ """
63
+ :param input_attributes: First dictionary of objects to attribute tuples.
64
+ :param target_attributes: Second dictionary of blocks to attribute tuples.
65
+ :returns: A dictionary of objects in the input_attributes to the closest objects in the
66
+ target_attributes.
67
+ """
68
+ closest_matches = {}
69
+
70
+ # for each object in the first set find the objects with the closest target attributes
71
+ for a in input_attributes:
72
+ best_dist = float("inf")
73
+ best_matches = []
74
+ for b in target_attributes:
75
+ dist = _euclidean_dist(input_attributes[a], target_attributes[b])
76
+ if dist < best_dist:
77
+ best_matches = [b]
78
+ best_dist = dist
79
+ elif dist == best_dist:
80
+ best_matches.append(b)
81
+ closest_matches[a] = best_matches
82
+
83
+ return closest_matches
84
+
85
+
86
+ # from https://rosettacode.org/wiki/Levenshtein_distance
87
+ def _levenshtein_distance(s1, s2):
88
+ """
89
+ :param s1: A list or string
90
+ :param s2: Another list or string
91
+ :returns: The levenshtein distance between the two
92
+ """
93
+ if len(s1) > len(s2):
94
+ s1, s2 = s2, s1
95
+ distances = range(len(s1) + 1)
96
+ for index2, num2 in enumerate(s2):
97
+ new_distances = [index2 + 1]
98
+ for index1, num1 in enumerate(s1):
99
+ if num1 == num2:
100
+ new_distances.append(distances[index1])
101
+ else:
102
+ new_distances.append(1 + min((distances[index1], distances[index1 + 1], new_distances[-1])))
103
+ distances = new_distances
104
+ return distances[-1]
105
+
106
+
107
+ def _normalized_levenshtein_distance(s1, s2, acceptable_differences):
108
+ """
109
+ This function calculates the levenshtein distance but allows for elements in the lists to be different by any number
110
+ in the set acceptable_differences.
111
+
112
+ :param s1: A list.
113
+ :param s2: Another list.
114
+ :param acceptable_differences: A set of numbers. If (s2[i]-s1[i]) is in the set then they are considered equal.
115
+ :returns:
116
+ """
117
+ if len(s1) > len(s2):
118
+ s1, s2 = s2, s1
119
+ acceptable_differences = {-i for i in acceptable_differences}
120
+ distances = range(len(s1) + 1)
121
+ for index2, num2 in enumerate(s2):
122
+ new_distances = [index2 + 1]
123
+ for index1, num1 in enumerate(s1):
124
+ if num2 - num1 in acceptable_differences:
125
+ new_distances.append(distances[index1])
126
+ else:
127
+ new_distances.append(1 + min((distances[index1], distances[index1 + 1], new_distances[-1])))
128
+ distances = new_distances
129
+ return distances[-1]
130
+
131
+
132
+ def _is_better_match(x, y, matched_a, matched_b, attributes_dict_a, attributes_dict_b):
133
+ """
134
+ :param x: The first element of a possible match.
135
+ :param y: The second element of a possible match.
136
+ :param matched_a: The current matches for the first set.
137
+ :param matched_b: The current matches for the second set.
138
+ :param attributes_dict_a: The attributes for each element in the first set.
139
+ :param attributes_dict_b: The attributes for each element in the second set.
140
+ :returns: True/False
141
+ """
142
+ attributes_x = attributes_dict_a[x]
143
+ attributes_y = attributes_dict_b[y]
144
+ if x in matched_a:
145
+ attributes_match = attributes_dict_b[matched_a[x]]
146
+ if _euclidean_dist(attributes_x, attributes_y) >= _euclidean_dist(attributes_x, attributes_match):
147
+ return False
148
+ if y in matched_b:
149
+ attributes_match = attributes_dict_a[matched_b[y]]
150
+ if _euclidean_dist(attributes_x, attributes_y) >= _euclidean_dist(attributes_y, attributes_match):
151
+ return False
152
+ return True
153
+
154
+
155
+ def differing_constants(block_a, block_b):
156
+ """
157
+ Compares two basic blocks and finds all the constants that differ from the first block to the second.
158
+
159
+ :param block_a: The first block to compare.
160
+ :param block_b: The second block to compare.
161
+ :returns: Returns a list of differing constants in the form of ConstantChange, which has the offset in the
162
+ block and the respective constants.
163
+ """
164
+ statements_a = [s for s in block_a.vex.statements if s.tag != "Ist_IMark"] + [block_a.vex.next]
165
+ statements_b = [s for s in block_b.vex.statements if s.tag != "Ist_IMark"] + [block_b.vex.next]
166
+ if len(statements_a) != len(statements_b):
167
+ raise UnmatchedStatementsException("Blocks have different numbers of statements")
168
+
169
+ start_1 = min(block_a.instruction_addrs)
170
+ start_2 = min(block_b.instruction_addrs)
171
+
172
+ changes = []
173
+
174
+ # check statements
175
+ current_offset = None
176
+ for statement, statement_2 in zip(statements_a, statements_b):
177
+ # sanity check
178
+ if statement.tag != statement_2.tag:
179
+ raise UnmatchedStatementsException("Statement tag has changed")
180
+
181
+ if statement.tag == "Ist_IMark":
182
+ if statement.addr - start_1 != statement_2.addr - start_2:
183
+ raise UnmatchedStatementsException("Instruction length has changed")
184
+ current_offset = statement.addr - start_1
185
+ continue
186
+
187
+ differences = compare_statement_dict(statement, statement_2)
188
+ for d in differences:
189
+ if d.type != DIFF_VALUE:
190
+ raise UnmatchedStatementsException("Instruction has changed")
191
+ else:
192
+ changes.append(ConstantChange(current_offset, d.value_a, d.value_b))
193
+
194
+ return changes
195
+
196
+
197
+ def compare_statement_dict(statement_1, statement_2):
198
+ # should return whether or not the statement's type/effects changed
199
+ # need to return the specific number that changed too
200
+
201
+ if type(statement_1) != type(statement_2):
202
+ return [Difference(DIFF_TYPE, None, None)]
203
+
204
+ # None
205
+ if statement_1 is None and statement_2 is None:
206
+ return []
207
+
208
+ # constants
209
+ if isinstance(statement_1, (int, float, str, bytes)):
210
+ if isinstance(statement_1, float) and math.isnan(statement_1) and math.isnan(statement_2):
211
+ return []
212
+ elif statement_1 == statement_2:
213
+ return []
214
+ else:
215
+ return [Difference(None, statement_1, statement_2)]
216
+
217
+ # tuples/lists
218
+ if isinstance(statement_1, (tuple, list)):
219
+ if len(statement_1) != len(statement_2):
220
+ return Difference(DIFF_TYPE, None, None)
221
+
222
+ differences = []
223
+ for s1, s2 in zip(statement_1, statement_2):
224
+ differences += compare_statement_dict(s1, s2)
225
+ return differences
226
+
227
+ # Yan's weird types
228
+ differences = []
229
+ for attr in statement_1.__slots__:
230
+ # don't check arch, property, or methods
231
+ if attr == "arch":
232
+ continue
233
+ if hasattr(statement_1.__class__, attr) and isinstance(getattr(statement_1.__class__, attr), property):
234
+ continue
235
+ if isinstance(getattr(statement_1, attr), types.MethodType):
236
+ continue
237
+
238
+ new_diffs = compare_statement_dict(getattr(statement_1, attr), getattr(statement_2, attr))
239
+ # set the difference types
240
+ for diff in new_diffs:
241
+ if diff.type is None:
242
+ diff.type = attr
243
+ differences += new_diffs
244
+
245
+ return differences
246
+
247
+
248
+ class NormalizedBlock:
249
+ # block may span multiple calls
250
+ def __init__(self, block, function):
251
+ addresses = [block.addr]
252
+ if block.addr in function.merged_blocks:
253
+ for a in function.merged_blocks[block.addr]:
254
+ addresses.append(a.addr)
255
+
256
+ self.addr = block.addr
257
+ self.addresses = addresses
258
+ self.statements = []
259
+ self.all_constants = []
260
+ self.operations = []
261
+ self.call_targets = []
262
+ self.blocks = []
263
+ self.instruction_addrs = []
264
+
265
+ if block.addr in function.call_sites:
266
+ self.call_targets = function.call_sites[block.addr]
267
+
268
+ self.jumpkind = None
269
+
270
+ for a in addresses:
271
+ block = function.project.factory.block(a)
272
+ self.instruction_addrs += block.instruction_addrs
273
+ irsb = block.vex
274
+ self.blocks.append(block)
275
+ self.statements += irsb.statements
276
+ self.all_constants += irsb.all_constants
277
+ self.operations += irsb.operations
278
+ self.jumpkind = irsb.jumpkind
279
+
280
+ self.size = sum([b.size for b in self.blocks])
281
+
282
+ def __repr__(self):
283
+ size = sum([b.size for b in self.blocks])
284
+ return "<Normalized Block for %#x, %d bytes>" % (self.addr, size)
285
+
286
+
287
+ class NormalizedFunction:
288
+ # a more normalized function
289
+ def __init__(self, function: "Function"):
290
+ # start by copying the graph
291
+ self.graph: networkx.DiGraph = function.graph.copy()
292
+ self.project = function._function_manager._kb._project
293
+ self.call_sites = {}
294
+ self.startpoint = function.startpoint
295
+ self.merged_blocks = {}
296
+ self.orig_function = function
297
+
298
+ # find nodes which end in call and combine them
299
+ done = False
300
+ while not done:
301
+ done = True
302
+ for node in self.graph.nodes():
303
+ try:
304
+ bl = self.project.factory.block(node.addr)
305
+ except (SimMemoryError, SimEngineError):
306
+ continue
307
+
308
+ # merge if it ends with a single call, and the successor has only one predecessor and succ is after
309
+ successors = list(self.graph.successors(node))
310
+ if (
311
+ bl.vex.jumpkind == "Ijk_Call"
312
+ and len(successors) == 1
313
+ and len(list(self.graph.predecessors(successors[0]))) == 1
314
+ and successors[0].addr > node.addr
315
+ ):
316
+ # add edges to the successors of its successor, and delete the original successors
317
+ succ = list(self.graph.successors(node))[0]
318
+ for s in self.graph.successors(succ):
319
+ self.graph.add_edge(node, s)
320
+ self.graph.remove_node(succ)
321
+ done = False
322
+
323
+ # add to merged blocks
324
+ if node not in self.merged_blocks:
325
+ self.merged_blocks[node] = []
326
+ self.merged_blocks[node].append(succ)
327
+ if succ in self.merged_blocks:
328
+ self.merged_blocks[node] += self.merged_blocks[succ]
329
+ del self.merged_blocks[succ]
330
+
331
+ # stop iterating and start over
332
+ break
333
+
334
+ # set up call sites
335
+ for n in self.graph.nodes():
336
+ call_targets = []
337
+ if n.addr in self.orig_function.get_call_sites():
338
+ call_targets.append(self.orig_function.get_call_target(n.addr))
339
+ if n.addr in self.merged_blocks:
340
+ for block in self.merged_blocks[n]:
341
+ if block.addr in self.orig_function.get_call_sites():
342
+ call_targets.append(self.orig_function.get_call_target(block.addr))
343
+ if len(call_targets) > 0:
344
+ self.call_sites[n] = call_targets
345
+
346
+
347
+ class FunctionDiff:
348
+ """
349
+ This class computes the a diff between two functions.
350
+ """
351
+
352
+ def __init__(self, function_a: "Function", function_b: "Function", bindiff=None):
353
+ """
354
+ :param function_a: The first angr Function object to diff.
355
+ :param function_b: The second angr Function object.
356
+ :param bindiff: An optional Bindiff object. Used for some extra normalization during basic block comparison.
357
+ """
358
+ self._function_a = NormalizedFunction(function_a)
359
+ self._function_b = NormalizedFunction(function_b)
360
+ self._project_a = self._function_a.project
361
+ self._project_b = self._function_b.project
362
+ self._bindiff = bindiff
363
+
364
+ self._attributes_a = {}
365
+ self._attributes_b = {}
366
+
367
+ self._block_matches = set()
368
+ self._unmatched_blocks_from_a = set()
369
+ self._unmatched_blocks_from_b = set()
370
+
371
+ self._compute_diff()
372
+
373
+ @property
374
+ def probably_identical(self):
375
+ """
376
+ :returns: Whether or not these two functions are identical.
377
+ """
378
+ if len(self._unmatched_blocks_from_a | self._unmatched_blocks_from_b) > 0:
379
+ return False
380
+ for a, b in self._block_matches:
381
+ if not self.blocks_probably_identical(a, b):
382
+ return False
383
+ return True
384
+
385
+ @property
386
+ def identical_blocks(self):
387
+ """
388
+ :returns: A list of block matches which appear to be identical
389
+ """
390
+ identical_blocks = []
391
+ for block_a, block_b in self._block_matches:
392
+ if self.blocks_probably_identical(block_a, block_b):
393
+ identical_blocks.append((block_a, block_b))
394
+ return identical_blocks
395
+
396
+ @property
397
+ def differing_blocks(self):
398
+ """
399
+ :returns: A list of block matches which appear to differ
400
+ """
401
+ differing_blocks = []
402
+ for block_a, block_b in self._block_matches:
403
+ if not self.blocks_probably_identical(block_a, block_b):
404
+ differing_blocks.append((block_a, block_b))
405
+ return differing_blocks
406
+
407
+ @property
408
+ def blocks_with_differing_constants(self):
409
+ """
410
+ :return: A list of block matches which appear to differ
411
+ """
412
+ differing_blocks = []
413
+ diffs = {}
414
+ for block_a, block_b in self._block_matches:
415
+ if self.blocks_probably_identical(block_a, block_b) and not self.blocks_probably_identical(
416
+ block_a, block_b, check_constants=True
417
+ ):
418
+ differing_blocks.append((block_a, block_b))
419
+ for block_a, block_b in differing_blocks:
420
+ ba = NormalizedBlock(block_a, self._function_a)
421
+ bb = NormalizedBlock(block_b, self._function_b)
422
+ diffs[(block_a, block_b)] = FunctionDiff._block_diff_constants(ba, bb)
423
+ return diffs
424
+
425
+ @property
426
+ def block_matches(self):
427
+ return self._block_matches
428
+
429
+ @property
430
+ def unmatched_blocks(self):
431
+ return self._unmatched_blocks_from_a, self._unmatched_blocks_from_b
432
+
433
+ @staticmethod
434
+ def get_normalized_block(addr, function):
435
+ """
436
+ :param addr: Where to start the normalized block.
437
+ :param function: A function containing the block address.
438
+ :returns: A normalized basic block.
439
+ """
440
+ return NormalizedBlock(addr, function)
441
+
442
+ def block_similarity(self, block_a, block_b):
443
+ """
444
+ :param block_a: The first block address.
445
+ :param block_b: The second block address.
446
+ :returns: The similarity of the basic blocks, normalized for the base address of the block and function
447
+ call addresses.
448
+ """
449
+
450
+ # handle sim procedure blocks
451
+ if self._project_a.is_hooked(block_a) and self._project_b.is_hooked(block_b):
452
+ if self._project_a._sim_procedures[block_a] == self._project_b._sim_procedures[block_b]:
453
+ return 1.0
454
+ else:
455
+ return 0.0
456
+
457
+ try:
458
+ block_a = NormalizedBlock(block_a, self._function_a)
459
+ except (SimMemoryError, SimEngineError):
460
+ block_a = None
461
+
462
+ try:
463
+ block_b = NormalizedBlock(block_b, self._function_b)
464
+ except (SimMemoryError, SimEngineError):
465
+ block_b = None
466
+
467
+ # if both were None then they are assumed to be the same, if only one was the same they are assumed to differ
468
+ if block_a is None and block_b is None:
469
+ return 1.0
470
+ elif block_a is None or block_b is None:
471
+ return 0.0
472
+
473
+ # get all elements for computing similarity
474
+ tags_a = [s.tag for s in block_a.statements]
475
+ tags_b = [s.tag for s in block_b.statements]
476
+ consts_a = [c.value for c in block_a.all_constants]
477
+ consts_b = [c.value for c in block_b.all_constants]
478
+ all_registers_a = [s.offset for s in block_a.statements if hasattr(s, "offset")]
479
+ all_registers_b = [s.offset for s in block_b.statements if hasattr(s, "offset")]
480
+ jumpkind_a = block_a.jumpkind
481
+ jumpkind_b = block_b.jumpkind
482
+
483
+ # compute total distance
484
+ total_dist = 0
485
+ total_dist += _levenshtein_distance(tags_a, tags_b)
486
+ total_dist += _levenshtein_distance(block_a.operations, block_b.operations)
487
+ total_dist += _levenshtein_distance(all_registers_a, all_registers_b)
488
+ acceptable_differences = self._get_acceptable_constant_differences(block_a, block_b)
489
+ total_dist += _normalized_levenshtein_distance(consts_a, consts_b, acceptable_differences)
490
+ total_dist += 0 if jumpkind_a == jumpkind_b else 1
491
+
492
+ # compute similarity
493
+ num_values = max(len(tags_a), len(tags_b))
494
+ num_values += max(len(consts_a), len(consts_b))
495
+ num_values += max(len(block_a.operations), len(block_b.operations))
496
+ num_values += 1 # jumpkind
497
+ similarity = 1 - (float(total_dist) / num_values)
498
+
499
+ return similarity
500
+
501
+ def blocks_probably_identical(self, block_a, block_b, check_constants=False):
502
+ """
503
+ :param block_a: The first block address.
504
+ :param block_b: The second block address.
505
+ :param check_constants: Whether or not to require matching constants in blocks.
506
+ :returns: Whether or not the blocks appear to be identical.
507
+ """
508
+ # handle sim procedure blocks
509
+ if self._project_a.is_hooked(block_a) and self._project_b.is_hooked(block_b):
510
+ return self._project_a._sim_procedures[block_a] == self._project_b._sim_procedures[block_b]
511
+
512
+ try:
513
+ block_a = NormalizedBlock(block_a, self._function_a)
514
+ except (SimMemoryError, SimEngineError):
515
+ block_a = None
516
+
517
+ try:
518
+ block_b = NormalizedBlock(block_b, self._function_b)
519
+ except (SimMemoryError, SimEngineError):
520
+ block_b = None
521
+
522
+ # if both were None then they are assumed to be the same, if only one was None they are assumed to differ
523
+ if block_a is None and block_b is None:
524
+ return True
525
+ elif block_a is None or block_b is None:
526
+ return False
527
+
528
+ # if they represent a different number of blocks they are not the same
529
+ if len(block_a.blocks) != len(block_b.blocks):
530
+ return False
531
+
532
+ # check differing constants
533
+ try:
534
+ diff_constants = FunctionDiff._block_diff_constants(block_a, block_b)
535
+ except UnmatchedStatementsException:
536
+ return False
537
+
538
+ if not check_constants:
539
+ return True
540
+
541
+ # get values of differences that probably indicate no change
542
+ acceptable_differences = self._get_acceptable_constant_differences(block_a, block_b)
543
+
544
+ # todo match globals
545
+ for c in diff_constants:
546
+ if (c.value_a, c.value_b) in self._block_matches:
547
+ # constants point to matched basic blocks
548
+ continue
549
+ if self._bindiff is not None and (c.value_a and c.value_b) in self._bindiff.function_matches:
550
+ # constants point to matched functions
551
+ continue
552
+ # if both are in the binary we'll assume it's okay, although we should really match globals
553
+ # TODO use global matches
554
+ if self._project_a.loader.main_object.contains_addr(
555
+ c.value_a
556
+ ) and self._project_b.loader.main_object.contains_addr(c.value_b):
557
+ continue
558
+ # if the difference is equal to the difference in block addr's or successor addr's we'll say it's also okay
559
+ if c.value_b - c.value_a in acceptable_differences:
560
+ continue
561
+ # otherwise they probably are different
562
+ return False
563
+
564
+ # the blocks appear to be identical
565
+ return True
566
+
567
+ @staticmethod
568
+ def _block_diff_constants(block_a, block_b):
569
+ diff_constants = []
570
+ for irsb_a, irsb_b in zip(block_a.blocks, block_b.blocks):
571
+ diff_constants += differing_constants(irsb_a, irsb_b)
572
+ return diff_constants
573
+
574
+ @staticmethod
575
+ def _compute_block_attributes(function: NormalizedFunction):
576
+ """
577
+ :param function: A normalized function object.
578
+ :returns: A dictionary of basic block addresses to tuples of attributes.
579
+ """
580
+ # The attributes we use are the distance form function start, distance from function exit and whether
581
+ # or not it has a subfunction call
582
+ distances_from_start = FunctionDiff._distances_from_function_start(function)
583
+ distances_from_exit = FunctionDiff._distances_from_function_exit(function)
584
+ call_sites = function.call_sites
585
+
586
+ attributes = {}
587
+ for block in function.graph.nodes():
588
+ if block in call_sites:
589
+ number_of_subfunction_calls = len(call_sites[block])
590
+ else:
591
+ number_of_subfunction_calls = 0
592
+ # there really shouldn't be blocks that can't be reached from the start, but there are for now
593
+ dist_start = distances_from_start[block] if block in distances_from_start else 10000
594
+ dist_exit = distances_from_exit[block] if block in distances_from_exit else 10000
595
+
596
+ attributes[block] = (dist_start, dist_exit, number_of_subfunction_calls)
597
+
598
+ return attributes
599
+
600
+ @staticmethod
601
+ def _distances_from_function_start(function: NormalizedFunction):
602
+ """
603
+ :param function: A normalized Function object.
604
+ :returns: A dictionary of basic block addresses and their distance to the start of the function.
605
+ """
606
+ return networkx.single_source_shortest_path_length(function.graph, function.startpoint)
607
+
608
+ @staticmethod
609
+ def _distances_from_function_exit(function: NormalizedFunction):
610
+ """
611
+ :param function: A normalized Function object.
612
+ :returns: A dictionary of basic block addresses and their distance to the exit of the function.
613
+ """
614
+ reverse_graph: networkx.DiGraph = function.graph.reverse()
615
+ # we aren't guaranteed to have an exit from the function so explicitly add the node
616
+ reverse_graph.add_node("start")
617
+ found_exits = False
618
+ for n in function.graph.nodes():
619
+ if len(list(function.graph.successors(n))) == 0:
620
+ reverse_graph.add_edge("start", n)
621
+ found_exits = True
622
+
623
+ # if there were no exits (a function with a while 1) let's consider the block with the highest address to
624
+ # be the exit. This isn't the most scientific way, but since this case is pretty rare it should be okay
625
+ if not found_exits:
626
+ last = max(function.graph.nodes(), key=lambda x: x.addr)
627
+ reverse_graph.add_edge("start", last)
628
+
629
+ dists = networkx.single_source_shortest_path_length(reverse_graph, "start")
630
+
631
+ # remove temp node
632
+ del dists["start"]
633
+
634
+ # correct for the added node
635
+ for n in dists:
636
+ dists[n] -= 1
637
+
638
+ return dists
639
+
640
+ def _compute_diff(self):
641
+ """
642
+ Computes the diff of the functions and saves the result.
643
+ """
644
+ # get the attributes for all blocks
645
+ l.debug(
646
+ "Computing diff of functions: %s, %s",
647
+ ("%#x" % self._function_a.startpoint.addr) if self._function_a.startpoint is not None else "None",
648
+ ("%#x" % self._function_b.startpoint.addr) if self._function_b.startpoint is not None else "None",
649
+ )
650
+ self.attributes_a = self._compute_block_attributes(self._function_a)
651
+ self.attributes_b = self._compute_block_attributes(self._function_b)
652
+
653
+ # get the initial matches
654
+ initial_matches = self._get_block_matches(
655
+ self.attributes_a, self.attributes_b, tiebreak_with_block_similarity=False
656
+ )
657
+
658
+ # Use a queue so we process matches in the order that they are found
659
+ to_process = deque(initial_matches)
660
+
661
+ # Keep track of which matches we've already added to the queue
662
+ processed_matches = {(x, y) for (x, y) in initial_matches}
663
+
664
+ # Keep a dict of current matches, which will be updated if better matches are found
665
+ matched_a = {}
666
+ matched_b = {}
667
+ for x, y in processed_matches:
668
+ matched_a[x] = y
669
+ matched_b[y] = x
670
+
671
+ # while queue is not empty
672
+ while to_process:
673
+ (block_a, block_b) = to_process.pop()
674
+ l.debug("FunctionDiff: Processing (%#x, %#x)", block_a.addr, block_b.addr)
675
+
676
+ # we could find new matches in the successors or predecessors of functions
677
+ block_a_succ = list(self._function_a.graph.successors(block_a))
678
+ block_b_succ = list(self._function_b.graph.successors(block_b))
679
+ block_a_pred = list(self._function_a.graph.predecessors(block_a))
680
+ block_b_pred = list(self._function_b.graph.predecessors(block_b))
681
+
682
+ # propagate the difference in blocks as delta
683
+ delta = tuple((i - j) for i, j in zip(self.attributes_b[block_b], self.attributes_a[block_a]))
684
+
685
+ # get possible new matches
686
+ new_matches = []
687
+
688
+ # if the blocks are identical then the successors should most likely be matched in the same order
689
+ if self.blocks_probably_identical(block_a, block_b) and len(block_a_succ) == len(block_b_succ):
690
+ ordered_succ_a = self._get_ordered_successors(self._project_a, block_a, block_a_succ)
691
+ ordered_succ_b = self._get_ordered_successors(self._project_b, block_b, block_b_succ)
692
+ new_matches.extend(zip(ordered_succ_a, ordered_succ_b))
693
+
694
+ new_matches += self._get_block_matches(
695
+ self.attributes_a,
696
+ self.attributes_b,
697
+ block_a_succ,
698
+ block_b_succ,
699
+ delta,
700
+ tiebreak_with_block_similarity=True,
701
+ )
702
+ new_matches += self._get_block_matches(
703
+ self.attributes_a,
704
+ self.attributes_b,
705
+ block_a_pred,
706
+ block_b_pred,
707
+ delta,
708
+ tiebreak_with_block_similarity=True,
709
+ )
710
+
711
+ # for each of the possible new matches add it if it improves the matching
712
+ for x, y in new_matches:
713
+ if (x, y) not in processed_matches:
714
+ processed_matches.add((x, y))
715
+ l.debug("FunctionDiff: checking if (%#x, %#x) is better", x.addr, y.addr)
716
+ # if it's a better match than what we already have use it
717
+ if _is_better_match(x, y, matched_a, matched_b, self.attributes_a, self.attributes_b):
718
+ l.debug("FunctionDiff: adding possible match (%#x, %#x)", x.addr, y.addr)
719
+ if x in matched_a:
720
+ old_match = matched_a[x]
721
+ del matched_b[old_match]
722
+ if y in matched_b:
723
+ old_match = matched_b[y]
724
+ del matched_a[old_match]
725
+ matched_a[x] = y
726
+ matched_b[y] = x
727
+ to_process.appendleft((x, y))
728
+
729
+ # reformat matches into a set of pairs
730
+ self._block_matches = {(x, y) for (x, y) in matched_a.items()}
731
+
732
+ # get the unmatched blocks
733
+ self._unmatched_blocks_from_a = {x for x in self._function_a.graph.nodes() if x not in matched_a}
734
+ self._unmatched_blocks_from_b = {x for x in self._function_b.graph.nodes() if x not in matched_b}
735
+
736
+ @staticmethod
737
+ def _get_ordered_successors(project, block, succ):
738
+ try:
739
+ # add them in order of the vex
740
+ addr = block.addr
741
+ succ = set(succ)
742
+ ordered_succ = []
743
+ bl = project.factory.block(addr)
744
+ for x in bl.vex.all_constants:
745
+ if x in succ:
746
+ ordered_succ.append(x)
747
+
748
+ # add the rest (sorting might be better than no order)
749
+ for s in sorted(succ - set(ordered_succ), key=lambda x: x.addr):
750
+ ordered_succ.append(s)
751
+ return ordered_succ
752
+ except (SimMemoryError, SimEngineError):
753
+ return sorted(succ, key=lambda x: x.addr)
754
+
755
+ def _get_block_matches(
756
+ self,
757
+ attributes_a,
758
+ attributes_b,
759
+ filter_set_a=None,
760
+ filter_set_b=None,
761
+ delta=(0, 0, 0),
762
+ tiebreak_with_block_similarity=False,
763
+ ):
764
+ """
765
+ :param attributes_a: A dict of blocks to their attributes
766
+ :param attributes_b: A dict of blocks to their attributes
767
+
768
+ The following parameters are optional.
769
+
770
+ :param filter_set_a: A set to limit attributes_a to the blocks in this set.
771
+ :param filter_set_b: A set to limit attributes_b to the blocks in this set.
772
+ :param delta: An offset to add to each vector in attributes_a.
773
+ :returns: A list of tuples of matching objects.
774
+ """
775
+ # get the attributes that are in the sets
776
+ if filter_set_a is None:
777
+ filtered_attributes_a = {k: v for k, v in attributes_a.items()}
778
+ else:
779
+ filtered_attributes_a = {k: v for k, v in attributes_a.items() if k in filter_set_a}
780
+
781
+ if filter_set_b is None:
782
+ filtered_attributes_b = {k: v for k, v in attributes_b.items()}
783
+ else:
784
+ filtered_attributes_b = {k: v for k, v in attributes_b.items() if k in filter_set_b}
785
+
786
+ # add delta
787
+ for k in filtered_attributes_a:
788
+ filtered_attributes_a[k] = tuple((i + j) for i, j in zip(filtered_attributes_a[k], delta))
789
+ for k in filtered_attributes_b:
790
+ filtered_attributes_b[k] = tuple((i + j) for i, j in zip(filtered_attributes_b[k], delta))
791
+
792
+ # get closest
793
+ closest_a = _get_closest_matches(filtered_attributes_a, filtered_attributes_b)
794
+ closest_b = _get_closest_matches(filtered_attributes_b, filtered_attributes_a)
795
+
796
+ if tiebreak_with_block_similarity:
797
+ # use block similarity to break ties in the first set
798
+ for a in closest_a:
799
+ if len(closest_a[a]) > 1:
800
+ best_similarity = 0
801
+ best = []
802
+ for x in closest_a[a]:
803
+ similarity = self.block_similarity(a, x)
804
+ if similarity > best_similarity:
805
+ best_similarity = similarity
806
+ best = [x]
807
+ elif similarity == best_similarity:
808
+ best.append(x)
809
+ closest_a[a] = best
810
+
811
+ # use block similarity to break ties in the second set
812
+ for b in closest_b:
813
+ if len(closest_b[b]) > 1:
814
+ best_similarity = 0
815
+ best = []
816
+ for x in closest_b[b]:
817
+ similarity = self.block_similarity(x, b)
818
+ if similarity > best_similarity:
819
+ best_similarity = similarity
820
+ best = [x]
821
+ elif similarity == best_similarity:
822
+ best.append(x)
823
+ closest_b[b] = best
824
+
825
+ # a match (x,y) is good if x is the closest to y and y is the closest to x
826
+ matches = []
827
+ for a in closest_a:
828
+ if len(closest_a[a]) == 1:
829
+ match = closest_a[a][0]
830
+ if len(closest_b[match]) == 1 and closest_b[match][0] == a:
831
+ matches.append((a, match))
832
+
833
+ return matches
834
+
835
+ def _get_acceptable_constant_differences(self, block_a, block_b):
836
+ # keep a set of the acceptable differences in constants between the two blocks
837
+ acceptable_differences = set()
838
+ acceptable_differences.add(0)
839
+
840
+ block_a_base = block_a.instruction_addrs[0]
841
+ block_b_base = block_b.instruction_addrs[0]
842
+ acceptable_differences.add(block_b_base - block_a_base)
843
+
844
+ # get matching successors
845
+ for target_a, target_b in zip(block_a.call_targets, block_b.call_targets):
846
+ # these can be none if we couldn't resolve the call target
847
+ if target_a is None or target_b is None:
848
+ continue
849
+ acceptable_differences.add(target_b - target_a)
850
+ acceptable_differences.add((target_b - block_b_base) - (target_a - block_a_base))
851
+
852
+ # get the difference between the data segments
853
+ # this is hackish
854
+ if (
855
+ ".bss" in self._project_a.loader.main_object.sections_map
856
+ and ".bss" in self._project_b.loader.main_object.sections_map
857
+ ):
858
+ bss_a = self._project_a.loader.main_object.sections_map[".bss"].min_addr
859
+ bss_b = self._project_b.loader.main_object.sections_map[".bss"].min_addr
860
+ acceptable_differences.add(bss_b - bss_a)
861
+ acceptable_differences.add((bss_b - block_b_base) - (bss_a - block_a_base))
862
+
863
+ return acceptable_differences
864
+
865
+
866
+ class BinDiff(Analysis):
867
+ """
868
+ This class computes the a diff between two binaries represented by angr Projects
869
+ """
870
+
871
+ def __init__(self, other_project, enable_advanced_backward_slicing=False, cfg_a=None, cfg_b=None):
872
+ """
873
+ :param other_project: The second project to diff
874
+ """
875
+ l.debug("Computing cfg's")
876
+
877
+ back_traversal = not enable_advanced_backward_slicing
878
+
879
+ if cfg_a is None:
880
+ # self.cfg_a = self.project.analyses.CFG(resolve_indirect_jumps=True)
881
+ # self.cfg_b = other_project.analyses.CFG(resolve_indirect_jumps=True)
882
+ self.cfg_a = self.project.analyses[CFGEmulated].prep()(
883
+ context_sensitivity_level=1,
884
+ keep_state=True,
885
+ enable_symbolic_back_traversal=back_traversal,
886
+ enable_advanced_backward_slicing=enable_advanced_backward_slicing,
887
+ )
888
+
889
+ self.cfg_b = other_project.analyses[CFGEmulated].prep()(
890
+ context_sensitivity_level=1,
891
+ keep_state=True,
892
+ enable_symbolic_back_traversal=back_traversal,
893
+ enable_advanced_backward_slicing=enable_advanced_backward_slicing,
894
+ )
895
+
896
+ else:
897
+ self.cfg_a = cfg_a
898
+ self.cfg_b = cfg_b
899
+
900
+ l.debug("Done computing cfg's")
901
+
902
+ self._p2 = other_project
903
+ self._attributes_a = {}
904
+ self._attributes_b = {}
905
+
906
+ self._function_diffs = {}
907
+ self.function_matches = set()
908
+ self._unmatched_functions_from_a = set()
909
+ self._unmatched_functions_from_b = set()
910
+
911
+ self._compute_diff()
912
+
913
+ def functions_probably_identical(self, func_a_addr, func_b_addr, check_consts=False):
914
+ """
915
+ Compare two functions and return True if they appear identical.
916
+
917
+ :param func_a_addr: The address of the first function (in the first binary).
918
+ :param func_b_addr: The address of the second function (in the second binary).
919
+ :returns: Whether or not the functions appear to be identical.
920
+ """
921
+ if self.cfg_a.project.is_hooked(func_a_addr) and self.cfg_b.project.is_hooked(func_b_addr):
922
+ return self.cfg_a.project._sim_procedures[func_a_addr] == self.cfg_b.project._sim_procedures[func_b_addr]
923
+
924
+ func_diff = self.get_function_diff(func_a_addr, func_b_addr)
925
+ if check_consts:
926
+ return func_diff.probably_identical_with_consts
927
+
928
+ return func_diff.probably_identical
929
+
930
+ @property
931
+ def identical_functions(self):
932
+ """
933
+ :returns: A list of function matches that appear to be identical
934
+ """
935
+ identical_funcs = []
936
+ for func_a, func_b in self.function_matches:
937
+ if self.functions_probably_identical(func_a, func_b):
938
+ identical_funcs.append((func_a, func_b))
939
+ return identical_funcs
940
+
941
+ @property
942
+ def differing_functions(self):
943
+ """
944
+ :returns: A list of function matches that appear to differ
945
+ """
946
+ different_funcs = []
947
+ for func_a, func_b in self.function_matches:
948
+ if not self.functions_probably_identical(func_a, func_b):
949
+ different_funcs.append((func_a, func_b))
950
+ return different_funcs
951
+
952
+ def differing_functions_with_consts(self):
953
+ """
954
+ :return: A list of function matches that appear to differ including just by constants
955
+ """
956
+ different_funcs = []
957
+ for func_a, func_b in self.function_matches:
958
+ if not self.functions_probably_identical(func_a, func_b, check_consts=True):
959
+ different_funcs.append((func_a, func_b))
960
+ return different_funcs
961
+
962
+ @property
963
+ def differing_blocks(self):
964
+ """
965
+ :returns: A list of block matches that appear to differ
966
+ """
967
+ differing_blocks = []
968
+ for func_a, func_b in self.function_matches:
969
+ differing_blocks.extend(self.get_function_diff(func_a, func_b).differing_blocks)
970
+ return differing_blocks
971
+
972
+ @property
973
+ def identical_blocks(self):
974
+ """
975
+ :return A list of all block matches that appear to be identical
976
+ """
977
+ identical_blocks = []
978
+ for func_a, func_b in self.function_matches:
979
+ identical_blocks.extend(self.get_function_diff(func_a, func_b).identical_blocks)
980
+ return identical_blocks
981
+
982
+ @property
983
+ def blocks_with_differing_constants(self):
984
+ """
985
+ :return: A dict of block matches with differing constants to the tuple of constants
986
+ """
987
+ diffs = {}
988
+ for func_a, func_b in self.function_matches:
989
+ diffs.update(self.get_function_diff(func_a, func_b).blocks_with_differing_constants)
990
+ return diffs
991
+
992
+ @property
993
+ def unmatched_functions(self):
994
+ return self._unmatched_functions_from_a, self._unmatched_functions_from_b
995
+
996
+ # gets the diff of two functions in the binaries
997
+ def get_function_diff(self, function_addr_a, function_addr_b):
998
+ """
999
+ :param function_addr_a: The address of the first function (in the first binary)
1000
+ :param function_addr_b: The address of the second function (in the second binary)
1001
+ :returns: the FunctionDiff of the two functions
1002
+ """
1003
+ pair = (function_addr_a, function_addr_b)
1004
+ if pair not in self._function_diffs:
1005
+ function_a = self.cfg_a.kb.functions.function(function_addr_a)
1006
+ function_b = self.cfg_b.kb.functions.function(function_addr_b)
1007
+ self._function_diffs[pair] = FunctionDiff(function_a, function_b, self)
1008
+ return self._function_diffs[pair]
1009
+
1010
+ @staticmethod
1011
+ def _compute_function_attributes(cfg):
1012
+ """
1013
+ :param cfg: An angr CFG object
1014
+ :returns: a dictionary of function addresses to tuples of attributes
1015
+ """
1016
+ # the attributes we use are the number of basic blocks, number of edges, and number of subfunction calls
1017
+ attributes = {}
1018
+ all_funcs = set(cfg.kb.callgraph.nodes())
1019
+ for function_addr in cfg.kb.functions:
1020
+ # skip syscalls and functions which are None in the cfg
1021
+ if cfg.kb.functions.function(function_addr) is None or cfg.kb.functions.function(function_addr).is_syscall:
1022
+ continue
1023
+ if cfg.kb.functions.function(function_addr) is not None:
1024
+ normalized_funtion = NormalizedFunction(cfg.kb.functions.function(function_addr))
1025
+ number_of_basic_blocks = len(normalized_funtion.graph.nodes())
1026
+ number_of_edges = len(normalized_funtion.graph.edges())
1027
+ else:
1028
+ number_of_basic_blocks = 0
1029
+ number_of_edges = 0
1030
+ if function_addr in all_funcs:
1031
+ number_of_subfunction_calls = len(list(cfg.kb.callgraph.successors(function_addr)))
1032
+ else:
1033
+ number_of_subfunction_calls = 0
1034
+ attributes[function_addr] = (number_of_basic_blocks, number_of_edges, number_of_subfunction_calls)
1035
+
1036
+ return attributes
1037
+
1038
+ def _get_call_site_matches(self, func_a, func_b):
1039
+ possible_matches = set()
1040
+
1041
+ # Make sure those functions are not SimProcedures
1042
+ f_a = self.cfg_a.kb.functions.function(func_a)
1043
+ f_b = self.cfg_b.kb.functions.function(func_b)
1044
+ if f_a.startpoint is None or f_b.startpoint is None:
1045
+ return possible_matches
1046
+
1047
+ fd = self.get_function_diff(func_a, func_b)
1048
+ basic_block_matches = fd.block_matches
1049
+ function_a = fd._function_a
1050
+ function_b = fd._function_b
1051
+ for a, b in basic_block_matches:
1052
+ if a in function_a.call_sites and b in function_b.call_sites:
1053
+ # add them in order
1054
+ for target_a, target_b in zip(function_a.call_sites[a], function_b.call_sites[b]):
1055
+ possible_matches.add((target_a, target_b))
1056
+ # add them in reverse, since if a new call was added the ordering from each side
1057
+ # will remain constant until the change
1058
+ for target_a, target_b in zip(reversed(function_a.call_sites[a]), reversed(function_b.call_sites[b])):
1059
+ possible_matches.add((target_a, target_b))
1060
+
1061
+ return possible_matches
1062
+
1063
+ def _get_plt_matches(self):
1064
+ plt_matches = []
1065
+ for name, addr in self.project.loader.main_object.plt.items():
1066
+ if name in self._p2.loader.main_object.plt:
1067
+ plt_matches.append((addr, self._p2.loader.main_object.plt[name]))
1068
+
1069
+ # in the case of sim procedures the actual sim procedure might be in the interfunction graph, not the plt entry
1070
+ func_to_addr_a = {}
1071
+ func_to_addr_b = {}
1072
+ for k, hook in self.project._sim_procedures.items():
1073
+ if "resolves" in hook.kwargs:
1074
+ func_to_addr_a[hook.kwargs["resolves"]] = k
1075
+
1076
+ for k, hook in self._p2._sim_procedures.items():
1077
+ if "resolves" in hook.kwargs:
1078
+ func_to_addr_b[hook.kwargs["resolves"]] = k
1079
+
1080
+ for name, addr in func_to_addr_a.items():
1081
+ if name in func_to_addr_b:
1082
+ plt_matches.append((addr, func_to_addr_b[name]))
1083
+
1084
+ # remove ones that aren't in the interfunction graph, because these seem to not be consistent
1085
+ all_funcs_a = set(self.cfg_a.kb.callgraph.nodes())
1086
+ all_funcs_b = set(self.cfg_b.kb.callgraph.nodes())
1087
+ plt_matches = [x for x in plt_matches if x[0] in all_funcs_a and x[1] in all_funcs_b]
1088
+
1089
+ return plt_matches
1090
+
1091
+ def _get_name_matches(self):
1092
+ names_to_addrs_a = defaultdict(list)
1093
+ for f in self.cfg_a.functions.values():
1094
+ if not f.name.startswith("sub_"):
1095
+ names_to_addrs_a[f.name].append(f.addr)
1096
+
1097
+ names_to_addrs_b = defaultdict(list)
1098
+ for f in self.cfg_b.functions.values():
1099
+ if not f.name.startswith("sub_"):
1100
+ names_to_addrs_b[f.name].append(f.addr)
1101
+
1102
+ name_matches = []
1103
+ for name, addrs in names_to_addrs_a.items():
1104
+ if name in names_to_addrs_b:
1105
+ for addr_a, addr_b in zip(addrs, names_to_addrs_b[name]):
1106
+ # if binary a and binary b have different numbers of functions with the same name, we will see them
1107
+ # in unmatched functions in the end.
1108
+ name_matches.append((addr_a, addr_b))
1109
+
1110
+ return name_matches
1111
+
1112
+ def _compute_diff(self):
1113
+ # get the attributes for all functions
1114
+ self.attributes_a = self._compute_function_attributes(self.cfg_a)
1115
+ self.attributes_b = self._compute_function_attributes(self.cfg_b)
1116
+
1117
+ # get the initial matches
1118
+ initial_matches = self._get_plt_matches()
1119
+ initial_matches += self._get_name_matches()
1120
+ initial_matches += self._get_function_matches(self.attributes_a, self.attributes_b)
1121
+ for a, b in initial_matches:
1122
+ l.debug("Initially matched (%#x, %#x)", a, b)
1123
+
1124
+ # Use a queue so we process matches in the order that they are found
1125
+ to_process = deque(initial_matches)
1126
+
1127
+ # Keep track of which matches we've already added to the queue
1128
+ processed_matches = {(x, y) for (x, y) in initial_matches}
1129
+
1130
+ # Keep a dict of current matches, which will be updated if better matches are found
1131
+ matched_a = {}
1132
+ matched_b = {}
1133
+ for x, y in processed_matches:
1134
+ matched_a[x] = y
1135
+ matched_b[y] = x
1136
+
1137
+ callgraph_a_nodes = set(self.cfg_a.kb.callgraph.nodes())
1138
+ callgraph_b_nodes = set(self.cfg_b.kb.callgraph.nodes())
1139
+
1140
+ # while queue is not empty
1141
+ while to_process:
1142
+ (func_a, func_b) = to_process.pop()
1143
+ l.debug("Processing (%#x, %#x)", func_a, func_b)
1144
+
1145
+ # we could find new matches in the successors or predecessors of functions
1146
+ if not self.project.loader.main_object.contains_addr(func_a):
1147
+ continue
1148
+ if not self._p2.loader.main_object.contains_addr(func_b):
1149
+ continue
1150
+
1151
+ func_a_succ = self.cfg_a.kb.callgraph.successors(func_a) if func_a in callgraph_a_nodes else []
1152
+ func_b_succ = self.cfg_b.kb.callgraph.successors(func_b) if func_b in callgraph_b_nodes else []
1153
+ func_a_pred = self.cfg_a.kb.callgraph.predecessors(func_a) if func_a in callgraph_a_nodes else []
1154
+ func_b_pred = self.cfg_b.kb.callgraph.predecessors(func_b) if func_b in callgraph_b_nodes else []
1155
+
1156
+ # get possible new matches
1157
+ new_matches = set(
1158
+ self._get_function_matches(self.attributes_a, self.attributes_b, func_a_succ, func_b_succ)
1159
+ )
1160
+ new_matches |= set(
1161
+ self._get_function_matches(self.attributes_a, self.attributes_b, func_a_pred, func_b_pred)
1162
+ )
1163
+
1164
+ # could also find matches as function calls of matched basic blocks
1165
+ new_matches.update(self._get_call_site_matches(func_a, func_b))
1166
+
1167
+ # for each of the possible new matches add it if it improves the matching
1168
+ for x, y in new_matches:
1169
+ # skip none functions and syscalls
1170
+ func_a = self.cfg_a.kb.functions.function(x)
1171
+ if func_a is None or func_a.is_simprocedure or func_a.is_syscall:
1172
+ continue
1173
+ func_b = self.cfg_b.kb.functions.function(y)
1174
+ if func_b is None or func_b.is_simprocedure or func_b.is_syscall:
1175
+ continue
1176
+
1177
+ if (x, y) not in processed_matches:
1178
+ processed_matches.add((x, y))
1179
+ # if it's a better match than what we already have use it
1180
+ l.debug("Checking function match %s, %s", hex(x), hex(y))
1181
+ if _is_better_match(x, y, matched_a, matched_b, self.attributes_a, self.attributes_b):
1182
+ l.debug("Adding potential match %s, %s", hex(x), hex(y))
1183
+ if x in matched_a:
1184
+ old_match = matched_a[x]
1185
+ del matched_b[old_match]
1186
+ l.debug("Removing previous match (%#x, %#x)", x, old_match)
1187
+ if y in matched_b:
1188
+ old_match = matched_b[y]
1189
+ del matched_a[old_match]
1190
+ l.debug("Removing previous match (%#x, %#x)", old_match, y)
1191
+ matched_a[x] = y
1192
+ matched_b[y] = x
1193
+ to_process.appendleft((x, y))
1194
+
1195
+ # reformat matches into a set of pairs
1196
+ self.function_matches = set()
1197
+ for x, y in matched_a.items():
1198
+ # only keep if the pair is in the binary ranges
1199
+ if self.project.loader.main_object.contains_addr(x) and self._p2.loader.main_object.contains_addr(y):
1200
+ self.function_matches.add((x, y))
1201
+
1202
+ # get the unmatched functions
1203
+ self._unmatched_functions_from_a = {x for x in self.attributes_a.keys() if x not in matched_a}
1204
+ self._unmatched_functions_from_b = {x for x in self.attributes_b.keys() if x not in matched_b}
1205
+
1206
+ # remove unneeded function diffs
1207
+ for x, y in dict(self._function_diffs):
1208
+ if (x, y) not in self.function_matches:
1209
+ del self._function_diffs[(x, y)]
1210
+
1211
+ @staticmethod
1212
+ def _get_function_matches(attributes_a, attributes_b, filter_set_a=None, filter_set_b=None):
1213
+ """
1214
+ :param attributes_a: A dict of functions to their attributes
1215
+ :param attributes_b: A dict of functions to their attributes
1216
+
1217
+ The following parameters are optional.
1218
+
1219
+ :param filter_set_a: A set to limit attributes_a to the functions in this set.
1220
+ :param filter_set_b: A set to limit attributes_b to the functions in this set.
1221
+ :returns: A list of tuples of matching objects.
1222
+ """
1223
+ # get the attributes that are in the sets
1224
+ if filter_set_a is None:
1225
+ filtered_attributes_a = {k: v for k, v in attributes_a.items()}
1226
+ else:
1227
+ filtered_attributes_a = {k: v for k, v in attributes_a.items() if k in filter_set_a}
1228
+
1229
+ if filter_set_b is None:
1230
+ filtered_attributes_b = {k: v for k, v in attributes_b.items()}
1231
+ else:
1232
+ filtered_attributes_b = {k: v for k, v in attributes_b.items() if k in filter_set_b}
1233
+
1234
+ # get closest
1235
+ closest_a = _get_closest_matches(filtered_attributes_a, filtered_attributes_b)
1236
+ closest_b = _get_closest_matches(filtered_attributes_b, filtered_attributes_a)
1237
+
1238
+ # a match (x,y) is good if x is the closest to y and y is the closest to x
1239
+ matches = []
1240
+ for a in closest_a:
1241
+ if len(closest_a[a]) == 1:
1242
+ match = closest_a[a][0]
1243
+ if len(closest_b[match]) == 1 and closest_b[match][0] == a:
1244
+ matches.append((a, match))
1245
+
1246
+ return matches
1247
+
1248
+
1249
+ from angr.analyses import AnalysesHub
1250
+
1251
+ AnalysesHub.register_default("BinDiff", BinDiff)