polyfile-weave 0.5.5__py3-none-any.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 polyfile-weave might be problematic. Click here for more details.

Files changed (585) hide show
  1. polyfile/__init__.py +15 -0
  2. polyfile/__main__.py +394 -0
  3. polyfile/arithmetic.py +27 -0
  4. polyfile/ast.py +114 -0
  5. polyfile/debugger.py +1039 -0
  6. polyfile/expressions.py +346 -0
  7. polyfile/fileutils.py +343 -0
  8. polyfile/html.py +135 -0
  9. polyfile/http/__init__.py +1 -0
  10. polyfile/http/defacto.py +37 -0
  11. polyfile/http/deprecated.py +51 -0
  12. polyfile/http/experimental.py +67 -0
  13. polyfile/http/http_11.py +548 -0
  14. polyfile/http/matcher.py +37 -0
  15. polyfile/http/structured_headers.py +48 -0
  16. polyfile/iterators.py +72 -0
  17. polyfile/jpeg.py +24 -0
  18. polyfile/kaitai/__init__.py +0 -0
  19. polyfile/kaitai/compiler.py +156 -0
  20. polyfile/kaitai/parser.py +312 -0
  21. polyfile/kaitai/parsers/__init__.py +0 -0
  22. polyfile/kaitai/parsers/aix_utmp.py +116 -0
  23. polyfile/kaitai/parsers/allegro_dat.py +367 -0
  24. polyfile/kaitai/parsers/andes_firmware.py +64 -0
  25. polyfile/kaitai/parsers/android_bootldr_asus.py +105 -0
  26. polyfile/kaitai/parsers/android_bootldr_huawei.py +181 -0
  27. polyfile/kaitai/parsers/android_bootldr_qcom.py +217 -0
  28. polyfile/kaitai/parsers/android_dto.py +138 -0
  29. polyfile/kaitai/parsers/android_img.py +319 -0
  30. polyfile/kaitai/parsers/android_nanoapp_header.py +83 -0
  31. polyfile/kaitai/parsers/android_opengl_shaders_cache.py +151 -0
  32. polyfile/kaitai/parsers/android_sparse.py +237 -0
  33. polyfile/kaitai/parsers/android_super.py +401 -0
  34. polyfile/kaitai/parsers/apm_partition_table.py +196 -0
  35. polyfile/kaitai/parsers/apple_single_double.py +180 -0
  36. polyfile/kaitai/parsers/asn1_der.py +235 -0
  37. polyfile/kaitai/parsers/au.py +138 -0
  38. polyfile/kaitai/parsers/avantes_roh60.py +112 -0
  39. polyfile/kaitai/parsers/avi.py +296 -0
  40. polyfile/kaitai/parsers/bcd.py +111 -0
  41. polyfile/kaitai/parsers/bitcoin_transaction.py +210 -0
  42. polyfile/kaitai/parsers/blender_blend.py +334 -0
  43. polyfile/kaitai/parsers/bmp.py +780 -0
  44. polyfile/kaitai/parsers/bson.py +411 -0
  45. polyfile/kaitai/parsers/btrfs_stream.py +318 -0
  46. polyfile/kaitai/parsers/bytes_with_io.py +27 -0
  47. polyfile/kaitai/parsers/chrome_pak.py +194 -0
  48. polyfile/kaitai/parsers/code_6502.py +456 -0
  49. polyfile/kaitai/parsers/compressed_resource.py +217 -0
  50. polyfile/kaitai/parsers/cpio_old_le.py +154 -0
  51. polyfile/kaitai/parsers/cramfs.py +344 -0
  52. polyfile/kaitai/parsers/creative_voice_file.py +342 -0
  53. polyfile/kaitai/parsers/dbf.py +274 -0
  54. polyfile/kaitai/parsers/dcmp_0.py +664 -0
  55. polyfile/kaitai/parsers/dcmp_1.py +422 -0
  56. polyfile/kaitai/parsers/dcmp_2.py +312 -0
  57. polyfile/kaitai/parsers/dcmp_variable_length_integer.py +66 -0
  58. polyfile/kaitai/parsers/dex.py +1086 -0
  59. polyfile/kaitai/parsers/dicom.py +4370 -0
  60. polyfile/kaitai/parsers/dime_message.py +201 -0
  61. polyfile/kaitai/parsers/dns_packet.py +569 -0
  62. polyfile/kaitai/parsers/doom_wad.py +654 -0
  63. polyfile/kaitai/parsers/dos_datetime.py +191 -0
  64. polyfile/kaitai/parsers/dos_mz.py +172 -0
  65. polyfile/kaitai/parsers/ds_store.py +513 -0
  66. polyfile/kaitai/parsers/dtb.py +310 -0
  67. polyfile/kaitai/parsers/dune_2_pak.py +126 -0
  68. polyfile/kaitai/parsers/edid.py +472 -0
  69. polyfile/kaitai/parsers/efivar_signature_list.py +331 -0
  70. polyfile/kaitai/parsers/elf.py +2482 -0
  71. polyfile/kaitai/parsers/ethernet_frame.py +114 -0
  72. polyfile/kaitai/parsers/exif.py +723 -0
  73. polyfile/kaitai/parsers/ext2.py +537 -0
  74. polyfile/kaitai/parsers/fallout2_dat.py +187 -0
  75. polyfile/kaitai/parsers/fallout_dat.py +156 -0
  76. polyfile/kaitai/parsers/fasttracker_xm_module.py +558 -0
  77. polyfile/kaitai/parsers/ftl_dat.py +90 -0
  78. polyfile/kaitai/parsers/genmidi_op2.py +161 -0
  79. polyfile/kaitai/parsers/gettext_mo.py +541 -0
  80. polyfile/kaitai/parsers/gif.py +492 -0
  81. polyfile/kaitai/parsers/gimp_brush.py +244 -0
  82. polyfile/kaitai/parsers/glibc_utmp.py +114 -0
  83. polyfile/kaitai/parsers/gltf_binary.py +132 -0
  84. polyfile/kaitai/parsers/google_protobuf.py +151 -0
  85. polyfile/kaitai/parsers/gpt_partition_table.py +175 -0
  86. polyfile/kaitai/parsers/gran_turismo_vol.py +140 -0
  87. polyfile/kaitai/parsers/grub2_font.py +337 -0
  88. polyfile/kaitai/parsers/gzip.py +232 -0
  89. polyfile/kaitai/parsers/hashcat_restore.py +60 -0
  90. polyfile/kaitai/parsers/hccap.py +111 -0
  91. polyfile/kaitai/parsers/hccapx.py +103 -0
  92. polyfile/kaitai/parsers/heaps_pak.py +177 -0
  93. polyfile/kaitai/parsers/heroes_of_might_and_magic_agg.py +116 -0
  94. polyfile/kaitai/parsers/heroes_of_might_and_magic_bmp.py +34 -0
  95. polyfile/kaitai/parsers/icmp_packet.py +136 -0
  96. polyfile/kaitai/parsers/ico.py +129 -0
  97. polyfile/kaitai/parsers/id3v1_1.py +220 -0
  98. polyfile/kaitai/parsers/id3v2_3.py +324 -0
  99. polyfile/kaitai/parsers/id3v2_4.py +423 -0
  100. polyfile/kaitai/parsers/ines.py +282 -0
  101. polyfile/kaitai/parsers/ipv4_packet.py +158 -0
  102. polyfile/kaitai/parsers/ipv6_packet.py +55 -0
  103. polyfile/kaitai/parsers/iso9660.py +544 -0
  104. polyfile/kaitai/parsers/java_class.py +1113 -0
  105. polyfile/kaitai/parsers/jpeg.py +361 -0
  106. polyfile/kaitai/parsers/luks.py +149 -0
  107. polyfile/kaitai/parsers/lzh.py +165 -0
  108. polyfile/kaitai/parsers/mac_os_resource_snd.py +493 -0
  109. polyfile/kaitai/parsers/mach_o.py +3033 -0
  110. polyfile/kaitai/parsers/mach_o_fat.py +92 -0
  111. polyfile/kaitai/parsers/magicavoxel_vox.py +391 -0
  112. polyfile/kaitai/parsers/manifest.json +1 -0
  113. polyfile/kaitai/parsers/mbr_partition_table.py +119 -0
  114. polyfile/kaitai/parsers/mcap.py +1015 -0
  115. polyfile/kaitai/parsers/microsoft_cfb.py +293 -0
  116. polyfile/kaitai/parsers/microsoft_network_monitor_v2.py +309 -0
  117. polyfile/kaitai/parsers/microsoft_pe.py +765 -0
  118. polyfile/kaitai/parsers/mifare_classic.py +706 -0
  119. polyfile/kaitai/parsers/minecraft_nbt.py +449 -0
  120. polyfile/kaitai/parsers/monomakh_sapr_chg.py +69 -0
  121. polyfile/kaitai/parsers/mozilla_mar.py +239 -0
  122. polyfile/kaitai/parsers/mp4.py +333 -0
  123. polyfile/kaitai/parsers/msgpack.py +467 -0
  124. polyfile/kaitai/parsers/nitf.py +1189 -0
  125. polyfile/kaitai/parsers/nt_mdt_pal.py +155 -0
  126. polyfile/kaitai/parsers/ogg.py +118 -0
  127. polyfile/kaitai/parsers/openpgp_message.py +993 -0
  128. polyfile/kaitai/parsers/packet_ppi.py +515 -0
  129. polyfile/kaitai/parsers/pcap.py +344 -0
  130. polyfile/kaitai/parsers/pcf_font.py +506 -0
  131. polyfile/kaitai/parsers/pcx.py +195 -0
  132. polyfile/kaitai/parsers/pcx_dcx.py +79 -0
  133. polyfile/kaitai/parsers/phar_without_stub.py +399 -0
  134. polyfile/kaitai/parsers/php_serialized_value.py +505 -0
  135. polyfile/kaitai/parsers/png.py +721 -0
  136. polyfile/kaitai/parsers/protocol_body.py +260 -0
  137. polyfile/kaitai/parsers/psx_tim.py +104 -0
  138. polyfile/kaitai/parsers/python_pickle.py +718 -0
  139. polyfile/kaitai/parsers/python_pyc_27.py +510 -0
  140. polyfile/kaitai/parsers/quake_mdl.py +441 -0
  141. polyfile/kaitai/parsers/quake_pak.py +112 -0
  142. polyfile/kaitai/parsers/quicktime_mov.py +634 -0
  143. polyfile/kaitai/parsers/rar.py +265 -0
  144. polyfile/kaitai/parsers/regf.py +569 -0
  145. polyfile/kaitai/parsers/renderware_binary_stream.py +877 -0
  146. polyfile/kaitai/parsers/resource_fork.py +611 -0
  147. polyfile/kaitai/parsers/respack.py +57 -0
  148. polyfile/kaitai/parsers/riff.py +409 -0
  149. polyfile/kaitai/parsers/rpm.py +964 -0
  150. polyfile/kaitai/parsers/rtcp_payload.py +579 -0
  151. polyfile/kaitai/parsers/rtp_packet.py +150 -0
  152. polyfile/kaitai/parsers/rtpdump.py +115 -0
  153. polyfile/kaitai/parsers/ruby_marshal.py +423 -0
  154. polyfile/kaitai/parsers/s3m.py +493 -0
  155. polyfile/kaitai/parsers/saints_row_2_vpp_pc.py +254 -0
  156. polyfile/kaitai/parsers/shapefile_index.py +174 -0
  157. polyfile/kaitai/parsers/shapefile_main.py +893 -0
  158. polyfile/kaitai/parsers/some_ip.py +209 -0
  159. polyfile/kaitai/parsers/some_ip_container.py +37 -0
  160. polyfile/kaitai/parsers/some_ip_sd.py +86 -0
  161. polyfile/kaitai/parsers/some_ip_sd_entries.py +160 -0
  162. polyfile/kaitai/parsers/some_ip_sd_options.py +374 -0
  163. polyfile/kaitai/parsers/specpr.py +404 -0
  164. polyfile/kaitai/parsers/sqlite3.py +472 -0
  165. polyfile/kaitai/parsers/ssh_public_key.py +252 -0
  166. polyfile/kaitai/parsers/standard_midi_file.py +390 -0
  167. polyfile/kaitai/parsers/stl.py +111 -0
  168. polyfile/kaitai/parsers/sudoers_ts.py +201 -0
  169. polyfile/kaitai/parsers/swf.py +406 -0
  170. polyfile/kaitai/parsers/systemd_journal.py +361 -0
  171. polyfile/kaitai/parsers/tcp_segment.py +57 -0
  172. polyfile/kaitai/parsers/tga.py +213 -0
  173. polyfile/kaitai/parsers/tls_client_hello.py +293 -0
  174. polyfile/kaitai/parsers/tr_dos_image.py +322 -0
  175. polyfile/kaitai/parsers/tsm.py +198 -0
  176. polyfile/kaitai/parsers/ttf.py +1847 -0
  177. polyfile/kaitai/parsers/udp_datagram.py +42 -0
  178. polyfile/kaitai/parsers/uefi_te.py +236 -0
  179. polyfile/kaitai/parsers/uimage.py +198 -0
  180. polyfile/kaitai/parsers/utf8_string.py +137 -0
  181. polyfile/kaitai/parsers/vfat.py +410 -0
  182. polyfile/kaitai/parsers/vlq_base128_be.py +104 -0
  183. polyfile/kaitai/parsers/vlq_base128_le.py +129 -0
  184. polyfile/kaitai/parsers/vmware_vmdk.py +167 -0
  185. polyfile/kaitai/parsers/vp8_ivf.py +112 -0
  186. polyfile/kaitai/parsers/warcraft_2_pud.py +423 -0
  187. polyfile/kaitai/parsers/wav.py +1014 -0
  188. polyfile/kaitai/parsers/websocket.py +167 -0
  189. polyfile/kaitai/parsers/windows_evt_log.py +304 -0
  190. polyfile/kaitai/parsers/windows_lnk_file.py +467 -0
  191. polyfile/kaitai/parsers/windows_minidump.py +575 -0
  192. polyfile/kaitai/parsers/windows_resource_file.py +243 -0
  193. polyfile/kaitai/parsers/windows_shell_items.py +190 -0
  194. polyfile/kaitai/parsers/windows_systemtime.py +52 -0
  195. polyfile/kaitai/parsers/wmf.py +502 -0
  196. polyfile/kaitai/parsers/xar.py +181 -0
  197. polyfile/kaitai/parsers/xwd.py +189 -0
  198. polyfile/kaitai/parsers/zip.py +685 -0
  199. polyfile/kaitai/parsers/zisofs.py +158 -0
  200. polyfile/kaitai/parsers/zx_spectrum_tap.py +184 -0
  201. polyfile/kaitaimatcher.py +113 -0
  202. polyfile/languagematcher.py +217 -0
  203. polyfile/logger.py +135 -0
  204. polyfile/magic.py +2983 -0
  205. polyfile/magic_defs/COPYING +29 -0
  206. polyfile/magic_defs/__init__.py +0 -0
  207. polyfile/magic_defs/acorn +102 -0
  208. polyfile/magic_defs/adi +13 -0
  209. polyfile/magic_defs/adventure +122 -0
  210. polyfile/magic_defs/aes +29 -0
  211. polyfile/magic_defs/algol68 +35 -0
  212. polyfile/magic_defs/allegro +9 -0
  213. polyfile/magic_defs/alliant +18 -0
  214. polyfile/magic_defs/alpha +32 -0
  215. polyfile/magic_defs/amanda +12 -0
  216. polyfile/magic_defs/amigaos +218 -0
  217. polyfile/magic_defs/android +259 -0
  218. polyfile/magic_defs/animation +1197 -0
  219. polyfile/magic_defs/aout +46 -0
  220. polyfile/magic_defs/apache +28 -0
  221. polyfile/magic_defs/apl +7 -0
  222. polyfile/magic_defs/apple +773 -0
  223. polyfile/magic_defs/application +7 -0
  224. polyfile/magic_defs/applix +13 -0
  225. polyfile/magic_defs/apt +52 -0
  226. polyfile/magic_defs/archive +2586 -0
  227. polyfile/magic_defs/aria +38 -0
  228. polyfile/magic_defs/arm +50 -0
  229. polyfile/magic_defs/asf +132 -0
  230. polyfile/magic_defs/assembler +18 -0
  231. polyfile/magic_defs/asterix +18 -0
  232. polyfile/magic_defs/att3b +41 -0
  233. polyfile/magic_defs/audio +1291 -0
  234. polyfile/magic_defs/avm +33 -0
  235. polyfile/magic_defs/basis +18 -0
  236. polyfile/magic_defs/beetle +7 -0
  237. polyfile/magic_defs/ber +65 -0
  238. polyfile/magic_defs/bflt +14 -0
  239. polyfile/magic_defs/bhl +10 -0
  240. polyfile/magic_defs/bioinformatics +178 -0
  241. polyfile/magic_defs/biosig +154 -0
  242. polyfile/magic_defs/blackberry +8 -0
  243. polyfile/magic_defs/blcr +25 -0
  244. polyfile/magic_defs/blender +50 -0
  245. polyfile/magic_defs/blit +24 -0
  246. polyfile/magic_defs/bm +10 -0
  247. polyfile/magic_defs/bout +11 -0
  248. polyfile/magic_defs/bsdi +33 -0
  249. polyfile/magic_defs/bsi +10 -0
  250. polyfile/magic_defs/btsnoop +13 -0
  251. polyfile/magic_defs/burp +7 -0
  252. polyfile/magic_defs/bytecode +41 -0
  253. polyfile/magic_defs/c-lang +110 -0
  254. polyfile/magic_defs/c64 +531 -0
  255. polyfile/magic_defs/cad +437 -0
  256. polyfile/magic_defs/cafebabe +107 -0
  257. polyfile/magic_defs/cbor +21 -0
  258. polyfile/magic_defs/ccf +14 -0
  259. polyfile/magic_defs/cddb +12 -0
  260. polyfile/magic_defs/chord +15 -0
  261. polyfile/magic_defs/cisco +12 -0
  262. polyfile/magic_defs/citrus +12 -0
  263. polyfile/magic_defs/clarion +27 -0
  264. polyfile/magic_defs/claris +48 -0
  265. polyfile/magic_defs/clipper +65 -0
  266. polyfile/magic_defs/clojure +30 -0
  267. polyfile/magic_defs/coff +98 -0
  268. polyfile/magic_defs/commands +201 -0
  269. polyfile/magic_defs/communications +22 -0
  270. polyfile/magic_defs/compress +461 -0
  271. polyfile/magic_defs/console +1213 -0
  272. polyfile/magic_defs/convex +69 -0
  273. polyfile/magic_defs/coverage +91 -0
  274. polyfile/magic_defs/cracklib +14 -0
  275. polyfile/magic_defs/crypto +31 -0
  276. polyfile/magic_defs/csv +8 -0
  277. polyfile/magic_defs/ctags +6 -0
  278. polyfile/magic_defs/ctf +23 -0
  279. polyfile/magic_defs/cubemap +8 -0
  280. polyfile/magic_defs/cups +56 -0
  281. polyfile/magic_defs/dact +11 -0
  282. polyfile/magic_defs/database +886 -0
  283. polyfile/magic_defs/dataone +47 -0
  284. polyfile/magic_defs/dbpf +15 -0
  285. polyfile/magic_defs/der +146 -0
  286. polyfile/magic_defs/diamond +12 -0
  287. polyfile/magic_defs/dif +33 -0
  288. polyfile/magic_defs/diff +41 -0
  289. polyfile/magic_defs/digital +59 -0
  290. polyfile/magic_defs/dolby +69 -0
  291. polyfile/magic_defs/dsf +25 -0
  292. polyfile/magic_defs/dump +96 -0
  293. polyfile/magic_defs/dwarfs +45 -0
  294. polyfile/magic_defs/dyadic +61 -0
  295. polyfile/magic_defs/ebml +8 -0
  296. polyfile/magic_defs/edid +11 -0
  297. polyfile/magic_defs/editors +43 -0
  298. polyfile/magic_defs/efi +15 -0
  299. polyfile/magic_defs/elf +379 -0
  300. polyfile/magic_defs/encore +22 -0
  301. polyfile/magic_defs/epoc +62 -0
  302. polyfile/magic_defs/erlang +21 -0
  303. polyfile/magic_defs/espressif +57 -0
  304. polyfile/magic_defs/esri +28 -0
  305. polyfile/magic_defs/etf +33 -0
  306. polyfile/magic_defs/fcs +9 -0
  307. polyfile/magic_defs/filesystems +2694 -0
  308. polyfile/magic_defs/finger +16 -0
  309. polyfile/magic_defs/firmware +133 -0
  310. polyfile/magic_defs/flash +62 -0
  311. polyfile/magic_defs/flif +36 -0
  312. polyfile/magic_defs/fonts +449 -0
  313. polyfile/magic_defs/forth +82 -0
  314. polyfile/magic_defs/fortran +9 -0
  315. polyfile/magic_defs/frame +62 -0
  316. polyfile/magic_defs/freebsd +164 -0
  317. polyfile/magic_defs/fsav +128 -0
  318. polyfile/magic_defs/fusecompress +12 -0
  319. polyfile/magic_defs/games +696 -0
  320. polyfile/magic_defs/gcc +17 -0
  321. polyfile/magic_defs/gconv +10 -0
  322. polyfile/magic_defs/gentoo +85 -0
  323. polyfile/magic_defs/geo +166 -0
  324. polyfile/magic_defs/geos +20 -0
  325. polyfile/magic_defs/gimp +77 -0
  326. polyfile/magic_defs/git +13 -0
  327. polyfile/magic_defs/glibc +21 -0
  328. polyfile/magic_defs/gnome +59 -0
  329. polyfile/magic_defs/gnu +173 -0
  330. polyfile/magic_defs/gnumeric +8 -0
  331. polyfile/magic_defs/gpt +240 -0
  332. polyfile/magic_defs/gpu +28 -0
  333. polyfile/magic_defs/grace +21 -0
  334. polyfile/magic_defs/graphviz +12 -0
  335. polyfile/magic_defs/gringotts +48 -0
  336. polyfile/magic_defs/guile +13 -0
  337. polyfile/magic_defs/hardware +12 -0
  338. polyfile/magic_defs/hitachi-sh +30 -0
  339. polyfile/magic_defs/hp +433 -0
  340. polyfile/magic_defs/human68k +26 -0
  341. polyfile/magic_defs/ibm370 +52 -0
  342. polyfile/magic_defs/ibm6000 +35 -0
  343. polyfile/magic_defs/icc +214 -0
  344. polyfile/magic_defs/iff +80 -0
  345. polyfile/magic_defs/images +4210 -0
  346. polyfile/magic_defs/inform +9 -0
  347. polyfile/magic_defs/intel +310 -0
  348. polyfile/magic_defs/interleaf +9 -0
  349. polyfile/magic_defs/island +10 -0
  350. polyfile/magic_defs/ispell +63 -0
  351. polyfile/magic_defs/isz +15 -0
  352. polyfile/magic_defs/java +52 -0
  353. polyfile/magic_defs/javascript +171 -0
  354. polyfile/magic_defs/jpeg +252 -0
  355. polyfile/magic_defs/json +8 -0
  356. polyfile/magic_defs/karma +9 -0
  357. polyfile/magic_defs/kde +11 -0
  358. polyfile/magic_defs/keepass +20 -0
  359. polyfile/magic_defs/kerberos +45 -0
  360. polyfile/magic_defs/kicad +85 -0
  361. polyfile/magic_defs/kml +34 -0
  362. polyfile/magic_defs/lammps +64 -0
  363. polyfile/magic_defs/lecter +6 -0
  364. polyfile/magic_defs/lex +12 -0
  365. polyfile/magic_defs/lif +50 -0
  366. polyfile/magic_defs/linux +557 -0
  367. polyfile/magic_defs/lisp +78 -0
  368. polyfile/magic_defs/llvm +22 -0
  369. polyfile/magic_defs/locoscript +12 -0
  370. polyfile/magic_defs/lua +31 -0
  371. polyfile/magic_defs/luks +126 -0
  372. polyfile/magic_defs/m4 +11 -0
  373. polyfile/magic_defs/mach +303 -0
  374. polyfile/magic_defs/macintosh +505 -0
  375. polyfile/magic_defs/macos +7 -0
  376. polyfile/magic_defs/magic +10 -0
  377. polyfile/magic_defs/magic.mgc +0 -0
  378. polyfile/magic_defs/mail.news +132 -0
  379. polyfile/magic_defs/make +21 -0
  380. polyfile/magic_defs/map +413 -0
  381. polyfile/magic_defs/maple +109 -0
  382. polyfile/magic_defs/marc21 +30 -0
  383. polyfile/magic_defs/mathcad +8 -0
  384. polyfile/magic_defs/mathematica +188 -0
  385. polyfile/magic_defs/matroska +17 -0
  386. polyfile/magic_defs/mcrypt +52 -0
  387. polyfile/magic_defs/measure +44 -0
  388. polyfile/magic_defs/mercurial +13 -0
  389. polyfile/magic_defs/metastore +8 -0
  390. polyfile/magic_defs/meteorological +53 -0
  391. polyfile/magic_defs/microfocus +21 -0
  392. polyfile/magic_defs/mime +9 -0
  393. polyfile/magic_defs/mips +120 -0
  394. polyfile/magic_defs/mirage +8 -0
  395. polyfile/magic_defs/misctools +140 -0
  396. polyfile/magic_defs/mkid +11 -0
  397. polyfile/magic_defs/mlssa +8 -0
  398. polyfile/magic_defs/mmdf +6 -0
  399. polyfile/magic_defs/modem +92 -0
  400. polyfile/magic_defs/modulefile +9 -0
  401. polyfile/magic_defs/motorola +71 -0
  402. polyfile/magic_defs/mozilla +37 -0
  403. polyfile/magic_defs/msdos +2304 -0
  404. polyfile/magic_defs/msooxml +68 -0
  405. polyfile/magic_defs/msvc +222 -0
  406. polyfile/magic_defs/msx +309 -0
  407. polyfile/magic_defs/mup +24 -0
  408. polyfile/magic_defs/music +17 -0
  409. polyfile/magic_defs/nasa +7 -0
  410. polyfile/magic_defs/natinst +24 -0
  411. polyfile/magic_defs/ncr +49 -0
  412. polyfile/magic_defs/neko +12 -0
  413. polyfile/magic_defs/netbsd +251 -0
  414. polyfile/magic_defs/netscape +26 -0
  415. polyfile/magic_defs/netware +11 -0
  416. polyfile/magic_defs/news +13 -0
  417. polyfile/magic_defs/nifty +202 -0
  418. polyfile/magic_defs/nim-lang +29 -0
  419. polyfile/magic_defs/nitpicker +14 -0
  420. polyfile/magic_defs/numpy +9 -0
  421. polyfile/magic_defs/oasis +12 -0
  422. polyfile/magic_defs/ocaml +14 -0
  423. polyfile/magic_defs/octave +6 -0
  424. polyfile/magic_defs/ole2compounddocs +760 -0
  425. polyfile/magic_defs/olf +98 -0
  426. polyfile/magic_defs/openfst +17 -0
  427. polyfile/magic_defs/opentimestamps +16 -0
  428. polyfile/magic_defs/oric +16 -0
  429. polyfile/magic_defs/os2 +186 -0
  430. polyfile/magic_defs/os400 +39 -0
  431. polyfile/magic_defs/os9 +80 -0
  432. polyfile/magic_defs/osf1 +10 -0
  433. polyfile/magic_defs/palm +156 -0
  434. polyfile/magic_defs/parix +13 -0
  435. polyfile/magic_defs/parrot +22 -0
  436. polyfile/magic_defs/pascal +39 -0
  437. polyfile/magic_defs/pbf +11 -0
  438. polyfile/magic_defs/pbm +8 -0
  439. polyfile/magic_defs/pc88 +24 -0
  440. polyfile/magic_defs/pc98 +77 -0
  441. polyfile/magic_defs/pci_ids +116 -0
  442. polyfile/magic_defs/pcjr +8 -0
  443. polyfile/magic_defs/pdf +51 -0
  444. polyfile/magic_defs/pdp +42 -0
  445. polyfile/magic_defs/perl +100 -0
  446. polyfile/magic_defs/pgf +52 -0
  447. polyfile/magic_defs/pgp +581 -0
  448. polyfile/magic_defs/pgp-binary-keys +388 -0
  449. polyfile/magic_defs/pkgadd +7 -0
  450. polyfile/magic_defs/plan9 +25 -0
  451. polyfile/magic_defs/playdate +57 -0
  452. polyfile/magic_defs/plus5 +18 -0
  453. polyfile/magic_defs/pmem +46 -0
  454. polyfile/magic_defs/polyfile_zip +5 -0
  455. polyfile/magic_defs/polyml +23 -0
  456. polyfile/magic_defs/printer +269 -0
  457. polyfile/magic_defs/project +10 -0
  458. polyfile/magic_defs/psdbms +14 -0
  459. polyfile/magic_defs/psl +14 -0
  460. polyfile/magic_defs/pulsar +13 -0
  461. polyfile/magic_defs/puzzle +17 -0
  462. polyfile/magic_defs/pwsafe +14 -0
  463. polyfile/magic_defs/pyramid +12 -0
  464. polyfile/magic_defs/python +305 -0
  465. polyfile/magic_defs/qt +30 -0
  466. polyfile/magic_defs/revision +66 -0
  467. polyfile/magic_defs/riff +840 -0
  468. polyfile/magic_defs/rinex +44 -0
  469. polyfile/magic_defs/ringdove +45 -0
  470. polyfile/magic_defs/rpi +52 -0
  471. polyfile/magic_defs/rpm +45 -0
  472. polyfile/magic_defs/rpmsg +7 -0
  473. polyfile/magic_defs/rst +11 -0
  474. polyfile/magic_defs/rtf +94 -0
  475. polyfile/magic_defs/ruby +55 -0
  476. polyfile/magic_defs/rust +21 -0
  477. polyfile/magic_defs/sc +7 -0
  478. polyfile/magic_defs/sccs +24 -0
  479. polyfile/magic_defs/scientific +144 -0
  480. polyfile/magic_defs/securitycerts +6 -0
  481. polyfile/magic_defs/selinux +24 -0
  482. polyfile/magic_defs/sendmail +37 -0
  483. polyfile/magic_defs/sequent +42 -0
  484. polyfile/magic_defs/sereal +35 -0
  485. polyfile/magic_defs/sgi +144 -0
  486. polyfile/magic_defs/sgml +161 -0
  487. polyfile/magic_defs/sharc +23 -0
  488. polyfile/magic_defs/sinclair +40 -0
  489. polyfile/magic_defs/sisu +18 -0
  490. polyfile/magic_defs/sketch +6 -0
  491. polyfile/magic_defs/smalltalk +25 -0
  492. polyfile/magic_defs/smile +34 -0
  493. polyfile/magic_defs/sniffer +482 -0
  494. polyfile/magic_defs/softquad +40 -0
  495. polyfile/magic_defs/sosi +40 -0
  496. polyfile/magic_defs/spec +21 -0
  497. polyfile/magic_defs/spectrum +184 -0
  498. polyfile/magic_defs/sql +288 -0
  499. polyfile/magic_defs/ssh +39 -0
  500. polyfile/magic_defs/ssl +20 -0
  501. polyfile/magic_defs/statistics +45 -0
  502. polyfile/magic_defs/subtitle +38 -0
  503. polyfile/magic_defs/sun +141 -0
  504. polyfile/magic_defs/svf +5 -0
  505. polyfile/magic_defs/sylk +36 -0
  506. polyfile/magic_defs/symbos +42 -0
  507. polyfile/magic_defs/sysex +429 -0
  508. polyfile/magic_defs/tcl +29 -0
  509. polyfile/magic_defs/teapot +6 -0
  510. polyfile/magic_defs/terminfo +63 -0
  511. polyfile/magic_defs/tex +141 -0
  512. polyfile/magic_defs/tgif +7 -0
  513. polyfile/magic_defs/ti-8x +239 -0
  514. polyfile/magic_defs/timezone +42 -0
  515. polyfile/magic_defs/tplink +95 -0
  516. polyfile/magic_defs/troff +38 -0
  517. polyfile/magic_defs/tuxedo +8 -0
  518. polyfile/magic_defs/typeset +8 -0
  519. polyfile/magic_defs/uf2 +72 -0
  520. polyfile/magic_defs/unicode +15 -0
  521. polyfile/magic_defs/unisig +12 -0
  522. polyfile/magic_defs/unknown +34 -0
  523. polyfile/magic_defs/usd +21 -0
  524. polyfile/magic_defs/uterus +16 -0
  525. polyfile/magic_defs/uuencode +28 -0
  526. polyfile/magic_defs/vacuum-cleaner +54 -0
  527. polyfile/magic_defs/varied.out +46 -0
  528. polyfile/magic_defs/varied.script +21 -0
  529. polyfile/magic_defs/vax +32 -0
  530. polyfile/magic_defs/vicar +17 -0
  531. polyfile/magic_defs/virtual +307 -0
  532. polyfile/magic_defs/virtutech +12 -0
  533. polyfile/magic_defs/visx +32 -0
  534. polyfile/magic_defs/vms +30 -0
  535. polyfile/magic_defs/vmware +6 -0
  536. polyfile/magic_defs/vorbis +155 -0
  537. polyfile/magic_defs/vxl +14 -0
  538. polyfile/magic_defs/warc +16 -0
  539. polyfile/magic_defs/weak +16 -0
  540. polyfile/magic_defs/web +18 -0
  541. polyfile/magic_defs/webassembly +17 -0
  542. polyfile/magic_defs/windows +1811 -0
  543. polyfile/magic_defs/wireless +7 -0
  544. polyfile/magic_defs/wordprocessors +630 -0
  545. polyfile/magic_defs/wsdl +23 -0
  546. polyfile/magic_defs/x68000 +25 -0
  547. polyfile/magic_defs/xdelta +13 -0
  548. polyfile/magic_defs/xenix +106 -0
  549. polyfile/magic_defs/xilinx +58 -0
  550. polyfile/magic_defs/xo65 +37 -0
  551. polyfile/magic_defs/xwindows +43 -0
  552. polyfile/magic_defs/yara +17 -0
  553. polyfile/magic_defs/zfs +96 -0
  554. polyfile/magic_defs/zilog +12 -0
  555. polyfile/magic_defs/zip +126 -0
  556. polyfile/magic_defs/zyxel +17 -0
  557. polyfile/nes.py +144 -0
  558. polyfile/nitf.py +15 -0
  559. polyfile/pdf.py +1264 -0
  560. polyfile/pickles.py +45 -0
  561. polyfile/polyfile.py +409 -0
  562. polyfile/profiling.py +115 -0
  563. polyfile/repl.py +624 -0
  564. polyfile/search.py +310 -0
  565. polyfile/serialization.py +323 -0
  566. polyfile/structmatcher.py +46 -0
  567. polyfile/structs.py +281 -0
  568. polyfile/templates/download.js +162 -0
  569. polyfile/templates/hexdump.css +268 -0
  570. polyfile/templates/hexdump.js +756 -0
  571. polyfile/templates/jquery-3.4.1.min.js +2 -0
  572. polyfile/templates/template.html +119 -0
  573. polyfile/wildcards.py +62 -0
  574. polyfile/zipmatcher.py +183 -0
  575. polyfile_weave-0.5.5.dist-info/METADATA +173 -0
  576. polyfile_weave-0.5.5.dist-info/RECORD +585 -0
  577. polyfile_weave-0.5.5.dist-info/WHEEL +5 -0
  578. polyfile_weave-0.5.5.dist-info/entry_points.txt +2 -0
  579. polyfile_weave-0.5.5.dist-info/licenses/LICENSE +202 -0
  580. polyfile_weave-0.5.5.dist-info/top_level.txt +2 -0
  581. polymerge/__init__.py +1 -0
  582. polymerge/__main__.py +296 -0
  583. polymerge/cfg.py +127 -0
  584. polymerge/polymerge.py +227 -0
  585. polymerge/polytracker.py +190 -0
