contrast-agent 3.8.4

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.
Files changed (500) hide show
  1. checksums.yaml +7 -0
  2. data/.clang-format +5 -0
  3. data/.dockerignore +10 -0
  4. data/.gitignore +58 -0
  5. data/.gitmodules +6 -0
  6. data/.rspec +6 -0
  7. data/.simplecov +4 -0
  8. data/Gemfile +7 -0
  9. data/LICENSE.txt +12 -0
  10. data/Rakefile +15 -0
  11. data/exe/contrast_service +29 -0
  12. data/ext/build_funchook.rb +48 -0
  13. data/ext/cs__assess_active_record_named/cs__active_record_named.c +47 -0
  14. data/ext/cs__assess_active_record_named/cs__active_record_named.h +10 -0
  15. data/ext/cs__assess_active_record_named/extconf.rb +2 -0
  16. data/ext/cs__assess_array/cs__assess_array.c +38 -0
  17. data/ext/cs__assess_array/cs__assess_array.h +9 -0
  18. data/ext/cs__assess_array/extconf.rb +2 -0
  19. data/ext/cs__assess_basic_object/cs__assess_basic_object.c +50 -0
  20. data/ext/cs__assess_basic_object/cs__assess_basic_object.h +17 -0
  21. data/ext/cs__assess_basic_object/extconf.rb +2 -0
  22. data/ext/cs__assess_fiber_track/cs__assess_fiber_track.c +86 -0
  23. data/ext/cs__assess_fiber_track/cs__assess_fiber_track.h +34 -0
  24. data/ext/cs__assess_fiber_track/extconf.rb +2 -0
  25. data/ext/cs__assess_hash/cs__assess_hash.c +64 -0
  26. data/ext/cs__assess_hash/cs__assess_hash.h +24 -0
  27. data/ext/cs__assess_hash/extconf.rb +2 -0
  28. data/ext/cs__assess_kernel/cs__assess_kernel.c +36 -0
  29. data/ext/cs__assess_kernel/cs__assess_kernel.h +10 -0
  30. data/ext/cs__assess_kernel/extconf.rb +2 -0
  31. data/ext/cs__assess_marshal_module/cs__assess_marshal_module.c +47 -0
  32. data/ext/cs__assess_marshal_module/cs__assess_marshal_module.h +18 -0
  33. data/ext/cs__assess_marshal_module/extconf.rb +2 -0
  34. data/ext/cs__assess_module/cs__assess_module.c +78 -0
  35. data/ext/cs__assess_module/cs__assess_module.h +25 -0
  36. data/ext/cs__assess_module/extconf.rb +2 -0
  37. data/ext/cs__assess_regexp/cs__assess_regexp.c +48 -0
  38. data/ext/cs__assess_regexp/cs__assess_regexp.h +22 -0
  39. data/ext/cs__assess_regexp/extconf.rb +2 -0
  40. data/ext/cs__assess_regexp_track/cs__assess_regexp_track.c +63 -0
  41. data/ext/cs__assess_regexp_track/cs__assess_regexp_track.h +29 -0
  42. data/ext/cs__assess_regexp_track/extconf.rb +2 -0
  43. data/ext/cs__assess_string/cs__assess_string.c +38 -0
  44. data/ext/cs__assess_string/cs__assess_string.h +19 -0
  45. data/ext/cs__assess_string/extconf.rb +2 -0
  46. data/ext/cs__assess_string_interpolation26/cs__assess_string_interpolation26.c +31 -0
  47. data/ext/cs__assess_string_interpolation26/cs__assess_string_interpolation26.h +13 -0
  48. data/ext/cs__assess_string_interpolation26/extconf.rb +2 -0
  49. data/ext/cs__common/cs__common.c +60 -0
  50. data/ext/cs__common/cs__common.h +28 -0
  51. data/ext/cs__common/extconf.rb +20 -0
  52. data/ext/cs__contrast_patch/cs__contrast_patch.c +445 -0
  53. data/ext/cs__contrast_patch/cs__contrast_patch.h +196 -0
  54. data/ext/cs__contrast_patch/extconf.rb +2 -0
  55. data/ext/cs__protect_kernel/cs__protect_kernel.c +37 -0
  56. data/ext/cs__protect_kernel/cs__protect_kernel.h +11 -0
  57. data/ext/cs__protect_kernel/extconf.rb +2 -0
  58. data/ext/cs__scope/cs__scope.c +96 -0
  59. data/ext/cs__scope/cs__scope.h +33 -0
  60. data/ext/cs__scope/extconf.rb +2 -0
  61. data/ext/extconf_common.rb +49 -0
  62. data/funchook/LICENSE +360 -0
  63. data/funchook/Makefile +29 -0
  64. data/funchook/Makefile.in +29 -0
  65. data/funchook/README.md +121 -0
  66. data/funchook/appveyor.yml +42 -0
  67. data/funchook/autogen.sh +3 -0
  68. data/funchook/autom4te.cache/output.0 +4976 -0
  69. data/funchook/autom4te.cache/requests +78 -0
  70. data/funchook/autom4te.cache/traces.0 +364 -0
  71. data/funchook/config.guess +1530 -0
  72. data/funchook/config.log +490 -0
  73. data/funchook/config.status +1016 -0
  74. data/funchook/config.sub +1773 -0
  75. data/funchook/configure +4976 -0
  76. data/funchook/configure.ac +59 -0
  77. data/funchook/distorm/COPYING +26 -0
  78. data/funchook/distorm/MANIFEST +25 -0
  79. data/funchook/distorm/MANIFEST.in +4 -0
  80. data/funchook/distorm/README.md +12 -0
  81. data/funchook/distorm/disOps/disOps.py +795 -0
  82. data/funchook/distorm/disOps/x86db.py +404 -0
  83. data/funchook/distorm/disOps/x86header.py +247 -0
  84. data/funchook/distorm/disOps/x86sets.py +1664 -0
  85. data/funchook/distorm/examples/cs/TestdiStorm/Program.cs +79 -0
  86. data/funchook/distorm/examples/cs/TestdiStorm/Properties/AssemblyInfo.cs +36 -0
  87. data/funchook/distorm/examples/cs/TestdiStorm/TestdiStorm.csproj +69 -0
  88. data/funchook/distorm/examples/cs/distorm-net.sln +26 -0
  89. data/funchook/distorm/examples/cs/distorm-net/CodeInfo.cs +23 -0
  90. data/funchook/distorm/examples/cs/distorm-net/DecodedInst.cs +15 -0
  91. data/funchook/distorm/examples/cs/distorm-net/DecodedResult.cs +14 -0
  92. data/funchook/distorm/examples/cs/distorm-net/DecomposedInst.cs +36 -0
  93. data/funchook/distorm/examples/cs/distorm-net/DecomposedResult.cs +14 -0
  94. data/funchook/distorm/examples/cs/distorm-net/Opcodes.cs +1268 -0
  95. data/funchook/distorm/examples/cs/distorm-net/Opcodes.tt +37 -0
  96. data/funchook/distorm/examples/cs/distorm-net/Operand.cs +25 -0
  97. data/funchook/distorm/examples/cs/distorm-net/Properties/AssemblyInfo.cs +36 -0
  98. data/funchook/distorm/examples/cs/distorm-net/diStorm3.cs +411 -0
  99. data/funchook/distorm/examples/cs/distorm-net/distorm-net.csproj +80 -0
  100. data/funchook/distorm/examples/cs/readme +3 -0
  101. data/funchook/distorm/examples/ddk/README +48 -0
  102. data/funchook/distorm/examples/ddk/distorm.ini +11 -0
  103. data/funchook/distorm/examples/ddk/dummy.c +15 -0
  104. data/funchook/distorm/examples/ddk/main.c +91 -0
  105. data/funchook/distorm/examples/ddk/makefile +1 -0
  106. data/funchook/distorm/examples/ddk/sources +10 -0
  107. data/funchook/distorm/examples/java/Makefile +23 -0
  108. data/funchook/distorm/examples/java/distorm/src/Main.java +43 -0
  109. data/funchook/distorm/examples/java/distorm/src/diStorm3/CodeInfo.java +27 -0
  110. data/funchook/distorm/examples/java/distorm/src/diStorm3/DecodedInst.java +32 -0
  111. data/funchook/distorm/examples/java/distorm/src/diStorm3/DecodedResult.java +11 -0
  112. data/funchook/distorm/examples/java/distorm/src/diStorm3/DecomposedInst.java +89 -0
  113. data/funchook/distorm/examples/java/distorm/src/diStorm3/DecomposedResult.java +11 -0
  114. data/funchook/distorm/examples/java/distorm/src/diStorm3/OpcodeEnum.java +131 -0
  115. data/funchook/distorm/examples/java/distorm/src/diStorm3/Opcodes.java +1123 -0
  116. data/funchook/distorm/examples/java/distorm/src/diStorm3/Operand.java +24 -0
  117. data/funchook/distorm/examples/java/distorm/src/diStorm3/distorm3.java +41 -0
  118. data/funchook/distorm/examples/java/jdistorm.c +405 -0
  119. data/funchook/distorm/examples/java/jdistorm.h +40 -0
  120. data/funchook/distorm/examples/java/jdistorm.sln +20 -0
  121. data/funchook/distorm/examples/java/jdistorm.vcproj +208 -0
  122. data/funchook/distorm/examples/linux/Makefile +15 -0
  123. data/funchook/distorm/examples/linux/main.c +181 -0
  124. data/funchook/distorm/examples/tests/Makefile +15 -0
  125. data/funchook/distorm/examples/tests/main.cpp +42 -0
  126. data/funchook/distorm/examples/tests/main.py +66 -0
  127. data/funchook/distorm/examples/tests/test_distorm3.py +1672 -0
  128. data/funchook/distorm/examples/tests/tests.sln +20 -0
  129. data/funchook/distorm/examples/tests/tests.vcxproj +82 -0
  130. data/funchook/distorm/examples/tests/tests.vcxproj.filters +22 -0
  131. data/funchook/distorm/examples/win32/disasm.sln +25 -0
  132. data/funchook/distorm/examples/win32/disasm.vcxproj +201 -0
  133. data/funchook/distorm/examples/win32/disasm.vcxproj.filters +14 -0
  134. data/funchook/distorm/examples/win32/main.cpp +163 -0
  135. data/funchook/distorm/include/distorm.h +482 -0
  136. data/funchook/distorm/include/mnemonics.h +301 -0
  137. data/funchook/distorm/make/linux/Makefile +28 -0
  138. data/funchook/distorm/make/mac/Makefile +24 -0
  139. data/funchook/distorm/make/win32/cdistorm.vcxproj +239 -0
  140. data/funchook/distorm/make/win32/cdistorm.vcxproj.filters +80 -0
  141. data/funchook/distorm/make/win32/distorm.sln +25 -0
  142. data/funchook/distorm/make/win32/resource.h +14 -0
  143. data/funchook/distorm/make/win32/resource.rc +99 -0
  144. data/funchook/distorm/python/distorm3/__init__.py +957 -0
  145. data/funchook/distorm/python/distorm3/sample.py +51 -0
  146. data/funchook/distorm/setup.cfg +10 -0
  147. data/funchook/distorm/setup.py +266 -0
  148. data/funchook/distorm/src/config.h +169 -0
  149. data/funchook/distorm/src/decoder.c +641 -0
  150. data/funchook/distorm/src/decoder.h +33 -0
  151. data/funchook/distorm/src/distorm.c +413 -0
  152. data/funchook/distorm/src/instructions.c +597 -0
  153. data/funchook/distorm/src/instructions.h +463 -0
  154. data/funchook/distorm/src/insts.c +7939 -0
  155. data/funchook/distorm/src/insts.h +64 -0
  156. data/funchook/distorm/src/mnemonics.c +284 -0
  157. data/funchook/distorm/src/operands.c +1290 -0
  158. data/funchook/distorm/src/operands.h +28 -0
  159. data/funchook/distorm/src/prefix.c +368 -0
  160. data/funchook/distorm/src/prefix.h +64 -0
  161. data/funchook/distorm/src/textdefs.c +172 -0
  162. data/funchook/distorm/src/textdefs.h +57 -0
  163. data/funchook/distorm/src/wstring.c +47 -0
  164. data/funchook/distorm/src/wstring.h +35 -0
  165. data/funchook/distorm/src/x86defs.h +82 -0
  166. data/funchook/include/funchook.h +123 -0
  167. data/funchook/install-sh +527 -0
  168. data/funchook/src/Makefile +70 -0
  169. data/funchook/src/Makefile.in +70 -0
  170. data/funchook/src/__strerror.h +109 -0
  171. data/funchook/src/config.h +101 -0
  172. data/funchook/src/config.h.in +100 -0
  173. data/funchook/src/decoder.o +0 -0
  174. data/funchook/src/distorm.o +0 -0
  175. data/funchook/src/funchook.c +440 -0
  176. data/funchook/src/funchook.o +0 -0
  177. data/funchook/src/funchook_internal.h +155 -0
  178. data/funchook/src/funchook_io.c +182 -0
  179. data/funchook/src/funchook_io.h +64 -0
  180. data/funchook/src/funchook_io.o +0 -0
  181. data/funchook/src/funchook_syscall.S +134 -0
  182. data/funchook/src/funchook_syscall.o +0 -0
  183. data/funchook/src/funchook_unix.c +480 -0
  184. data/funchook/src/funchook_unix.o +0 -0
  185. data/funchook/src/funchook_windows.c +397 -0
  186. data/funchook/src/funchook_x86.c +622 -0
  187. data/funchook/src/funchook_x86.o +0 -0
  188. data/funchook/src/instructions.o +0 -0
  189. data/funchook/src/insts.o +0 -0
  190. data/funchook/src/libfunchook.so +0 -0
  191. data/funchook/src/mnemonics.o +0 -0
  192. data/funchook/src/operands.o +0 -0
  193. data/funchook/src/os_func.c +115 -0
  194. data/funchook/src/os_func.h +75 -0
  195. data/funchook/src/os_func.o +0 -0
  196. data/funchook/src/os_func_unix.c +94 -0
  197. data/funchook/src/os_func_unix.o +0 -0
  198. data/funchook/src/os_func_windows.c +32 -0
  199. data/funchook/src/prefix.o +0 -0
  200. data/funchook/src/printf_base.c +1688 -0
  201. data/funchook/src/printf_base.h +46 -0
  202. data/funchook/src/printf_base.o +0 -0
  203. data/funchook/src/textdefs.o +0 -0
  204. data/funchook/src/wstring.o +0 -0
  205. data/funchook/test/Makefile +43 -0
  206. data/funchook/test/Makefile.in +43 -0
  207. data/funchook/test/funchook_test +0 -0
  208. data/funchook/test/libfunchook_test.c +25 -0
  209. data/funchook/test/libfunchook_test.so +0 -0
  210. data/funchook/test/libfunchook_test2.c +18 -0
  211. data/funchook/test/suffix.list +600 -0
  212. data/funchook/test/test_main.c +430 -0
  213. data/funchook/test/test_main.o +0 -0
  214. data/funchook/test/x86_64_test.S +10 -0
  215. data/funchook/test/x86_64_test.o +0 -0
  216. data/funchook/test/x86_test.S +339 -0
  217. data/funchook/win32/config.h +1 -0
  218. data/funchook/win32/funchook.sln +52 -0
  219. data/funchook/win32/funchook.vcxproj +188 -0
  220. data/funchook/win32/funchook.vcxproj.filters +84 -0
  221. data/funchook/win32/funchook_test.vcxproj +170 -0
  222. data/funchook/win32/funchook_test.vcxproj.filters +22 -0
  223. data/funchook/win32/funchook_test_dll.vcxproj +184 -0
  224. data/funchook/win32/funchook_test_dll.vcxproj.filters +30 -0
  225. data/funchook/win32/funchook_test_exe.def +3 -0
  226. data/lib/contrast-agent.rb +8 -0
  227. data/lib/contrast.rb +57 -0
  228. data/lib/contrast/agent.rb +80 -0
  229. data/lib/contrast/agent/assess.rb +45 -0
  230. data/lib/contrast/agent/assess/adjusted_span.rb +25 -0
  231. data/lib/contrast/agent/assess/class_reverter.rb +82 -0
  232. data/lib/contrast/agent/assess/contrast_event.rb +398 -0
  233. data/lib/contrast/agent/assess/frozen_properties.rb +41 -0
  234. data/lib/contrast/agent/assess/insulator.rb +53 -0
  235. data/lib/contrast/agent/assess/policy/dynamic_source_factory.rb +78 -0
  236. data/lib/contrast/agent/assess/policy/patcher.rb +85 -0
  237. data/lib/contrast/agent/assess/policy/policy.rb +116 -0
  238. data/lib/contrast/agent/assess/policy/policy_node.rb +289 -0
  239. data/lib/contrast/agent/assess/policy/policy_scanner.rb +44 -0
  240. data/lib/contrast/agent/assess/policy/preshift.rb +94 -0
  241. data/lib/contrast/agent/assess/policy/propagation_method.rb +260 -0
  242. data/lib/contrast/agent/assess/policy/propagation_node.rb +127 -0
  243. data/lib/contrast/agent/assess/policy/propagator.rb +35 -0
  244. data/lib/contrast/agent/assess/policy/propagator/append.rb +54 -0
  245. data/lib/contrast/agent/assess/policy/propagator/base.rb +37 -0
  246. data/lib/contrast/agent/assess/policy/propagator/center.rb +73 -0
  247. data/lib/contrast/agent/assess/policy/propagator/custom.rb +36 -0
  248. data/lib/contrast/agent/assess/policy/propagator/database_write.rb +62 -0
  249. data/lib/contrast/agent/assess/policy/propagator/insert.rb +55 -0
  250. data/lib/contrast/agent/assess/policy/propagator/keep.rb +26 -0
  251. data/lib/contrast/agent/assess/policy/propagator/next.rb +42 -0
  252. data/lib/contrast/agent/assess/policy/propagator/prepend.rb +50 -0
  253. data/lib/contrast/agent/assess/policy/propagator/remove.rb +76 -0
  254. data/lib/contrast/agent/assess/policy/propagator/replace.rb +27 -0
  255. data/lib/contrast/agent/assess/policy/propagator/reverse.rb +38 -0
  256. data/lib/contrast/agent/assess/policy/propagator/select.rb +86 -0
  257. data/lib/contrast/agent/assess/policy/propagator/splat.rb +60 -0
  258. data/lib/contrast/agent/assess/policy/propagator/split.rb +49 -0
  259. data/lib/contrast/agent/assess/policy/propagator/substitution.rb +169 -0
  260. data/lib/contrast/agent/assess/policy/propagator/trim.rb +81 -0
  261. data/lib/contrast/agent/assess/policy/rewriter_patch.rb +79 -0
  262. data/lib/contrast/agent/assess/policy/source_method.rb +209 -0
  263. data/lib/contrast/agent/assess/policy/source_node.rb +62 -0
  264. data/lib/contrast/agent/assess/policy/trigger_method.rb +209 -0
  265. data/lib/contrast/agent/assess/policy/trigger_node.rb +198 -0
  266. data/lib/contrast/agent/assess/policy/trigger_validation/ssrf_validator.rb +77 -0
  267. data/lib/contrast/agent/assess/policy/trigger_validation/trigger_validation.rb +31 -0
  268. data/lib/contrast/agent/assess/policy/trigger_validation/xss_validator.rb +40 -0
  269. data/lib/contrast/agent/assess/properties.rb +392 -0
  270. data/lib/contrast/agent/assess/rule.rb +18 -0
  271. data/lib/contrast/agent/assess/rule/base.rb +72 -0
  272. data/lib/contrast/agent/assess/rule/csrf.rb +66 -0
  273. data/lib/contrast/agent/assess/rule/csrf/csrf_action.rb +28 -0
  274. data/lib/contrast/agent/assess/rule/csrf/csrf_applicator.rb +69 -0
  275. data/lib/contrast/agent/assess/rule/csrf/csrf_watcher.rb +132 -0
  276. data/lib/contrast/agent/assess/rule/provider.rb +21 -0
  277. data/lib/contrast/agent/assess/rule/provider/hardcoded_key.rb +62 -0
  278. data/lib/contrast/agent/assess/rule/provider/hardcoded_password.rb +73 -0
  279. data/lib/contrast/agent/assess/rule/provider/hardcoded_value_rule.rb +121 -0
  280. data/lib/contrast/agent/assess/rule/redos.rb +68 -0
  281. data/lib/contrast/agent/assess/rule/response_scanning_rule.rb +47 -0
  282. data/lib/contrast/agent/assess/rule/response_watcher.rb +36 -0
  283. data/lib/contrast/agent/assess/rule/watcher.rb +36 -0
  284. data/lib/contrast/agent/assess/tag.rb +151 -0
  285. data/lib/contrast/agent/at_exit_hook.rb +33 -0
  286. data/lib/contrast/agent/class_reopener.rb +195 -0
  287. data/lib/contrast/agent/deadzone/policy/deadzone_node.rb +26 -0
  288. data/lib/contrast/agent/deadzone/policy/policy.rb +57 -0
  289. data/lib/contrast/agent/disable_reaction.rb +24 -0
  290. data/lib/contrast/agent/exclusion_matcher.rb +190 -0
  291. data/lib/contrast/agent/feature_state.rb +379 -0
  292. data/lib/contrast/agent/inventory/policy/policy.rb +32 -0
  293. data/lib/contrast/agent/inventory/policy/trigger_node.rb +22 -0
  294. data/lib/contrast/agent/logger_manager.rb +116 -0
  295. data/lib/contrast/agent/middleware.rb +352 -0
  296. data/lib/contrast/agent/module_data.rb +16 -0
  297. data/lib/contrast/agent/patching/policy/after_load_patch.rb +37 -0
  298. data/lib/contrast/agent/patching/policy/after_load_patcher.rb +58 -0
  299. data/lib/contrast/agent/patching/policy/method_policy.rb +94 -0
  300. data/lib/contrast/agent/patching/policy/module_policy.rb +116 -0
  301. data/lib/contrast/agent/patching/policy/patch.rb +312 -0
  302. data/lib/contrast/agent/patching/policy/patch_status.rb +192 -0
  303. data/lib/contrast/agent/patching/policy/patcher.rb +310 -0
  304. data/lib/contrast/agent/patching/policy/policy.rb +138 -0
  305. data/lib/contrast/agent/patching/policy/policy_node.rb +80 -0
  306. data/lib/contrast/agent/patching/policy/policy_unpatcher.rb +28 -0
  307. data/lib/contrast/agent/patching/policy/trigger_node.rb +81 -0
  308. data/lib/contrast/agent/protect/policy/policy.rb +37 -0
  309. data/lib/contrast/agent/protect/policy/trigger_node.rb +23 -0
  310. data/lib/contrast/agent/protect/rule.rb +58 -0
  311. data/lib/contrast/agent/protect/rule/base.rb +300 -0
  312. data/lib/contrast/agent/protect/rule/base_service.rb +88 -0
  313. data/lib/contrast/agent/protect/rule/cmd_injection.rb +156 -0
  314. data/lib/contrast/agent/protect/rule/csrf.rb +118 -0
  315. data/lib/contrast/agent/protect/rule/csrf/csrf_evaluator.rb +103 -0
  316. data/lib/contrast/agent/protect/rule/csrf/csrf_token_injector.rb +85 -0
  317. data/lib/contrast/agent/protect/rule/default_scanner.rb +300 -0
  318. data/lib/contrast/agent/protect/rule/deserialization.rb +193 -0
  319. data/lib/contrast/agent/protect/rule/http_method_tampering.rb +80 -0
  320. data/lib/contrast/agent/protect/rule/no_sqli.rb +101 -0
  321. data/lib/contrast/agent/protect/rule/no_sqli/mongo_no_sql_scanner.rb +40 -0
  322. data/lib/contrast/agent/protect/rule/path_traversal.rb +143 -0
  323. data/lib/contrast/agent/protect/rule/sqli.rb +101 -0
  324. data/lib/contrast/agent/protect/rule/sqli/default_sql_scanner.rb +16 -0
  325. data/lib/contrast/agent/protect/rule/sqli/mysql_sql_scanner.rb +38 -0
  326. data/lib/contrast/agent/protect/rule/sqli/postgres_sql_scanner.rb +22 -0
  327. data/lib/contrast/agent/protect/rule/sqli/sqlite_sql_scanner.rb +19 -0
  328. data/lib/contrast/agent/protect/rule/unsafe_file_upload.rb +20 -0
  329. data/lib/contrast/agent/protect/rule/xss.rb +24 -0
  330. data/lib/contrast/agent/protect/rule/xxe.rb +120 -0
  331. data/lib/contrast/agent/protect/rule/xxe/entity_wrapper.rb +82 -0
  332. data/lib/contrast/agent/railtie.rb +30 -0
  333. data/lib/contrast/agent/reaction_processor.rb +47 -0
  334. data/lib/contrast/agent/request.rb +493 -0
  335. data/lib/contrast/agent/request_context.rb +225 -0
  336. data/lib/contrast/agent/require_state.rb +61 -0
  337. data/lib/contrast/agent/response.rb +215 -0
  338. data/lib/contrast/agent/rewriter.rb +244 -0
  339. data/lib/contrast/agent/scope.rb +28 -0
  340. data/lib/contrast/agent/service_heartbeat.rb +37 -0
  341. data/lib/contrast/agent/settings_state.rb +148 -0
  342. data/lib/contrast/agent/socket_client.rb +125 -0
  343. data/lib/contrast/agent/thread.rb +26 -0
  344. data/lib/contrast/agent/tracepoint_hook.rb +51 -0
  345. data/lib/contrast/agent/version.rb +8 -0
  346. data/lib/contrast/api.rb +17 -0
  347. data/lib/contrast/api/.gitkeep +0 -0
  348. data/lib/contrast/api/connection_status.rb +49 -0
  349. data/lib/contrast/api/socket.rb +43 -0
  350. data/lib/contrast/api/speedracer.rb +206 -0
  351. data/lib/contrast/api/tcp_socket.rb +31 -0
  352. data/lib/contrast/api/unix_socket.rb +25 -0
  353. data/lib/contrast/common_agent_configuration.rb +86 -0
  354. data/lib/contrast/components/agent.rb +85 -0
  355. data/lib/contrast/components/app_context.rb +188 -0
  356. data/lib/contrast/components/assess.rb +67 -0
  357. data/lib/contrast/components/config.rb +135 -0
  358. data/lib/contrast/components/contrast_service.rb +113 -0
  359. data/lib/contrast/components/heap_dump.rb +34 -0
  360. data/lib/contrast/components/interface.rb +178 -0
  361. data/lib/contrast/components/inventory.rb +23 -0
  362. data/lib/contrast/components/logger.rb +92 -0
  363. data/lib/contrast/components/protect.rb +38 -0
  364. data/lib/contrast/components/sampling.rb +41 -0
  365. data/lib/contrast/components/scope.rb +106 -0
  366. data/lib/contrast/components/settings.rb +140 -0
  367. data/lib/contrast/config.rb +33 -0
  368. data/lib/contrast/config/agent_configuration.rb +24 -0
  369. data/lib/contrast/config/application_configuration.rb +27 -0
  370. data/lib/contrast/config/assess_configuration.rb +22 -0
  371. data/lib/contrast/config/assess_rules_configuration.rb +18 -0
  372. data/lib/contrast/config/base_configuration.rb +105 -0
  373. data/lib/contrast/config/default_value.rb +16 -0
  374. data/lib/contrast/config/exception_configuration.rb +21 -0
  375. data/lib/contrast/config/heap_dump_configuration.rb +23 -0
  376. data/lib/contrast/config/inventory_configuration.rb +20 -0
  377. data/lib/contrast/config/logger_configuration.rb +20 -0
  378. data/lib/contrast/config/protect_configuration.rb +20 -0
  379. data/lib/contrast/config/protect_rule_configuration.rb +37 -0
  380. data/lib/contrast/config/protect_rules_configuration.rb +30 -0
  381. data/lib/contrast/config/root_configuration.rb +26 -0
  382. data/lib/contrast/config/ruby_configuration.rb +39 -0
  383. data/lib/contrast/config/sampling_configuration.rb +22 -0
  384. data/lib/contrast/config/server_configuration.rb +23 -0
  385. data/lib/contrast/config/service_configuration.rb +22 -0
  386. data/lib/contrast/configuration.rb +214 -0
  387. data/lib/contrast/core_extensions/assess.rb +51 -0
  388. data/lib/contrast/core_extensions/assess/array.rb +58 -0
  389. data/lib/contrast/core_extensions/assess/assess_extension.rb +145 -0
  390. data/lib/contrast/core_extensions/assess/basic_object.rb +15 -0
  391. data/lib/contrast/core_extensions/assess/erb.rb +42 -0
  392. data/lib/contrast/core_extensions/assess/exec_trigger.rb +48 -0
  393. data/lib/contrast/core_extensions/assess/fiber.rb +125 -0
  394. data/lib/contrast/core_extensions/assess/hash.rb +22 -0
  395. data/lib/contrast/core_extensions/assess/kernel.rb +95 -0
  396. data/lib/contrast/core_extensions/assess/module.rb +14 -0
  397. data/lib/contrast/core_extensions/assess/regexp.rb +206 -0
  398. data/lib/contrast/core_extensions/assess/string.rb +75 -0
  399. data/lib/contrast/core_extensions/assess/tilt_template_trigger.rb +73 -0
  400. data/lib/contrast/core_extensions/delegator.rb +14 -0
  401. data/lib/contrast/core_extensions/eval_trigger.rb +52 -0
  402. data/lib/contrast/core_extensions/inventory.rb +22 -0
  403. data/lib/contrast/core_extensions/inventory/datastores.rb +37 -0
  404. data/lib/contrast/core_extensions/module.rb +42 -0
  405. data/lib/contrast/core_extensions/object.rb +27 -0
  406. data/lib/contrast/core_extensions/protect.rb +20 -0
  407. data/lib/contrast/core_extensions/protect/applies_command_injection_rule.rb +70 -0
  408. data/lib/contrast/core_extensions/protect/applies_deserialization_rule.rb +58 -0
  409. data/lib/contrast/core_extensions/protect/applies_no_sqli_rule.rb +81 -0
  410. data/lib/contrast/core_extensions/protect/applies_path_traversal_rule.rb +119 -0
  411. data/lib/contrast/core_extensions/protect/applies_sqli_rule.rb +63 -0
  412. data/lib/contrast/core_extensions/protect/applies_xxe_rule.rb +141 -0
  413. data/lib/contrast/core_extensions/protect/kernel.rb +30 -0
  414. data/lib/contrast/core_extensions/protect/psych.rb +7 -0
  415. data/lib/contrast/core_extensions/thread.rb +31 -0
  416. data/lib/contrast/internal_exception.rb +8 -0
  417. data/lib/contrast/rails_extensions/assess/action_controller_inheritance.rb +48 -0
  418. data/lib/contrast/rails_extensions/assess/active_record.rb +32 -0
  419. data/lib/contrast/rails_extensions/assess/active_record_named.rb +61 -0
  420. data/lib/contrast/rails_extensions/assess/configuration.rb +26 -0
  421. data/lib/contrast/rails_extensions/buffer.rb +30 -0
  422. data/lib/contrast/rails_extensions/rack.rb +45 -0
  423. data/lib/contrast/security_exception.rb +14 -0
  424. data/lib/contrast/sinatra_extensions/assess/cookie.rb +26 -0
  425. data/lib/contrast/sinatra_extensions/inventory/sinatra_base.rb +59 -0
  426. data/lib/contrast/tasks/service.rb +95 -0
  427. data/lib/contrast/utils/assess/sampling_util.rb +96 -0
  428. data/lib/contrast/utils/assess/tracking_util.rb +39 -0
  429. data/lib/contrast/utils/boolean_util.rb +33 -0
  430. data/lib/contrast/utils/cache.rb +69 -0
  431. data/lib/contrast/utils/class_util.rb +58 -0
  432. data/lib/contrast/utils/comment_range.rb +19 -0
  433. data/lib/contrast/utils/data_store_util.rb +23 -0
  434. data/lib/contrast/utils/duck_utils.rb +58 -0
  435. data/lib/contrast/utils/env_configuration_item.rb +52 -0
  436. data/lib/contrast/utils/environment_util.rb +152 -0
  437. data/lib/contrast/utils/freeze_util.rb +36 -0
  438. data/lib/contrast/utils/gemfile_reader.rb +191 -0
  439. data/lib/contrast/utils/hash_digest.rb +148 -0
  440. data/lib/contrast/utils/heap_dump_util.rb +113 -0
  441. data/lib/contrast/utils/invalid_configuration_util.rb +88 -0
  442. data/lib/contrast/utils/inventory_util.rb +126 -0
  443. data/lib/contrast/utils/io_util.rb +61 -0
  444. data/lib/contrast/utils/object_share.rb +117 -0
  445. data/lib/contrast/utils/operating_environment.rb +38 -0
  446. data/lib/contrast/utils/os.rb +49 -0
  447. data/lib/contrast/utils/path_util.rb +151 -0
  448. data/lib/contrast/utils/performs_logging.rb +152 -0
  449. data/lib/contrast/utils/preflight_util.rb +13 -0
  450. data/lib/contrast/utils/prevent_serialization.rb +52 -0
  451. data/lib/contrast/utils/rack_assess_session_cookie.rb +104 -0
  452. data/lib/contrast/utils/rails_assess_configuration.rb +95 -0
  453. data/lib/contrast/utils/random_util.rb +22 -0
  454. data/lib/contrast/utils/resource_loader.rb +23 -0
  455. data/lib/contrast/utils/ruby_ast_rewriter.rb +74 -0
  456. data/lib/contrast/utils/scope_util.rb +99 -0
  457. data/lib/contrast/utils/service_response_util.rb +116 -0
  458. data/lib/contrast/utils/service_sender_util.rb +98 -0
  459. data/lib/contrast/utils/sha256_builder.rb +69 -0
  460. data/lib/contrast/utils/sinatra_helper.rb +49 -0
  461. data/lib/contrast/utils/stack_trace_utils.rb +209 -0
  462. data/lib/contrast/utils/string_utils.rb +72 -0
  463. data/lib/contrast/utils/tag_util.rb +139 -0
  464. data/lib/contrast/utils/thread_tracker.rb +54 -0
  465. data/lib/contrast/utils/timer.rb +78 -0
  466. data/resources/assess/policy.json +1673 -0
  467. data/resources/csrf/inject.js +44 -0
  468. data/resources/deadzone/policy.json +55 -0
  469. data/resources/factory-bot-spec/spec_helper.rb +30 -0
  470. data/resources/inventory/policy.json +110 -0
  471. data/resources/protect/policy.json +417 -0
  472. data/resources/rubocops/kernel/catch_cop.rb +37 -0
  473. data/resources/rubocops/kernel/require_cop.rb +37 -0
  474. data/resources/rubocops/kernel/require_relative_cop.rb +33 -0
  475. data/resources/rubocops/module/autoload_cop.rb +37 -0
  476. data/resources/rubocops/module/const_defined_cop.rb +37 -0
  477. data/resources/rubocops/module/const_get_cop.rb +37 -0
  478. data/resources/rubocops/module/const_set_cop.rb +37 -0
  479. data/resources/rubocops/module/constants_cop.rb +37 -0
  480. data/resources/rubocops/module/name_cop.rb +37 -0
  481. data/resources/rubocops/object/class_cop.rb +37 -0
  482. data/resources/rubocops/object/freeze_cop.rb +37 -0
  483. data/resources/rubocops/object/frozen_cop.rb +37 -0
  484. data/resources/rubocops/object/is_a_cop.rb +37 -0
  485. data/resources/rubocops/object/method_cop.rb +37 -0
  486. data/resources/rubocops/object/respond_to_cop.rb +37 -0
  487. data/resources/rubocops/object/singleton_class_cop.rb +37 -0
  488. data/resources/rubocops/regexp/spelling_cop.rb +44 -0
  489. data/resources/rubocops/thread/new_cop.rb +39 -0
  490. data/resources/ruby-spec/ancestors_spec.rb +70 -0
  491. data/resources/ruby-spec/modulo_spec.rb +831 -0
  492. data/resources/ruby-spec/parameters_spec.rb +261 -0
  493. data/resources/ruby-spec/ruby_spec_spec_helper.rb +35 -0
  494. data/resources/test_marker.txt +1 -0
  495. data/ruby-agent.gemspec +129 -0
  496. data/service_executables/.gitkeep +0 -0
  497. data/service_executables/VERSION +1 -0
  498. data/service_executables/linux/contrast-service +0 -0
  499. data/service_executables/mac/contrast-service +0 -0
  500. metadata +945 -0
