From 633201acf4b4a786985499c1bfd52d3bc517c3fc Mon Sep 17 00:00:00 2001 From: "947330670@qq.com" <947330670@qq.com> Date: Mon, 5 Aug 2024 11:43:14 +0800 Subject: [PATCH] 121212 --- DNF_DLL编写.sln | 36 +- test/DNFTOOL.cpp | 191 +- test/dllmain.cpp | 59 +- test/hook.cpp | 50 +- test/httplib.h | 12 +- test/lib/zlib.lib | Bin 0 -> 17072 bytes test/lib/zlibstatic.lib | Bin 0 -> 116008 bytes .../include/openssl/__DECC_INCLUDE_EPILOGUE.H | 22 + .../include/openssl/__DECC_INCLUDE_PROLOGUE.H | 26 + test/openssl/include/openssl/aes.h | 111 + test/openssl/include/openssl/applink.c | 144 + test/openssl/include/openssl/asn1.h | 1128 ++++ test/openssl/include/openssl/asn1_mac.h | 10 + test/openssl/include/openssl/asn1err.h | 140 + test/openssl/include/openssl/asn1t.h | 946 +++ test/openssl/include/openssl/async.h | 96 + test/openssl/include/openssl/asyncerr.h | 29 + test/openssl/include/openssl/bio.h | 886 +++ test/openssl/include/openssl/bioerr.h | 65 + test/openssl/include/openssl/blowfish.h | 78 + test/openssl/include/openssl/bn.h | 583 ++ test/openssl/include/openssl/bnerr.h | 46 + test/openssl/include/openssl/buffer.h | 62 + test/openssl/include/openssl/buffererr.h | 25 + test/openssl/include/openssl/camellia.h | 117 + test/openssl/include/openssl/cast.h | 71 + test/openssl/include/openssl/cmac.h | 52 + test/openssl/include/openssl/cmp.h | 592 ++ test/openssl/include/openssl/cmp_util.h | 56 + test/openssl/include/openssl/cmperr.h | 112 + test/openssl/include/openssl/cms.h | 493 ++ test/openssl/include/openssl/cmserr.h | 122 + test/openssl/include/openssl/comp.h | 59 + test/openssl/include/openssl/comperr.h | 31 + test/openssl/include/openssl/conf.h | 211 + test/openssl/include/openssl/conf_api.h | 46 + test/openssl/include/openssl/conferr.h | 51 + test/openssl/include/openssl/configuration.h | 133 + test/openssl/include/openssl/conftypes.h | 44 + test/openssl/include/openssl/core.h | 233 + test/openssl/include/openssl/core_dispatch.h | 943 +++ test/openssl/include/openssl/core_names.h | 556 ++ test/openssl/include/openssl/core_object.h | 41 + test/openssl/include/openssl/crmf.h | 227 + test/openssl/include/openssl/crmferr.h | 50 + test/openssl/include/openssl/crypto.h | 558 ++ test/openssl/include/openssl/cryptoerr.h | 46 + .../include/openssl/cryptoerr_legacy.h | 1466 +++++ test/openssl/include/openssl/ct.h | 573 ++ test/openssl/include/openssl/cterr.h | 45 + test/openssl/include/openssl/decoder.h | 133 + test/openssl/include/openssl/decodererr.h | 28 + test/openssl/include/openssl/des.h | 211 + test/openssl/include/openssl/dh.h | 328 + test/openssl/include/openssl/dherr.h | 57 + test/openssl/include/openssl/dsa.h | 275 + test/openssl/include/openssl/dsaerr.h | 43 + test/openssl/include/openssl/dtls1.h | 57 + test/openssl/include/openssl/e_os2.h | 305 + test/openssl/include/openssl/ebcdic.h | 39 + test/openssl/include/openssl/ec.h | 1569 +++++ test/openssl/include/openssl/ecdh.h | 10 + test/openssl/include/openssl/ecdsa.h | 10 + test/openssl/include/openssl/ecerr.h | 103 + test/openssl/include/openssl/encoder.h | 124 + test/openssl/include/openssl/encodererr.h | 28 + test/openssl/include/openssl/engine.h | 833 +++ test/openssl/include/openssl/engineerr.h | 63 + test/openssl/include/openssl/err.h | 492 ++ test/openssl/include/openssl/ess.h | 128 + test/openssl/include/openssl/esserr.h | 32 + test/openssl/include/openssl/evp.h | 2170 +++++++ test/openssl/include/openssl/evperr.h | 134 + test/openssl/include/openssl/fips_names.h | 60 + test/openssl/include/openssl/fipskey.h | 36 + test/openssl/include/openssl/hmac.h | 62 + test/openssl/include/openssl/http.h | 109 + test/openssl/include/openssl/httperr.h | 55 + test/openssl/include/openssl/idea.h | 82 + test/openssl/include/openssl/kdf.h | 138 + test/openssl/include/openssl/kdferr.h | 16 + test/openssl/include/openssl/lhash.h | 288 + test/openssl/include/openssl/macros.h | 304 + test/openssl/include/openssl/md2.h | 56 + test/openssl/include/openssl/md4.h | 63 + test/openssl/include/openssl/md5.h | 62 + test/openssl/include/openssl/mdc2.h | 55 + test/openssl/include/openssl/modes.h | 219 + test/openssl/include/openssl/obj_mac.h | 5481 +++++++++++++++++ test/openssl/include/openssl/objects.h | 183 + test/openssl/include/openssl/objectserr.h | 28 + test/openssl/include/openssl/ocsp.h | 483 ++ test/openssl/include/openssl/ocsperr.h | 53 + test/openssl/include/openssl/opensslconf.h | 17 + test/openssl/include/openssl/opensslv.h | 114 + test/openssl/include/openssl/ossl_typ.h | 16 + test/openssl/include/openssl/param_build.h | 63 + test/openssl/include/openssl/params.h | 160 + test/openssl/include/openssl/pem.h | 538 ++ test/openssl/include/openssl/pem2.h | 19 + test/openssl/include/openssl/pemerr.h | 58 + test/openssl/include/openssl/pkcs12.h | 350 ++ test/openssl/include/openssl/pkcs12err.h | 45 + test/openssl/include/openssl/pkcs7.h | 427 ++ test/openssl/include/openssl/pkcs7err.h | 63 + test/openssl/include/openssl/prov_ssl.h | 34 + test/openssl/include/openssl/proverr.h | 148 + test/openssl/include/openssl/provider.h | 60 + test/openssl/include/openssl/rand.h | 123 + test/openssl/include/openssl/randerr.h | 68 + test/openssl/include/openssl/rc2.h | 68 + test/openssl/include/openssl/rc4.h | 47 + test/openssl/include/openssl/rc5.h | 79 + test/openssl/include/openssl/ripemd.h | 59 + test/openssl/include/openssl/rsa.h | 604 ++ test/openssl/include/openssl/rsaerr.h | 107 + test/openssl/include/openssl/safestack.h | 297 + test/openssl/include/openssl/seed.h | 113 + test/openssl/include/openssl/self_test.h | 92 + test/openssl/include/openssl/sha.h | 138 + test/openssl/include/openssl/srp.h | 285 + test/openssl/include/openssl/srtp.h | 56 + test/openssl/include/openssl/ssl.h | 2599 ++++++++ test/openssl/include/openssl/ssl2.h | 30 + test/openssl/include/openssl/ssl3.h | 347 ++ test/openssl/include/openssl/sslerr.h | 343 ++ test/openssl/include/openssl/sslerr_legacy.h | 468 ++ test/openssl/include/openssl/stack.h | 90 + test/openssl/include/openssl/store.h | 369 ++ test/openssl/include/openssl/storeerr.h | 49 + test/openssl/include/openssl/symhacks.h | 39 + test/openssl/include/openssl/tls1.h | 1223 ++++ test/openssl/include/openssl/trace.h | 312 + test/openssl/include/openssl/ts.h | 503 ++ test/openssl/include/openssl/tserr.h | 67 + test/openssl/include/openssl/txt_db.h | 63 + test/openssl/include/openssl/types.h | 236 + test/openssl/include/openssl/ui.h | 407 ++ test/openssl/include/openssl/uierr.h | 38 + test/openssl/include/openssl/whrlpool.h | 62 + test/openssl/include/openssl/x509.h | 1276 ++++ test/openssl/include/openssl/x509_vfy.h | 894 +++ test/openssl/include/openssl/x509err.h | 68 + test/openssl/include/openssl/x509v3.h | 1450 +++++ test/openssl/include/openssl/x509v3err.h | 93 + test/openssl/lib/engines-3/capi.dll | Bin 0 -> 53248 bytes test/openssl/lib/engines-3/loader_attic.dll | Bin 0 -> 61952 bytes test/openssl/lib/engines-3/padlock.dll | Bin 0 -> 46592 bytes test/openssl/lib/libcrypto.lib | Bin 0 -> 1256052 bytes test/openssl/lib/libssl.lib | Bin 0 -> 126770 bytes test/openssl/lib/ossl-modules/legacy.dll | Bin 0 -> 100864 bytes test/squirrel.cpp | 70 + test/test.vcxproj | 17 +- test/test.vcxproj.filters | 3 - 154 files changed, 41915 insertions(+), 127 deletions(-) create mode 100644 test/lib/zlib.lib create mode 100644 test/lib/zlibstatic.lib create mode 100644 test/openssl/include/openssl/__DECC_INCLUDE_EPILOGUE.H create mode 100644 test/openssl/include/openssl/__DECC_INCLUDE_PROLOGUE.H create mode 100644 test/openssl/include/openssl/aes.h create mode 100644 test/openssl/include/openssl/applink.c create mode 100644 test/openssl/include/openssl/asn1.h create mode 100644 test/openssl/include/openssl/asn1_mac.h create mode 100644 test/openssl/include/openssl/asn1err.h create mode 100644 test/openssl/include/openssl/asn1t.h create mode 100644 test/openssl/include/openssl/async.h create mode 100644 test/openssl/include/openssl/asyncerr.h create mode 100644 test/openssl/include/openssl/bio.h create mode 100644 test/openssl/include/openssl/bioerr.h create mode 100644 test/openssl/include/openssl/blowfish.h create mode 100644 test/openssl/include/openssl/bn.h create mode 100644 test/openssl/include/openssl/bnerr.h create mode 100644 test/openssl/include/openssl/buffer.h create mode 100644 test/openssl/include/openssl/buffererr.h create mode 100644 test/openssl/include/openssl/camellia.h create mode 100644 test/openssl/include/openssl/cast.h create mode 100644 test/openssl/include/openssl/cmac.h create mode 100644 test/openssl/include/openssl/cmp.h create mode 100644 test/openssl/include/openssl/cmp_util.h create mode 100644 test/openssl/include/openssl/cmperr.h create mode 100644 test/openssl/include/openssl/cms.h create mode 100644 test/openssl/include/openssl/cmserr.h create mode 100644 test/openssl/include/openssl/comp.h create mode 100644 test/openssl/include/openssl/comperr.h create mode 100644 test/openssl/include/openssl/conf.h create mode 100644 test/openssl/include/openssl/conf_api.h create mode 100644 test/openssl/include/openssl/conferr.h create mode 100644 test/openssl/include/openssl/configuration.h create mode 100644 test/openssl/include/openssl/conftypes.h create mode 100644 test/openssl/include/openssl/core.h create mode 100644 test/openssl/include/openssl/core_dispatch.h create mode 100644 test/openssl/include/openssl/core_names.h create mode 100644 test/openssl/include/openssl/core_object.h create mode 100644 test/openssl/include/openssl/crmf.h create mode 100644 test/openssl/include/openssl/crmferr.h create mode 100644 test/openssl/include/openssl/crypto.h create mode 100644 test/openssl/include/openssl/cryptoerr.h create mode 100644 test/openssl/include/openssl/cryptoerr_legacy.h create mode 100644 test/openssl/include/openssl/ct.h create mode 100644 test/openssl/include/openssl/cterr.h create mode 100644 test/openssl/include/openssl/decoder.h create mode 100644 test/openssl/include/openssl/decodererr.h create mode 100644 test/openssl/include/openssl/des.h create mode 100644 test/openssl/include/openssl/dh.h create mode 100644 test/openssl/include/openssl/dherr.h create mode 100644 test/openssl/include/openssl/dsa.h create mode 100644 test/openssl/include/openssl/dsaerr.h create mode 100644 test/openssl/include/openssl/dtls1.h create mode 100644 test/openssl/include/openssl/e_os2.h create mode 100644 test/openssl/include/openssl/ebcdic.h create mode 100644 test/openssl/include/openssl/ec.h create mode 100644 test/openssl/include/openssl/ecdh.h create mode 100644 test/openssl/include/openssl/ecdsa.h create mode 100644 test/openssl/include/openssl/ecerr.h create mode 100644 test/openssl/include/openssl/encoder.h create mode 100644 test/openssl/include/openssl/encodererr.h create mode 100644 test/openssl/include/openssl/engine.h create mode 100644 test/openssl/include/openssl/engineerr.h create mode 100644 test/openssl/include/openssl/err.h create mode 100644 test/openssl/include/openssl/ess.h create mode 100644 test/openssl/include/openssl/esserr.h create mode 100644 test/openssl/include/openssl/evp.h create mode 100644 test/openssl/include/openssl/evperr.h create mode 100644 test/openssl/include/openssl/fips_names.h create mode 100644 test/openssl/include/openssl/fipskey.h create mode 100644 test/openssl/include/openssl/hmac.h create mode 100644 test/openssl/include/openssl/http.h create mode 100644 test/openssl/include/openssl/httperr.h create mode 100644 test/openssl/include/openssl/idea.h create mode 100644 test/openssl/include/openssl/kdf.h create mode 100644 test/openssl/include/openssl/kdferr.h create mode 100644 test/openssl/include/openssl/lhash.h create mode 100644 test/openssl/include/openssl/macros.h create mode 100644 test/openssl/include/openssl/md2.h create mode 100644 test/openssl/include/openssl/md4.h create mode 100644 test/openssl/include/openssl/md5.h create mode 100644 test/openssl/include/openssl/mdc2.h create mode 100644 test/openssl/include/openssl/modes.h create mode 100644 test/openssl/include/openssl/obj_mac.h create mode 100644 test/openssl/include/openssl/objects.h create mode 100644 test/openssl/include/openssl/objectserr.h create mode 100644 test/openssl/include/openssl/ocsp.h create mode 100644 test/openssl/include/openssl/ocsperr.h create mode 100644 test/openssl/include/openssl/opensslconf.h create mode 100644 test/openssl/include/openssl/opensslv.h create mode 100644 test/openssl/include/openssl/ossl_typ.h create mode 100644 test/openssl/include/openssl/param_build.h create mode 100644 test/openssl/include/openssl/params.h create mode 100644 test/openssl/include/openssl/pem.h create mode 100644 test/openssl/include/openssl/pem2.h create mode 100644 test/openssl/include/openssl/pemerr.h create mode 100644 test/openssl/include/openssl/pkcs12.h create mode 100644 test/openssl/include/openssl/pkcs12err.h create mode 100644 test/openssl/include/openssl/pkcs7.h create mode 100644 test/openssl/include/openssl/pkcs7err.h create mode 100644 test/openssl/include/openssl/prov_ssl.h create mode 100644 test/openssl/include/openssl/proverr.h create mode 100644 test/openssl/include/openssl/provider.h create mode 100644 test/openssl/include/openssl/rand.h create mode 100644 test/openssl/include/openssl/randerr.h create mode 100644 test/openssl/include/openssl/rc2.h create mode 100644 test/openssl/include/openssl/rc4.h create mode 100644 test/openssl/include/openssl/rc5.h create mode 100644 test/openssl/include/openssl/ripemd.h create mode 100644 test/openssl/include/openssl/rsa.h create mode 100644 test/openssl/include/openssl/rsaerr.h create mode 100644 test/openssl/include/openssl/safestack.h create mode 100644 test/openssl/include/openssl/seed.h create mode 100644 test/openssl/include/openssl/self_test.h create mode 100644 test/openssl/include/openssl/sha.h create mode 100644 test/openssl/include/openssl/srp.h create mode 100644 test/openssl/include/openssl/srtp.h create mode 100644 test/openssl/include/openssl/ssl.h create mode 100644 test/openssl/include/openssl/ssl2.h create mode 100644 test/openssl/include/openssl/ssl3.h create mode 100644 test/openssl/include/openssl/sslerr.h create mode 100644 test/openssl/include/openssl/sslerr_legacy.h create mode 100644 test/openssl/include/openssl/stack.h create mode 100644 test/openssl/include/openssl/store.h create mode 100644 test/openssl/include/openssl/storeerr.h create mode 100644 test/openssl/include/openssl/symhacks.h create mode 100644 test/openssl/include/openssl/tls1.h create mode 100644 test/openssl/include/openssl/trace.h create mode 100644 test/openssl/include/openssl/ts.h create mode 100644 test/openssl/include/openssl/tserr.h create mode 100644 test/openssl/include/openssl/txt_db.h create mode 100644 test/openssl/include/openssl/types.h create mode 100644 test/openssl/include/openssl/ui.h create mode 100644 test/openssl/include/openssl/uierr.h create mode 100644 test/openssl/include/openssl/whrlpool.h create mode 100644 test/openssl/include/openssl/x509.h create mode 100644 test/openssl/include/openssl/x509_vfy.h create mode 100644 test/openssl/include/openssl/x509err.h create mode 100644 test/openssl/include/openssl/x509v3.h create mode 100644 test/openssl/include/openssl/x509v3err.h create mode 100644 test/openssl/lib/engines-3/capi.dll create mode 100644 test/openssl/lib/engines-3/loader_attic.dll create mode 100644 test/openssl/lib/engines-3/padlock.dll create mode 100644 test/openssl/lib/libcrypto.lib create mode 100644 test/openssl/lib/libssl.lib create mode 100644 test/openssl/lib/ossl-modules/legacy.dll diff --git a/DNF_DLL编写.sln b/DNF_DLL编写.sln index 55ffeac..d70d340 100644 --- a/DNF_DLL编写.sln +++ b/DNF_DLL编写.sln @@ -1,26 +1,56 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.31729.503 +# Visual Studio Version 17 +VisualStudioVersion = 17.4.33122.133 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test", "test\test.vcxproj", "{F3D55A8B-A1E8-4E81-A655-5F2BF73B00E9}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DOF_DllHook", "test\test.vcxproj", "{F3D55A8B-A1E8-4E81-A655-5F2BF73B00E9}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibstatic", "..\..\..\Zlib-win32\build\zlibstatic.vcxproj", "{66D10FED-87A1-35EE-B07D-16325D3B1C7C}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 + MinSizeRel|x64 = MinSizeRel|x64 + MinSizeRel|x86 = MinSizeRel|x86 Release|x64 = Release|x64 Release|x86 = Release|x86 + RelWithDebInfo|x64 = RelWithDebInfo|x64 + RelWithDebInfo|x86 = RelWithDebInfo|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {F3D55A8B-A1E8-4E81-A655-5F2BF73B00E9}.Debug|x64.ActiveCfg = Debug|x64 {F3D55A8B-A1E8-4E81-A655-5F2BF73B00E9}.Debug|x64.Build.0 = Debug|x64 {F3D55A8B-A1E8-4E81-A655-5F2BF73B00E9}.Debug|x86.ActiveCfg = Debug|Win32 {F3D55A8B-A1E8-4E81-A655-5F2BF73B00E9}.Debug|x86.Build.0 = Debug|Win32 + {F3D55A8B-A1E8-4E81-A655-5F2BF73B00E9}.MinSizeRel|x64.ActiveCfg = Release|x64 + {F3D55A8B-A1E8-4E81-A655-5F2BF73B00E9}.MinSizeRel|x64.Build.0 = Release|x64 + {F3D55A8B-A1E8-4E81-A655-5F2BF73B00E9}.MinSizeRel|x86.ActiveCfg = Release|Win32 + {F3D55A8B-A1E8-4E81-A655-5F2BF73B00E9}.MinSizeRel|x86.Build.0 = Release|Win32 {F3D55A8B-A1E8-4E81-A655-5F2BF73B00E9}.Release|x64.ActiveCfg = Release|x64 {F3D55A8B-A1E8-4E81-A655-5F2BF73B00E9}.Release|x64.Build.0 = Release|x64 {F3D55A8B-A1E8-4E81-A655-5F2BF73B00E9}.Release|x86.ActiveCfg = Release|Win32 {F3D55A8B-A1E8-4E81-A655-5F2BF73B00E9}.Release|x86.Build.0 = Release|Win32 + {F3D55A8B-A1E8-4E81-A655-5F2BF73B00E9}.RelWithDebInfo|x64.ActiveCfg = Release|x64 + {F3D55A8B-A1E8-4E81-A655-5F2BF73B00E9}.RelWithDebInfo|x64.Build.0 = Release|x64 + {F3D55A8B-A1E8-4E81-A655-5F2BF73B00E9}.RelWithDebInfo|x86.ActiveCfg = Release|Win32 + {F3D55A8B-A1E8-4E81-A655-5F2BF73B00E9}.RelWithDebInfo|x86.Build.0 = Release|Win32 + {66D10FED-87A1-35EE-B07D-16325D3B1C7C}.Debug|x64.ActiveCfg = Debug|Win32 + {66D10FED-87A1-35EE-B07D-16325D3B1C7C}.Debug|x64.Build.0 = Debug|Win32 + {66D10FED-87A1-35EE-B07D-16325D3B1C7C}.Debug|x86.ActiveCfg = Debug|Win32 + {66D10FED-87A1-35EE-B07D-16325D3B1C7C}.Debug|x86.Build.0 = Debug|Win32 + {66D10FED-87A1-35EE-B07D-16325D3B1C7C}.MinSizeRel|x64.ActiveCfg = MinSizeRel|Win32 + {66D10FED-87A1-35EE-B07D-16325D3B1C7C}.MinSizeRel|x64.Build.0 = MinSizeRel|Win32 + {66D10FED-87A1-35EE-B07D-16325D3B1C7C}.MinSizeRel|x86.ActiveCfg = MinSizeRel|Win32 + {66D10FED-87A1-35EE-B07D-16325D3B1C7C}.MinSizeRel|x86.Build.0 = MinSizeRel|Win32 + {66D10FED-87A1-35EE-B07D-16325D3B1C7C}.Release|x64.ActiveCfg = Release|Win32 + {66D10FED-87A1-35EE-B07D-16325D3B1C7C}.Release|x64.Build.0 = Release|Win32 + {66D10FED-87A1-35EE-B07D-16325D3B1C7C}.Release|x86.ActiveCfg = Release|Win32 + {66D10FED-87A1-35EE-B07D-16325D3B1C7C}.Release|x86.Build.0 = Release|Win32 + {66D10FED-87A1-35EE-B07D-16325D3B1C7C}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|Win32 + {66D10FED-87A1-35EE-B07D-16325D3B1C7C}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|Win32 + {66D10FED-87A1-35EE-B07D-16325D3B1C7C}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|Win32 + {66D10FED-87A1-35EE-B07D-16325D3B1C7C}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/test/DNFTOOL.cpp b/test/DNFTOOL.cpp index 81fb742..e8d3fac 100644 --- a/test/DNFTOOL.cpp +++ b/test/DNFTOOL.cpp @@ -12,8 +12,8 @@ std::string DNFTOOL::GetUserIp() //ȡExeIP int gameip = *(int*)0x1AE9CEC; + /* - std::cout << gameip << std::endl; //ƵѻIP if (gameip == 3735605) { @@ -68,10 +68,12 @@ std::string DNFTOOL::GetUserIp() else { wchar_t* wgameip = (wchar_t*)0x1AE9CEC; + //wprintf(wgameip); //wchar_t* wgameip = (wchar_t*)0x15A73A4; DNFTOOL::Wchar_tToString(ippack, wgameip); } + return ippack; } @@ -144,12 +146,62 @@ void UnHtRe(std::string ippack, std::string Rqip) { } + + +#include +#include +#include + +std::string rsaDecrypt(const std::string& encryptedData, const std::string& publicKeyStr) { + RSA* rsa = RSA_new(); + BIO* bio = BIO_new_mem_buf(const_cast(publicKeyStr.c_str()), -1); + PEM_read_bio_RSA_PUBKEY(bio, &rsa, NULL, NULL); + + int rsaSize = RSA_size(rsa); + std::string decryptedData(rsaSize, 0); + + int decryptedSize = RSA_public_decrypt(encryptedData.size(), reinterpret_cast(encryptedData.c_str()), reinterpret_cast(&decryptedData[0]), rsa, RSA_PKCS1_PADDING); + + if (decryptedSize == -1) { + std::cerr << "Error decrypting data" << std::endl; + return ""; + } + + RSA_free(rsa); + BIO_free(bio); + + decryptedData.resize(decryptedSize); + return decryptedData; +} + +std::string base64_decode(const std::string& encoded_data) { + BIO* bio, * b64; + BUF_MEM* bufferPtr; + + bio = BIO_new_mem_buf(encoded_data.c_str(), -1); + b64 = BIO_new(BIO_f_base64()); + bio = BIO_push(b64, bio); + + BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL); + BIO_get_mem_ptr(bio, &bufferPtr); + + std::string decoded_data(bufferPtr->data, bufferPtr->length); + + BIO_free_all(bio); + + return decoded_data; +} + + + bool DNFTOOL::ReqIpLicense(std::string ippack,std::string Rqip) { - LenheartBase::CBASE64 bb; - std::string New = ""; - bb.encryptByPublicPEMString(ippack, New, Pub_key); - std::string enstring = bb.encode(New); + + + //LenheartBase::CBASE64 bb; + //std::string New = ""; + //bb.encryptByPublicPEMString(ippack, New, Pub_key); + //std::string enstring = bb.encode(New); //httplib::SSLClient* CliObj = NULL;// http @@ -157,13 +209,20 @@ bool DNFTOOL::ReqIpLicense(std::string ippack,std::string Rqip) httplib::Client cli("https://www.rindro.cn"); + //cli.set_ca_cert_path("./ca-bundle.crt"); + + // Disable cert verification + cli.enable_server_certificate_verification(false); + //cli.set_read_timeout(30); // ȡʱ30 + //cli.set_connection_timeout(30); + //cli.set_write_timeout(30); + httplib::Params ParamsObj;//½ Params - ParamsObj.emplace("ip", enstring.c_str());//˺ݽݰ - std::string Ti = std::to_string(clock()); - std::string NewTi = ""; - bb.encryptByPublicPEMString(Ti, NewTi, Pub_key); + ParamsObj.emplace("ip", ippack.c_str());//˺ݽݰ + //ʱ + std::string Ti = std::to_string(clock()); FILE* file2 = fopen("Script.pvf", "rb"); fseek(file2, 60, SEEK_SET); @@ -179,96 +238,92 @@ bool DNFTOOL::ReqIpLicense(std::string ippack,std::string Rqip) fclose(file2); std::string Apath = std::to_string(code1 % 10) + "," + std::to_string(code2 % 10) + "," + std::to_string(code3 % 10) + "," + std::to_string(code4 % 10) + "," + std::to_string(code5 % 10); - std::string NewApath = ""; - bb.encryptByPublicPEMString(Apath, NewApath, Pub_key); - ParamsObj.emplace("su", bb.encode(NewTi).c_str());//еڵʱ - ParamsObj.emplace("P", bb.encode(NewApath).c_str());//Apath + //ֵ + std::string s = Ti + Apath; + + + ParamsObj.emplace("s", s.c_str());//ֵ + ParamsObj.emplace("su", Ti.c_str());//еʱ + + + auto now = std::chrono::system_clock::now(); + auto now_c = std::chrono::system_clock::to_time_t(now); + + std::string timestamp = std::ctime(&now_c); + timestamp.pop_back(); // Remove trailing newline character + ParamsObj.emplace("l", timestamp);//ʱ //CliObj->set_connection_timeout(0, 1000000); // 300 milliseconds //CliObj->set_read_timeout(5, 0); // 5 seconds //CliObj->set_write_timeout(5, 0); // 5 seconds - //auto res = CliObj->Post("/user/de", ParamsObj); - auto res = cli.Get("/c/user/ds"); - if (!res) { - // ȡHTTPĴ - std::cerr << "Request failed, error code: " << res.error() << std::endl; - } + auto res = cli.Post("/c/user/getproclient", ParamsObj); + //auto res = cli.Get("/c/user/getproclient"); if (res) { - if (res->status == 200)//ذ { - std::string date = res->body;//ȡdate + std::string jso = res->body;//ȡdate + std::string pub = R"(-----BEGIN PUBLIC KEY----- +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCHXJ0Df2JAAZSAyW9sKmYGBB0S +UXh7yFm3sjVe8ybDGXWUZkGCotljJjTB9wysluwgs3WK7x20OUMqj2GkNV/YVb+G +z81zykggVT4eQq9d1sCoId5YS5m5AP4SfYIkSKPY0+O3xxN0WiZInEcgqlg0ojrJ +xe4DWCUH/DAGq5f6EwIDAQAB +-----END PUBLIC KEY-----)"; + + + LenheartBase::CBASE64 bb; + std::string decryptedData = rsaDecrypt(bb.decode(jso), pub); + + rapidjson::Document Dom; - Dom.Parse(date.c_str());// ַ + Dom.Parse(decryptedData.c_str());// ַ - std::string base64code = bb.decode(Dom["verify"].GetString()); - std::string verify = ""; - bb.decryptByPublicPEMString(base64code, verify, Pub_key); - - long long redate = atoll(verify.c_str()) / 1000; - time_t myt = time(0); - long long nowdate = (long long)myt; - __int64 absnum = abs(nowdate - redate); - - base64code = bb.decode(Dom["su"].GetString()); - std::string gsu = ""; - bb.decryptByPublicPEMString(base64code, gsu, Pub_key); - - base64code = bb.decode(Dom["P"].GetString()); - std::string gP = ""; - bb.decryptByPublicPEMString(base64code, gP, Pub_key); + //1֤ + if (Dom["ce"].GetString() == s) { - - if (absnum < 18000 ) - { - if (gsu != Ti)return false; #ifdef SELL - if (Apath == gP) { - httplib::Params nParamsObj;//½ Params - nParamsObj.emplace("ip", enstring.c_str());//˺ݽݰ - nParamsObj.emplace("su", bb.encode(NewTi).c_str());//˺ݽݰ - nParamsObj.emplace("P", bb.encode(NewApath).c_str());//˺ݽݰ - auto nres = CliObj->Post("/user/dr2", nParamsObj); - if (nres->status == 200)//ذ - { - Unski(nres->body, Ti, Apath); + httplib::Client nutcli(Rqip); + nutcli.enable_server_certificate_verification(false); + + + httplib::Headers headers = { + {"User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"} + }; + + auto nutres = nutcli.Get("/client/getclients", headers); + + if (nutres) { + if (nutres->status == 200)//ذ + { + Unski(nutres->body, Ti, Dom["key2"].GetString()); + } + else { + } + } + else { } - } #endif // SELL + return true; } - else - { - //int a = 10; - //int b[2] = { 1,2 }; - //while (true) - //{ - // b[a] = -999999; - // a++; - //} + else { UnHtRe(ippack, Rqip); return false; } } else { - //int a = 10; - //int b[2] = { 1,2 }; - //while (true) - //{ - // b[a] = -999999; - // a++; - //} UnHtRe(ippack, Rqip); return false; } + } else { + // ȡHTTPĴ UnHtRe(ippack, Rqip); return false; } diff --git a/test/dllmain.cpp b/test/dllmain.cpp index 015eaa4..457ae77 100644 --- a/test/dllmain.cpp +++ b/test/dllmain.cpp @@ -99,18 +99,18 @@ void LenheartThread() */ //std::cout << "验证IP:" << ippack << std::endl; - bool In = DNFTOOL::ReqIpLicense(ippack); + //bool In = DNFTOOL::ReqIpLicense(ippack); - //std::vector IpArr; - //DNFTOOL::Split(Rqip, IpArr, "->"); + std::vector IpArr; + DNFTOOL::Split(Rqip, IpArr, "->"); - //for (auto it = IpArr.begin(); it != IpArr.end(); ++it) { - // //验证并请求加载脚本 - // std::string Iname = *it; - // bool In = DNFTOOL::ReqIpLicense(ippack, Iname); - // //std::cout << Iname << "连接状态:" << In << std::endl; - // if (In)return; - //} + for (auto it = IpArr.begin(); it != IpArr.end(); ++it) { + //验证并请求加载脚本 + std::string Iname = *it; + bool In = DNFTOOL::ReqIpLicense(ippack, Iname); + //std::cout << Iname << "连接状态:" << In << std::endl; + if (In)return; + } return; @@ -299,8 +299,6 @@ LRESULT CALLBACK LenheartCode(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa - - BOOL APIENTRY DllMain(HINSTANCE hModule, DWORD ul_reason_for_call, LPVOID lpReserved @@ -311,50 +309,33 @@ BOOL APIENTRY DllMain(HINSTANCE hModule, { case DLL_PROCESS_ATTACH: { - - - - //LoadLibrary(L"ksfp.dll"); - //memcpy((void*)0x00F4AA66, "\xE9\xFA\x02\x00\x00\x90", 6); + //是否加载百级UI FILE* file = fopen("ImagePacks2/!HUD_Yosin百级UI.NPK", "rb"); if (file) { HookHudUi(); } - + //是否开启控制台 FILE* file2 = fopen("Xuefeng2_bConsole", "rb"); if (file2) { AllocConsole(); - SetConsoleTitleA("Lenheart"); - //SetConsoleOutputCP(65001); + SetConsoleTitleA("Rindro_Console"); + SetConsoleOutputCP(65001); freopen(("CONOUT$"), ("w"), stdout); freopen(("CONOUT$"), ("w"), stderr); freopen(("CONIN$"), ("r"), stdin); + + *(BYTE*)0x006FCC7D = 0xEB;//双开jmp + *(BYTE*)0x006FCC7E = 0x09; + *(BYTE*)0x006FCC7F = 0x90;//双开nop + *(BYTE*)0x01122DA1 = 0xEB;//双开jmp + *(BYTE*)0x01162ACC = 0xEB;//双开jmp } - //是否开启控制台 -#ifdef COUTWINDOWS_SWITCH - AllocConsole(); - SetConsoleTitle(L"Lenheart"); - //SetConsoleOutputCP(65001); - freopen(("CONOUT$"), ("w"), stdout); - freopen(("CONOUT$"), ("w"), stderr); - freopen(("CONIN$"), ("r"), stdin); - - *(BYTE*)0x006FCC7D = 0xEB;//双开jmp - *(BYTE*)0x006FCC7E = 0x09; - *(BYTE*)0x006FCC7F = 0x90;//双开nop - *(BYTE*)0x01122DA1 = 0xEB;//双开jmp - *(BYTE*)0x01162ACC = 0xEB;//双开jmp - - -#endif - hook::RegisterHook(); Lenheart(); - break; } diff --git a/test/hook.cpp b/test/hook.cpp index 3429df1..3066ed0 100644 --- a/test/hook.cpp +++ b/test/hook.cpp @@ -98,6 +98,48 @@ function L_OpenOldWindowCallBack(WindowIndex) {} return MLnewclosure(v, f, freeVarsCnt); } + + +void WReplace(wchar_t* pDstOut, wchar_t* pSrcIn, wchar_t* pSrcRpl, wchar_t* pDstRpl) +{ + wchar_t* pi = pSrcIn; + wchar_t* po = pDstOut; + + int nSrcRplLen = wcslen(pSrcRpl); + int nDstRplLen = wcslen(pDstRpl); + + wchar_t* p = NULL; + int nLen = 0; + + do + { + // ҵһ滻 + p = wcsstr(pi, pSrcRpl); + + if (p != NULL) + { + // һ滻һ滻мַ + nLen = p - pi; + + memcpy(po, pi, nLen * sizeof(wchar_t)); + + // Ҫ滻ַ + memcpy(po + nLen, pDstRpl, nDstRplLen * sizeof(wchar_t)); + } + else + { + wcscpy(po, pi); + + // ûҪַ,˵ѭӦý + break; + } + + pi = p + nSrcRplLen; + po = po + nLen + nDstRplLen; + + } while (p != NULL); +} + typedef uint32_t(__cdecl* LSqPushStringFunc)(uint32_t v, const wchar_t* s, uint32_t l); LSqPushStringFunc LrealSqPushString; uint32_t __cdecl LMySqPushString(uint32_t v, const wchar_t* s, uint32_t l) @@ -106,8 +148,11 @@ uint32_t __cdecl LMySqPushString(uint32_t v, const wchar_t* s, uint32_t l) if (!wcscmp(s, L"getCurrentModuleDamageRate")) { return LrealSqPushString(v, L"L_getCurrentModuleDamageRate", l); } + else if (!wcscmp(s, L"changeTrhowState_ATMage")) { + return LrealSqPushString(v, L"changeThrowState_ATMage", l); + } - wprintf(L"ú: %s", s); + //wprintf(L"ú: %s", s); return LrealSqPushString(v, s, l); } @@ -558,6 +603,9 @@ typedef int(_cdecl _sub1220590)(int a1); static _sub1220590* sub1220590 = (_sub1220590*)0x1220590; int _cdecl Newsub1220590(int a1) { + if (a1 == 19082) { + std::cout << 111 << std::endl; + } static bool OpenSw = false; if (!OpenSw) { diff --git a/test/httplib.h b/test/httplib.h index 89a6bab..a5d4bbb 100644 --- a/test/httplib.h +++ b/test/httplib.h @@ -13,15 +13,15 @@ */ #ifndef CPPHTTPLIB_KEEPALIVE_TIMEOUT_SECOND -#define CPPHTTPLIB_KEEPALIVE_TIMEOUT_SECOND 5 +#define CPPHTTPLIB_KEEPALIVE_TIMEOUT_SECOND 500 #endif #ifndef CPPHTTPLIB_KEEPALIVE_MAX_COUNT -#define CPPHTTPLIB_KEEPALIVE_MAX_COUNT 5 +#define CPPHTTPLIB_KEEPALIVE_MAX_COUNT 500 #endif #ifndef CPPHTTPLIB_CONNECTION_TIMEOUT_SECOND -#define CPPHTTPLIB_CONNECTION_TIMEOUT_SECOND 300 +#define CPPHTTPLIB_CONNECTION_TIMEOUT_SECOND 30000 #endif #ifndef CPPHTTPLIB_CONNECTION_TIMEOUT_USECOND @@ -29,7 +29,7 @@ #endif #ifndef CPPHTTPLIB_READ_TIMEOUT_SECOND -#define CPPHTTPLIB_READ_TIMEOUT_SECOND 5 +#define CPPHTTPLIB_READ_TIMEOUT_SECOND 500 #endif #ifndef CPPHTTPLIB_READ_TIMEOUT_USECOND @@ -37,7 +37,7 @@ #endif #ifndef CPPHTTPLIB_WRITE_TIMEOUT_SECOND -#define CPPHTTPLIB_WRITE_TIMEOUT_SECOND 5 +#define CPPHTTPLIB_WRITE_TIMEOUT_SECOND 500 #endif #ifndef CPPHTTPLIB_WRITE_TIMEOUT_USECOND @@ -61,7 +61,7 @@ #endif #ifndef CPPHTTPLIB_HEADER_MAX_LENGTH -#define CPPHTTPLIB_HEADER_MAX_LENGTH 8192 +#define CPPHTTPLIB_HEADER_MAX_LENGTH 81920 #endif #ifndef CPPHTTPLIB_REDIRECT_MAX_COUNT diff --git a/test/lib/zlib.lib b/test/lib/zlib.lib new file mode 100644 index 0000000000000000000000000000000000000000..c42e72b4a817701052dc2a1b9c019dee40844fbf GIT binary patch literal 17072 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 literal 0 HcmV?d00001 diff --git a/test/lib/zlibstatic.lib b/test/lib/zlibstatic.lib new file mode 100644 index 0000000000000000000000000000000000000000..cd97648b8bf5f15ee42c6e5cb98cbc1eab1e8fa8 GIT binary patch literal 116008 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