polymerge/polymerge.py ADDED
@@ -0,0 +1,227 @@
1
+ import copy
2
+ from collections import Counter, defaultdict
3
+ import heapq
4
+ import math
5
+ from statistics import stdev
6
+ from typing import Dict, Set, Tuple
7
+
8
+ from intervaltree import IntervalTree
9
+
10
+ from polyfile import logger, __version__
11
+
12
+ from . import polytracker
13
+ from . import cfg
14
+
15
+ log = logger.getStatusLogger("PolyMerge")
16
+
17
+
18
+ def _function_labels(merged: dict, labeling: Dict[str, Set[Tuple[str]]], ancestry: Tuple[str] = ()):
19
+ if 'type' in merged:
20
+ name = merged['type']
21
+ else:
22
+ name = merged['name']
23
+ label: Tuple[str] = ancestry + (name,)
24
+ for f in merged.get('functions', ()):
25
+ labeling[f].add(label)
26
+ for s in merged.get('subEls', ()):
27
+ _function_labels(s, labeling, ancestry=label)
28
+
29
+
30
+ def function_labels(merged_json_obj: dict) -> Dict[str, Set[Tuple[str]]]:
31
+ labels = defaultdict(set)
32
+ for merged in merged_json_obj['struc']:
33
+ _function_labels(merged, labels)
34
+ return labels
35
+
36
+
37
+ class Hashable:
38
+ def __init__(self, value):
39
+ self.value = value
40
+ self._hash = None
41
+
42
+ @staticmethod
43
+ def deephash(obj):
44
+ if isinstance(obj, dict):
45
+ return hash(tuple(Hashable.deephash(o) for o in sorted(obj.items())))
46
+ elif isinstance(obj, list) or isinstance(obj, tuple):
47
+ return hash(tuple(Hashable.deephash(o) for o in obj))
48
+ else:
49
+ return hash(obj)
50
+
51
+ def __hash__(self):
52
+ if self._hash is None:
53
+ self._hash = Hashable.deephash(self.value)
54
+ return self._hash
55
+
56
+ def __repr__(self):
57
+ return f"{self.__class__.__name__}(value={self.value!r})"
58
+
59
+
60
+ class IDHashable:
61
+ def __init__(self, value):
62
+ self.value = value
63
+
64
+ def __hash__(self):
65
+ return id(self.value)
66
+
67
+ def __repr__(self):
68
+ return f"{self.__class__.__name__}(value={self.value!r})"
69
+
70
+
71
+ def build_intervals(elem: dict, tree: IntervalTree = None):
72
+ if tree is None:
73
+ tree = IntervalTree()
74
+ if 'size' in elem:
75
+ elem_size = elem['size']
76
+ if elem_size > 0:
77
+ tree[elem['offset']:elem['offset']+elem_size] = elem
78
+ if 'subEls' in elem:
79
+ for child in elem['subEls']:
80
+ build_intervals(child, tree)
81
+ return tree
82
+
83
+
84
+ def shannon_entropy(data):
85
+ if not hasattr(data, '__len__'):
86
+ data = list(data)
87
+
88
+ if len(data) <= 1:
89
+ return 0
90
+
91
+ counts = Counter(data)
92
+
93
+ probabilities = [float(c) / len(data) for c in counts.values()]
94
+
95
+ return -sum(p * math.log(p, 2) for p in probabilities if p > 0.)
96
+
97
+
98
+ def _build_type_graph(graph: cfg.DiGraph, elem: dict, parent: str = None):
99
+ node_name = elem['type']
100
+ graph.add_node(node_name)
101
+ if parent is not None:
102
+ graph.add_edge(parent, node_name)
103
+ if 'subEls' in elem:
104
+ for child in elem['subEls']:
105
+ _build_type_graph(graph, child, node_name)
106
+
107
+
108
+ def polyfile_type_graph(polyfile_json_obj: dict) -> cfg.DiGraph:
109
+ graph = cfg.DiGraph()
110
+ roots = []
111
+ for match in polyfile_json_obj['struc']:
112
+ roots.append(match['type'])
113
+ _build_type_graph(graph, match)
114
+ graph.set_roots(roots)
115
+ return graph
116
+
117
+
118
+ def _filter_function_matches(
119
+ type_dominators: cfg.DAG,
120
+ node: str,
121
+ matches: dict,
122
+ disallowed: Dict[str, int],
123
+ depth: int = 0):
124
+ if node in matches:
125
+ orig_matches = matches[node]
126
+ for disallowed_depth in range(depth, -1, -1):
127
+ matches[node] = [
128
+ func for func in orig_matches if func not in disallowed or disallowed[func] >= disallowed_depth
129
+ ]
130
+ if matches[node]:
131
+ break
132
+ for func in matches[node]:
133
+ if func not in disallowed:
134
+ disallowed[func] = depth
135
+ for child in type_dominators.successors(node):
136
+ _filter_function_matches(type_dominators, child, matches, disallowed, depth + 1)
137
+
138
+
139
+ def filter_function_matches(type_dominators: cfg.DAG, matches: dict):
140
+ for root in type_dominators.roots:
141
+ _filter_function_matches(type_dominators, root, matches, {})
142
+
143
+
144
+ def merge(polyfile_json_obj: dict, program_trace: polytracker.ProgramTrace) -> dict:
145
+ ret = copy.deepcopy(polyfile_json_obj)
146
+ if 'versions' in ret:
147
+ ret['versions']['polymerge'] = __version__
148
+ else:
149
+ ret['versions'] = {'polymerge': __version__}
150
+ intervals = None
151
+ for match in ret['struc']:
152
+ intervals = build_intervals(match, tree=intervals)
153
+ matches = defaultdict(set)
154
+ elems_by_function = defaultdict(set)
155
+ functions_by_type = defaultdict(set)
156
+ elems_by_type = defaultdict(set)
157
+ ret['versions']['polytracker'] = '.'.join(map(str, program_trace.polytracker_version))
158
+ # The following code assumes that taint was tracked from a single input file.
159
+ if log.isEnabledFor(logger.STATUS):
160
+ total_bytes = 0
161
+ for function_info in program_trace.functions.values():
162
+ for _, tainted_bytes in function_info.items():
163
+ total_bytes += len(tainted_bytes)
164
+ progress = 0
165
+ for function_name, function_info in program_trace.functions.items():
166
+ if log.isEnabledFor(logger.STATUS):
167
+ function_bytes = sum(len(tainted_bytes) for _, tainted_bytes in function_info.items())#.cmp_bytes.items())
168
+ function_progress = 0
169
+ function_percent = -1
170
+ for input_source, tainted_bytes in function_info.items():#cmp_bytes.items():
171
+ for offset in tainted_bytes:
172
+ if log.isEnabledFor(logger.STATUS):
173
+ progress += 1
174
+ function_progress += 1
175
+ last_percent = function_percent
176
+ function_percent = int((function_progress / function_bytes) * 100.0)
177
+ if function_percent > last_percent:
178
+ log.status(f"{(progress / total_bytes) * 100.0:.2f}% processing function {function_name}... ({function_percent}%)")
179
+ for interval in intervals[offset]:
180
+ elem = IDHashable(interval.data)
181
+ elems_by_function[function_name].add(elem)
182
+ elem_type = elem.value['type']
183
+ functions_by_type[elem_type].add(function_name)
184
+ elems_by_type[elem_type].add(elem)
185
+ matches[elem].add(function_name)
186
+ log.clear_status()
187
+ dominator_tree = program_trace.cfg.dominator_forest
188
+ ret['best_function_matches'] = {}
189
+ for elem_type, elems in elems_by_type.items():
190
+ # find the function that is most specialized in operating on elems of this type:
191
+ specialization = [
192
+ (shannon_entropy(elem.value['type'] for elem in elems_by_function[func]), func)
193
+ for func in functions_by_type[elem_type]
194
+ ]
195
+ if not specialization:
196
+ continue
197
+ elif len(specialization) == 1:
198
+ func_matches = [specialization[0][1]]
199
+ else:
200
+ std_dev = stdev(entropy for entropy, _ in specialization)
201
+ heapq.heapify(specialization)
202
+ best_value, best_match_func = heapq.heappop(specialization)
203
+ value_threshold = best_value + std_dev
204
+ func_matches = [best_match_func]
205
+ while specialization:
206
+ best_value, best_match_func = heapq.heappop(specialization)
207
+ if best_value > value_threshold:
208
+ break
209
+ func_matches.append(best_match_func)
210
+ # now choose the functions that are roots in the vertex-induced subgraph of the CFG dominator tree:
211
+ ret['best_function_matches'][elem_type] = [
212
+ root.name
213
+ for root in cfg.roots(
214
+ dominator_tree.vertex_induced_subgraph(program_trace.functions[func] for func in func_matches)
215
+ )
216
+ ]
217
+ # finally, remove redundant functions in the best matches based upon the semantic hierarchy:
218
+ # first step in that is to build the dominator tree of the PolyFile hierarchy:
219
+ type_dominators: cfg.DAG = polyfile_type_graph(polyfile_json_obj).dominator_forest
220
+ # for each type in the 'best_function_matches' mapping, only include a function if that function is not
221
+ # included for any ancestor of the type in `type_dominators`
222
+ filter_function_matches(type_dominators, ret['best_function_matches'])
223
+ for elem, functions in matches.items():
224
+ elem.value['functions'] = list(functions)
225
+ return ret
226
+
227
+
@@ -0,0 +1,190 @@
1
+ from collections import defaultdict
2
+ from typing import Dict, Iterable, List, Set, Tuple
3
+
4
+ from polyfile import logger
5
+
6
+ from .cfg import CFG
7
+
8
+ log = logger.getStatusLogger('PolyTracker')
9
+
10
+
11
+ class FunctionInfo:
12
+ def __init__(self, name: str, cmp_bytes: Dict[str, List[int]], input_bytes: Dict[str, List[int]] = None, called_from: Iterable[str] = ()):
13
+ self.name = name
14
+ self.called_from = frozenset(called_from)
15
+ self.cmp_bytes = cmp_bytes
16
+ if input_bytes is None:
17
+ self.input_bytes = cmp_bytes
18
+ else:
19
+ self.input_bytes = input_bytes
20
+
21
+ @property
22
+ def taint_sources(self) -> Set[str]:
23
+ return self.input_bytes.keys()
24
+
25
+ def __getitem__(self, input_source_name):
26
+ return self.input_bytes[input_source_name]
27
+
28
+ def __iter__(self):
29
+ return self.taint_sources
30
+
31
+ def items(self):
32
+ return self.input_bytes.items()
33
+
34
+ def __hash__(self):
35
+ return hash(self.name)
36
+
37
+ def __str__(self):
38
+ return self.name
39
+
40
+ def __repr__(self):
41
+ return f"{self.__class__.__name__}(name={self.name!r}, cmp_bytes={self.cmp_bytes!r}, input_bytes={self.input_bytes!r}, called_from={self.called_from!r})"
42
+
43
+
44
+ class ProgramTrace:
45
+ def __init__(self, polytracker_version: tuple, function_data: Iterable[FunctionInfo]):
46
+ self.polytracker_version = polytracker_version
47
+ self.functions: Dict[str, FunctionInfo] = {f.name: f for f in function_data}
48
+ self._cfg = None
49
+
50
+ @property
51
+ def cfg(self) -> CFG:
52
+ if self._cfg is not None:
53
+ return self._cfg
54
+ self._cfg = CFG(self)
55
+ self._cfg.add_nodes_from(self.functions.values())
56
+ for f in list(self.functions.values()):
57
+ for caller in f.called_from:
58
+ if caller not in self.functions:
59
+ info = FunctionInfo(caller, {})
60
+ self.functions[caller] = info
61
+ self._cfg.add_node(info)
62
+ self._cfg.add_edge(info, f)
63
+ else:
64
+ self._cfg.add_edge(self.functions[caller], f)
65
+ return self._cfg
66
+
67
+ def __repr__(self):
68
+ return f"{self.__class__.__name__}(polytracker_version={self.polytracker_version!r}, function_data={list(self.functions.values())!r})"
69
+
70
+
71
+ POLYTRACKER_JSON_FORMATS = []
72
+
73
+
74
+ def normalize_version(*version) -> Tuple[str]:
75
+ version = tuple(str(v) for v in version)
76
+ version = tuple(version) + ('0',) * (3 - len(version))
77
+ version = tuple(version) + ('',) * (4 - len(version))
78
+ return version
79
+
80
+
81
+ def polytracker_version(*version):
82
+ def wrapper(func):
83
+ POLYTRACKER_JSON_FORMATS.append((normalize_version(*version), func))
84
+ POLYTRACKER_JSON_FORMATS.sort(reverse=True)
85
+ return func
86
+ return wrapper
87
+
88
+
89
+ def parse(polytracker_json_obj: dict) -> ProgramTrace:
90
+ if 'version' in polytracker_json_obj:
91
+ version = normalize_version(*polytracker_json_obj['version'].split('.'))
92
+ if len(version) > 4:
93
+ log.warn(f"Unexpectedly long PolyTracker version: {polytracker_json_obj['version']!r}")
94
+ for i, (known_version, parser) in enumerate(POLYTRACKER_JSON_FORMATS):
95
+ # POLYTRACKER_JSON_FORMATS is auto-sorted in decreasing order
96
+ if version >= known_version:
97
+ if i == 0 and version > known_version:
98
+ log.warn(f"PolyTracker version {polytracker_json_obj['version']!r} is newer than the latest supported by PolyMerge ({'.'.join(known_version)})")
99
+ return parser(polytracker_json_obj)
100
+ raise ValueError(f"Unsupported PolyTracker version {polytracker_json_obj['version']!r}")
101
+ for function_name, function_data in polytracker_json_obj.items():
102
+ if isinstance(function_data, dict) and 'called_from' in function_data:
103
+ # this is the second version of the output format
104
+ return parse_format_v2(polytracker_json_obj)
105
+ else:
106
+ return parse_format_v1(polytracker_json_obj)
107
+
108
+
109
+ @polytracker_version(0, 0, 1, '')
110
+ def parse_format_v1(polytracker_json_obj: dict) -> ProgramTrace:
111
+ return ProgramTrace(
112
+ polytracker_version=(0, 0, 1),
113
+ function_data=[FunctionInfo(
114
+ function_name,
115
+ {None: taint_bytes}
116
+ ) for function_name, taint_bytes in polytracker_json_obj.items()
117
+ ]
118
+ )
119
+
120
+
121
+ @polytracker_version(0, 0, 1, 'alpha2.1')
122
+ def parse_format_v2(polytracker_json_obj: dict) -> ProgramTrace:
123
+ function_data = []
124
+ for function_name, data in polytracker_json_obj.items():
125
+ if 'input_bytes' not in data:
126
+ if 'cmp_bytes' in data:
127
+ input_bytes = data['cmp_bytes']
128
+ else:
129
+ input_bytes = {}
130
+ else:
131
+ input_bytes = data['input_bytes']
132
+ if 'cmp_bytes' in data:
133
+ cmp_bytes = data['cmp_bytes']
134
+ else:
135
+ cmp_bytes = input_bytes
136
+ if 'called_from' in data:
137
+ called_from = data['called_from']
138
+ else:
139
+ called_from = ()
140
+ function_data.append(FunctionInfo(
141
+ name=function_name,
142
+ cmp_bytes=cmp_bytes,
143
+ input_bytes=input_bytes,
144
+ called_from=called_from
145
+ ))
146
+ return ProgramTrace(
147
+ polytracker_version=(0, 0, 1, 'alpha2.1'),
148
+ function_data=function_data
149
+ )
150
+
151
+
152
+ @polytracker_version(1, 0, 1)
153
+ def parse_format_v3(polytracker_json_obj: dict) -> ProgramTrace:
154
+ version = polytracker_json_obj['version'].split('.')
155
+ function_data = []
156
+ tainted_functions = set()
157
+ for function_name, data in polytracker_json_obj['tainted_functions'].items():
158
+ if 'input_bytes' not in data:
159
+ if 'cmp_bytes' in data:
160
+ input_bytes = data['cmp_bytes']
161
+ else:
162
+ input_bytes = {}
163
+ else:
164
+ input_bytes = data['input_bytes']
165
+ if 'cmp_bytes' in data:
166
+ cmp_bytes = data['cmp_bytes']
167
+ else:
168
+ cmp_bytes = input_bytes
169
+ if function_name in polytracker_json_obj['runtime_cfg']:
170
+ called_from = frozenset(polytracker_json_obj['runtime_cfg'][function_name])
171
+ else:
172
+ called_from = frozenset()
173
+ function_data.append(FunctionInfo(
174
+ name=function_name,
175
+ cmp_bytes=cmp_bytes,
176
+ input_bytes=input_bytes,
177
+ called_from=called_from
178
+ ))
179
+ tainted_functions.add(function_name)
180
+ # Add any additional functions from the CFG that didn't operate on tainted bytes
181
+ for function_name in polytracker_json_obj['runtime_cfg'].keys() - tainted_functions:
182
+ function_data.append(FunctionInfo(
183
+ name=function_name,
184
+ cmp_bytes={},
185
+ called_from=polytracker_json_obj['runtime_cfg'][function_name]
186
+ ))
187
+ return ProgramTrace(
188
+ polytracker_version=version,
189
+ function_data=function_data
190
+ )