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,430 @@
1
+ /* -*- indent-tabs-mode: nil -*-
2
+ */
3
+ #ifdef WIN32
4
+ #define _CRT_SECURE_NO_WARNINGS
5
+ #endif
6
+ #include <stdio.h>
7
+ #include <string.h>
8
+ #include <sys/types.h>
9
+ #include <sys/stat.h>
10
+ #include <fcntl.h>
11
+ #ifdef WIN32
12
+ #include <io.h>
13
+ #define mode_t int
14
+ #define ssize_t int
15
+ #define open _open
16
+ #define read _read
17
+ #define close _close
18
+ #else
19
+ #include <unistd.h>
20
+ #endif
21
+ #include <funchook.h>
22
+
23
+ #ifdef WIN32
24
+ #define DLLEXPORT __declspec(dllexport)
25
+ #else
26
+ #define DLLEXPORT
27
+ #endif
28
+
29
+ #ifdef __GNUC__
30
+ #define NOINLINE __attribute__((noinline))
31
+ #endif
32
+ #ifdef _MSC_VER
33
+ #define NOINLINE __declspec(noinline)
34
+ #endif
35
+
36
+ typedef int (*int_func_t)(void);
37
+
38
+ extern int reset_retval(void);
39
+ DLLEXPORT int get_val_in_exe(void);
40
+ extern int get_val_in_dll(void);
41
+ extern int get_val_in_exe_from_dll(void);
42
+ extern int get_val_in_dll_from_dll(void);
43
+ extern int x86_test_jump(void);
44
+ extern int x86_test_call_get_pc_thunk_ax(void);
45
+ extern int x86_test_call_get_pc_thunk_bx(void);
46
+ extern int x86_test_call_get_pc_thunk_cx(void);
47
+ extern int x86_test_call_get_pc_thunk_dx(void);
48
+ extern int x86_test_call_get_pc_thunk_si(void);
49
+ extern int x86_test_call_get_pc_thunk_di(void);
50
+ extern int x86_test_call_get_pc_thunk_bp(void);
51
+ extern int x86_test_call_and_pop_eax(void);
52
+ extern int x86_test_call_and_pop_ebx(void);
53
+ extern int x86_test_call_and_pop_ecx(void);
54
+ extern int x86_test_call_and_pop_edx(void);
55
+ extern int x86_test_call_and_pop_esi(void);
56
+ extern int x86_test_call_and_pop_edi(void);
57
+ extern int x86_test_call_and_pop_ebp(void);
58
+ extern int x86_test_error_jump1(void);
59
+ extern int x86_test_error_jump2(void);
60
+
61
+ #if defined(WIN32) || defined(__APPLE__)
62
+ extern void set_int_val(int val);
63
+ #else
64
+ #define set_int_val(val) do {} while(0)
65
+ #endif
66
+
67
+ #ifdef _MSC_VER
68
+ int reset_retval()
69
+ {
70
+ return 0;
71
+ }
72
+ #endif
73
+
74
+ #if defined(WIN32)
75
+ __declspec(dllexport) int int_val = 0xbaceba11;
76
+ #else
77
+ int int_val = 0xbaceba11;
78
+ #endif
79
+
80
+
81
+ static int test_cnt;
82
+ static int error_cnt;
83
+ static int hook_is_called;
84
+ static int_func_t orig_func;
85
+
86
+ int get_val_in_exe(void)
87
+ {
88
+ return int_val;
89
+ }
90
+
91
+ static int hook_func(void)
92
+ {
93
+ hook_is_called = 1;
94
+ return orig_func();
95
+ }
96
+
97
+ #define TEST_FUNCHOOK_INT(func) test_funchook_int(func, #func, NULL, NULL)
98
+ #define TEST_FUNCHOOK_INT2(func, func2) test_funchook_int(func, #func, func2, #func2)
99
+
100
+ void test_funchook_int(volatile int_func_t func, const char *func_str, volatile int_func_t func2, const char *func2_str)
101
+ {
102
+ funchook_t *funchook = funchook_create();
103
+ int result;
104
+ int expected;
105
+ int rv;
106
+
107
+ test_cnt++;
108
+ if (func2 == NULL) {
109
+ printf("[%d] test_funchook_int: %s\n", test_cnt, func_str);
110
+ } else {
111
+ printf("[%d] test_funchook_int: %s and %s\n", test_cnt, func_str, func2_str);
112
+ }
113
+
114
+ expected = ++int_val;
115
+ set_int_val(int_val);
116
+ reset_retval();
117
+ result = func();
118
+ if (expected != result) {
119
+ printf("ERROR: %s should return %d but %d before hooking.\n", func_str, expected, result);
120
+ error_cnt++;
121
+ return;
122
+ }
123
+ if (func2 != NULL) {
124
+ reset_retval();
125
+ result = func2();
126
+ if (expected != result) {
127
+ printf("ERROR: %s should return %d but %d before hooking.\n", func2_str, expected, result);
128
+ error_cnt++;
129
+ return;
130
+ }
131
+ }
132
+ orig_func = func;
133
+ rv = funchook_prepare(funchook, (void**)&orig_func, hook_func);
134
+ if (rv != 0) {
135
+ printf("ERROR: failed to hook %s.\n", func_str);
136
+ error_cnt++;
137
+ return;
138
+ }
139
+ funchook_install(funchook, 0);
140
+
141
+ hook_is_called = 0;
142
+ expected = ++int_val;
143
+ set_int_val(int_val);
144
+ reset_retval();
145
+ result = func();
146
+ if (hook_is_called == 0) {
147
+ printf("ERROR: hook_func is not called by %s.\n", func_str);
148
+ error_cnt++;
149
+ return;
150
+ }
151
+ if (expected != result) {
152
+ printf("ERROR: %s should return %d but %d after hooking.\n", func_str, expected, result);
153
+ error_cnt++;
154
+ return;
155
+ }
156
+ if (func2 != NULL) {
157
+ hook_is_called = 0;
158
+ reset_retval();
159
+ result = func2();
160
+ if (hook_is_called == 0) {
161
+ printf("ERROR: hook_func is not called by %s.\n", func2_str);
162
+ error_cnt++;
163
+ return;
164
+ }
165
+ if (expected != result) {
166
+ printf("ERROR: %s should return %d but %d after hooking.\n", func2_str, expected, result);
167
+ error_cnt++;
168
+ return;
169
+ }
170
+ }
171
+
172
+ funchook_uninstall(funchook, 0);
173
+
174
+ expected = ++int_val;
175
+ set_int_val(int_val);
176
+ reset_retval();
177
+ result = func();
178
+ if (expected != result) {
179
+ printf("ERROR: %s should return %d but %d after hook is removed.\n", func_str, expected, result);
180
+ error_cnt++;
181
+ return;
182
+ }
183
+ if (func2 != NULL) {
184
+ reset_retval();
185
+ result = func2();
186
+ if (expected != result) {
187
+ printf("ERROR: %s should return %d but %d after hook is removed.\n", func2_str, expected, result);
188
+ error_cnt++;
189
+ return;
190
+ }
191
+ }
192
+
193
+ funchook_destroy(funchook);
194
+ }
195
+
196
+ #define TEST_FUNCHOOK_EXPECT_ERROR(func, errcode) test_funchook_expect_error(func, errcode, #func, __LINE__)
197
+ void test_funchook_expect_error(int_func_t func, int errcode, const char *func_str, int line)
198
+ {
199
+ funchook_t *funchook = funchook_create();
200
+ int rv;
201
+
202
+ test_cnt++;
203
+ printf("[%d] test_funchook_expect_error: %s\n", test_cnt, func_str);
204
+
205
+ orig_func = func;
206
+ rv = funchook_prepare(funchook, (void**)&orig_func, hook_func);
207
+ if (rv != errcode) {
208
+ printf("ERROR at line %d: hooking must fail with %d but %d.\n", line, errcode, rv);
209
+ error_cnt++;
210
+ }
211
+ funchook_destroy(funchook);
212
+ }
213
+
214
+ static int (*open_func)(const char *pathname, int flags, mode_t mode);
215
+ static FILE *(*fopen_func)(const char *pathname, const char *mode);
216
+
217
+ static int open_hook(const char *pathname, int flags, mode_t mode)
218
+ {
219
+ if (strcmp(pathname, "test-1.txt") == 0) {
220
+ pathname = "test-2.txt";
221
+ }
222
+ return open_func(pathname, flags, mode);
223
+ }
224
+
225
+ static FILE *fopen_hook(const char *pathname, const char *mode)
226
+ {
227
+ if (strcmp(pathname, "test-1.txt") == 0) {
228
+ pathname = "test-2.txt";
229
+ }
230
+ return fopen_func(pathname, mode);
231
+ }
232
+
233
+ static void read_content_by_open(const char *filename, char *buf, size_t bufsiz)
234
+ {
235
+ int fd = open(filename, O_RDONLY);
236
+ ssize_t size = read(fd, buf, bufsiz);
237
+
238
+ if (size >= 0) {
239
+ buf[size] = '\0';
240
+ } else {
241
+ strcpy(buf, "read error");
242
+ }
243
+ close(fd);
244
+ }
245
+
246
+ static void read_content_by_fopen(const char *filename, char *buf, size_t bufsiz)
247
+ {
248
+ FILE *fp = fopen(filename, "r");
249
+ if (fp != NULL) {
250
+ if (fgets(buf, bufsiz, fp) == NULL) {
251
+ strcpy(buf, "read error");
252
+ }
253
+ fclose(fp);
254
+ } else {
255
+ strcpy(buf, "open error");
256
+ }
257
+ }
258
+
259
+ static void check_content(const char *filename, const char *expect, int line)
260
+ {
261
+ char buf[512];
262
+
263
+ read_content_by_open(filename, buf, sizeof(buf));
264
+ if (strcmp(buf, expect) != 0) {
265
+ printf("ERROR at line %d: '%s' != '%s' (open)\n", line, buf, expect);
266
+ error_cnt++;
267
+ }
268
+ read_content_by_fopen(filename, buf, sizeof(buf));
269
+ if (strcmp(buf, expect) != 0) {
270
+ printf("ERROR at line %d: '%s' != '%s' (fopen)\n", line, buf, expect);
271
+ error_cnt++;
272
+ }
273
+ }
274
+
275
+ static void test_hook_open_and_fopen(void)
276
+ {
277
+ FILE *fp;
278
+ funchook_t *funchook;
279
+
280
+ #ifdef WIN64
281
+ if (getenv("WINELOADERNOEXEC") != NULL) {
282
+ /* The test doesn't work on Wine. */
283
+ return;
284
+ }
285
+ #endif
286
+
287
+ test_cnt++;
288
+ printf("[%d] test_hook_open_and_fopen\n", test_cnt);
289
+
290
+ /* prepare file contents */
291
+ fp = fopen("test-1.txt", "w");
292
+ fputs("This is test-1.txt.", fp);
293
+ fclose(fp);
294
+ fp = fopen("test-2.txt", "w");
295
+ fputs("This is test-2.txt.", fp);
296
+ fclose(fp);
297
+
298
+ /* prepare to hook `open' and `fopen` */
299
+ funchook = funchook_create();
300
+ open_func = (int (*)(const char*, int, mode_t))open;
301
+ funchook_prepare(funchook, (void**)&open_func, open_hook);
302
+ fopen_func = fopen;
303
+ funchook_prepare(funchook, (void**)&fopen_func, fopen_hook);
304
+
305
+ /* The contents of test-1.txt should be "This is test-1.txt". */
306
+ check_content("test-1.txt", "This is test-1.txt.", __LINE__);
307
+
308
+ /* hook `open' and `fopen` */
309
+ funchook_install(funchook, 0);
310
+ /* Try to open test-1.txt but open test-2.txt. */
311
+ check_content("test-1.txt", "This is test-2.txt.", __LINE__);
312
+
313
+ /* restore hooks. */
314
+ funchook_uninstall(funchook, 0);
315
+ /* Open test-1.txt. */
316
+ check_content("test-1.txt", "This is test-1.txt.", __LINE__);
317
+
318
+ funchook_destroy(funchook);
319
+ }
320
+
321
+ #define S(suffix) \
322
+ extern int dllfunc_##suffix(int, int); \
323
+ static int (*dllfunc_##suffix##_func)(int, int); \
324
+ static int dllfunc_##suffix##_hook(int a, int b) { \
325
+ return dllfunc_##suffix##_func(a, b) * 2; \
326
+ } \
327
+ NOINLINE int exefunc_##suffix(int a, int b) { return a * b + suffix; } \
328
+ static int (*exefunc_##suffix##_func)(int, int); \
329
+ static int exefunc_##suffix##_hook(int a, int b) { \
330
+ return exefunc_##suffix##_func(a, b) * 2; \
331
+ }
332
+ #include "suffix.list"
333
+ #undef S
334
+
335
+ static NOINLINE int call_dll_and_exe_funcs(int installed)
336
+ {
337
+ int rv;
338
+ int mul = installed ? 2 : 1;
339
+ const char *is_str = installed ? "isn't" : "is";
340
+ #define S(suffix) \
341
+ rv = dllfunc_##suffix(2, 3); \
342
+ if (rv != (2 * 3 + suffix) * mul) { \
343
+ printf("ERROR: dllfunc_%s %s hooked. (rv=%d)\n", #suffix, is_str, rv); \
344
+ error_cnt++; \
345
+ return -1; \
346
+ } \
347
+ rv = exefunc_##suffix(2, 3); \
348
+ if (rv != (2 * 3 + suffix) * mul) { \
349
+ printf("ERROR: exefunc_%s %s hooked. (rv=%d)\n", #suffix, is_str, rv); \
350
+ error_cnt++; \
351
+ return -1; \
352
+ }
353
+ #include "suffix.list"
354
+ #undef S
355
+ return 0;
356
+ }
357
+
358
+ static void test_hook_many_funcs(void)
359
+ {
360
+ funchook_t *funchook;
361
+ test_cnt++;
362
+ printf("[%d] test_hook_many_funcs\n", test_cnt);
363
+ funchook = funchook_create();
364
+ #define S(suffix) \
365
+ dllfunc_##suffix##_func = dllfunc_##suffix; \
366
+ funchook_prepare(funchook, (void**)&dllfunc_##suffix##_func, dllfunc_##suffix##_hook); \
367
+ exefunc_##suffix##_func = exefunc_##suffix; \
368
+ funchook_prepare(funchook, (void**)&exefunc_##suffix##_func, exefunc_##suffix##_hook); \
369
+ putchar('.'); fflush(stdout);
370
+ #include "suffix.list"
371
+ #undef S
372
+ putchar('\n');
373
+
374
+ funchook_install(funchook, 0);
375
+ if (call_dll_and_exe_funcs(1) != 0) {
376
+ return;
377
+ }
378
+
379
+ funchook_uninstall(funchook, 0);
380
+ if (call_dll_and_exe_funcs(0) != 0) {
381
+ return;
382
+ }
383
+
384
+ funchook_destroy(funchook);
385
+ }
386
+
387
+ int main()
388
+ {
389
+ funchook_set_debug_file("debug.log");
390
+
391
+ TEST_FUNCHOOK_INT2(get_val_in_exe, get_val_in_exe_from_dll);
392
+ TEST_FUNCHOOK_INT2(get_val_in_dll, get_val_in_dll_from_dll);
393
+
394
+ #ifndef _MSC_VER
395
+ #if defined __i386 || defined _M_I386
396
+ TEST_FUNCHOOK_INT(x86_test_jump);
397
+ TEST_FUNCHOOK_EXPECT_ERROR(x86_test_error_jump1, FUNCHOOK_ERROR_CANNOT_FIX_IP_RELATIVE);
398
+ TEST_FUNCHOOK_EXPECT_ERROR(x86_test_error_jump2, FUNCHOOK_ERROR_FOUND_BACK_JUMP);
399
+
400
+ #ifndef WIN32
401
+ TEST_FUNCHOOK_INT(x86_test_call_get_pc_thunk_ax);
402
+ TEST_FUNCHOOK_INT(x86_test_call_get_pc_thunk_bx);
403
+ TEST_FUNCHOOK_INT(x86_test_call_get_pc_thunk_cx);
404
+ TEST_FUNCHOOK_INT(x86_test_call_get_pc_thunk_dx);
405
+ TEST_FUNCHOOK_INT(x86_test_call_get_pc_thunk_si);
406
+ TEST_FUNCHOOK_INT(x86_test_call_get_pc_thunk_di);
407
+ TEST_FUNCHOOK_INT(x86_test_call_get_pc_thunk_bp);
408
+ TEST_FUNCHOOK_INT(x86_test_call_and_pop_eax);
409
+ TEST_FUNCHOOK_INT(x86_test_call_and_pop_ebx);
410
+ TEST_FUNCHOOK_INT(x86_test_call_and_pop_ecx);
411
+ TEST_FUNCHOOK_INT(x86_test_call_and_pop_edx);
412
+ TEST_FUNCHOOK_INT(x86_test_call_and_pop_esi);
413
+ TEST_FUNCHOOK_INT(x86_test_call_and_pop_edi);
414
+ TEST_FUNCHOOK_INT(x86_test_call_and_pop_ebp);
415
+ #endif
416
+ #endif
417
+
418
+ #endif
419
+
420
+ test_hook_open_and_fopen();
421
+ test_hook_many_funcs();
422
+
423
+ if (error_cnt == 0) {
424
+ printf("all %d tests are passed.\n", test_cnt);
425
+ return 0;
426
+ } else {
427
+ printf("%d of %d tests are failed.\n", error_cnt, test_cnt);
428
+ return 1;
429
+ }
430
+ }
Binary file
@@ -0,0 +1,10 @@
1
+ #ifdef __APPLE__
2
+ #define reset_retval _reset_retval
3
+ #endif
4
+ .text
5
+
6
+ .p2align 4,,15
7
+ .globl reset_retval
8
+ reset_retval:
9
+ xorq %rax, %rax
10
+ ret
@@ -0,0 +1,339 @@
1
+ #if defined(_WIN32) || defined(__APPLE__)
2
+ #define get_val_in_exe _get_val_in_exe
3
+ #define int_val _int_val
4
+ #define reset_retval _reset_retval
5
+ #define x86_test_jump _x86_test_jump
6
+ #define x86_test_error_jump1 _x86_test_error_jump1
7
+ #define x86_test_error_jump2 _x86_test_error_jump2
8
+ #define x86_test_call_get_pc_thunk_ax _x86_test_call_get_pc_thunk_ax
9
+ #define x86_test_call_get_pc_thunk_bx _x86_test_call_get_pc_thunk_bx
10
+ #define x86_test_call_get_pc_thunk_cx _x86_test_call_get_pc_thunk_cx
11
+ #define x86_test_call_get_pc_thunk_dx _x86_test_call_get_pc_thunk_dx
12
+ #define x86_test_call_get_pc_thunk_si _x86_test_call_get_pc_thunk_si
13
+ #define x86_test_call_get_pc_thunk_di _x86_test_call_get_pc_thunk_di
14
+ #define x86_test_call_get_pc_thunk_bp _x86_test_call_get_pc_thunk_bp
15
+ #define x86_test_call_and_pop_eax _x86_test_call_and_pop_eax
16
+ #define x86_test_call_and_pop_ebx _x86_test_call_and_pop_ebx
17
+ #define x86_test_call_and_pop_ecx _x86_test_call_and_pop_ecx
18
+ #define x86_test_call_and_pop_edx _x86_test_call_and_pop_edx
19
+ #define x86_test_call_and_pop_esi _x86_test_call_and_pop_esi
20
+ #define x86_test_call_and_pop_edi _x86_test_call_and_pop_edi
21
+ #define x86_test_call_and_pop_ebp _x86_test_call_and_pop_ebp
22
+ #endif
23
+ .text
24
+
25
+ .p2align 4,,15
26
+ .globl reset_retval
27
+ reset_retval:
28
+ xorl %eax, %eax
29
+ ret
30
+
31
+ .p2align 4,,15
32
+ .globl x86_test_jump
33
+ x86_test_jump:
34
+ jmp get_val_in_exe
35
+
36
+ .p2align 4,,15
37
+ .globl x86_test_error_jump1
38
+ x86_test_error_jump1:
39
+ jmp label_1 /* jump whose size is not 32-bit */
40
+ label_1:
41
+ #ifdef __PIE__
42
+ call x86.get_pc_thunk.ax
43
+ addl $_GLOBAL_OFFSET_TABLE_, %eax
44
+ mov int_val@GOT(%eax), %eax
45
+ #elif defined __APPLE__
46
+ call x86.get_pc_thunk.ax
47
+ label_1_1:
48
+ movl L_int_val$non_lazy_ptr-label_1_1(%eax), %eax
49
+ #else
50
+ mov int_val, %eax
51
+ #endif
52
+ ret
53
+
54
+ .p2align 4,,15
55
+ .globl x86_test_error_jump2
56
+ x86_test_error_jump2:
57
+ xorl %eax, %eax
58
+ label_2:
59
+ nop
60
+ nop
61
+ nop
62
+ nop
63
+ jnz label_2 /* jump to hot-patched region */
64
+ #ifdef __PIE__
65
+ call x86.get_pc_thunk.ax
66
+ addl $_GLOBAL_OFFSET_TABLE_, %eax
67
+ mov int_val@GOT(%eax), %eax
68
+ #elif defined __APPLE__
69
+ call x86.get_pc_thunk.ax
70
+ label_2_1:
71
+ movl L_int_val$non_lazy_ptr-label_2_1(%eax), %eax
72
+ #else
73
+ mov int_val, %eax
74
+ #endif
75
+ ret
76
+
77
+ #ifndef WIN32
78
+ .p2align 4,,15
79
+ .globl x86_test_call_get_pc_thunk_ax
80
+ x86_test_call_get_pc_thunk_ax:
81
+ call x86.get_pc_thunk.ax
82
+ #ifdef __APPLE__
83
+ L_ax:
84
+ movl L_int_val$non_lazy_ptr-L_ax(%eax), %eax
85
+ #else
86
+ addl $_GLOBAL_OFFSET_TABLE_, %eax
87
+ movl int_val@GOT(%eax), %eax
88
+ #endif
89
+ movl (%eax), %eax
90
+ ret
91
+
92
+ .p2align 4,,15
93
+ .globl x86_test_call_get_pc_thunk_bx
94
+ x86_test_call_get_pc_thunk_bx:
95
+ pushl %ebx
96
+ call x86.get_pc_thunk.bx
97
+ #ifdef __APPLE__
98
+ L_bx:
99
+ movl L_int_val$non_lazy_ptr-L_bx(%ebx), %eax
100
+ #else
101
+ addl $_GLOBAL_OFFSET_TABLE_, %ebx
102
+ movl int_val@GOT(%ebx), %eax
103
+ #endif
104
+ movl (%eax), %eax
105
+ popl %ebx
106
+ ret
107
+
108
+ .p2align 4,,15
109
+ .globl x86_test_call_get_pc_thunk_cx
110
+ x86_test_call_get_pc_thunk_cx:
111
+ call x86.get_pc_thunk.cx
112
+ #ifdef __APPLE__
113
+ L_cx:
114
+ movl L_int_val$non_lazy_ptr-L_cx(%ecx), %eax
115
+ #else
116
+ addl $_GLOBAL_OFFSET_TABLE_, %ecx
117
+ movl int_val@GOT(%ecx), %eax
118
+ #endif
119
+ movl (%eax), %eax
120
+ ret
121
+
122
+ .p2align 4,,15
123
+ .globl x86_test_call_get_pc_thunk_dx
124
+ x86_test_call_get_pc_thunk_dx:
125
+ call x86.get_pc_thunk.dx
126
+ #ifdef __APPLE__
127
+ L_dx:
128
+ movl L_int_val$non_lazy_ptr-L_dx(%edx), %eax
129
+ #else
130
+ addl $_GLOBAL_OFFSET_TABLE_, %edx
131
+ movl int_val@GOT(%edx), %eax
132
+ #endif
133
+ movl (%eax), %eax
134
+ ret
135
+
136
+ .p2align 4,,15
137
+ .globl x86_test_call_get_pc_thunk_si
138
+ x86_test_call_get_pc_thunk_si:
139
+ pushl %esi
140
+ call x86.get_pc_thunk.si
141
+ #ifdef __APPLE__
142
+ L_si:
143
+ movl L_int_val$non_lazy_ptr-L_si(%esi), %eax
144
+ #else
145
+ addl $_GLOBAL_OFFSET_TABLE_, %esi
146
+ movl int_val@GOT(%esi), %eax
147
+ #endif
148
+ movl (%eax), %eax
149
+ popl %esi
150
+ ret
151
+
152
+ .p2align 4,,15
153
+ .globl x86_test_call_get_pc_thunk_di
154
+ x86_test_call_get_pc_thunk_di:
155
+ pushl %edi
156
+ call x86.get_pc_thunk.di
157
+ #ifdef __APPLE__
158
+ L_di:
159
+ movl L_int_val$non_lazy_ptr-L_di(%edi), %eax
160
+ #else
161
+ addl $_GLOBAL_OFFSET_TABLE_, %edi
162
+ movl int_val@GOT(%edi), %eax
163
+ #endif
164
+ movl (%eax), %eax
165
+ popl %edi
166
+ ret
167
+
168
+ .p2align 4,,15
169
+ .globl x86_test_call_get_pc_thunk_bp
170
+ x86_test_call_get_pc_thunk_bp:
171
+ pushl %ebp
172
+ call x86.get_pc_thunk.bp
173
+ #ifdef __APPLE__
174
+ L_bp:
175
+ movl L_int_val$non_lazy_ptr-L_bp(%ebp), %eax
176
+ #else
177
+ addl $_GLOBAL_OFFSET_TABLE_, %ebp
178
+ movl int_val@GOT(%ebp), %eax
179
+ #endif
180
+ movl (%eax), %eax
181
+ popl %ebp
182
+ ret
183
+
184
+ .p2align 4,,15
185
+ x86.get_pc_thunk.ax:
186
+ movl (%esp), %eax
187
+ ret
188
+
189
+ .p2align 4,,15
190
+ x86.get_pc_thunk.bx:
191
+ movl (%esp), %ebx
192
+ ret
193
+
194
+ .p2align 4,,15
195
+ x86.get_pc_thunk.cx:
196
+ movl (%esp), %ecx
197
+ ret
198
+
199
+ .p2align 4,,15
200
+ x86.get_pc_thunk.dx:
201
+ movl (%esp), %edx
202
+ ret
203
+
204
+ .p2align 4,,15
205
+ x86.get_pc_thunk.si:
206
+ movl (%esp), %esi
207
+ ret
208
+
209
+ .p2align 4,,15
210
+ x86.get_pc_thunk.di:
211
+ movl (%esp), %edi
212
+ ret
213
+
214
+ .p2align 4,,15
215
+ x86.get_pc_thunk.bp:
216
+ movl (%esp), %ebp
217
+ ret
218
+
219
+ .p2align 4,,15
220
+ .globl x86_test_call_and_pop_eax
221
+ x86_test_call_and_pop_eax:
222
+ call L_call_and_pop_eax
223
+ L_call_and_pop_eax:
224
+ popl %eax
225
+ #ifdef __APPLE__
226
+ movl L_int_val$non_lazy_ptr-L_call_and_pop_eax(%eax), %eax
227
+ #else
228
+ addl $_GLOBAL_OFFSET_TABLE_+1, %eax
229
+ movl int_val@GOT(%eax), %eax
230
+ #endif
231
+ movl (%eax), %eax
232
+ ret
233
+
234
+ .p2align 4,,15
235
+ .globl x86_test_call_and_pop_ebx
236
+ x86_test_call_and_pop_ebx:
237
+ pushl %ebx
238
+ call L_call_and_pop_ebx
239
+ L_call_and_pop_ebx:
240
+ popl %ebx
241
+ #ifdef __APPLE__
242
+ movl L_int_val$non_lazy_ptr-L_call_and_pop_ebx(%ebx), %eax
243
+ #else
244
+ addl $_GLOBAL_OFFSET_TABLE_+1, %ebx
245
+ movl int_val@GOT(%ebx), %eax
246
+ #endif
247
+ movl (%eax), %eax
248
+ popl %ebx
249
+ ret
250
+
251
+ .p2align 4,,15
252
+ .globl x86_test_call_and_pop_ecx
253
+ x86_test_call_and_pop_ecx:
254
+ call L_call_and_pop_ecx
255
+ L_call_and_pop_ecx:
256
+ popl %ecx
257
+ #ifdef __APPLE__
258
+ movl L_int_val$non_lazy_ptr-L_call_and_pop_ecx(%ecx), %eax
259
+ #else
260
+ addl $_GLOBAL_OFFSET_TABLE_+1, %ecx
261
+ movl int_val@GOT(%ecx), %eax
262
+ #endif
263
+ movl (%eax), %eax
264
+ ret
265
+
266
+ .p2align 4,,15
267
+ .globl x86_test_call_and_pop_edx
268
+ x86_test_call_and_pop_edx:
269
+ call L_call_and_pop_edx
270
+ L_call_and_pop_edx:
271
+ popl %edx
272
+ #ifdef __APPLE__
273
+ movl L_int_val$non_lazy_ptr-L_call_and_pop_edx(%edx), %eax
274
+ #else
275
+ addl $_GLOBAL_OFFSET_TABLE_+1, %edx
276
+ movl int_val@GOT(%edx), %eax
277
+ #endif
278
+ movl (%eax), %eax
279
+ ret
280
+
281
+ .p2align 4,,15
282
+ .globl x86_test_call_and_pop_esi
283
+ x86_test_call_and_pop_esi:
284
+ pushl %esi
285
+ call L_call_and_pop_esi
286
+ L_call_and_pop_esi:
287
+ popl %esi
288
+ #ifdef __APPLE__
289
+ movl L_int_val$non_lazy_ptr-L_call_and_pop_esi(%esi), %eax
290
+ #else
291
+ addl $_GLOBAL_OFFSET_TABLE_+1, %esi
292
+ movl int_val@GOT(%esi), %eax
293
+ #endif
294
+ movl (%eax), %eax
295
+ popl %esi
296
+ ret
297
+
298
+ .p2align 4,,15
299
+ .globl x86_test_call_and_pop_edi
300
+ x86_test_call_and_pop_edi:
301
+ pushl %edi
302
+ call L_call_and_pop_edi
303
+ L_call_and_pop_edi:
304
+ popl %edi
305
+ #ifdef __APPLE__
306
+ movl L_int_val$non_lazy_ptr-L_call_and_pop_edi(%edi), %eax
307
+ #else
308
+ addl $_GLOBAL_OFFSET_TABLE_+1, %edi
309
+ movl int_val@GOT(%edi), %eax
310
+ #endif
311
+ movl (%eax), %eax
312
+ popl %edi
313
+ ret
314
+
315
+ .p2align 4,,15
316
+ .globl x86_test_call_and_pop_ebp
317
+ x86_test_call_and_pop_ebp:
318
+ pushl %ebp
319
+ call L_call_and_pop_ebp
320
+ L_call_and_pop_ebp:
321
+ popl %ebp
322
+ #ifdef __APPLE__
323
+ movl L_int_val$non_lazy_ptr-L_call_and_pop_ebp(%ebp), %eax
324
+ #else
325
+ addl $_GLOBAL_OFFSET_TABLE_+1, %ebp
326
+ movl int_val@GOT(%ebp), %eax
327
+ #endif
328
+ movl (%eax), %eax
329
+ popl %ebp
330
+ ret
331
+
332
+ #endif
333
+
334
+ #ifdef __APPLE__
335
+ .section __IMPORT,__pointers,non_lazy_symbol_pointers
336
+ L_int_val$non_lazy_ptr:
337
+ .indirect_symbol _int_val
338
+ .long 0
339
+ #endif