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,37 @@
1
+ <#@ template debug="true" hostSpecific="true" #>
2
+ <#@ output extension=".cs" #>
3
+ <#@ Assembly Name="System.Core" #>
4
+ <#@ Assembly Name="System.Windows.Forms" #>
5
+ <#@ import namespace="System" #>
6
+ <#@ import namespace="System.IO" #>
7
+ <#@ import namespace="System.Diagnostics" #>
8
+ <#@ import namespace="System.Linq" #>
9
+ <#@ import namespace="System.Collections" #>
10
+ <#@ import namespace="System.Collections.Generic" #>
11
+ <#@ import namespace="System.Text.RegularExpressions" #>
12
+ // This file was auto generated from the distrom opcodes.h file
13
+ // on <#= DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.FFF") #>
14
+ <#
15
+ var mnemonics = File.ReadAllText(Host.ResolvePath(@"..\..\..\include\mnemonics.h"));
16
+ var instRe = new Regex("typedef enum {(.+)} _InstructionType;", RegexOptions.Singleline);
17
+ var regRe = new Regex("typedef enum {(.+)} _RegisterType;", RegexOptions.Singleline);
18
+ var m = instRe.Match(mnemonics);
19
+ var insts = m.Groups[1].Value.Split(',').Select(x => new {
20
+ Name = x.Split('=')[0].Trim().Substring(2),
21
+ Value = x.Split('=')[1].Trim(),
22
+ }).ToArray();
23
+ m = regRe.Match(mnemonics, m.Index + m.Length);
24
+ var regs = m.Groups[1].Value.Split(',').Select(x => x.Trim()).ToArray();
25
+ #>
26
+ namespace diStorm
27
+ {
28
+ public enum Opcode : ushort {
29
+ <# foreach (var i in insts) { #>
30
+ <#= i.Name #> = <#= i.Value #>,<# } #>
31
+ }
32
+
33
+ public enum Register {
34
+ <# foreach (var r in regs) { #>
35
+ <#= r #>,<# } #>
36
+ }
37
+ }
@@ -0,0 +1,25 @@
1
+
2
+ namespace diStorm
3
+ {
4
+
5
+ public enum OperandType : byte
6
+ {
7
+ None,
8
+ Reg,
9
+ Imm,
10
+ Imm1,
11
+ Imm2,
12
+ Disp,
13
+ Smem,
14
+ Mem,
15
+ Pc,
16
+ Ptr
17
+ }
18
+
19
+ public class Operand
20
+ {
21
+ public OperandType Type { get; internal set; }
22
+ public int Index { get; internal set; }
23
+ public int Size { get; internal set; }
24
+ }
25
+ }
@@ -0,0 +1,36 @@
1
+ using System.Reflection;
2
+ using System.Runtime.CompilerServices;
3
+ using System.Runtime.InteropServices;
4
+
5
+ // General Information about an assembly is controlled through the following
6
+ // set of attributes. Change these attribute values to modify the information
7
+ // associated with an assembly.
8
+ [assembly: AssemblyTitle("distorm-net")]
9
+ [assembly: AssemblyDescription("")]
10
+ [assembly: AssemblyConfiguration("")]
11
+ [assembly: AssemblyCompany("")]
12
+ [assembly: AssemblyProduct("distorm-net")]
13
+ [assembly: AssemblyCopyright("Copyright © 2012")]
14
+ [assembly: AssemblyTrademark("")]
15
+ [assembly: AssemblyCulture("")]
16
+
17
+ // Setting ComVisible to false makes the types in this assembly not visible
18
+ // to COM components. If you need to access a type in this assembly from
19
+ // COM, set the ComVisible attribute to true on that type.
20
+ [assembly: ComVisible(false)]
21
+
22
+ // The following GUID is for the ID of the typelib if this project is exposed to COM
23
+ [assembly: Guid("ddf3403b-11ea-4470-9fb3-03e68ac68fb5")]
24
+
25
+ // Version information for an assembly consists of the following four values:
26
+ //
27
+ // Major Version
28
+ // Minor Version
29
+ // Build Number
30
+ // Revision
31
+ //
32
+ // You can specify all the values or you can default the Build and Revision Numbers
33
+ // by using the '*' as shown below:
34
+ // [assembly: AssemblyVersion("1.0.*")]
35
+ [assembly: AssemblyVersion("1.0.0.0")]
36
+ [assembly: AssemblyFileVersion("1.0.0.0")]
@@ -0,0 +1,411 @@
1
+ using System;
2
+ using System.Runtime.CompilerServices;
3
+ using System.Runtime.InteropServices;
4
+
5
+ namespace diStorm
6
+ {
7
+ public enum DecodeType
8
+ {
9
+ Decode16Bits,
10
+ Decode32Bits,
11
+ Decode64Bits
12
+ }
13
+
14
+ public class diStorm3
15
+ {
16
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
17
+ public unsafe struct _CodeInfo
18
+ {
19
+ internal IntPtr codeOffset;
20
+ internal IntPtr nextOffset; /* nextOffset is OUT only. */
21
+ internal byte* code;
22
+ internal int codeLen; /* Using signed integer makes it easier to detect an underflow. */
23
+ internal DecodeType dt;
24
+ internal int features;
25
+ };
26
+
27
+
28
+ public struct _WString
29
+ {
30
+ public const int MAX_TEXT_SIZE = 48;
31
+ public uint length;
32
+ public unsafe fixed sbyte p[MAX_TEXT_SIZE]; /* p is a null terminated string. */
33
+ }
34
+
35
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
36
+ public struct _DecodedInst
37
+ {
38
+ public _WString mnemonic; /* Mnemonic of decoded instruction, prefixed if required by REP, LOCK etc. */
39
+ public _WString operands; /* Operands of the decoded instruction, up to 3 operands, comma-seperated. */
40
+ public _WString instructionHex; /* Hex dump - little endian, including prefixes. */
41
+ public uint size; /* Size of decoded instruction. */
42
+ public IntPtr offset; /* Start offset of the decoded instruction. */
43
+ };
44
+
45
+
46
+ /* Used by O_PTR: */
47
+
48
+ public struct PtrStruct
49
+ {
50
+ private ushort seg;
51
+ /* Can be 16 or 32 bits, size is in ops[n].size. */
52
+ private uint off;
53
+ };
54
+
55
+ /* Used by O_IMM1 (i1) and O_IMM2 (i2). ENTER instruction only. */
56
+
57
+ public struct ExStruct
58
+ {
59
+ private uint i1;
60
+ private uint i2;
61
+ };
62
+
63
+ [StructLayout(LayoutKind.Explicit)]
64
+ public struct _Value
65
+ {
66
+ /* Used by O_IMM: */
67
+ [FieldOffset(0)] public sbyte sbyt;
68
+ [FieldOffset(0)] public byte byt;
69
+ [FieldOffset(0)] public short sword;
70
+ [FieldOffset(0)] public ushort word;
71
+ [FieldOffset(0)] public int sdword;
72
+ [FieldOffset(0)] public uint dword;
73
+ [FieldOffset(0)] public long sqword; /* All immediates are SIGN-EXTENDED to 64 bits! */
74
+ [FieldOffset(0)] public ulong qword;
75
+ /* Used by O_PC: (Use GET_TARGET_ADDR).*/
76
+ [FieldOffset(0)] public IntPtr addr; /* It's a relative offset as for now. */
77
+ [FieldOffset(0)] public PtrStruct ptr;
78
+ [FieldOffset(0)] public ExStruct ex;
79
+ };
80
+
81
+ public struct _Operand
82
+ {
83
+ /* Type of operand:
84
+ O_NONE: operand is to be ignored.
85
+ O_REG: index holds global register index.
86
+ O_IMM: instruction.imm.
87
+ O_IMM1: instruction.imm.ex.i1.
88
+ O_IMM2: instruction.imm.ex.i2.
89
+ O_DISP: memory dereference with displacement only, instruction.disp.
90
+ O_SMEM: simple memory dereference with optional displacement (a single register memory dereference).
91
+ O_MEM: complex memory dereference (optional fields: s/i/b/disp).
92
+ O_PC: the relative address of a branch instruction (instruction.imm.addr).
93
+ O_PTR: the absolute target address of a far branch instruction (instruction.imm.ptr.seg/off).
94
+ */
95
+ public OperandType type; /* _OperandType */
96
+
97
+ /* Index of:
98
+ O_REG: holds global register index
99
+ O_SMEM: holds the 'base' register. E.G: [ECX], [EBX+0x1234] are both in operand.index.
100
+ O_MEM: holds the 'index' register. E.G: [EAX*4] is in operand.index.
101
+ */
102
+ public byte index;
103
+
104
+ /* Size of:
105
+ O_REG: register
106
+ O_IMM: instruction.imm
107
+ O_IMM1: instruction.imm.ex.i1
108
+ O_IMM2: instruction.imm.ex.i2
109
+ O_DISP: instruction.disp
110
+ O_SMEM: size of indirection.
111
+ O_MEM: size of indirection.
112
+ O_PC: size of the relative offset
113
+ O_PTR: size of instruction.imm.ptr.off (16 or 32)
114
+ */
115
+ public ushort size;
116
+ };
117
+
118
+ public struct _DInst
119
+ {
120
+ public const int OPERANDS_NO = 4;
121
+ private const int OPERANDS_SIZE = 4*OPERANDS_NO;
122
+
123
+ /* Used by ops[n].type == O_IMM/O_IMM1&O_IMM2/O_PTR/O_PC. Its size is ops[n].size. */
124
+ internal _Value imm;
125
+ /* Used by ops[n].type == O_SMEM/O_MEM/O_DISP. Its size is dispSize. */
126
+ internal ulong disp;
127
+ /* Virtual address of first byte of instruction. */
128
+ internal IntPtr addr;
129
+ /* General flags of instruction, holds prefixes and more, if FLAG_NOT_DECODABLE, instruction is invalid. */
130
+ internal ushort flags;
131
+ /* Unused prefixes mask, for each bit that is set that prefix is not used (LSB is byte [addr + 0]). */
132
+ internal ushort unusedPrefixesMask;
133
+ /* 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. */
134
+ internal ushort usedRegistersMask;
135
+ /* ID of opcode in the global opcode table. Use for mnemonic look up. */
136
+ internal ushort opcode;
137
+ /* Up to four operands per instruction, ignored if ops[n].type == O_NONE. */
138
+ private unsafe fixed byte ops_storage[OPERANDS_SIZE];
139
+ internal unsafe _Operand* ops
140
+ {
141
+ get
142
+ {
143
+ fixed (byte* p = ops_storage)
144
+ {
145
+ return (_Operand*) p;
146
+ }
147
+ }
148
+ }
149
+ /* Size of the whole instruction. */
150
+ internal byte size;
151
+ /* Segment information of memory indirection, default segment, or overridden one, can be -1. Use SEGMENT macros. */
152
+ internal byte segment;
153
+ /* 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. */
154
+ internal byte ibase, scale;
155
+ internal byte dispSize;
156
+ /* Meta defines the instruction set class, and the flow control flags. Use META macros. */
157
+ internal byte meta;
158
+ /* The CPU flags that the instruction operates upon. */
159
+ internal byte modifiedFlagsMask, testedFlagsMask, undefinedFlagsMask;
160
+ };
161
+
162
+ [DllImport("distorm3")]
163
+ private static extern unsafe void distorm_decompose64(void* codeInfo, void* dinsts, int maxInstructions, int* usedInstructions);
164
+
165
+ [DllImport("distorm3")]
166
+ private static extern unsafe void distorm_decode64(IntPtr codeOffset, byte* code, int codeLen, DecodeType dt, void *result, uint maxInstructions, uint* usedInstructionsCount);
167
+
168
+ [DllImport("distorm3")]
169
+ private static extern unsafe void distorm_format64(void* codeInfo, void* dinst, void* output);
170
+
171
+ public static unsafe void* Malloc(int sz)
172
+ {
173
+ return Marshal.AllocHGlobal(new IntPtr(sz)).ToPointer();
174
+ }
175
+
176
+ private static unsafe void Free(void* mem)
177
+ {
178
+ Marshal.FreeHGlobal(new IntPtr(mem));
179
+ }
180
+
181
+ private static unsafe _CodeInfo* AcquireCodeInfoStruct(CodeInfo nci, out GCHandle gch)
182
+ {
183
+ var ci = (_CodeInfo*) Malloc(sizeof (_CodeInfo));
184
+ if (ci == null)
185
+ throw new OutOfMemoryException();
186
+
187
+ Memset(ci, 0, sizeof (_CodeInfo));
188
+ //memset(ci, 0, sizeof(_CodeInfo));
189
+
190
+ ci->codeOffset = new IntPtr(nci._codeOffset);
191
+ gch = GCHandle.Alloc(nci._code, GCHandleType.Pinned);
192
+
193
+ ci->code = (byte*) gch.AddrOfPinnedObject().ToPointer();
194
+ ci->codeLen = nci._code.Length;
195
+ ci->dt = nci._decodeType;
196
+ ci->features = nci._features;
197
+ return ci;
198
+ }
199
+
200
+ private static unsafe DecodedInst CreateDecodedInstObj(_DecodedInst* inst)
201
+ {
202
+ return new DecodedInst {
203
+ Mnemonic = new String(inst->mnemonic.p),
204
+ Operands = new String(inst->operands.p),
205
+ Hex = new string(inst->instructionHex.p),
206
+ Size = inst->size,
207
+ Offset = inst->offset
208
+ };
209
+ }
210
+
211
+ private static unsafe void Memset(void *p, int v, int sz)
212
+ {
213
+ }
214
+
215
+
216
+ public static unsafe void Decompose(CodeInfo nci, DecomposedResult ndr)
217
+ {
218
+ _CodeInfo* ci = null;
219
+ _DInst* insts = null;
220
+ var gch = new GCHandle();
221
+ var usedInstructionsCount = 0;
222
+
223
+ try
224
+ {
225
+ if ((ci = AcquireCodeInfoStruct(nci, out gch)) == null)
226
+ throw new OutOfMemoryException();
227
+
228
+ var maxInstructions = ndr.MaxInstructions;
229
+
230
+ if ((insts = (_DInst*) Malloc(maxInstructions*sizeof (_DInst))) == null)
231
+ throw new OutOfMemoryException();
232
+
233
+ distorm_decompose64(ci, insts, maxInstructions, &usedInstructionsCount);
234
+
235
+ var dinsts = new DecomposedInst[usedInstructionsCount];
236
+
237
+ for (var i = 0; i < usedInstructionsCount; i++) {
238
+ var di = new DecomposedInst {
239
+ Address = insts[i].addr,
240
+ Flags = insts[i].flags,
241
+ Size = insts[i].size,
242
+ _segment = insts[i].segment,
243
+ Base = insts[i].ibase,
244
+ Scale = insts[i].scale,
245
+ Opcode = (Opcode) insts[i].opcode,
246
+ UnusedPrefixesMask = insts[i].unusedPrefixesMask,
247
+ Meta = insts[i].meta,
248
+ RegistersMask = insts[i].usedRegistersMask,
249
+ ModifiedFlagsMask = insts[i].modifiedFlagsMask,
250
+ TestedFlagsMask = insts[i].testedFlagsMask,
251
+ UndefinedFlagsMask = insts[i].undefinedFlagsMask
252
+ };
253
+
254
+ /* Simple fields: */
255
+
256
+ /* Immediate variant. */
257
+ var immVariant = new DecomposedInst.ImmVariant {
258
+ Imm = insts[i].imm.qword,
259
+ Size = 0
260
+ };
261
+ /* The size of the immediate is in one of the operands, if at all. Look for it below. Zero by default. */
262
+
263
+ /* Count operands. */
264
+ var operandsNo = 0;
265
+ for (operandsNo = 0; operandsNo < _DInst.OPERANDS_NO; operandsNo++)
266
+ {
267
+ if (insts[i].ops[operandsNo].type == OperandType.None)
268
+ break;
269
+ }
270
+
271
+ var ops = new Operand[operandsNo];
272
+
273
+ for (var j = 0; j < operandsNo; j++)
274
+ {
275
+ if (insts[i].ops[j].type == OperandType.Imm) {
276
+ /* Set the size of the immediate operand. */
277
+ immVariant.Size = insts[i].ops[j].size;
278
+ }
279
+
280
+ var op = new Operand {
281
+ Type = insts[i].ops[j].type,
282
+ Index = insts[i].ops[j].index,
283
+ Size = insts[i].ops[j].size
284
+ };
285
+
286
+ ops[j] = op;
287
+ }
288
+ di.Operands = ops;
289
+
290
+ /* Attach the immediate variant. */
291
+ di.Imm = immVariant;
292
+
293
+ /* Displacement variant. */
294
+ var disp = new DecomposedInst.DispVariant {
295
+ Displacement = insts[i].disp,
296
+ Size = insts[i].dispSize
297
+ };
298
+
299
+ di.Disp = disp;
300
+ dinsts[i] = di;
301
+ }
302
+
303
+ ndr.Instructions = dinsts;
304
+ }
305
+ finally
306
+ {
307
+ if (gch.IsAllocated)
308
+ gch.Free();
309
+ if (ci != null)
310
+ Free(ci);
311
+ if (insts != null)
312
+ Free(insts);
313
+ }
314
+ }
315
+
316
+ public static unsafe void Decode(CodeInfo nci, DecodedResult dr)
317
+ {
318
+ _CodeInfo* ci = null;
319
+ _DecodedInst* insts = null;
320
+ var gch = new GCHandle();
321
+ uint usedInstructionsCount = 0;
322
+
323
+ try
324
+ {
325
+ if ((ci = AcquireCodeInfoStruct(nci, out gch)) == null)
326
+ throw new OutOfMemoryException();
327
+
328
+ var maxInstructions = dr.MaxInstructions;
329
+
330
+ if ((insts = (_DecodedInst*) Malloc(maxInstructions*sizeof (_DecodedInst))) == null)
331
+ throw new OutOfMemoryException();
332
+
333
+ distorm_decode64(ci->codeOffset, ci->code, ci->codeLen, ci->dt, insts, (uint) maxInstructions,
334
+ &usedInstructionsCount);
335
+
336
+ var dinsts = new DecodedInst[usedInstructionsCount];
337
+
338
+ for (var i = 0; i < usedInstructionsCount; i++)
339
+ dinsts[i] = CreateDecodedInstObj(&insts[i]);
340
+ dr.Instructions = dinsts;
341
+ }
342
+ finally {
343
+ /* In case of an error, jInsts will get cleaned automatically. */
344
+ if (gch.IsAllocated)
345
+ gch.Free();
346
+ if (ci != null)
347
+ Free(ci);
348
+ if (insts != null)
349
+ Free(insts);
350
+ }
351
+ }
352
+
353
+
354
+ public static unsafe DecodedInst Format(CodeInfo nci, DecomposedInst ndi)
355
+ {
356
+ var input = new _DInst();
357
+ _CodeInfo *ci = null;
358
+ var gch = new GCHandle();
359
+ DecodedInst di;
360
+
361
+ try
362
+ {
363
+ ci = AcquireCodeInfoStruct(nci, out gch);
364
+ if (ci == null)
365
+ throw new OutOfMemoryException();
366
+
367
+ input.addr = ndi.Address;
368
+ input.flags = ndi.Flags;
369
+ input.size = (byte) ndi.Size;
370
+ input.segment = (byte) ndi._segment;
371
+ input.ibase = (byte) ndi.Base;
372
+ input.scale = (byte) ndi.Scale;
373
+ input.opcode = (ushort) ndi.Opcode;
374
+ /* unusedPrefixesMask is unused indeed, lol. */
375
+ input.meta = (byte) ndi.Meta;
376
+ /* Nor usedRegistersMask. */
377
+
378
+ int opsCount = ndi.Operands.Length;
379
+ for (var i = 0; i < opsCount; i++) {
380
+ var op = ndi.Operands[i];
381
+ if (op == null) continue;
382
+ input.ops[i].index = (byte) op.Index;
383
+ input.ops[i].type = op.Type;
384
+ input.ops[i].size = (ushort) op.Size;
385
+ }
386
+
387
+ if (ndi.Imm != null)
388
+ input.imm.qword = ndi.Imm.Imm;
389
+
390
+ if (ndi.Disp != null)
391
+ {
392
+ input.disp = ndi.Disp.Displacement;
393
+ input.dispSize = (byte) ndi.Disp.Size;
394
+ }
395
+
396
+ _DecodedInst output;
397
+ distorm_format64(ci, &input, &output);
398
+
399
+ di = CreateDecodedInstObj(&output);
400
+ }
401
+ finally
402
+ {
403
+ if (gch.IsAllocated)
404
+ gch.Free();
405
+ if (ci != null)
406
+ Free(ci);
407
+ }
408
+ return di;
409
+ }
410
+ }
411
+ }