@@ -0,0 +1,482 @@
1
+ /* diStorm 3.3.3 */
2
+
3
+ /*
4
+ distorm.h
5
+
6
+ diStorm3 - Powerful disassembler for X86/AMD64
7
+ http://ragestorm.net/distorm/
8
+ distorm at gmail dot com
9
+ Copyright (C) 2003-2016 Gil Dabah
10
+ This library is licensed under the BSD license. See the file COPYING.
11
+ */
12
+
13
+
14
+ #ifndef DISTORM_H
15
+ #define DISTORM_H
16
+
17
+ /*
18
+ * 64 bit offsets support:
19
+ * If the diStorm library you use was compiled with 64 bits offsets,
20
+ * make sure you compile your own code with the following macro set:
21
+ * SUPPORT_64BIT_OFFSET
22
+ * Otherwise comment it out, or you will get a linker error of an unresolved symbol...
23
+ * Turned on by default!
24
+ */
25
+
26
+ #if !(defined(DISTORM_STATIC) || defined(DISTORM_DYNAMIC))
27
+ /* Define this macro for outer projects by default. */
28
+ #define SUPPORT_64BIT_OFFSET
29
+ #endif
30
+
31
+ /* TINYC has a problem with some 64bits library functions, so ignore 64 bit offsets. */
32
+ #ifdef __TINYC__
33
+ #undef SUPPORT_64BIT_OFFSET
34
+ #endif
35
+
36
+ /* If your compiler doesn't support stdint.h, define your own 64 bits type. */
37
+ #ifdef SUPPORT_64BIT_OFFSET
38
+ #ifdef _MSC_VER
39
+ #define OFFSET_INTEGER unsigned __int64
40
+ #else
41
+ #include <stdint.h>
42
+ #define OFFSET_INTEGER uint64_t
43
+ #endif
44
+ #else
45
+ /* 32 bit offsets are used. */
46
+ #define OFFSET_INTEGER unsigned long
47
+ #endif
48
+
49
+ #ifdef _MSC_VER
50
+ /* Since MSVC isn't shipped with stdint.h, we will have our own: */
51
+ typedef signed __int64 int64_t;
52
+ typedef unsigned __int64 uint64_t;
53
+ typedef signed __int32 int32_t;
54
+ typedef unsigned __int32 uint32_t;
55
+ typedef signed __int16 int16_t;
56
+ typedef unsigned __int16 uint16_t;
57
+ typedef signed __int8 int8_t;
58
+ typedef unsigned __int8 uint8_t;
59
+ #endif
60
+
61
+ /* Support C++ compilers */
62
+ #ifdef __cplusplus
63
+ extern "C" {
64
+ #endif
65
+
66
+
67
+ /* *** Helper Macros *** */
68
+
69
+ /* Get the ISC of the instruction, used with the definitions below. */
70
+ #define META_GET_ISC(meta) (((meta) >> 3) & 0x1f)
71
+ #define META_SET_ISC(di, isc) (((di)->meta) |= ((isc) << 3))
72
+ /* Get the flow control flags of the instruction, see 'features for decompose' below. */
73
+ #define META_GET_FC(meta) ((meta) & 0x7)
74
+
75
+ /* Get the target address of a branching instruction. O_PC operand type. */
76
+ #define INSTRUCTION_GET_TARGET(di) ((_OffsetType)(((di)->addr + (di)->imm.addr + (di)->size)))
77
+ /* Get the target address of a RIP-relative memory indirection. */
78
+ #define INSTRUCTION_GET_RIP_TARGET(di) ((_OffsetType)(((di)->addr + (di)->disp + (di)->size)))
79
+
80
+ /*
81
+ * Operand Size or Adderss size are stored inside the flags:
82
+ * 00 - 16 bits
83
+ * 01 - 32 bits
84
+ * 10 - 64 bits
85
+ * 11 - reserved
86
+ *
87
+ * If you call these set-macros more than once, you will have to clean the bits before doing so.
88
+ */
89
+ #define FLAG_SET_OPSIZE(di, size) ((di->flags) |= (((size) & 3) << 8))
90
+ #define FLAG_SET_ADDRSIZE(di, size) ((di->flags) |= (((size) & 3) << 10))
91
+ #define FLAG_GET_OPSIZE(flags) (((flags) >> 8) & 3)
92
+ #define FLAG_GET_ADDRSIZE(flags) (((flags) >> 10) & 3)
93
+ /* To get the LOCK/REPNZ/REP prefixes. */
94
+ #define FLAG_GET_PREFIX(flags) ((flags) & 7)
95
+ /* Indicates whether the instruction is privileged. */
96
+ #define FLAG_GET_PRIVILEGED(flags) (((flags) & FLAG_PRIVILEGED_INSTRUCTION) != 0)
97
+
98
+ /*
99
+ * Macros to extract segment registers from 'segment':
100
+ */
101
+ #define SEGMENT_DEFAULT 0x80
102
+ #define SEGMENT_SET(di, seg) ((di->segment) |= seg)
103
+ #define SEGMENT_GET(segment) (((segment) == R_NONE) ? R_NONE : ((segment) & 0x7f))
104
+ #define SEGMENT_IS_DEFAULT(segment) (((segment) & SEGMENT_DEFAULT) == SEGMENT_DEFAULT)
105
+
106
+
107
+ /* Decodes modes of the disassembler, 16 bits or 32 bits or 64 bits for AMD64, x86-64. */
108
+ typedef enum { Decode16Bits = 0, Decode32Bits = 1, Decode64Bits = 2 } _DecodeType;
109
+
110
+ typedef OFFSET_INTEGER _OffsetType;
111
+
112
+ typedef struct {
113
+ _OffsetType codeOffset, nextOffset; /* nextOffset is OUT only. */
114
+ const uint8_t* code;
115
+ int codeLen; /* Using signed integer makes it easier to detect an underflow. */
116
+ _DecodeType dt;
117
+ unsigned int features;
118
+ } _CodeInfo;
119
+
120
+ typedef enum { O_NONE, O_REG, O_IMM, O_IMM1, O_IMM2, O_DISP, O_SMEM, O_MEM, O_PC, O_PTR } _OperandType;
121
+
122
+ typedef union {
123
+ /* Used by O_IMM: */
124
+ int8_t sbyte;
125
+ uint8_t byte;
126
+ int16_t sword;
127
+ uint16_t word;
128
+ int32_t sdword;
129
+ uint32_t dword;
130
+ int64_t sqword; /* All immediates are SIGN-EXTENDED to 64 bits! */
131
+ uint64_t qword;
132
+
133
+ /* Used by O_PC: (Use GET_TARGET_ADDR).*/
134
+ _OffsetType addr; /* It's a relative offset as for now. */
135
+
136
+ /* Used by O_PTR: */
137
+ struct {
138
+ uint16_t seg;
139
+ /* Can be 16 or 32 bits, size is in ops[n].size. */
140
+ uint32_t off;
141
+ } ptr;
142
+
143
+ /* Used by O_IMM1 (i1) and O_IMM2 (i2). ENTER instruction only. */
144
+ struct {
145
+ uint32_t i1;
146
+ uint32_t i2;
147
+ } ex;
148
+ } _Value;
149
+
150
+ typedef struct {
151
+ /* Type of operand:
152
+ O_NONE: operand is to be ignored.
153
+ O_REG: index holds global register index.
154
+ O_IMM: instruction.imm.
155
+ O_IMM1: instruction.imm.ex.i1.
156
+ O_IMM2: instruction.imm.ex.i2.
157
+ O_DISP: memory dereference with displacement only, instruction.disp.
158
+ O_SMEM: simple memory dereference with optional displacement (a single register memory dereference).
159
+ O_MEM: complex memory dereference (optional fields: s/i/b/disp).
160
+ O_PC: the relative address of a branch instruction (instruction.imm.addr).
161
+ O_PTR: the absolute target address of a far branch instruction (instruction.imm.ptr.seg/off).
162
+ */
163
+ uint8_t type; /* _OperandType */
164
+
165
+ /* Index of:
166
+ O_REG: holds global register index
167
+ O_SMEM: holds the 'base' register. E.G: [ECX], [EBX+0x1234] are both in operand.index.
168
+ O_MEM: holds the 'index' register. E.G: [EAX*4] is in operand.index.
169
+ */
170
+ uint8_t index;
171
+
172
+ /* Size in bits of:
173
+ O_REG: register
174
+ O_IMM: instruction.imm
175
+ O_IMM1: instruction.imm.ex.i1
176
+ O_IMM2: instruction.imm.ex.i2
177
+ O_DISP: instruction.disp
178
+ O_SMEM: size of indirection.
179
+ O_MEM: size of indirection.
180
+ O_PC: size of the relative offset
181
+ O_PTR: size of instruction.imm.ptr.off (16 or 32)
182
+ */
183
+ uint16_t size;
184
+ } _Operand;
185
+
186
+ #define OPCODE_ID_NONE 0
187
+ /* Instruction could not be disassembled. */
188
+ #define FLAG_NOT_DECODABLE ((uint16_t)-1)
189
+ /* The instruction locks memory access. */
190
+ #define FLAG_LOCK (1 << 0)
191
+ /* The instruction is prefixed with a REPNZ. */
192
+ #define FLAG_REPNZ (1 << 1)
193
+ /* The instruction is prefixed with a REP, this can be a REPZ, it depends on the specific instruction. */
194
+ #define FLAG_REP (1 << 2)
195
+ /* Indicates there is a hint taken for Jcc instructions only. */
196
+ #define FLAG_HINT_TAKEN (1 << 3)
197
+ /* Indicates there is a hint non-taken for Jcc instructions only. */
198
+ #define FLAG_HINT_NOT_TAKEN (1 << 4)
199
+ /* The Imm value is signed extended (E.G in 64 bit decoding mode, a 32 bit imm is usually sign extended into 64 bit imm). */
200
+ #define FLAG_IMM_SIGNED (1 << 5)
201
+ /* The destination operand is writable. */
202
+ #define FLAG_DST_WR (1 << 6)
203
+ /* The instruction uses RIP-relative indirection. */
204
+ #define FLAG_RIP_RELATIVE (1 << 7)
205
+
206
+ /* See flag FLAG_GET_XXX macros above. */
207
+
208
+ /* The instruction is privileged and can only be used from Ring0. */
209
+ #define FLAG_PRIVILEGED_INSTRUCTION (1 << 15)
210
+
211
+ /* No register was defined. */
212
+ #define R_NONE ((uint8_t)-1)
213
+
214
+ #define REGS64_BASE 0
215
+ #define REGS32_BASE 16
216
+ #define REGS16_BASE 32
217
+ #define REGS8_BASE 48
218
+ #define REGS8_REX_BASE 64
219
+ #define SREGS_BASE 68
220
+ #define FPUREGS_BASE 75
221
+ #define MMXREGS_BASE 83
222
+ #define SSEREGS_BASE 91
223
+ #define AVXREGS_BASE 107
224
+ #define CREGS_BASE 123
225
+ #define DREGS_BASE 132
226
+
227
+ #define OPERANDS_NO (4)
228
+
229
+ typedef struct {
230
+ /* Used by ops[n].type == O_IMM/O_IMM1&O_IMM2/O_PTR/O_PC. Its size is ops[n].size. */
231
+ _Value imm;
232
+ /* Used by ops[n].type == O_SMEM/O_MEM/O_DISP. Its size is dispSize. */
233
+ uint64_t disp;
234
+ /* Virtual address of first byte of instruction. */
235
+ _OffsetType addr;
236
+ /* General flags of instruction, holds prefixes and more, if FLAG_NOT_DECODABLE, instruction is invalid. */
237
+ uint16_t flags;
238
+ /* Unused prefixes mask, for each bit that is set that prefix is not used (LSB is byte [addr + 0]). */
239
+ uint16_t unusedPrefixesMask;
240
+ /* Mask of registers that were used in the operands, only used for quick look up, in order to know *some* operand uses that register class. */
241
+ uint32_t usedRegistersMask;
242
+ /* ID of opcode in the global opcode table. Use for mnemonic look up. */
243
+ uint16_t opcode;
244
+ /* Up to four operands per instruction, ignored if ops[n].type == O_NONE. */
245
+ _Operand ops[OPERANDS_NO];
246
+ /* Size of the whole instruction in bytes. */
247
+ uint8_t size;
248
+ /* Segment information of memory indirection, default segment, or overriden one, can be -1. Use SEGMENT macros. */
249
+ uint8_t segment;
250
+ /* Used by ops[n].type == O_MEM. Base global register index (might be R_NONE), scale size (2/4/8), ignored for 0 or 1. */
251
+ uint8_t base, scale;
252
+ uint8_t dispSize;
253
+ /* Meta defines the instruction set class, and the flow control flags. Use META macros. */
254
+ uint8_t meta;
255
+ /* The CPU flags that the instruction operates upon. */
256
+ uint16_t modifiedFlagsMask, testedFlagsMask, undefinedFlagsMask;
257
+ } _DInst;
258
+
259
+ #ifndef DISTORM_LIGHT
260
+
261
+ /* Static size of strings. Do not change this value. Keep Python wrapper in sync. */
262
+ #define MAX_TEXT_SIZE (48)
263
+ typedef struct {
264
+ unsigned int length;
265
+ unsigned char p[MAX_TEXT_SIZE]; /* p is a null terminated string. */
266
+ } _WString;
267
+
268
+ /*
269
+ * Old decoded instruction structure in text format.
270
+ * Used only for backward compatibility with diStorm64.
271
+ * This structure holds all information the disassembler generates per instruction.
272
+ */
273
+ typedef struct {
274
+ _WString mnemonic; /* Mnemonic of decoded instruction, prefixed if required by REP, LOCK etc. */
275
+ _WString operands; /* Operands of the decoded instruction, up to 3 operands, comma-seperated. */
276
+ _WString instructionHex; /* Hex dump - little endian, including prefixes. */
277
+ unsigned int size; /* Size of decoded instruction in bytes. */
278
+ _OffsetType offset; /* Start offset of the decoded instruction. */
279
+ } _DecodedInst;
280
+
281
+ #endif /* DISTORM_LIGHT */
282
+
283
+ /* Register masks for quick look up, each mask indicates one of a register-class that is being used in some operand. */
284
+ #define RM_AX 1 /* AL, AH, AX, EAX, RAX */
285
+ #define RM_CX 2 /* CL, CH, CX, ECX, RCX */
286
+ #define RM_DX 4 /* DL, DH, DX, EDX, RDX */
287
+ #define RM_BX 8 /* BL, BH, BX, EBX, RBX */
288
+ #define RM_SP 0x10 /* SPL, SP, ESP, RSP */
289
+ #define RM_BP 0x20 /* BPL, BP, EBP, RBP */
290
+ #define RM_SI 0x40 /* SIL, SI, ESI, RSI */
291
+ #define RM_DI 0x80 /* DIL, DI, EDI, RDI */
292
+ #define RM_FPU 0x100 /* ST(0) - ST(7) */
293
+ #define RM_MMX 0x200 /* MM0 - MM7 */
294
+ #define RM_SSE 0x400 /* XMM0 - XMM15 */
295
+ #define RM_AVX 0x800 /* YMM0 - YMM15 */
296
+ #define RM_CR 0x1000 /* CR0, CR2, CR3, CR4, CR8 */
297
+ #define RM_DR 0x2000 /* DR0, DR1, DR2, DR3, DR6, DR7 */
298
+ #define RM_R8 0x4000 /* R8B, R8W, R8D, R8 */
299
+ #define RM_R9 0x8000 /* R9B, R9W, R9D, R9 */
300
+ #define RM_R10 0x10000 /* R10B, R10W, R10D, R10 */
301
+ #define RM_R11 0x20000 /* R11B, R11W, R11D, R11 */
302
+ #define RM_R12 0x40000 /* R12B, R12W, R12D, R12 */
303
+ #define RM_R13 0x80000 /* R13B, R13W, R13D, R13 */
304
+ #define RM_R14 0x100000 /* R14B, R14W, R14D, R14 */
305
+ #define RM_R15 0x200000 /* R15B, R15W, R15D, R15 */
306
+
307
+ /* RIP should be checked using the 'flags' field and FLAG_RIP_RELATIVE.
308
+ * Segments should be checked using the segment macros.
309
+ * For now R8 - R15 are not supported and non general purpose registers map into same RM.
310
+ */
311
+
312
+ /* CPU flags that instructions modify, test or undefine (are EFLAGS compatible!). */
313
+ #define D_CF 1 /* Carry */
314
+ #define D_PF 4 /* Parity */
315
+ #define D_AF 0x10 /* Auxiliary */
316
+ #define D_ZF 0x40 /* Zero */
317
+ #define D_SF 0x80 /* Sign */
318
+ #define D_IF 0x200 /* Interrupt */
319
+ #define D_DF 0x400 /* Direction */
320
+ #define D_OF 0x800 /* Overflow */
321
+
322
+ /*
323
+ * Instructions Set classes:
324
+ * if you want a better understanding of the available classes, look at disOps project, file: x86sets.py.
325
+ */
326
+ /* Indicates the instruction belongs to the General Integer set. */
327
+ #define ISC_INTEGER 1
328
+ /* Indicates the instruction belongs to the 387 FPU set. */
329
+ #define ISC_FPU 2
330
+ /* Indicates the instruction belongs to the P6 set. */
331
+ #define ISC_P6 3
332
+ /* Indicates the instruction belongs to the MMX set. */
333
+ #define ISC_MMX 4
334
+ /* Indicates the instruction belongs to the SSE set. */
335
+ #define ISC_SSE 5
336
+ /* Indicates the instruction belongs to the SSE2 set. */
337
+ #define ISC_SSE2 6
338
+ /* Indicates the instruction belongs to the SSE3 set. */
339
+ #define ISC_SSE3 7
340
+ /* Indicates the instruction belongs to the SSSE3 set. */
341
+ #define ISC_SSSE3 8
342
+ /* Indicates the instruction belongs to the SSE4.1 set. */
343
+ #define ISC_SSE4_1 9
344
+ /* Indicates the instruction belongs to the SSE4.2 set. */
345
+ #define ISC_SSE4_2 10
346
+ /* Indicates the instruction belongs to the AMD's SSE4.A set. */
347
+ #define ISC_SSE4_A 11
348
+ /* Indicates the instruction belongs to the 3DNow! set. */
349
+ #define ISC_3DNOW 12
350
+ /* Indicates the instruction belongs to the 3DNow! Extensions set. */
351
+ #define ISC_3DNOWEXT 13
352
+ /* Indicates the instruction belongs to the VMX (Intel) set. */
353
+ #define ISC_VMX 14
354
+ /* Indicates the instruction belongs to the SVM (AMD) set. */
355
+ #define ISC_SVM 15
356
+ /* Indicates the instruction belongs to the AVX (Intel) set. */
357
+ #define ISC_AVX 16
358
+ /* Indicates the instruction belongs to the FMA (Intel) set. */
359
+ #define ISC_FMA 17
360
+ /* Indicates the instruction belongs to the AES/AVX (Intel) set. */
361
+ #define ISC_AES 18
362
+ /* Indicates the instruction belongs to the CLMUL (Intel) set. */
363
+ #define ISC_CLMUL 19
364
+
365
+ /* Features for decompose: */
366
+ #define DF_NONE 0
367
+ /* The decoder will limit addresses to a maximum of 16 bits. */
368
+ #define DF_MAXIMUM_ADDR16 1
369
+ /* The decoder will limit addresses to a maximum of 32 bits. */
370
+ #define DF_MAXIMUM_ADDR32 2
371
+ /* The decoder will return only flow control instructions (and filter the others internally). */
372
+ #define DF_RETURN_FC_ONLY 4
373
+ /* The decoder will stop and return to the caller when the instruction 'CALL' (near and far) was decoded. */
374
+ #define DF_STOP_ON_CALL 8
375
+ /* The decoder will stop and return to the caller when the instruction 'RET' (near and far) was decoded. */
376
+ #define DF_STOP_ON_RET 0x10
377
+ /* The decoder will stop and return to the caller when the instruction system-call/ret was decoded. */
378
+ #define DF_STOP_ON_SYS 0x20
379
+ /* The decoder will stop and return to the caller when any of the branch 'JMP', (near and far) instructions were decoded. */
380
+ #define DF_STOP_ON_UNC_BRANCH 0x40
381
+ /* The decoder will stop and return to the caller when any of the conditional branch instruction were decoded. */
382
+ #define DF_STOP_ON_CND_BRANCH 0x80
383
+ /* The decoder will stop and return to the caller when the instruction 'INT' (INT, INT1, INTO, INT 3) was decoded. */
384
+ #define DF_STOP_ON_INT 0x100
385
+ /* The decoder will stop and return to the caller when any of the 'CMOVxx' instruction was decoded. */
386
+ #define DF_STOP_ON_CMOV 0x200
387
+ /* The decoder will stop and return to the caller when any flow control instruction was decoded. */
388
+ #define DF_STOP_ON_FLOW_CONTROL (DF_STOP_ON_CALL | DF_STOP_ON_RET | DF_STOP_ON_SYS | DF_STOP_ON_UNC_BRANCH | DF_STOP_ON_CND_BRANCH | DF_STOP_ON_INT | DF_STOP_ON_CMOV)
389
+
390
+ /* Indicates the instruction is not a flow-control instruction. */
391
+ #define FC_NONE 0
392
+ /* Indicates the instruction is one of: CALL, CALL FAR. */
393
+ #define FC_CALL 1
394
+ /* Indicates the instruction is one of: RET, IRET, RETF. */
395
+ #define FC_RET 2
396
+ /* Indicates the instruction is one of: SYSCALL, SYSRET, SYSENTER, SYSEXIT. */
397
+ #define FC_SYS 3
398
+ /* Indicates the instruction is one of: JMP, JMP FAR. */
399
+ #define FC_UNC_BRANCH 4
400
+ /*
401
+ * Indicates the instruction is one of:
402
+ * JCXZ, JO, JNO, JB, JAE, JZ, JNZ, JBE, JA, JS, JNS, JP, JNP, JL, JGE, JLE, JG, LOOP, LOOPZ, LOOPNZ.
403
+ */
404
+ #define FC_CND_BRANCH 5
405
+ /* Indiciates the instruction is one of: INT, INT1, INT 3, INTO, UD2. */
406
+ #define FC_INT 6
407
+ /* Indicates the instruction is one of: CMOVxx. */
408
+ #define FC_CMOV 7
409
+
410
+ /* Return code of the decoding function. */
411
+ typedef enum { DECRES_NONE, DECRES_SUCCESS, DECRES_MEMORYERR, DECRES_INPUTERR, DECRES_FILTERED } _DecodeResult;
412
+
413
+ /* Define the following interface functions only for outer projects. */
414
+ #if !(defined(DISTORM_STATIC) || defined(DISTORM_DYNAMIC))
415
+
416
+ /* distorm_decode
417
+ * Input:
418
+ * offset - Origin of the given code (virtual address that is), NOT an offset in code.
419
+ * code - Pointer to the code buffer to be disassembled.
420
+ * length - Amount of bytes that should be decoded from the code buffer.
421
+ * dt - Decoding mode, 16 bits (Decode16Bits), 32 bits (Decode32Bits) or AMD64 (Decode64Bits).
422
+ * result - Array of type _DecodeInst which will be used by this function in order to return the disassembled instructions.
423
+ * maxInstructions - The maximum number of entries in the result array that you pass to this function, so it won't exceed its bound.
424
+ * usedInstructionsCount - Number of the instruction that successfully were disassembled and written to the result array.
425
+ * Output: usedInstructionsCount will hold the number of entries used in the result array
426
+ * and the result array itself will be filled with the disassembled instructions.
427
+ * Return: DECRES_SUCCESS on success (no more to disassemble), DECRES_INPUTERR on input error (null code buffer, invalid decoding mode, etc...),
428
+ * DECRES_MEMORYERR when there are not enough entries to use in the result array, BUT YOU STILL have to check for usedInstructionsCount!
429
+ * Side-Effects: Even if the return code is DECRES_MEMORYERR, there might STILL be data in the
430
+ * array you passed, this function will try to use as much entries as possible!
431
+ * Notes: 1)The minimal size of maxInstructions is 15.
432
+ * 2)You will have to synchronize the offset,code and length by yourself if you pass code fragments and not a complete code block!
433
+ */
434
+
435
+ /* distorm_decompose
436
+ * See more documentation online at the GitHub project's wiki.
437
+ *
438
+ */
439
+ #ifdef SUPPORT_64BIT_OFFSET
440
+
441
+ _DecodeResult distorm_decompose64(_CodeInfo* ci, _DInst result[], unsigned int maxInstructions, unsigned int* usedInstructionsCount);
442
+ #define distorm_decompose distorm_decompose64
443
+
444
+ #ifndef DISTORM_LIGHT
445
+ /* If distorm-light is defined, we won't export these text-formatting functionality. */
446
+ _DecodeResult distorm_decode64(_OffsetType codeOffset, const unsigned char* code, int codeLen, _DecodeType dt, _DecodedInst result[], unsigned int maxInstructions, unsigned int* usedInstructionsCount);
447
+ void distorm_format64(const _CodeInfo* ci, const _DInst* di, _DecodedInst* result);
448
+ #define distorm_decode distorm_decode64
449
+ #define distorm_format distorm_format64
450
+ #endif /*DISTORM_LIGHT*/
451
+
452
+ #else /*SUPPORT_64BIT_OFFSET*/
453
+
454
+ _DecodeResult distorm_decompose32(_CodeInfo* ci, _DInst result[], unsigned int maxInstructions, unsigned int* usedInstructionsCount);
455
+ #define distorm_decompose distorm_decompose32
456
+
457
+ #ifndef DISTORM_LIGHT
458
+ /* If distorm-light is defined, we won't export these text-formatting functionality. */
459
+ _DecodeResult distorm_decode32(_OffsetType codeOffset, const unsigned char* code, int codeLen, _DecodeType dt, _DecodedInst result[], unsigned int maxInstructions, unsigned int* usedInstructionsCount);
460
+ void distorm_format32(const _CodeInfo* ci, const _DInst* di, _DecodedInst* result);
461
+ #define distorm_decode distorm_decode32
462
+ #define distorm_format distorm_format32
463
+ #endif /*DISTORM_LIGHT*/
464
+
465
+ #endif
466
+
467
+ /*
468
+ * distorm_version
469
+ * Input:
470
+ * none
471
+ *
472
+ * Output: unsigned int - version of compiled library.
473
+ */
474
+ unsigned int distorm_version();
475
+
476
+ #endif /* DISTORM_STATIC */
477
+
478
+ #ifdef __cplusplus
479
+ } /* End Of Extern */
480
+ #endif
481
+
482
+ #endif /* DISTORM_H */