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.
- checksums.yaml +7 -0
- data/.clang-format +5 -0
- data/.dockerignore +10 -0
- data/.gitignore +58 -0
- data/.gitmodules +6 -0
- data/.rspec +6 -0
- data/.simplecov +4 -0
- data/Gemfile +7 -0
- data/LICENSE.txt +12 -0
- data/Rakefile +15 -0
- data/exe/contrast_service +29 -0
- data/ext/build_funchook.rb +48 -0
- data/ext/cs__assess_active_record_named/cs__active_record_named.c +47 -0
- data/ext/cs__assess_active_record_named/cs__active_record_named.h +10 -0
- data/ext/cs__assess_active_record_named/extconf.rb +2 -0
- data/ext/cs__assess_array/cs__assess_array.c +38 -0
- data/ext/cs__assess_array/cs__assess_array.h +9 -0
- data/ext/cs__assess_array/extconf.rb +2 -0
- data/ext/cs__assess_basic_object/cs__assess_basic_object.c +50 -0
- data/ext/cs__assess_basic_object/cs__assess_basic_object.h +17 -0
- data/ext/cs__assess_basic_object/extconf.rb +2 -0
- data/ext/cs__assess_fiber_track/cs__assess_fiber_track.c +86 -0
- data/ext/cs__assess_fiber_track/cs__assess_fiber_track.h +34 -0
- data/ext/cs__assess_fiber_track/extconf.rb +2 -0
- data/ext/cs__assess_hash/cs__assess_hash.c +64 -0
- data/ext/cs__assess_hash/cs__assess_hash.h +24 -0
- data/ext/cs__assess_hash/extconf.rb +2 -0
- data/ext/cs__assess_kernel/cs__assess_kernel.c +36 -0
- data/ext/cs__assess_kernel/cs__assess_kernel.h +10 -0
- data/ext/cs__assess_kernel/extconf.rb +2 -0
- data/ext/cs__assess_marshal_module/cs__assess_marshal_module.c +47 -0
- data/ext/cs__assess_marshal_module/cs__assess_marshal_module.h +18 -0
- data/ext/cs__assess_marshal_module/extconf.rb +2 -0
- data/ext/cs__assess_module/cs__assess_module.c +78 -0
- data/ext/cs__assess_module/cs__assess_module.h +25 -0
- data/ext/cs__assess_module/extconf.rb +2 -0
- data/ext/cs__assess_regexp/cs__assess_regexp.c +48 -0
- data/ext/cs__assess_regexp/cs__assess_regexp.h +22 -0
- data/ext/cs__assess_regexp/extconf.rb +2 -0
- data/ext/cs__assess_regexp_track/cs__assess_regexp_track.c +63 -0
- data/ext/cs__assess_regexp_track/cs__assess_regexp_track.h +29 -0
- data/ext/cs__assess_regexp_track/extconf.rb +2 -0
- data/ext/cs__assess_string/cs__assess_string.c +38 -0
- data/ext/cs__assess_string/cs__assess_string.h +19 -0
- data/ext/cs__assess_string/extconf.rb +2 -0
- data/ext/cs__assess_string_interpolation26/cs__assess_string_interpolation26.c +31 -0
- data/ext/cs__assess_string_interpolation26/cs__assess_string_interpolation26.h +13 -0
- data/ext/cs__assess_string_interpolation26/extconf.rb +2 -0
- data/ext/cs__common/cs__common.c +60 -0
- data/ext/cs__common/cs__common.h +28 -0
- data/ext/cs__common/extconf.rb +20 -0
- data/ext/cs__contrast_patch/cs__contrast_patch.c +445 -0
- data/ext/cs__contrast_patch/cs__contrast_patch.h +196 -0
- data/ext/cs__contrast_patch/extconf.rb +2 -0
- data/ext/cs__protect_kernel/cs__protect_kernel.c +37 -0
- data/ext/cs__protect_kernel/cs__protect_kernel.h +11 -0
- data/ext/cs__protect_kernel/extconf.rb +2 -0
- data/ext/cs__scope/cs__scope.c +96 -0
- data/ext/cs__scope/cs__scope.h +33 -0
- data/ext/cs__scope/extconf.rb +2 -0
- data/ext/extconf_common.rb +49 -0
- data/funchook/LICENSE +360 -0
- data/funchook/Makefile +29 -0
- data/funchook/Makefile.in +29 -0
- data/funchook/README.md +121 -0
- data/funchook/appveyor.yml +42 -0
- data/funchook/autogen.sh +3 -0
- data/funchook/autom4te.cache/output.0 +4976 -0
- data/funchook/autom4te.cache/requests +78 -0
- data/funchook/autom4te.cache/traces.0 +364 -0
- data/funchook/config.guess +1530 -0
- data/funchook/config.log +490 -0
- data/funchook/config.status +1016 -0
- data/funchook/config.sub +1773 -0
- data/funchook/configure +4976 -0
- data/funchook/configure.ac +59 -0
- data/funchook/distorm/COPYING +26 -0
- data/funchook/distorm/MANIFEST +25 -0
- data/funchook/distorm/MANIFEST.in +4 -0
- data/funchook/distorm/README.md +12 -0
- data/funchook/distorm/disOps/disOps.py +795 -0
- data/funchook/distorm/disOps/x86db.py +404 -0
- data/funchook/distorm/disOps/x86header.py +247 -0
- data/funchook/distorm/disOps/x86sets.py +1664 -0
- data/funchook/distorm/examples/cs/TestdiStorm/Program.cs +79 -0
- data/funchook/distorm/examples/cs/TestdiStorm/Properties/AssemblyInfo.cs +36 -0
- data/funchook/distorm/examples/cs/TestdiStorm/TestdiStorm.csproj +69 -0
- data/funchook/distorm/examples/cs/distorm-net.sln +26 -0
- data/funchook/distorm/examples/cs/distorm-net/CodeInfo.cs +23 -0
- data/funchook/distorm/examples/cs/distorm-net/DecodedInst.cs +15 -0
- data/funchook/distorm/examples/cs/distorm-net/DecodedResult.cs +14 -0
- data/funchook/distorm/examples/cs/distorm-net/DecomposedInst.cs +36 -0
- data/funchook/distorm/examples/cs/distorm-net/DecomposedResult.cs +14 -0
- data/funchook/distorm/examples/cs/distorm-net/Opcodes.cs +1268 -0
- data/funchook/distorm/examples/cs/distorm-net/Opcodes.tt +37 -0
- data/funchook/distorm/examples/cs/distorm-net/Operand.cs +25 -0
- data/funchook/distorm/examples/cs/distorm-net/Properties/AssemblyInfo.cs +36 -0
- data/funchook/distorm/examples/cs/distorm-net/diStorm3.cs +411 -0
- data/funchook/distorm/examples/cs/distorm-net/distorm-net.csproj +80 -0
- data/funchook/distorm/examples/cs/readme +3 -0
- data/funchook/distorm/examples/ddk/README +48 -0
- data/funchook/distorm/examples/ddk/distorm.ini +11 -0
- data/funchook/distorm/examples/ddk/dummy.c +15 -0
- data/funchook/distorm/examples/ddk/main.c +91 -0
- data/funchook/distorm/examples/ddk/makefile +1 -0
- data/funchook/distorm/examples/ddk/sources +10 -0
- data/funchook/distorm/examples/java/Makefile +23 -0
- data/funchook/distorm/examples/java/distorm/src/Main.java +43 -0
- data/funchook/distorm/examples/java/distorm/src/diStorm3/CodeInfo.java +27 -0
- data/funchook/distorm/examples/java/distorm/src/diStorm3/DecodedInst.java +32 -0
- data/funchook/distorm/examples/java/distorm/src/diStorm3/DecodedResult.java +11 -0
- data/funchook/distorm/examples/java/distorm/src/diStorm3/DecomposedInst.java +89 -0
- data/funchook/distorm/examples/java/distorm/src/diStorm3/DecomposedResult.java +11 -0
- data/funchook/distorm/examples/java/distorm/src/diStorm3/OpcodeEnum.java +131 -0
- data/funchook/distorm/examples/java/distorm/src/diStorm3/Opcodes.java +1123 -0
- data/funchook/distorm/examples/java/distorm/src/diStorm3/Operand.java +24 -0
- data/funchook/distorm/examples/java/distorm/src/diStorm3/distorm3.java +41 -0
- data/funchook/distorm/examples/java/jdistorm.c +405 -0
- data/funchook/distorm/examples/java/jdistorm.h +40 -0
- data/funchook/distorm/examples/java/jdistorm.sln +20 -0
- data/funchook/distorm/examples/java/jdistorm.vcproj +208 -0
- data/funchook/distorm/examples/linux/Makefile +15 -0
- data/funchook/distorm/examples/linux/main.c +181 -0
- data/funchook/distorm/examples/tests/Makefile +15 -0
- data/funchook/distorm/examples/tests/main.cpp +42 -0
- data/funchook/distorm/examples/tests/main.py +66 -0
- data/funchook/distorm/examples/tests/test_distorm3.py +1672 -0
- data/funchook/distorm/examples/tests/tests.sln +20 -0
- data/funchook/distorm/examples/tests/tests.vcxproj +82 -0
- data/funchook/distorm/examples/tests/tests.vcxproj.filters +22 -0
- data/funchook/distorm/examples/win32/disasm.sln +25 -0
- data/funchook/distorm/examples/win32/disasm.vcxproj +201 -0
- data/funchook/distorm/examples/win32/disasm.vcxproj.filters +14 -0
- data/funchook/distorm/examples/win32/main.cpp +163 -0
- data/funchook/distorm/include/distorm.h +482 -0
- data/funchook/distorm/include/mnemonics.h +301 -0
- data/funchook/distorm/make/linux/Makefile +28 -0
- data/funchook/distorm/make/mac/Makefile +24 -0
- data/funchook/distorm/make/win32/cdistorm.vcxproj +239 -0
- data/funchook/distorm/make/win32/cdistorm.vcxproj.filters +80 -0
- data/funchook/distorm/make/win32/distorm.sln +25 -0
- data/funchook/distorm/make/win32/resource.h +14 -0
- data/funchook/distorm/make/win32/resource.rc +99 -0
- data/funchook/distorm/python/distorm3/__init__.py +957 -0
- data/funchook/distorm/python/distorm3/sample.py +51 -0
- data/funchook/distorm/setup.cfg +10 -0
- data/funchook/distorm/setup.py +266 -0
- data/funchook/distorm/src/config.h +169 -0
- data/funchook/distorm/src/decoder.c +641 -0
- data/funchook/distorm/src/decoder.h +33 -0
- data/funchook/distorm/src/distorm.c +413 -0
- data/funchook/distorm/src/instructions.c +597 -0
- data/funchook/distorm/src/instructions.h +463 -0
- data/funchook/distorm/src/insts.c +7939 -0
- data/funchook/distorm/src/insts.h +64 -0
- data/funchook/distorm/src/mnemonics.c +284 -0
- data/funchook/distorm/src/operands.c +1290 -0
- data/funchook/distorm/src/operands.h +28 -0
- data/funchook/distorm/src/prefix.c +368 -0
- data/funchook/distorm/src/prefix.h +64 -0
- data/funchook/distorm/src/textdefs.c +172 -0
- data/funchook/distorm/src/textdefs.h +57 -0
- data/funchook/distorm/src/wstring.c +47 -0
- data/funchook/distorm/src/wstring.h +35 -0
- data/funchook/distorm/src/x86defs.h +82 -0
- data/funchook/include/funchook.h +123 -0
- data/funchook/install-sh +527 -0
- data/funchook/src/Makefile +70 -0
- data/funchook/src/Makefile.in +70 -0
- data/funchook/src/__strerror.h +109 -0
- data/funchook/src/config.h +101 -0
- data/funchook/src/config.h.in +100 -0
- data/funchook/src/decoder.o +0 -0
- data/funchook/src/distorm.o +0 -0
- data/funchook/src/funchook.c +440 -0
- data/funchook/src/funchook.o +0 -0
- data/funchook/src/funchook_internal.h +155 -0
- data/funchook/src/funchook_io.c +182 -0
- data/funchook/src/funchook_io.h +64 -0
- data/funchook/src/funchook_io.o +0 -0
- data/funchook/src/funchook_syscall.S +134 -0
- data/funchook/src/funchook_syscall.o +0 -0
- data/funchook/src/funchook_unix.c +480 -0
- data/funchook/src/funchook_unix.o +0 -0
- data/funchook/src/funchook_windows.c +397 -0
- data/funchook/src/funchook_x86.c +622 -0
- data/funchook/src/funchook_x86.o +0 -0
- data/funchook/src/instructions.o +0 -0
- data/funchook/src/insts.o +0 -0
- data/funchook/src/libfunchook.so +0 -0
- data/funchook/src/mnemonics.o +0 -0
- data/funchook/src/operands.o +0 -0
- data/funchook/src/os_func.c +115 -0
- data/funchook/src/os_func.h +75 -0
- data/funchook/src/os_func.o +0 -0
- data/funchook/src/os_func_unix.c +94 -0
- data/funchook/src/os_func_unix.o +0 -0
- data/funchook/src/os_func_windows.c +32 -0
- data/funchook/src/prefix.o +0 -0
- data/funchook/src/printf_base.c +1688 -0
- data/funchook/src/printf_base.h +46 -0
- data/funchook/src/printf_base.o +0 -0
- data/funchook/src/textdefs.o +0 -0
- data/funchook/src/wstring.o +0 -0
- data/funchook/test/Makefile +43 -0
- data/funchook/test/Makefile.in +43 -0
- data/funchook/test/funchook_test +0 -0
- data/funchook/test/libfunchook_test.c +25 -0
- data/funchook/test/libfunchook_test.so +0 -0
- data/funchook/test/libfunchook_test2.c +18 -0
- data/funchook/test/suffix.list +600 -0
- data/funchook/test/test_main.c +430 -0
- data/funchook/test/test_main.o +0 -0
- data/funchook/test/x86_64_test.S +10 -0
- data/funchook/test/x86_64_test.o +0 -0
- data/funchook/test/x86_test.S +339 -0
- data/funchook/win32/config.h +1 -0
- data/funchook/win32/funchook.sln +52 -0
- data/funchook/win32/funchook.vcxproj +188 -0
- data/funchook/win32/funchook.vcxproj.filters +84 -0
- data/funchook/win32/funchook_test.vcxproj +170 -0
- data/funchook/win32/funchook_test.vcxproj.filters +22 -0
- data/funchook/win32/funchook_test_dll.vcxproj +184 -0
- data/funchook/win32/funchook_test_dll.vcxproj.filters +30 -0
- data/funchook/win32/funchook_test_exe.def +3 -0
- data/lib/contrast-agent.rb +8 -0
- data/lib/contrast.rb +57 -0
- data/lib/contrast/agent.rb +80 -0
- data/lib/contrast/agent/assess.rb +45 -0
- data/lib/contrast/agent/assess/adjusted_span.rb +25 -0
- data/lib/contrast/agent/assess/class_reverter.rb +82 -0
- data/lib/contrast/agent/assess/contrast_event.rb +398 -0
- data/lib/contrast/agent/assess/frozen_properties.rb +41 -0
- data/lib/contrast/agent/assess/insulator.rb +53 -0
- data/lib/contrast/agent/assess/policy/dynamic_source_factory.rb +78 -0
- data/lib/contrast/agent/assess/policy/patcher.rb +85 -0
- data/lib/contrast/agent/assess/policy/policy.rb +116 -0
- data/lib/contrast/agent/assess/policy/policy_node.rb +289 -0
- data/lib/contrast/agent/assess/policy/policy_scanner.rb +44 -0
- data/lib/contrast/agent/assess/policy/preshift.rb +94 -0
- data/lib/contrast/agent/assess/policy/propagation_method.rb +260 -0
- data/lib/contrast/agent/assess/policy/propagation_node.rb +127 -0
- data/lib/contrast/agent/assess/policy/propagator.rb +35 -0
- data/lib/contrast/agent/assess/policy/propagator/append.rb +54 -0
- data/lib/contrast/agent/assess/policy/propagator/base.rb +37 -0
- data/lib/contrast/agent/assess/policy/propagator/center.rb +73 -0
- data/lib/contrast/agent/assess/policy/propagator/custom.rb +36 -0
- data/lib/contrast/agent/assess/policy/propagator/database_write.rb +62 -0
- data/lib/contrast/agent/assess/policy/propagator/insert.rb +55 -0
- data/lib/contrast/agent/assess/policy/propagator/keep.rb +26 -0
- data/lib/contrast/agent/assess/policy/propagator/next.rb +42 -0
- data/lib/contrast/agent/assess/policy/propagator/prepend.rb +50 -0
- data/lib/contrast/agent/assess/policy/propagator/remove.rb +76 -0
- data/lib/contrast/agent/assess/policy/propagator/replace.rb +27 -0
- data/lib/contrast/agent/assess/policy/propagator/reverse.rb +38 -0
- data/lib/contrast/agent/assess/policy/propagator/select.rb +86 -0
- data/lib/contrast/agent/assess/policy/propagator/splat.rb +60 -0
- data/lib/contrast/agent/assess/policy/propagator/split.rb +49 -0
- data/lib/contrast/agent/assess/policy/propagator/substitution.rb +169 -0
- data/lib/contrast/agent/assess/policy/propagator/trim.rb +81 -0
- data/lib/contrast/agent/assess/policy/rewriter_patch.rb +79 -0
- data/lib/contrast/agent/assess/policy/source_method.rb +209 -0
- data/lib/contrast/agent/assess/policy/source_node.rb +62 -0
- data/lib/contrast/agent/assess/policy/trigger_method.rb +209 -0
- data/lib/contrast/agent/assess/policy/trigger_node.rb +198 -0
- data/lib/contrast/agent/assess/policy/trigger_validation/ssrf_validator.rb +77 -0
- data/lib/contrast/agent/assess/policy/trigger_validation/trigger_validation.rb +31 -0
- data/lib/contrast/agent/assess/policy/trigger_validation/xss_validator.rb +40 -0
- data/lib/contrast/agent/assess/properties.rb +392 -0
- data/lib/contrast/agent/assess/rule.rb +18 -0
- data/lib/contrast/agent/assess/rule/base.rb +72 -0
- data/lib/contrast/agent/assess/rule/csrf.rb +66 -0
- data/lib/contrast/agent/assess/rule/csrf/csrf_action.rb +28 -0
- data/lib/contrast/agent/assess/rule/csrf/csrf_applicator.rb +69 -0
- data/lib/contrast/agent/assess/rule/csrf/csrf_watcher.rb +132 -0
- data/lib/contrast/agent/assess/rule/provider.rb +21 -0
- data/lib/contrast/agent/assess/rule/provider/hardcoded_key.rb +62 -0
- data/lib/contrast/agent/assess/rule/provider/hardcoded_password.rb +73 -0
- data/lib/contrast/agent/assess/rule/provider/hardcoded_value_rule.rb +121 -0
- data/lib/contrast/agent/assess/rule/redos.rb +68 -0
- data/lib/contrast/agent/assess/rule/response_scanning_rule.rb +47 -0
- data/lib/contrast/agent/assess/rule/response_watcher.rb +36 -0
- data/lib/contrast/agent/assess/rule/watcher.rb +36 -0
- data/lib/contrast/agent/assess/tag.rb +151 -0
- data/lib/contrast/agent/at_exit_hook.rb +33 -0
- data/lib/contrast/agent/class_reopener.rb +195 -0
- data/lib/contrast/agent/deadzone/policy/deadzone_node.rb +26 -0
- data/lib/contrast/agent/deadzone/policy/policy.rb +57 -0
- data/lib/contrast/agent/disable_reaction.rb +24 -0
- data/lib/contrast/agent/exclusion_matcher.rb +190 -0
- data/lib/contrast/agent/feature_state.rb +379 -0
- data/lib/contrast/agent/inventory/policy/policy.rb +32 -0
- data/lib/contrast/agent/inventory/policy/trigger_node.rb +22 -0
- data/lib/contrast/agent/logger_manager.rb +116 -0
- data/lib/contrast/agent/middleware.rb +352 -0
- data/lib/contrast/agent/module_data.rb +16 -0
- data/lib/contrast/agent/patching/policy/after_load_patch.rb +37 -0
- data/lib/contrast/agent/patching/policy/after_load_patcher.rb +58 -0
- data/lib/contrast/agent/patching/policy/method_policy.rb +94 -0
- data/lib/contrast/agent/patching/policy/module_policy.rb +116 -0
- data/lib/contrast/agent/patching/policy/patch.rb +312 -0
- data/lib/contrast/agent/patching/policy/patch_status.rb +192 -0
- data/lib/contrast/agent/patching/policy/patcher.rb +310 -0
- data/lib/contrast/agent/patching/policy/policy.rb +138 -0
- data/lib/contrast/agent/patching/policy/policy_node.rb +80 -0
- data/lib/contrast/agent/patching/policy/policy_unpatcher.rb +28 -0
- data/lib/contrast/agent/patching/policy/trigger_node.rb +81 -0
- data/lib/contrast/agent/protect/policy/policy.rb +37 -0
- data/lib/contrast/agent/protect/policy/trigger_node.rb +23 -0
- data/lib/contrast/agent/protect/rule.rb +58 -0
- data/lib/contrast/agent/protect/rule/base.rb +300 -0
- data/lib/contrast/agent/protect/rule/base_service.rb +88 -0
- data/lib/contrast/agent/protect/rule/cmd_injection.rb +156 -0
- data/lib/contrast/agent/protect/rule/csrf.rb +118 -0
- data/lib/contrast/agent/protect/rule/csrf/csrf_evaluator.rb +103 -0
- data/lib/contrast/agent/protect/rule/csrf/csrf_token_injector.rb +85 -0
- data/lib/contrast/agent/protect/rule/default_scanner.rb +300 -0
- data/lib/contrast/agent/protect/rule/deserialization.rb +193 -0
- data/lib/contrast/agent/protect/rule/http_method_tampering.rb +80 -0
- data/lib/contrast/agent/protect/rule/no_sqli.rb +101 -0
- data/lib/contrast/agent/protect/rule/no_sqli/mongo_no_sql_scanner.rb +40 -0
- data/lib/contrast/agent/protect/rule/path_traversal.rb +143 -0
- data/lib/contrast/agent/protect/rule/sqli.rb +101 -0
- data/lib/contrast/agent/protect/rule/sqli/default_sql_scanner.rb +16 -0
- data/lib/contrast/agent/protect/rule/sqli/mysql_sql_scanner.rb +38 -0
- data/lib/contrast/agent/protect/rule/sqli/postgres_sql_scanner.rb +22 -0
- data/lib/contrast/agent/protect/rule/sqli/sqlite_sql_scanner.rb +19 -0
- data/lib/contrast/agent/protect/rule/unsafe_file_upload.rb +20 -0
- data/lib/contrast/agent/protect/rule/xss.rb +24 -0
- data/lib/contrast/agent/protect/rule/xxe.rb +120 -0
- data/lib/contrast/agent/protect/rule/xxe/entity_wrapper.rb +82 -0
- data/lib/contrast/agent/railtie.rb +30 -0
- data/lib/contrast/agent/reaction_processor.rb +47 -0
- data/lib/contrast/agent/request.rb +493 -0
- data/lib/contrast/agent/request_context.rb +225 -0
- data/lib/contrast/agent/require_state.rb +61 -0
- data/lib/contrast/agent/response.rb +215 -0
- data/lib/contrast/agent/rewriter.rb +244 -0
- data/lib/contrast/agent/scope.rb +28 -0
- data/lib/contrast/agent/service_heartbeat.rb +37 -0
- data/lib/contrast/agent/settings_state.rb +148 -0
- data/lib/contrast/agent/socket_client.rb +125 -0
- data/lib/contrast/agent/thread.rb +26 -0
- data/lib/contrast/agent/tracepoint_hook.rb +51 -0
- data/lib/contrast/agent/version.rb +8 -0
- data/lib/contrast/api.rb +17 -0
- data/lib/contrast/api/.gitkeep +0 -0
- data/lib/contrast/api/connection_status.rb +49 -0
- data/lib/contrast/api/socket.rb +43 -0
- data/lib/contrast/api/speedracer.rb +206 -0
- data/lib/contrast/api/tcp_socket.rb +31 -0
- data/lib/contrast/api/unix_socket.rb +25 -0
- data/lib/contrast/common_agent_configuration.rb +86 -0
- data/lib/contrast/components/agent.rb +85 -0
- data/lib/contrast/components/app_context.rb +188 -0
- data/lib/contrast/components/assess.rb +67 -0
- data/lib/contrast/components/config.rb +135 -0
- data/lib/contrast/components/contrast_service.rb +113 -0
- data/lib/contrast/components/heap_dump.rb +34 -0
- data/lib/contrast/components/interface.rb +178 -0
- data/lib/contrast/components/inventory.rb +23 -0
- data/lib/contrast/components/logger.rb +92 -0
- data/lib/contrast/components/protect.rb +38 -0
- data/lib/contrast/components/sampling.rb +41 -0
- data/lib/contrast/components/scope.rb +106 -0
- data/lib/contrast/components/settings.rb +140 -0
- data/lib/contrast/config.rb +33 -0
- data/lib/contrast/config/agent_configuration.rb +24 -0
- data/lib/contrast/config/application_configuration.rb +27 -0
- data/lib/contrast/config/assess_configuration.rb +22 -0
- data/lib/contrast/config/assess_rules_configuration.rb +18 -0
- data/lib/contrast/config/base_configuration.rb +105 -0
- data/lib/contrast/config/default_value.rb +16 -0
- data/lib/contrast/config/exception_configuration.rb +21 -0
- data/lib/contrast/config/heap_dump_configuration.rb +23 -0
- data/lib/contrast/config/inventory_configuration.rb +20 -0
- data/lib/contrast/config/logger_configuration.rb +20 -0
- data/lib/contrast/config/protect_configuration.rb +20 -0
- data/lib/contrast/config/protect_rule_configuration.rb +37 -0
- data/lib/contrast/config/protect_rules_configuration.rb +30 -0
- data/lib/contrast/config/root_configuration.rb +26 -0
- data/lib/contrast/config/ruby_configuration.rb +39 -0
- data/lib/contrast/config/sampling_configuration.rb +22 -0
- data/lib/contrast/config/server_configuration.rb +23 -0
- data/lib/contrast/config/service_configuration.rb +22 -0
- data/lib/contrast/configuration.rb +214 -0
- data/lib/contrast/core_extensions/assess.rb +51 -0
- data/lib/contrast/core_extensions/assess/array.rb +58 -0
- data/lib/contrast/core_extensions/assess/assess_extension.rb +145 -0
- data/lib/contrast/core_extensions/assess/basic_object.rb +15 -0
- data/lib/contrast/core_extensions/assess/erb.rb +42 -0
- data/lib/contrast/core_extensions/assess/exec_trigger.rb +48 -0
- data/lib/contrast/core_extensions/assess/fiber.rb +125 -0
- data/lib/contrast/core_extensions/assess/hash.rb +22 -0
- data/lib/contrast/core_extensions/assess/kernel.rb +95 -0
- data/lib/contrast/core_extensions/assess/module.rb +14 -0
- data/lib/contrast/core_extensions/assess/regexp.rb +206 -0
- data/lib/contrast/core_extensions/assess/string.rb +75 -0
- data/lib/contrast/core_extensions/assess/tilt_template_trigger.rb +73 -0
- data/lib/contrast/core_extensions/delegator.rb +14 -0
- data/lib/contrast/core_extensions/eval_trigger.rb +52 -0
- data/lib/contrast/core_extensions/inventory.rb +22 -0
- data/lib/contrast/core_extensions/inventory/datastores.rb +37 -0
- data/lib/contrast/core_extensions/module.rb +42 -0
- data/lib/contrast/core_extensions/object.rb +27 -0
- data/lib/contrast/core_extensions/protect.rb +20 -0
- data/lib/contrast/core_extensions/protect/applies_command_injection_rule.rb +70 -0
- data/lib/contrast/core_extensions/protect/applies_deserialization_rule.rb +58 -0
- data/lib/contrast/core_extensions/protect/applies_no_sqli_rule.rb +81 -0
- data/lib/contrast/core_extensions/protect/applies_path_traversal_rule.rb +119 -0
- data/lib/contrast/core_extensions/protect/applies_sqli_rule.rb +63 -0
- data/lib/contrast/core_extensions/protect/applies_xxe_rule.rb +141 -0
- data/lib/contrast/core_extensions/protect/kernel.rb +30 -0
- data/lib/contrast/core_extensions/protect/psych.rb +7 -0
- data/lib/contrast/core_extensions/thread.rb +31 -0
- data/lib/contrast/internal_exception.rb +8 -0
- data/lib/contrast/rails_extensions/assess/action_controller_inheritance.rb +48 -0
- data/lib/contrast/rails_extensions/assess/active_record.rb +32 -0
- data/lib/contrast/rails_extensions/assess/active_record_named.rb +61 -0
- data/lib/contrast/rails_extensions/assess/configuration.rb +26 -0
- data/lib/contrast/rails_extensions/buffer.rb +30 -0
- data/lib/contrast/rails_extensions/rack.rb +45 -0
- data/lib/contrast/security_exception.rb +14 -0
- data/lib/contrast/sinatra_extensions/assess/cookie.rb +26 -0
- data/lib/contrast/sinatra_extensions/inventory/sinatra_base.rb +59 -0
- data/lib/contrast/tasks/service.rb +95 -0
- data/lib/contrast/utils/assess/sampling_util.rb +96 -0
- data/lib/contrast/utils/assess/tracking_util.rb +39 -0
- data/lib/contrast/utils/boolean_util.rb +33 -0
- data/lib/contrast/utils/cache.rb +69 -0
- data/lib/contrast/utils/class_util.rb +58 -0
- data/lib/contrast/utils/comment_range.rb +19 -0
- data/lib/contrast/utils/data_store_util.rb +23 -0
- data/lib/contrast/utils/duck_utils.rb +58 -0
- data/lib/contrast/utils/env_configuration_item.rb +52 -0
- data/lib/contrast/utils/environment_util.rb +152 -0
- data/lib/contrast/utils/freeze_util.rb +36 -0
- data/lib/contrast/utils/gemfile_reader.rb +191 -0
- data/lib/contrast/utils/hash_digest.rb +148 -0
- data/lib/contrast/utils/heap_dump_util.rb +113 -0
- data/lib/contrast/utils/invalid_configuration_util.rb +88 -0
- data/lib/contrast/utils/inventory_util.rb +126 -0
- data/lib/contrast/utils/io_util.rb +61 -0
- data/lib/contrast/utils/object_share.rb +117 -0
- data/lib/contrast/utils/operating_environment.rb +38 -0
- data/lib/contrast/utils/os.rb +49 -0
- data/lib/contrast/utils/path_util.rb +151 -0
- data/lib/contrast/utils/performs_logging.rb +152 -0
- data/lib/contrast/utils/preflight_util.rb +13 -0
- data/lib/contrast/utils/prevent_serialization.rb +52 -0
- data/lib/contrast/utils/rack_assess_session_cookie.rb +104 -0
- data/lib/contrast/utils/rails_assess_configuration.rb +95 -0
- data/lib/contrast/utils/random_util.rb +22 -0
- data/lib/contrast/utils/resource_loader.rb +23 -0
- data/lib/contrast/utils/ruby_ast_rewriter.rb +74 -0
- data/lib/contrast/utils/scope_util.rb +99 -0
- data/lib/contrast/utils/service_response_util.rb +116 -0
- data/lib/contrast/utils/service_sender_util.rb +98 -0
- data/lib/contrast/utils/sha256_builder.rb +69 -0
- data/lib/contrast/utils/sinatra_helper.rb +49 -0
- data/lib/contrast/utils/stack_trace_utils.rb +209 -0
- data/lib/contrast/utils/string_utils.rb +72 -0
- data/lib/contrast/utils/tag_util.rb +139 -0
- data/lib/contrast/utils/thread_tracker.rb +54 -0
- data/lib/contrast/utils/timer.rb +78 -0
- data/resources/assess/policy.json +1673 -0
- data/resources/csrf/inject.js +44 -0
- data/resources/deadzone/policy.json +55 -0
- data/resources/factory-bot-spec/spec_helper.rb +30 -0
- data/resources/inventory/policy.json +110 -0
- data/resources/protect/policy.json +417 -0
- data/resources/rubocops/kernel/catch_cop.rb +37 -0
- data/resources/rubocops/kernel/require_cop.rb +37 -0
- data/resources/rubocops/kernel/require_relative_cop.rb +33 -0
- data/resources/rubocops/module/autoload_cop.rb +37 -0
- data/resources/rubocops/module/const_defined_cop.rb +37 -0
- data/resources/rubocops/module/const_get_cop.rb +37 -0
- data/resources/rubocops/module/const_set_cop.rb +37 -0
- data/resources/rubocops/module/constants_cop.rb +37 -0
- data/resources/rubocops/module/name_cop.rb +37 -0
- data/resources/rubocops/object/class_cop.rb +37 -0
- data/resources/rubocops/object/freeze_cop.rb +37 -0
- data/resources/rubocops/object/frozen_cop.rb +37 -0
- data/resources/rubocops/object/is_a_cop.rb +37 -0
- data/resources/rubocops/object/method_cop.rb +37 -0
- data/resources/rubocops/object/respond_to_cop.rb +37 -0
- data/resources/rubocops/object/singleton_class_cop.rb +37 -0
- data/resources/rubocops/regexp/spelling_cop.rb +44 -0
- data/resources/rubocops/thread/new_cop.rb +39 -0
- data/resources/ruby-spec/ancestors_spec.rb +70 -0
- data/resources/ruby-spec/modulo_spec.rb +831 -0
- data/resources/ruby-spec/parameters_spec.rb +261 -0
- data/resources/ruby-spec/ruby_spec_spec_helper.rb +35 -0
- data/resources/test_marker.txt +1 -0
- data/ruby-agent.gemspec +129 -0
- data/service_executables/.gitkeep +0 -0
- data/service_executables/VERSION +1 -0
- data/service_executables/linux/contrast-service +0 -0
- data/service_executables/mac/contrast-service +0 -0
- 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
|
|
Binary file
|
|
@@ -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
|