Refactoring

This commit is contained in:
Changhua 2023-07-15 09:46:40 +08:00
parent 121de88a57
commit 736f6830b9
137 changed files with 2478 additions and 2549 deletions

View File

@ -1,7 +1,7 @@
[*] [*]
end_of_line = lf end_of_line = lf
charset = utf-8-bom charset = utf-8-bom
trim_trailing_whitespace = true trim_trailing_whitespace = true
insert_final_newline = true insert_final_newline = true
indent_style = space indent_style = space
indent_size = 4 indent_size = 4

View File

@ -1,49 +1,49 @@
 
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16 # Visual Studio Version 16
VisualStudioVersion = 16.0.32802.440 VisualStudioVersion = 16.0.32802.440
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "spy", "spy\spy.vcxproj", "{4DE80B82-5F6A-4C4C-9D16-1574308110FA}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "spy", "spy\spy.vcxproj", "{4DE80B82-5F6A-4C4C-9D16-1574308110FA}"
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sdk", "sdk\sdk.vcxproj", "{ABFCB647-137F-478B-A73E-F0B1E3ADC215}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sdk", "sdk\sdk.vcxproj", "{ABFCB647-137F-478B-A73E-F0B1E3ADC215}"
ProjectSection(ProjectDependencies) = postProject ProjectSection(ProjectDependencies) = postProject
{4DE80B82-5F6A-4C4C-9D16-1574308110FA} = {4DE80B82-5F6A-4C4C-9D16-1574308110FA} {4DE80B82-5F6A-4C4C-9D16-1574308110FA} = {4DE80B82-5F6A-4C4C-9D16-1574308110FA}
EndProjectSection EndProjectSection
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "launcher", "launcher\launcher.vcxproj", "{B11ADC6F-20DA-4DEF-A8A0-60374427D4C6}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "launcher", "launcher\launcher.vcxproj", "{B11ADC6F-20DA-4DEF-A8A0-60374427D4C6}"
ProjectSection(ProjectDependencies) = postProject ProjectSection(ProjectDependencies) = postProject
{ABFCB647-137F-478B-A73E-F0B1E3ADC215} = {ABFCB647-137F-478B-A73E-F0B1E3ADC215} {ABFCB647-137F-478B-A73E-F0B1E3ADC215} = {ABFCB647-137F-478B-A73E-F0B1E3ADC215}
EndProjectSection EndProjectSection
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wcf", "wcf\wcf.vcxproj", "{02747CE0-AD9F-4812-B019-FCF9867F7514}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wcf", "wcf\wcf.vcxproj", "{02747CE0-AD9F-4812-B019-FCF9867F7514}"
ProjectSection(ProjectDependencies) = postProject ProjectSection(ProjectDependencies) = postProject
{4DE80B82-5F6A-4C4C-9D16-1574308110FA} = {4DE80B82-5F6A-4C4C-9D16-1574308110FA} {4DE80B82-5F6A-4C4C-9D16-1574308110FA} = {4DE80B82-5F6A-4C4C-9D16-1574308110FA}
EndProjectSection EndProjectSection
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x86 = Debug|x86 Debug|x86 = Debug|x86
Release|x86 = Release|x86 Release|x86 = Release|x86
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{4DE80B82-5F6A-4C4C-9D16-1574308110FA}.Debug|x86.ActiveCfg = Debug|Win32 {4DE80B82-5F6A-4C4C-9D16-1574308110FA}.Debug|x86.ActiveCfg = Debug|Win32
{4DE80B82-5F6A-4C4C-9D16-1574308110FA}.Debug|x86.Build.0 = Debug|Win32 {4DE80B82-5F6A-4C4C-9D16-1574308110FA}.Debug|x86.Build.0 = Debug|Win32
{4DE80B82-5F6A-4C4C-9D16-1574308110FA}.Release|x86.ActiveCfg = Release|Win32 {4DE80B82-5F6A-4C4C-9D16-1574308110FA}.Release|x86.ActiveCfg = Release|Win32
{4DE80B82-5F6A-4C4C-9D16-1574308110FA}.Release|x86.Build.0 = Release|Win32 {4DE80B82-5F6A-4C4C-9D16-1574308110FA}.Release|x86.Build.0 = Release|Win32
{ABFCB647-137F-478B-A73E-F0B1E3ADC215}.Debug|x86.ActiveCfg = Release|Win32 {ABFCB647-137F-478B-A73E-F0B1E3ADC215}.Debug|x86.ActiveCfg = Release|Win32
{ABFCB647-137F-478B-A73E-F0B1E3ADC215}.Release|x86.ActiveCfg = Release|Win32 {ABFCB647-137F-478B-A73E-F0B1E3ADC215}.Release|x86.ActiveCfg = Release|Win32
{ABFCB647-137F-478B-A73E-F0B1E3ADC215}.Release|x86.Build.0 = Release|Win32 {ABFCB647-137F-478B-A73E-F0B1E3ADC215}.Release|x86.Build.0 = Release|Win32
{B11ADC6F-20DA-4DEF-A8A0-60374427D4C6}.Debug|x86.ActiveCfg = Release|Win32 {B11ADC6F-20DA-4DEF-A8A0-60374427D4C6}.Debug|x86.ActiveCfg = Release|Win32
{B11ADC6F-20DA-4DEF-A8A0-60374427D4C6}.Release|x86.ActiveCfg = Release|Win32 {B11ADC6F-20DA-4DEF-A8A0-60374427D4C6}.Release|x86.ActiveCfg = Release|Win32
{B11ADC6F-20DA-4DEF-A8A0-60374427D4C6}.Release|x86.Build.0 = Release|Win32 {B11ADC6F-20DA-4DEF-A8A0-60374427D4C6}.Release|x86.Build.0 = Release|Win32
{02747CE0-AD9F-4812-B019-FCF9867F7514}.Debug|x86.ActiveCfg = Release|Win32 {02747CE0-AD9F-4812-B019-FCF9867F7514}.Debug|x86.ActiveCfg = Release|Win32
{02747CE0-AD9F-4812-B019-FCF9867F7514}.Release|x86.ActiveCfg = Release|Win32 {02747CE0-AD9F-4812-B019-FCF9867F7514}.Release|x86.ActiveCfg = Release|Win32
{02747CE0-AD9F-4812-B019-FCF9867F7514}.Release|x86.Build.0 = Release|Win32 {02747CE0-AD9F-4812-B019-FCF9867F7514}.Release|x86.Build.0 = Release|Win32
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
EndGlobalSection EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {76A678AA-570C-4CB7-B58F-3B2C170ACAC0} SolutionGuid = {76A678AA-570C-4CB7-B58F-3B2C170ACAC0}
EndGlobalSection EndGlobalSection
EndGlobal EndGlobal

View File

Before

Width:  |  Height:  |  Size: 170 KiB

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

View File

@ -1,191 +1,191 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations"> <ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32"> <ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration> <Configuration>Debug</Configuration>
<Platform>Win32</Platform> <Platform>Win32</Platform>
</ProjectConfiguration> </ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32"> <ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration> <Configuration>Release</Configuration>
<Platform>Win32</Platform> <Platform>Win32</Platform>
</ProjectConfiguration> </ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64"> <ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration> <Configuration>Debug</Configuration>
<Platform>x64</Platform> <Platform>x64</Platform>
</ProjectConfiguration> </ProjectConfiguration>
<ProjectConfiguration Include="Release|x64"> <ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration> <Configuration>Release</Configuration>
<Platform>x64</Platform> <Platform>x64</Platform>
</ProjectConfiguration> </ProjectConfiguration>
</ItemGroup> </ItemGroup>
<PropertyGroup Label="Globals"> <PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion> <VCProjectVersion>16.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword> <Keyword>Win32Proj</Keyword>
<ProjectGuid>{abfcb647-137f-478b-a73e-f0b1e3adc215}</ProjectGuid> <ProjectGuid>{abfcb647-137f-478b-a73e-f0b1e3adc215}</ProjectGuid>
<RootNamespace>sdk</RootNamespace> <RootNamespace>sdk</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion> <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType> <ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType> <ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries> <UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType> <ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType> <ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries> <UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings"> <ImportGroup Label="ExtensionSettings">
</ImportGroup> </ImportGroup>
<ImportGroup Label="Shared"> <ImportGroup Label="Shared">
</ImportGroup> </ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup> </ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup> </ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup> </ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup> </ImportGroup>
<PropertyGroup Label="UserMacros" /> <PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental> <LinkIncremental>true</LinkIncremental>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental> <LinkIncremental>false</LinkIncremental>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental> <LinkIncremental>true</LinkIncremental>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental> <LinkIncremental>false</LinkIncremental>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<VcpkgUseStatic>true</VcpkgUseStatic> <VcpkgUseStatic>true</VcpkgUseStatic>
<VcpkgTriplet>x86-windows-static</VcpkgTriplet> <VcpkgTriplet>x86-windows-static</VcpkgTriplet>
</PropertyGroup> </PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile> <ClCompile>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;SDK_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;_DEBUG;SDK_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>Use</PrecompiledHeader> <PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile> <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC> <EnableUAC>false</EnableUAC>
<ModuleDefinitionFile>sdk.def</ModuleDefinitionFile> <ModuleDefinitionFile>sdk.def</ModuleDefinitionFile>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile> <ClCompile>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking> <FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions> <IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;SDK_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;NDEBUG;SDK_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>NotUsing</PrecompiledHeader> <PrecompiledHeader>NotUsing</PrecompiledHeader>
<PrecompiledHeaderFile> <PrecompiledHeaderFile>
</PrecompiledHeaderFile> </PrecompiledHeaderFile>
<LanguageStandard>stdcpp17</LanguageStandard> <LanguageStandard>stdcpp17</LanguageStandard>
<AdditionalIncludeDirectories>$(SolutionDir)spy;C:\Tools\vcpkg\installed\x86-windows-static\include</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>$(SolutionDir)spy;C:\Tools\vcpkg\installed\x86-windows-static\include</AdditionalIncludeDirectories>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary> <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC> <EnableUAC>false</EnableUAC>
<ModuleDefinitionFile>sdk.def</ModuleDefinitionFile> <ModuleDefinitionFile>sdk.def</ModuleDefinitionFile>
</Link> </Link>
<PostBuildEvent> <PostBuildEvent>
<Command>xcopy /y $(OutDir)$(TargetFileName) $(SolutionDir)Out</Command> <Command>xcopy /y $(OutDir)$(TargetFileName) $(SolutionDir)Out</Command>
</PostBuildEvent> </PostBuildEvent>
<PostBuildEvent> <PostBuildEvent>
<Message>Copy files</Message> <Message>Copy files</Message>
</PostBuildEvent> </PostBuildEvent>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile> <ClCompile>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;SDK_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_DEBUG;SDK_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>Use</PrecompiledHeader> <PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile> <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC> <EnableUAC>false</EnableUAC>
<ModuleDefinitionFile>sdk.def</ModuleDefinitionFile> <ModuleDefinitionFile>sdk.def</ModuleDefinitionFile>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile> <ClCompile>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking> <FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions> <IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;SDK_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>NDEBUG;SDK_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>Use</PrecompiledHeader> <PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile> <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC> <EnableUAC>false</EnableUAC>
<ModuleDefinitionFile>sdk.def</ModuleDefinitionFile> <ModuleDefinitionFile>sdk.def</ModuleDefinitionFile>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\spy\log.h" /> <ClInclude Include="..\spy\log.h" />
<ClInclude Include="..\spy\util.h" /> <ClInclude Include="..\spy\util.h" />
<ClInclude Include="framework.h" /> <ClInclude Include="framework.h" />
<ClInclude Include="injector.h" /> <ClInclude Include="injector.h" />
<ClInclude Include="sdk.h" /> <ClInclude Include="sdk.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="..\spy\log.cpp" /> <ClCompile Include="..\spy\log.cpp" />
<ClCompile Include="..\spy\util.cpp" /> <ClCompile Include="..\spy\util.cpp" />
<ClCompile Include="dllmain.cpp" /> <ClCompile Include="dllmain.cpp" />
<ClCompile Include="injector.cpp" /> <ClCompile Include="injector.cpp" />
<ClCompile Include="sdk.cpp" /> <ClCompile Include="sdk.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="sdk.def" /> <None Include="sdk.def" />
</ItemGroup> </ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">
</ImportGroup> </ImportGroup>
</Project> </Project>

View File

@ -1,56 +1,56 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup> <ItemGroup>
<Filter Include="源文件"> <Filter Include="源文件">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions> <Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter> </Filter>
<Filter Include="头文件"> <Filter Include="头文件">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions> <Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
</Filter> </Filter>
<Filter Include="资源文件"> <Filter Include="资源文件">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter> </Filter>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="framework.h"> <ClInclude Include="framework.h">
<Filter>头文件</Filter> <Filter>头文件</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="sdk.h"> <ClInclude Include="sdk.h">
<Filter>头文件</Filter> <Filter>头文件</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\spy\util.h"> <ClInclude Include="..\spy\util.h">
<Filter>头文件</Filter> <Filter>头文件</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\spy\log.h"> <ClInclude Include="..\spy\log.h">
<Filter>头文件</Filter> <Filter>头文件</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="injector.h"> <ClInclude Include="injector.h">
<Filter>头文件</Filter> <Filter>头文件</Filter>
</ClInclude> </ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="dllmain.cpp"> <ClCompile Include="dllmain.cpp">
<Filter>源文件</Filter> <Filter>源文件</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\spy\log.cpp"> <ClCompile Include="..\spy\log.cpp">
<Filter>源文件</Filter> <Filter>源文件</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\spy\util.cpp"> <ClCompile Include="..\spy\util.cpp">
<Filter>源文件</Filter> <Filter>源文件</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="sdk.cpp"> <ClCompile Include="sdk.cpp">
<Filter>源文件</Filter> <Filter>源文件</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="injector.cpp"> <ClCompile Include="injector.cpp">
<Filter>源文件</Filter> <Filter>源文件</Filter>
</ClCompile> </ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="sdk.def"> <None Include="sdk.def">
<Filter>源文件</Filter> <Filter>源文件</Filter>
</None> </None>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -1,14 +1,14 @@
// dllmain.cpp : 定义 DLL 应用程序的入口点。 // dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "framework.h" #include "framework.h"
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{ {
switch (ul_reason_for_call) { switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH: case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH: case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH: case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH: case DLL_PROCESS_DETACH:
break; break;
} }
return TRUE; return TRUE;
} }

View File

@ -1,5 +1,5 @@
#pragma once #pragma once
#define WIN32_LEAN_AND_MEAN // 从 Windows 头文件中排除极少使用的内容 #define WIN32_LEAN_AND_MEAN // 从 Windows 头文件中排除极少使用的内容
// Windows 头文件 // Windows 头文件
#include <windows.h> #include <windows.h>

View File

@ -1,122 +1,122 @@
#include "injector.h" #include "injector.h"
HANDLE InjectDll(DWORD pid, LPCWSTR dllPath, HMODULE *injectedBase) HANDLE InjectDll(DWORD pid, LPCWSTR dllPath, HMODULE *injectedBase)
{ {
HANDLE hThread; HANDLE hThread;
SIZE_T cszDLL = (wcslen(dllPath) + 1) * sizeof(WCHAR); SIZE_T cszDLL = (wcslen(dllPath) + 1) * sizeof(WCHAR);
// 1. 打开目标进程 // 1. 打开目标进程
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
if (hProcess == NULL) { if (hProcess == NULL) {
MessageBox(NULL, L"打开进程失败", L"InjectDll", 0); MessageBox(NULL, L"打开进程失败", L"InjectDll", 0);
return NULL; return NULL;
} }
// 2. 在目标进程的内存里开辟空间 // 2. 在目标进程的内存里开辟空间
LPVOID pRemoteAddress = VirtualAllocEx(hProcess, NULL, cszDLL, MEM_COMMIT, PAGE_READWRITE); LPVOID pRemoteAddress = VirtualAllocEx(hProcess, NULL, cszDLL, MEM_COMMIT, PAGE_READWRITE);
if (pRemoteAddress == NULL) { if (pRemoteAddress == NULL) {
MessageBox(NULL, L"DLL 路径写入失败", L"InjectDll", 0); MessageBox(NULL, L"DLL 路径写入失败", L"InjectDll", 0);
return NULL; return NULL;
} }
// 3. 把 dll 的路径写入到目标进程的内存空间中 // 3. 把 dll 的路径写入到目标进程的内存空间中
WriteProcessMemory(hProcess, pRemoteAddress, dllPath, cszDLL, NULL); WriteProcessMemory(hProcess, pRemoteAddress, dllPath, cszDLL, NULL);
// 3. 创建一个远程线程,让目标进程调用 LoadLibrary // 3. 创建一个远程线程,让目标进程调用 LoadLibrary
hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)LoadLibrary, pRemoteAddress, 0, NULL); hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)LoadLibrary, pRemoteAddress, 0, NULL);
if (hThread == NULL) { if (hThread == NULL) {
MessageBox(NULL, L"LoadLibrary 调用失败", L"InjectDll", 0); MessageBox(NULL, L"LoadLibrary 调用失败", L"InjectDll", 0);
return NULL; return NULL;
} }
WaitForSingleObject(hThread, -1); WaitForSingleObject(hThread, -1);
GetExitCodeThread(hThread, (LPDWORD)injectedBase); GetExitCodeThread(hThread, (LPDWORD)injectedBase);
CloseHandle(hThread); CloseHandle(hThread);
VirtualFreeEx(hProcess, pRemoteAddress, 0, MEM_RELEASE); VirtualFreeEx(hProcess, pRemoteAddress, 0, MEM_RELEASE);
// CloseHandle(hProcess); // Close when exit // CloseHandle(hProcess); // Close when exit
return hProcess; return hProcess;
} }
bool EjectDll(HANDLE process, HMODULE dllBase) bool EjectDll(HANDLE process, HMODULE dllBase)
{ {
HANDLE hThread = NULL; HANDLE hThread = NULL;
// 使目标进程调用 FreeLibrary卸载 DLL // 使目标进程调用 FreeLibrary卸载 DLL
hThread = CreateRemoteThread(process, NULL, 0, (LPTHREAD_START_ROUTINE)FreeLibrary, (LPVOID)dllBase, 0, NULL); hThread = CreateRemoteThread(process, NULL, 0, (LPTHREAD_START_ROUTINE)FreeLibrary, (LPVOID)dllBase, 0, NULL);
if (hThread == NULL) { if (hThread == NULL) {
MessageBox(NULL, L"FreeLibrary 调用失败!", L"EjectDll", 0); MessageBox(NULL, L"FreeLibrary 调用失败!", L"EjectDll", 0);
return false; return false;
} }
WaitForSingleObject(hThread, INFINITE); WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread); CloseHandle(hThread);
CloseHandle(process); CloseHandle(process);
return true; return true;
} }
static void *GetFuncAddr(LPCWSTR dllPath, HMODULE dllBase, LPCSTR funcName) static void *GetFuncAddr(LPCWSTR dllPath, HMODULE dllBase, LPCSTR funcName)
{ {
HMODULE hLoaded = LoadLibrary(dllPath); HMODULE hLoaded = LoadLibrary(dllPath);
if (hLoaded == NULL) { if (hLoaded == NULL) {
return NULL; return NULL;
} }
void *absAddr = GetProcAddress(hLoaded, funcName); void *absAddr = GetProcAddress(hLoaded, funcName);
DWORD offset = (DWORD)absAddr - (DWORD)hLoaded; DWORD offset = (DWORD)absAddr - (DWORD)hLoaded;
FreeLibrary(hLoaded); FreeLibrary(hLoaded);
return (void *)((DWORD)dllBase + offset); return (void *)((DWORD)dllBase + offset);
} }
bool CallDllFunc(HANDLE process, LPCWSTR dllPath, HMODULE dllBase, LPCSTR funcName, LPVOID parameter, DWORD *ret) bool CallDllFunc(HANDLE process, LPCWSTR dllPath, HMODULE dllBase, LPCSTR funcName, LPVOID parameter, DWORD *ret)
{ {
void *pFunc = GetFuncAddr(dllPath, dllBase, funcName); void *pFunc = GetFuncAddr(dllPath, dllBase, funcName);
if (pFunc == NULL) { if (pFunc == NULL) {
return false; return false;
} }
HANDLE hThread = CreateRemoteThread(process, NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, parameter, 0, NULL); HANDLE hThread = CreateRemoteThread(process, NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, parameter, 0, NULL);
if (hThread == NULL) { if (hThread == NULL) {
return false; return false;
} }
WaitForSingleObject(hThread, INFINITE); WaitForSingleObject(hThread, INFINITE);
if (ret != NULL) { if (ret != NULL) {
GetExitCodeThread(hThread, ret); GetExitCodeThread(hThread, ret);
} }
CloseHandle(hThread); CloseHandle(hThread);
return true; return true;
} }
bool CallDllFuncEx(HANDLE process, LPCWSTR dllPath, HMODULE dllBase, LPCSTR funcName, LPVOID parameter, size_t sz, bool CallDllFuncEx(HANDLE process, LPCWSTR dllPath, HMODULE dllBase, LPCSTR funcName, LPVOID parameter, size_t sz,
DWORD *ret) DWORD *ret)
{ {
void *pFunc = GetFuncAddr(dllPath, dllBase, funcName); void *pFunc = GetFuncAddr(dllPath, dllBase, funcName);
if (pFunc == NULL) { if (pFunc == NULL) {
return false; return false;
} }
LPVOID pRemoteAddress = VirtualAllocEx(process, NULL, sz, MEM_COMMIT, PAGE_READWRITE); LPVOID pRemoteAddress = VirtualAllocEx(process, NULL, sz, MEM_COMMIT, PAGE_READWRITE);
if (pRemoteAddress == NULL) { if (pRemoteAddress == NULL) {
MessageBox(NULL, L"申请内存失败", L"CallDllFuncEx", 0); MessageBox(NULL, L"申请内存失败", L"CallDllFuncEx", 0);
return NULL; return NULL;
} }
WriteProcessMemory(process, pRemoteAddress, parameter, sz, NULL); WriteProcessMemory(process, pRemoteAddress, parameter, sz, NULL);
HANDLE hThread = CreateRemoteThread(process, NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, pRemoteAddress, 0, NULL); HANDLE hThread = CreateRemoteThread(process, NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, pRemoteAddress, 0, NULL);
if (hThread == NULL) { if (hThread == NULL) {
VirtualFree(pRemoteAddress, 0, MEM_RELEASE); VirtualFree(pRemoteAddress, 0, MEM_RELEASE);
MessageBox(NULL, L"远程调用失败", L"CallDllFuncEx", 0); MessageBox(NULL, L"远程调用失败", L"CallDllFuncEx", 0);
return false; return false;
} }
WaitForSingleObject(hThread, INFINITE); WaitForSingleObject(hThread, INFINITE);
VirtualFree(pRemoteAddress, 0, MEM_RELEASE); VirtualFree(pRemoteAddress, 0, MEM_RELEASE);
if (ret != NULL) { if (ret != NULL) {
GetExitCodeThread(hThread, ret); GetExitCodeThread(hThread, ret);
} }
CloseHandle(hThread); CloseHandle(hThread);
return true; return true;
} }

View File

@ -1,125 +1,125 @@
#include "Shlwapi.h" #include "Shlwapi.h"
#include "framework.h" #include "framework.h"
#include <filesystem> #include <filesystem>
#include <process.h> #include <process.h>
#include <tlhelp32.h> #include <tlhelp32.h>
#include "injector.h" #include "injector.h"
#include "sdk.h" #include "sdk.h"
#include "util.h" #include "util.h"
#define WCF_LOCK ".wcf.lock" #define WCF_LOCK ".wcf.lock"
static bool debugMode = false; static bool debugMode = false;
static HANDLE wcProcess = NULL; static HANDLE wcProcess = NULL;
static HMODULE spyBase = NULL; static HMODULE spyBase = NULL;
static WCHAR spyDllPath[MAX_PATH] = { 0 }; static WCHAR spyDllPath[MAX_PATH] = { 0 };
static int GetDllPath(bool debug, wchar_t *dllPath) static int GetDllPath(bool debug, wchar_t *dllPath)
{ {
GetModuleFileName(GetModuleHandle(WECHATSDKDLL), spyDllPath, MAX_PATH); GetModuleFileName(GetModuleHandle(WECHATSDKDLL), spyDllPath, MAX_PATH);
PathRemoveFileSpec(spyDllPath); PathRemoveFileSpec(spyDllPath);
if (debug) { if (debug) {
PathAppend(spyDllPath, WECHATINJECTDLL_DEBUG); PathAppend(spyDllPath, WECHATINJECTDLL_DEBUG);
} else { } else {
PathAppend(spyDllPath, WECHATINJECTDLL); PathAppend(spyDllPath, WECHATINJECTDLL);
} }
if (!PathFileExists(spyDllPath)) { if (!PathFileExists(spyDllPath)) {
MessageBox(NULL, spyDllPath, L"文件不存在", 0); MessageBox(NULL, spyDllPath, L"文件不存在", 0);
return ERROR_FILE_NOT_FOUND; return ERROR_FILE_NOT_FOUND;
} }
return 0; return 0;
} }
int WxInitSDK(bool debug, int port) int WxInitSDK(bool debug, int port)
{ {
int status = 0; int status = 0;
DWORD wcPid = 0; DWORD wcPid = 0;
status = GetDllPath(debug, spyDllPath); status = GetDllPath(debug, spyDllPath);
if (status != 0) { if (status != 0) {
return status; return status;
} }
status = OpenWeChat(&wcPid); status = OpenWeChat(&wcPid);
if (status != 0) { if (status != 0) {
MessageBox(NULL, L"打开微信失败", L"WxInitSDK", 0); MessageBox(NULL, L"打开微信失败", L"WxInitSDK", 0);
return status; return status;
} }
Sleep(2000); // 等待微信打开 Sleep(2000); // 等待微信打开
wcProcess = InjectDll(wcPid, spyDllPath, &spyBase); wcProcess = InjectDll(wcPid, spyDllPath, &spyBase);
if (wcProcess == NULL) { if (wcProcess == NULL) {
MessageBox(NULL, L"注入失败", L"WxInitSDK", 0); MessageBox(NULL, L"注入失败", L"WxInitSDK", 0);
return -1; return -1;
} }
PortPath_t pp = { 0 }; PortPath_t pp = { 0 };
pp.port = port; pp.port = port;
sprintf_s(pp.path, MAX_PATH, "%s", std::filesystem::current_path().string().c_str()); sprintf_s(pp.path, MAX_PATH, "%s", std::filesystem::current_path().string().c_str());
if (!CallDllFuncEx(wcProcess, spyDllPath, spyBase, "InitSpy", (LPVOID)&pp, sizeof(PortPath_t), NULL)) { if (!CallDllFuncEx(wcProcess, spyDllPath, spyBase, "InitSpy", (LPVOID)&pp, sizeof(PortPath_t), NULL)) {
MessageBox(NULL, L"初始化失败", L"WxInitSDK", 0); MessageBox(NULL, L"初始化失败", L"WxInitSDK", 0);
return -1; return -1;
} }
#ifdef WCF #ifdef WCF
FILE *fd = fopen(WCF_LOCK, "wb"); FILE *fd = fopen(WCF_LOCK, "wb");
if (fd == NULL) { if (fd == NULL) {
MessageBox(NULL, L"无法打开lock文件", L"WxInitSDK", 0); MessageBox(NULL, L"无法打开lock文件", L"WxInitSDK", 0);
return -2; return -2;
} }
fwrite((uint8_t *)&debug, sizeof(debug), 1, fd); fwrite((uint8_t *)&debug, sizeof(debug), 1, fd);
fwrite((uint8_t *)&spyBase, sizeof(spyBase), 1, fd); fwrite((uint8_t *)&spyBase, sizeof(spyBase), 1, fd);
fclose(fd); fclose(fd);
#endif #endif
debugMode = debug; debugMode = debug;
return 0; return 0;
} }
int WxDestroySDK() int WxDestroySDK()
{ {
int status = 0; int status = 0;
#ifdef WCF #ifdef WCF
bool debug; bool debug;
DWORD pid = GetWeChatPid(); DWORD pid = GetWeChatPid();
if (pid == 0) { if (pid == 0) {
MessageBox(NULL, L"微信未运行", L"WxDestroySDK", 0); MessageBox(NULL, L"微信未运行", L"WxDestroySDK", 0);
return status; return status;
} }
wcProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); wcProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
if (wcProcess == NULL) { if (wcProcess == NULL) {
MessageBox(NULL, L"微信未运行", L"WxDestroySDK", 0); MessageBox(NULL, L"微信未运行", L"WxDestroySDK", 0);
return -1; return -1;
} }
FILE *fd = fopen(WCF_LOCK, "rb"); FILE *fd = fopen(WCF_LOCK, "rb");
if (fd == NULL) { if (fd == NULL) {
MessageBox(NULL, L"无法打开lock文件", L"WxDestroySDK", 0); MessageBox(NULL, L"无法打开lock文件", L"WxDestroySDK", 0);
return -2; return -2;
} }
fread((uint8_t *)&debug, sizeof(debug), 1, fd); fread((uint8_t *)&debug, sizeof(debug), 1, fd);
fread((uint8_t *)&spyBase, sizeof(spyBase), 1, fd); fread((uint8_t *)&spyBase, sizeof(spyBase), 1, fd);
fclose(fd); fclose(fd);
status = GetDllPath(debug, spyDllPath); status = GetDllPath(debug, spyDllPath);
#else #else
status = GetDllPath(debugMode, spyDllPath); status = GetDllPath(debugMode, spyDllPath);
#endif #endif
if (status != 0) { if (status != 0) {
return status; return status;
} }
if (!CallDllFunc(wcProcess, spyDllPath, spyBase, "CleanupSpy", NULL, NULL)) { if (!CallDllFunc(wcProcess, spyDllPath, spyBase, "CleanupSpy", NULL, NULL)) {
return -1; return -1;
} }
if (!EjectDll(wcProcess, spyBase)) { if (!EjectDll(wcProcess, spyBase)) {
return -1; // TODO: Unify error codes return -1; // TODO: Unify error codes
} }
return 0; return 0;
} }

View File

@ -1,3 +1,3 @@
EXPORTS EXPORTS
WxInitSDK WxInitSDK
WxDestroySDK WxDestroySDK

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
int WxInitSDK(bool debug, int port); int WxInitSDK(bool debug, int port);
int WxDestroySDK(); int WxDestroySDK();

View File

@ -1,278 +1,278 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations"> <ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32"> <ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration> <Configuration>Debug</Configuration>
<Platform>Win32</Platform> <Platform>Win32</Platform>
</ProjectConfiguration> </ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32"> <ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration> <Configuration>Release</Configuration>
<Platform>Win32</Platform> <Platform>Win32</Platform>
</ProjectConfiguration> </ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64"> <ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration> <Configuration>Debug</Configuration>
<Platform>x64</Platform> <Platform>x64</Platform>
</ProjectConfiguration> </ProjectConfiguration>
<ProjectConfiguration Include="Release|x64"> <ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration> <Configuration>Release</Configuration>
<Platform>x64</Platform> <Platform>x64</Platform>
</ProjectConfiguration> </ProjectConfiguration>
</ItemGroup> </ItemGroup>
<PropertyGroup Label="Globals"> <PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion> <VCProjectVersion>16.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword> <Keyword>Win32Proj</Keyword>
<ProjectGuid>{4de80b82-5f6a-4c4c-9d16-1574308110fa}</ProjectGuid> <ProjectGuid>{4de80b82-5f6a-4c4c-9d16-1574308110fa}</ProjectGuid>
<RootNamespace>spy</RootNamespace> <RootNamespace>spy</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion> <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
<VcpkgTriplet Condition="'$(Platform)'=='Win32'">x86-windows-static</VcpkgTriplet> <VcpkgTriplet Condition="'$(Platform)'=='Win32'">x86-windows-static</VcpkgTriplet>
<VcpkgTriplet Condition="'$(Platform)'=='x64'">x64-windows-static</VcpkgTriplet> <VcpkgTriplet Condition="'$(Platform)'=='x64'">x64-windows-static</VcpkgTriplet>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType> <ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType> <ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries> <UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType> <ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType> <ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries> <UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings"> <ImportGroup Label="ExtensionSettings">
</ImportGroup> </ImportGroup>
<ImportGroup Label="Shared"> <ImportGroup Label="Shared">
</ImportGroup> </ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup> </ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup> </ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup> </ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup> </ImportGroup>
<PropertyGroup Label="UserMacros" /> <PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental> <LinkIncremental>true</LinkIncremental>
<TargetName>$(ProjectName)_debug</TargetName> <TargetName>$(ProjectName)_debug</TargetName>
<PreBuildEventUseInBuild>true</PreBuildEventUseInBuild> <PreBuildEventUseInBuild>true</PreBuildEventUseInBuild>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental> <LinkIncremental>false</LinkIncremental>
<PreBuildEventUseInBuild>true</PreBuildEventUseInBuild> <PreBuildEventUseInBuild>true</PreBuildEventUseInBuild>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental> <LinkIncremental>true</LinkIncremental>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental> <LinkIncremental>false</LinkIncremental>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<VcpkgUseStatic>true</VcpkgUseStatic> <VcpkgUseStatic>true</VcpkgUseStatic>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<VcpkgUseStatic>true</VcpkgUseStatic> <VcpkgUseStatic>true</VcpkgUseStatic>
<VcpkgConfiguration>Release</VcpkgConfiguration> <VcpkgConfiguration>Release</VcpkgConfiguration>
</PropertyGroup> </PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile> <ClCompile>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking> <FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions> <IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;SPY_EXPORTS;_WINDOWS;_USRDLL;ENABLE_DEBUG_LOG;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;NDEBUG;SPY_EXPORTS;_WINDOWS;_USRDLL;ENABLE_DEBUG_LOG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>NotUsing</PrecompiledHeader> <PrecompiledHeader>NotUsing</PrecompiledHeader>
<PrecompiledHeaderFile> <PrecompiledHeaderFile>
</PrecompiledHeaderFile> </PrecompiledHeaderFile>
<AdditionalIncludeDirectories>$(SolutionDir)rpc;$(SolutionDir)rpc\nanopb;$(SolutionDir)rpc\proto;$(SolutionDir)spy;C:\Tools\vcpkg\installed\x86-windows-static\include</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>$(SolutionDir)rpc;$(SolutionDir)rpc\nanopb;$(SolutionDir)rpc\proto;$(SolutionDir)spy;C:\Tools\vcpkg\installed\x86-windows-static\include</AdditionalIncludeDirectories>
<PrecompiledHeaderOutputFile /> <PrecompiledHeaderOutputFile />
<DisableSpecificWarnings>4251;4731;4819</DisableSpecificWarnings> <DisableSpecificWarnings>4251;4731;4819</DisableSpecificWarnings>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary> <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<LanguageStandard>stdcpp17</LanguageStandard> <LanguageStandard>stdcpp17</LanguageStandard>
<AdditionalOptions>/EHa %(AdditionalOptions)</AdditionalOptions> <AdditionalOptions>/EHa %(AdditionalOptions)</AdditionalOptions>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC> <EnableUAC>false</EnableUAC>
<AdditionalDependencies>iphlpapi.lib;wsock32.lib;ws2_32.lib;crypt32.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>iphlpapi.lib;wsock32.lib;ws2_32.lib;crypt32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<ModuleDefinitionFile>spy.def</ModuleDefinitionFile> <ModuleDefinitionFile>spy.def</ModuleDefinitionFile>
</Link> </Link>
<PostBuildEvent> <PostBuildEvent>
<Command>if not exist $(SolutionDir)Out md $(SolutionDir)Out <Command>if not exist $(SolutionDir)Out md $(SolutionDir)Out
xcopy /y $(OutDir)$(TargetFileName) $(SolutionDir)Out xcopy /y $(OutDir)$(TargetFileName) $(SolutionDir)Out
xcopy /y $(OutDir)$(TargetName).exp $(SolutionDir)Out xcopy /y $(OutDir)$(TargetName).exp $(SolutionDir)Out
xcopy /y $(OutDir)$(TargetName).lib $(SolutionDir)Out xcopy /y $(OutDir)$(TargetName).lib $(SolutionDir)Out
xcopy /y $(OutDir)$(TargetName).pdb $(SolutionDir)Out xcopy /y $(OutDir)$(TargetName).pdb $(SolutionDir)Out
xcopy /y $(OutDir)$(TargetFileName) $(SolutionDir)python\wcferry</Command> xcopy /y $(OutDir)$(TargetFileName) $(SolutionDir)..\clients\python\wcferry</Command>
</PostBuildEvent> </PostBuildEvent>
<PostBuildEvent> <PostBuildEvent>
<Message>Copy spy.dll</Message> <Message>Copy spy.dll</Message>
</PostBuildEvent> </PostBuildEvent>
<PreBuildEvent> <PreBuildEvent>
<Command>cd $(SolutionDir)rpc\proto <Command>cd $(SolutionDir)rpc\proto
$(SolutionDir)rpc\tool\protoc --nanopb_out=. wcf.proto</Command> $(SolutionDir)rpc\tool\protoc --nanopb_out=. wcf.proto</Command>
</PreBuildEvent> </PreBuildEvent>
<PreBuildEvent> <PreBuildEvent>
<Message>Generating PB files</Message> <Message>Generating PB files</Message>
</PreBuildEvent> </PreBuildEvent>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile> <ClCompile>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking> <FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions> <IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;SPY_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;NDEBUG;SPY_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>NotUsing</PrecompiledHeader> <PrecompiledHeader>NotUsing</PrecompiledHeader>
<PrecompiledHeaderFile> <PrecompiledHeaderFile>
</PrecompiledHeaderFile> </PrecompiledHeaderFile>
<AdditionalIncludeDirectories>$(SolutionDir)rpc;$(SolutionDir)rpc\nanopb;$(SolutionDir)rpc\proto;$(SolutionDir)spy;C:\Tools\vcpkg\installed\x86-windows-static\include</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>$(SolutionDir)rpc;$(SolutionDir)rpc\nanopb;$(SolutionDir)rpc\proto;$(SolutionDir)spy;C:\Tools\vcpkg\installed\x86-windows-static\include</AdditionalIncludeDirectories>
<PrecompiledHeaderOutputFile /> <PrecompiledHeaderOutputFile />
<DisableSpecificWarnings>4251;4731;4819</DisableSpecificWarnings> <DisableSpecificWarnings>4251;4731;4819</DisableSpecificWarnings>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary> <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<LanguageStandard>stdcpp17</LanguageStandard> <LanguageStandard>stdcpp17</LanguageStandard>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC> <EnableUAC>false</EnableUAC>
<AdditionalDependencies>iphlpapi.lib;wsock32.lib;ws2_32.lib;crypt32.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>iphlpapi.lib;wsock32.lib;ws2_32.lib;crypt32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<ModuleDefinitionFile>spy.def</ModuleDefinitionFile> <ModuleDefinitionFile>spy.def</ModuleDefinitionFile>
</Link> </Link>
<PostBuildEvent> <PostBuildEvent>
<Command>if not exist $(SolutionDir)Out md $(SolutionDir)Out <Command>if not exist $(SolutionDir)Out md $(SolutionDir)Out
xcopy /y $(OutDir)$(TargetFileName) $(SolutionDir)Out xcopy /y $(OutDir)$(TargetFileName) $(SolutionDir)Out
xcopy /y $(OutDir)$(TargetFileName) $(SolutionDir)python\wcferry</Command> xcopy /y $(OutDir)$(TargetFileName) $(SolutionDir)..\clients\python\wcferry</Command>
</PostBuildEvent> </PostBuildEvent>
<PostBuildEvent> <PostBuildEvent>
<Message>Copy spy.dll</Message> <Message>Copy spy.dll</Message>
</PostBuildEvent> </PostBuildEvent>
<PreBuildEvent> <PreBuildEvent>
<Command>cd $(SolutionDir)rpc\proto <Command>cd $(SolutionDir)rpc\proto
$(SolutionDir)rpc\tool\protoc --nanopb_out=. wcf.proto</Command> $(SolutionDir)rpc\tool\protoc --nanopb_out=. wcf.proto</Command>
</PreBuildEvent> </PreBuildEvent>
<PreBuildEvent> <PreBuildEvent>
<Message>Generating PB files</Message> <Message>Generating PB files</Message>
</PreBuildEvent> </PreBuildEvent>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile> <ClCompile>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;SPY_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_DEBUG;SPY_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>Use</PrecompiledHeader> <PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile> <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC> <EnableUAC>false</EnableUAC>
<ModuleDefinitionFile>spy.def</ModuleDefinitionFile> <ModuleDefinitionFile>spy.def</ModuleDefinitionFile>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile> <ClCompile>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking> <FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions> <IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;SPY_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>NDEBUG;SPY_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>Use</PrecompiledHeader> <PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile> <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC> <EnableUAC>false</EnableUAC>
<ModuleDefinitionFile>spy.def</ModuleDefinitionFile> <ModuleDefinitionFile>spy.def</ModuleDefinitionFile>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\rpc\nanopb\pb.h" /> <ClInclude Include="..\rpc\nanopb\pb.h" />
<ClInclude Include="..\rpc\nanopb\pb_common.h" /> <ClInclude Include="..\rpc\nanopb\pb_common.h" />
<ClInclude Include="..\rpc\nanopb\pb_decode.h" /> <ClInclude Include="..\rpc\nanopb\pb_decode.h" />
<ClInclude Include="..\rpc\nanopb\pb_encode.h" /> <ClInclude Include="..\rpc\nanopb\pb_encode.h" />
<ClInclude Include="..\rpc\pb_types.h" /> <ClInclude Include="..\rpc\pb_types.h" />
<ClInclude Include="..\rpc\pb_util.h" /> <ClInclude Include="..\rpc\pb_util.h" />
<ClInclude Include="..\rpc\proto\wcf.pb.h" /> <ClInclude Include="..\rpc\proto\wcf.pb.h" />
<ClInclude Include="chatroom_mgmt.h" /> <ClInclude Include="chatroom_mgmt.h" />
<ClInclude Include="decrypt_image.h" /> <ClInclude Include="decrypt_image.h" />
<ClInclude Include="exec_sql.h" /> <ClInclude Include="exec_sql.h" />
<ClInclude Include="framework.h" /> <ClInclude Include="framework.h" />
<ClInclude Include="contact_mgmt.h" /> <ClInclude Include="contact_mgmt.h" />
<ClInclude Include="load_calls.h" /> <ClInclude Include="load_calls.h" />
<ClInclude Include="log.h" /> <ClInclude Include="log.h" />
<ClInclude Include="receive_msg.h" /> <ClInclude Include="receive_msg.h" />
<ClInclude Include="receive_transfer.h" /> <ClInclude Include="receive_transfer.h" />
<ClInclude Include="resource.h" /> <ClInclude Include="resource.h" />
<ClInclude Include="rpc_server.h" /> <ClInclude Include="rpc_server.h" />
<ClInclude Include="send_msg.h" /> <ClInclude Include="send_msg.h" />
<ClInclude Include="spy.h" /> <ClInclude Include="spy.h" />
<ClInclude Include="spy_types.h" /> <ClInclude Include="spy_types.h" />
<ClInclude Include="sqlite3.h" /> <ClInclude Include="sqlite3.h" />
<ClInclude Include="user_info.h" /> <ClInclude Include="user_info.h" />
<ClInclude Include="util.h" /> <ClInclude Include="util.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="..\rpc\nanopb\pb_common.c" /> <ClCompile Include="..\rpc\nanopb\pb_common.c" />
<ClCompile Include="..\rpc\nanopb\pb_decode.c" /> <ClCompile Include="..\rpc\nanopb\pb_decode.c" />
<ClCompile Include="..\rpc\nanopb\pb_encode.c" /> <ClCompile Include="..\rpc\nanopb\pb_encode.c" />
<ClCompile Include="..\rpc\pb_util.cpp" /> <ClCompile Include="..\rpc\pb_util.cpp" />
<ClCompile Include="..\rpc\proto\wcf.pb.c" /> <ClCompile Include="..\rpc\proto\wcf.pb.c" />
<ClCompile Include="chatroom_mgmt.cpp" /> <ClCompile Include="chatroom_mgmt.cpp" />
<ClCompile Include="decrypt_image.cpp" /> <ClCompile Include="decrypt_image.cpp" />
<ClCompile Include="dllmain.cpp" /> <ClCompile Include="dllmain.cpp" />
<ClCompile Include="exec_sql.cpp" /> <ClCompile Include="exec_sql.cpp" />
<ClCompile Include="contact_mgmt.cpp" /> <ClCompile Include="contact_mgmt.cpp" />
<ClCompile Include="load_calls.cpp" /> <ClCompile Include="load_calls.cpp" />
<ClCompile Include="log.cpp" /> <ClCompile Include="log.cpp" />
<ClCompile Include="receive_msg.cpp" /> <ClCompile Include="receive_msg.cpp" />
<ClCompile Include="receive_transfer.cpp" /> <ClCompile Include="receive_transfer.cpp" />
<ClCompile Include="rpc_server.cpp" /> <ClCompile Include="rpc_server.cpp" />
<ClCompile Include="send_msg.cpp" /> <ClCompile Include="send_msg.cpp" />
<ClCompile Include="spy.cpp" /> <ClCompile Include="spy.cpp" />
<ClCompile Include="user_info.cpp" /> <ClCompile Include="user_info.cpp" />
<ClCompile Include="util.cpp" /> <ClCompile Include="util.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="..\rpc\proto\wcf.proto" /> <None Include="..\rpc\proto\wcf.proto" />
<None Include="spy.def" /> <None Include="spy.def" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ResourceCompile Include="spy.rc" /> <ResourceCompile Include="spy.rc" />
</ItemGroup> </ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">
</ImportGroup> </ImportGroup>
</Project> </Project>

View File

@ -1,166 +1,166 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup> <ItemGroup>
<Filter Include="源文件"> <Filter Include="源文件">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions> <Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter> </Filter>
<Filter Include="头文件"> <Filter Include="头文件">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions> <Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
</Filter> </Filter>
<Filter Include="资源文件"> <Filter Include="资源文件">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter> </Filter>
<Filter Include="nnrpc"> <Filter Include="nnrpc">
<UniqueIdentifier>{7e39c2cc-c605-4204-88dc-9ae15c7d8d6c}</UniqueIdentifier> <UniqueIdentifier>{7e39c2cc-c605-4204-88dc-9ae15c7d8d6c}</UniqueIdentifier>
</Filter> </Filter>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="framework.h"> <ClInclude Include="framework.h">
<Filter>头文件</Filter> <Filter>头文件</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="rpc_server.h"> <ClInclude Include="rpc_server.h">
<Filter>头文件</Filter> <Filter>头文件</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="log.h"> <ClInclude Include="log.h">
<Filter>头文件</Filter> <Filter>头文件</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="exec_sql.h"> <ClInclude Include="exec_sql.h">
<Filter>头文件</Filter> <Filter>头文件</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="contact_mgmt.h"> <ClInclude Include="contact_mgmt.h">
<Filter>头文件</Filter> <Filter>头文件</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="load_calls.h"> <ClInclude Include="load_calls.h">
<Filter>头文件</Filter> <Filter>头文件</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="receive_msg.h"> <ClInclude Include="receive_msg.h">
<Filter>头文件</Filter> <Filter>头文件</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="send_msg.h"> <ClInclude Include="send_msg.h">
<Filter>头文件</Filter> <Filter>头文件</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="spy.h"> <ClInclude Include="spy.h">
<Filter>头文件</Filter> <Filter>头文件</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="spy_types.h"> <ClInclude Include="spy_types.h">
<Filter>头文件</Filter> <Filter>头文件</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="util.h"> <ClInclude Include="util.h">
<Filter>头文件</Filter> <Filter>头文件</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\rpc\nanopb\pb.h"> <ClInclude Include="..\rpc\nanopb\pb.h">
<Filter>nnrpc</Filter> <Filter>nnrpc</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\rpc\nanopb\pb_common.h"> <ClInclude Include="..\rpc\nanopb\pb_common.h">
<Filter>nnrpc</Filter> <Filter>nnrpc</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\rpc\nanopb\pb_decode.h"> <ClInclude Include="..\rpc\nanopb\pb_decode.h">
<Filter>nnrpc</Filter> <Filter>nnrpc</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\rpc\nanopb\pb_encode.h"> <ClInclude Include="..\rpc\nanopb\pb_encode.h">
<Filter>nnrpc</Filter> <Filter>nnrpc</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\rpc\proto\wcf.pb.h"> <ClInclude Include="..\rpc\proto\wcf.pb.h">
<Filter>nnrpc</Filter> <Filter>nnrpc</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\rpc\pb_util.h"> <ClInclude Include="..\rpc\pb_util.h">
<Filter>nnrpc</Filter> <Filter>nnrpc</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\rpc\pb_types.h"> <ClInclude Include="..\rpc\pb_types.h">
<Filter>nnrpc</Filter> <Filter>nnrpc</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="chatroom_mgmt.h"> <ClInclude Include="chatroom_mgmt.h">
<Filter>头文件</Filter> <Filter>头文件</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="user_info.h"> <ClInclude Include="user_info.h">
<Filter>头文件</Filter> <Filter>头文件</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="resource.h"> <ClInclude Include="resource.h">
<Filter>头文件</Filter> <Filter>头文件</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="decrypt_image.h"> <ClInclude Include="decrypt_image.h">
<Filter>头文件</Filter> <Filter>头文件</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="receive_transfer.h"> <ClInclude Include="receive_transfer.h">
<Filter>头文件</Filter> <Filter>头文件</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="sqlite3.h"> <ClInclude Include="sqlite3.h">
<Filter>头文件</Filter> <Filter>头文件</Filter>
</ClInclude> </ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="dllmain.cpp"> <ClCompile Include="dllmain.cpp">
<Filter>源文件</Filter> <Filter>源文件</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="rpc_server.cpp"> <ClCompile Include="rpc_server.cpp">
<Filter>源文件</Filter> <Filter>源文件</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="log.cpp"> <ClCompile Include="log.cpp">
<Filter>源文件</Filter> <Filter>源文件</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="exec_sql.cpp"> <ClCompile Include="exec_sql.cpp">
<Filter>源文件</Filter> <Filter>源文件</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="contact_mgmt.cpp"> <ClCompile Include="contact_mgmt.cpp">
<Filter>源文件</Filter> <Filter>源文件</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="load_calls.cpp"> <ClCompile Include="load_calls.cpp">
<Filter>源文件</Filter> <Filter>源文件</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="receive_msg.cpp"> <ClCompile Include="receive_msg.cpp">
<Filter>源文件</Filter> <Filter>源文件</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="send_msg.cpp"> <ClCompile Include="send_msg.cpp">
<Filter>源文件</Filter> <Filter>源文件</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="spy.cpp"> <ClCompile Include="spy.cpp">
<Filter>源文件</Filter> <Filter>源文件</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="util.cpp"> <ClCompile Include="util.cpp">
<Filter>源文件</Filter> <Filter>源文件</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\rpc\nanopb\pb_common.c"> <ClCompile Include="..\rpc\nanopb\pb_common.c">
<Filter>nnrpc</Filter> <Filter>nnrpc</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\rpc\nanopb\pb_decode.c"> <ClCompile Include="..\rpc\nanopb\pb_decode.c">
<Filter>nnrpc</Filter> <Filter>nnrpc</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\rpc\nanopb\pb_encode.c"> <ClCompile Include="..\rpc\nanopb\pb_encode.c">
<Filter>nnrpc</Filter> <Filter>nnrpc</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\rpc\proto\wcf.pb.c"> <ClCompile Include="..\rpc\proto\wcf.pb.c">
<Filter>nnrpc</Filter> <Filter>nnrpc</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\rpc\pb_util.cpp"> <ClCompile Include="..\rpc\pb_util.cpp">
<Filter>nnrpc</Filter> <Filter>nnrpc</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="chatroom_mgmt.cpp"> <ClCompile Include="chatroom_mgmt.cpp">
<Filter>源文件</Filter> <Filter>源文件</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="user_info.cpp"> <ClCompile Include="user_info.cpp">
<Filter>源文件</Filter> <Filter>源文件</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="decrypt_image.cpp"> <ClCompile Include="decrypt_image.cpp">
<Filter>源文件</Filter> <Filter>源文件</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="receive_transfer.cpp"> <ClCompile Include="receive_transfer.cpp">
<Filter>源文件</Filter> <Filter>源文件</Filter>
</ClCompile> </ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="spy.def"> <None Include="spy.def">
<Filter>源文件</Filter> <Filter>源文件</Filter>
</None> </None>
<None Include="..\rpc\proto\wcf.proto"> <None Include="..\rpc\proto\wcf.proto">
<Filter>nnrpc</Filter> <Filter>nnrpc</Filter>
</None> </None>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ResourceCompile Include="spy.rc"> <ResourceCompile Include="spy.rc">
<Filter>资源文件</Filter> <Filter>资源文件</Filter>
</ResourceCompile> </ResourceCompile>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup /> <PropertyGroup />
</Project> </Project>

View File

@ -1,5 +1,5 @@
#pragma once #pragma once
#define WIN32_LEAN_AND_MEAN // 从 Windows 头文件中排除极少使用的内容 #define WIN32_LEAN_AND_MEAN // 从 Windows 头文件中排除极少使用的内容
// Windows 头文件 // Windows 头文件
#include <windows.h> #include <windows.h>

View File

@ -1,39 +1,39 @@
#include <iostream> #include <iostream>
#include <map> #include <map>
#include "load_calls.h" #include "load_calls.h"
#define SUPPORT_VERSION L"3.9.2.23" #define SUPPORT_VERSION L"3.9.2.23"
WxCalls_t wxCalls = { WxCalls_t wxCalls = {
0x2FFD638, // Login Status 0x2FFD638, // Login Status
{ 0x2FFD484, 0x2FFD590, 0x2FFD500, 0x30238CC }, // User Info: wxid, nickname, mobile, home { 0x2FFD484, 0x2FFD590, 0x2FFD500, 0x30238CC }, // User Info: wxid, nickname, mobile, home
{ 0x768140, 0xCE6C80, 0x756960 }, // Send Message { 0x768140, 0xCE6C80, 0x756960 }, // Send Message
/* Receive Message: /* Receive Message:
Hook, call, type, self, id, msgXml, roomId, wxId, content, thumb, extra */ Hook, call, type, self, id, msgXml, roomId, wxId, content, thumb, extra */
{ 0xD19A0B, 0x756960, 0x38, 0x3C, 0x194, 0x1FC, 0x48, 0x180, 0x70, 0x1A8, 0x1BC }, { 0xD19A0B, 0x756960, 0x38, 0x3C, 0x194, 0x1FC, 0x48, 0x180, 0x70, 0x1A8, 0x1BC },
{ 0x768140, 0XF59E40, 0XCE6640, 0x756960 }, // Send Image Message { 0x768140, 0XF59E40, 0XCE6640, 0x756960 }, // Send Image Message
{ 0x76AE20, 0xF59E40, 0xB6D1F0, 0x756960 }, // Send File Message { 0x76AE20, 0xF59E40, 0xB6D1F0, 0x756960 }, // Send File Message
{ 0xB8A70, 0x3ED5E0, 0x107F00, 0x3ED7B0, 0x2386FE4 }, // Send xml Message { 0xB8A70, 0x3ED5E0, 0x107F00, 0x3ED7B0, 0x2386FE4 }, // Send xml Message
{ 0x771980, 0x4777E0, 0x239E888 }, // Send Emotion Message { 0x771980, 0x4777E0, 0x239E888 }, // Send Emotion Message
/* Get Contacts: /* Get Contacts:
call1, call2, wxId, Code, Remark,Name, Gender, Country, Province, City*/ call1, call2, wxId, Code, Remark,Name, Gender, Country, Province, City*/
{ 0x75A4A0, 0xC089F0, 0x10, 0x24, 0x58, 0x6C, 0x0E, 0x00, 0x00, 0x00 }, { 0x75A4A0, 0xC089F0, 0x10, 0x24, 0x58, 0x6C, 0x0E, 0x00, 0x00, 0x00 },
/* Exec Sql: /* Exec Sql:
Exec, base, start, end, slot, name*/ Exec, base, start, end, slot, name*/
{ 0x141BDF0, 0x2366934, 0x1428, 0x142C, 0x3C, 0x50 }, { 0x141BDF0, 0x2366934, 0x1428, 0x142C, 0x3C, 0x50 },
{ 0xA17D50, 0xF59E40, 0xA18BD0, 0xA17E70 }, // Accept New Friend application { 0xA17D50, 0xF59E40, 0xA18BD0, 0xA17E70 }, // Accept New Friend application
{ 0x78CF20, 0xF59E40, 0xBD1DC0 }, // Add chatroom members { 0x78CF20, 0xF59E40, 0xBD1DC0 }, // Add chatroom members
{ 0x78CF20, 0xF59E40, 0xBD22A0 }, // Delete chatroom members { 0x78CF20, 0xF59E40, 0xBD22A0 }, // Delete chatroom members
{ 0x7B2E60, 0x15E2C20, 0x79C250 } // Receive transfer { 0x7B2E60, 0x15E2C20, 0x79C250 } // Receive transfer
}; };
int LoadCalls(const wchar_t *version, WxCalls_t *calls) int LoadCalls(const wchar_t *version, WxCalls_t *calls)
{ {
if (wcscmp(version, SUPPORT_VERSION) != 0) { if (wcscmp(version, SUPPORT_VERSION) != 0) {
return -1; return -1;
} }
memcpy_s(calls, sizeof(WxCalls_t), &wxCalls, sizeof(WxCalls_t)); memcpy_s(calls, sizeof(WxCalls_t), &wxCalls, sizeof(WxCalls_t));
return 0; return 0;
} }

View File

@ -1,5 +1,5 @@
#pragma once #pragma once
#include "spy_types.h" #include "spy_types.h"
int LoadCalls(const wchar_t *version, WxCalls_t *calls); int LoadCalls(const wchar_t *version, WxCalls_t *calls);

View File

@ -1,175 +1,175 @@
#pragma execution_character_set("utf-8") #pragma execution_character_set("utf-8")
#include "framework.h" #include "framework.h"
#include <condition_variable> #include <condition_variable>
#include <mutex> #include <mutex>
#include <queue> #include <queue>
#include "load_calls.h" #include "load_calls.h"
#include "receive_msg.h" #include "receive_msg.h"
#include "user_info.h" #include "user_info.h"
#include "util.h" #include "util.h"
// Defined in rpc_server.cpp // Defined in rpc_server.cpp
extern bool gIsListening; extern bool gIsListening;
extern mutex gMutex; extern mutex gMutex;
extern condition_variable gCV; extern condition_variable gCV;
extern queue<WxMsg_t> gMsgQueue; extern queue<WxMsg_t> gMsgQueue;
// Defined in spy.cpp // Defined in spy.cpp
extern WxCalls_t g_WxCalls; extern WxCalls_t g_WxCalls;
extern DWORD g_WeChatWinDllAddr; extern DWORD g_WeChatWinDllAddr;
static DWORD reg_buffer = 0; static DWORD reg_buffer = 0;
static DWORD recvMsgHookAddr = 0; static DWORD recvMsgHookAddr = 0;
static DWORD recvMsgCallAddr = 0; static DWORD recvMsgCallAddr = 0;
static DWORD recvMsgJumpBackAddr = 0; static DWORD recvMsgJumpBackAddr = 0;
static CHAR recvMsgBackupCode[5] = { 0 }; static CHAR recvMsgBackupCode[5] = { 0 };
MsgTypes_t GetMsgTypes() MsgTypes_t GetMsgTypes()
{ {
const MsgTypes_t m = { const MsgTypes_t m = {
{ 0x01, "文字" }, { 0x01, "文字" },
{ 0x03, "图片" }, { 0x03, "图片" },
{ 0x22, "语音" }, { 0x22, "语音" },
{ 0x25, "好友确认" }, { 0x25, "好友确认" },
{ 0x28, "POSSIBLEFRIEND_MSG" }, { 0x28, "POSSIBLEFRIEND_MSG" },
{ 0x2A, "名片" }, { 0x2A, "名片" },
{ 0x2B, "视频" }, { 0x2B, "视频" },
{ 0x2F, "石头剪刀布 | 表情图片" }, { 0x2F, "石头剪刀布 | 表情图片" },
{ 0x30, "位置" }, { 0x30, "位置" },
{ 0x31, "共享实时位置、文件、转账、链接" }, { 0x31, "共享实时位置、文件、转账、链接" },
{ 0x32, "VOIPMSG" }, { 0x32, "VOIPMSG" },
{ 0x33, "微信初始化" }, { 0x33, "微信初始化" },
{ 0x34, "VOIPNOTIFY" }, { 0x34, "VOIPNOTIFY" },
{ 0x35, "VOIPINVITE" }, { 0x35, "VOIPINVITE" },
{ 0x3E, "小视频" }, { 0x3E, "小视频" },
{ 0x42, "微信红包" }, { 0x42, "微信红包" },
{ 0x270F, "SYSNOTICE" }, { 0x270F, "SYSNOTICE" },
{ 0x2710, "红包、系统消息" }, { 0x2710, "红包、系统消息" },
{ 0x2712, "撤回消息" }, { 0x2712, "撤回消息" },
{ 0x100031, "搜狗表情" }, { 0x100031, "搜狗表情" },
{ 0x1000031, "链接" }, { 0x1000031, "链接" },
{ 0x1A000031, "微信红包" }, { 0x1A000031, "微信红包" },
{ 0x20010031, "红包封面" }, { 0x20010031, "红包封面" },
{ 0x2D000031, "视频号视频" }, { 0x2D000031, "视频号视频" },
{ 0x2E000031, "视频号名片" }, { 0x2E000031, "视频号名片" },
{ 0x31000031, "引用消息" }, { 0x31000031, "引用消息" },
{ 0x37000031, "拍一拍" }, { 0x37000031, "拍一拍" },
{ 0x3A000031, "视频号直播" }, { 0x3A000031, "视频号直播" },
{ 0x3A100031, "商品链接" }, { 0x3A100031, "商品链接" },
{ 0x3A200031, "视频号直播" }, { 0x3A200031, "视频号直播" },
{ 0x3E000031, "音乐链接" }, { 0x3E000031, "音乐链接" },
{ 0x41000031, "文件" }, { 0x41000031, "文件" },
}; };
return m; return m;
} }
void HookAddress(DWORD hookAddr, LPVOID funcAddr, CHAR recvMsgBackupCode[5]) void HookAddress(DWORD hookAddr, LPVOID funcAddr, CHAR recvMsgBackupCode[5])
{ {
// 组装跳转数据 // 组装跳转数据
BYTE jmpCode[5] = { 0 }; BYTE jmpCode[5] = { 0 };
jmpCode[0] = 0xE9; jmpCode[0] = 0xE9;
// 计算偏移 // 计算偏移
*(DWORD *)&jmpCode[1] = (DWORD)funcAddr - hookAddr - 5; *(DWORD *)&jmpCode[1] = (DWORD)funcAddr - hookAddr - 5;
// 备份原来的代码 // 备份原来的代码
ReadProcessMemory(GetCurrentProcess(), (LPVOID)hookAddr, recvMsgBackupCode, 5, 0); ReadProcessMemory(GetCurrentProcess(), (LPVOID)hookAddr, recvMsgBackupCode, 5, 0);
// 写入新的代码 // 写入新的代码
WriteProcessMemory(GetCurrentProcess(), (LPVOID)hookAddr, jmpCode, 5, 0); WriteProcessMemory(GetCurrentProcess(), (LPVOID)hookAddr, jmpCode, 5, 0);
} }
void UnHookAddress(DWORD hookAddr, CHAR restoreCode[5]) void UnHookAddress(DWORD hookAddr, CHAR restoreCode[5])
{ {
WriteProcessMemory(GetCurrentProcess(), (LPVOID)hookAddr, restoreCode, 5, 0); WriteProcessMemory(GetCurrentProcess(), (LPVOID)hookAddr, restoreCode, 5, 0);
} }
void DispatchMsg(DWORD reg) void DispatchMsg(DWORD reg)
{ {
WxMsg_t wxMsg; WxMsg_t wxMsg;
wxMsg.type = GET_DWORD(reg + g_WxCalls.recvMsg.type); wxMsg.type = GET_DWORD(reg + g_WxCalls.recvMsg.type);
wxMsg.is_self = GET_DWORD(reg + g_WxCalls.recvMsg.isSelf); wxMsg.is_self = GET_DWORD(reg + g_WxCalls.recvMsg.isSelf);
wxMsg.id = GetStringByStrAddr(reg + g_WxCalls.recvMsg.msgId); wxMsg.id = GetStringByStrAddr(reg + g_WxCalls.recvMsg.msgId);
wxMsg.xml = GetStringByStrAddr(reg + g_WxCalls.recvMsg.msgXml); wxMsg.xml = GetStringByStrAddr(reg + g_WxCalls.recvMsg.msgXml);
string roomid = GetStringByWstrAddr(reg + g_WxCalls.recvMsg.roomId); string roomid = GetStringByWstrAddr(reg + g_WxCalls.recvMsg.roomId);
if (roomid.find("@chatroom") != string::npos) { // 群 ID 的格式为 xxxxxxxxxxx@chatroom if (roomid.find("@chatroom") != string::npos) { // 群 ID 的格式为 xxxxxxxxxxx@chatroom
wxMsg.is_group = true; wxMsg.is_group = true;
wxMsg.roomid = roomid; wxMsg.roomid = roomid;
if (wxMsg.is_self) { if (wxMsg.is_self) {
wxMsg.sender = GetSelfWxid(); wxMsg.sender = GetSelfWxid();
} else { } else {
wxMsg.sender = GetStringByStrAddr(reg + g_WxCalls.recvMsg.wxId); wxMsg.sender = GetStringByStrAddr(reg + g_WxCalls.recvMsg.wxId);
} }
} else { } else {
wxMsg.is_group = false; wxMsg.is_group = false;
if (wxMsg.is_self) { if (wxMsg.is_self) {
wxMsg.sender = GetSelfWxid(); wxMsg.sender = GetSelfWxid();
} else { } else {
wxMsg.sender = roomid; wxMsg.sender = roomid;
} }
} }
wxMsg.content = GetStringByWstrAddr(reg + g_WxCalls.recvMsg.content); wxMsg.content = GetStringByWstrAddr(reg + g_WxCalls.recvMsg.content);
wxMsg.thumb = GetStringByStrAddr(reg + g_WxCalls.recvMsg.thumb); wxMsg.thumb = GetStringByStrAddr(reg + g_WxCalls.recvMsg.thumb);
if (!wxMsg.thumb.empty()) { if (!wxMsg.thumb.empty()) {
wxMsg.thumb = GetHomePath() + wxMsg.thumb; wxMsg.thumb = GetHomePath() + wxMsg.thumb;
} }
wxMsg.extra = GetStringByStrAddr(reg + g_WxCalls.recvMsg.extra); wxMsg.extra = GetStringByStrAddr(reg + g_WxCalls.recvMsg.extra);
if (!wxMsg.extra.empty()) { if (!wxMsg.extra.empty()) {
wxMsg.extra = GetHomePath() + wxMsg.extra; wxMsg.extra = GetHomePath() + wxMsg.extra;
} }
{ {
unique_lock<mutex> lock(gMutex); unique_lock<mutex> lock(gMutex);
gMsgQueue.push(wxMsg); // 推送到队列 gMsgQueue.push(wxMsg); // 推送到队列
} }
gCV.notify_all(); // 通知各方消息就绪 gCV.notify_all(); // 通知各方消息就绪
} }
__declspec(naked) void RecieveMsgFunc() __declspec(naked) void RecieveMsgFunc()
{ {
__asm { __asm {
pushad pushad
pushfd pushfd
push ecx push ecx
call DispatchMsg call DispatchMsg
add esp, 0x4 add esp, 0x4
popfd popfd
popad popad
call recvMsgCallAddr // 这个为被覆盖的call call recvMsgCallAddr // 这个为被覆盖的call
jmp recvMsgJumpBackAddr // 跳回被HOOK指令的下一条指令 jmp recvMsgJumpBackAddr // 跳回被HOOK指令的下一条指令
} }
} }
void ListenMessage() void ListenMessage()
{ {
// DbgMsg("ListenMessage"); // DbgMsg("ListenMessage");
// OutputDebugString(L"ListenMessage\n"); // OutputDebugString(L"ListenMessage\n");
// MessageBox(NULL, L"ListenMessage", L"ListenMessage", 0); // MessageBox(NULL, L"ListenMessage", L"ListenMessage", 0);
if (gIsListening || (g_WeChatWinDllAddr == 0)) { if (gIsListening || (g_WeChatWinDllAddr == 0)) {
return; return;
} }
recvMsgHookAddr = g_WeChatWinDllAddr + g_WxCalls.recvMsg.hook; recvMsgHookAddr = g_WeChatWinDllAddr + g_WxCalls.recvMsg.hook;
recvMsgCallAddr = g_WeChatWinDllAddr + g_WxCalls.recvMsg.call; recvMsgCallAddr = g_WeChatWinDllAddr + g_WxCalls.recvMsg.call;
recvMsgJumpBackAddr = recvMsgHookAddr + 5; recvMsgJumpBackAddr = recvMsgHookAddr + 5;
HookAddress(recvMsgHookAddr, RecieveMsgFunc, recvMsgBackupCode); HookAddress(recvMsgHookAddr, RecieveMsgFunc, recvMsgBackupCode);
gIsListening = true; gIsListening = true;
} }
void UnListenMessage() void UnListenMessage()
{ {
if (!gIsListening) { if (!gIsListening) {
return; return;
} }
UnHookAddress(recvMsgHookAddr, recvMsgBackupCode); UnHookAddress(recvMsgHookAddr, recvMsgBackupCode);
gIsListening = false; gIsListening = false;
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,10 +1,10 @@
#pragma once #pragma once
#ifdef SPY_EXPORTS #ifdef SPY_EXPORTS
#define SPY_API __declspec(dllexport) #define SPY_API __declspec(dllexport)
#else #else
#define SPY_API __declspec(dllimport) #define SPY_API __declspec(dllimport)
#endif #endif
int RpcStartServer(int port); int RpcStartServer(int port);
int RpcStopServer(); int RpcStopServer();

View File

@ -1,342 +1,342 @@
#include "framework.h" #include "framework.h"
#include <sstream> #include <sstream>
#include <vector> #include <vector>
#include "send_msg.h" #include "send_msg.h"
#include "spy_types.h" #include "spy_types.h"
#include "util.h" #include "util.h"
extern HANDLE g_hEvent; extern HANDLE g_hEvent;
extern WxCalls_t g_WxCalls; extern WxCalls_t g_WxCalls;
extern DWORD g_WeChatWinDllAddr; extern DWORD g_WeChatWinDllAddr;
extern string GetSelfWxid(); // Defined in spy.cpp extern string GetSelfWxid(); // Defined in spy.cpp
void SendTextMessage(string wxid, string msg, string atWxids) void SendTextMessage(string wxid, string msg, string atWxids)
{ {
int success = 0; int success = 0;
char buffer[0x2D8] = { 0 }; char buffer[0x2D8] = { 0 };
WxString_t wxMsg = { 0 }; WxString_t wxMsg = { 0 };
WxString_t wxWxid = { 0 }; WxString_t wxWxid = { 0 };
// 发送消息Call地址 = 微信基址 + 偏移 // 发送消息Call地址 = 微信基址 + 偏移
DWORD sendCall1 = g_WeChatWinDllAddr + g_WxCalls.sendText.call1; DWORD sendCall1 = g_WeChatWinDllAddr + g_WxCalls.sendText.call1;
DWORD sendCall2 = g_WeChatWinDllAddr + g_WxCalls.sendText.call2; DWORD sendCall2 = g_WeChatWinDllAddr + g_WxCalls.sendText.call2;
DWORD sendCall3 = g_WeChatWinDllAddr + g_WxCalls.sendText.call3; DWORD sendCall3 = g_WeChatWinDllAddr + g_WxCalls.sendText.call3;
wstring wsWxid = String2Wstring(wxid); wstring wsWxid = String2Wstring(wxid);
wstring wsMsg = String2Wstring(msg); wstring wsMsg = String2Wstring(msg);
wxMsg.text = (wchar_t *)wsMsg.c_str(); wxMsg.text = (wchar_t *)wsMsg.c_str();
wxMsg.size = wsMsg.size(); wxMsg.size = wsMsg.size();
wxMsg.capacity = wsMsg.capacity(); wxMsg.capacity = wsMsg.capacity();
wxWxid.text = (wchar_t *)wsWxid.c_str(); wxWxid.text = (wchar_t *)wsWxid.c_str();
wxWxid.size = wsWxid.size(); wxWxid.size = wsWxid.size();
wxWxid.capacity = wsWxid.capacity(); wxWxid.capacity = wsWxid.capacity();
vector<WxString_t> vTxtAtWxids; vector<WxString_t> vTxtAtWxids;
if (!atWxids.empty()) { if (!atWxids.empty()) {
vector<wstring> vAtWxids; vector<wstring> vAtWxids;
wstringstream wss(String2Wstring(atWxids)); wstringstream wss(String2Wstring(atWxids));
while (wss.good()) { while (wss.good()) {
wstring wstr; wstring wstr;
getline(wss, wstr, L','); getline(wss, wstr, L',');
vAtWxids.push_back(wstr); vAtWxids.push_back(wstr);
WxString_t txtAtWxid = { 0 }; WxString_t txtAtWxid = { 0 };
txtAtWxid.text = (wchar_t *)vAtWxids.back().c_str(); txtAtWxid.text = (wchar_t *)vAtWxids.back().c_str();
txtAtWxid.size = vAtWxids.back().size(); txtAtWxid.size = vAtWxids.back().size();
txtAtWxid.capacity = vAtWxids.back().capacity(); txtAtWxid.capacity = vAtWxids.back().capacity();
vTxtAtWxids.push_back(txtAtWxid); vTxtAtWxids.push_back(txtAtWxid);
} }
} }
__asm __asm
{ {
pushad; pushad;
call sendCall1; call sendCall1;
push 0x0; push 0x0;
push 0x0; push 0x0;
push 0x0; push 0x0;
push 0x1; push 0x1;
lea eax, vTxtAtWxids; lea eax, vTxtAtWxids;
push eax; push eax;
lea eax, wxMsg; lea eax, wxMsg;
push eax; push eax;
lea edx, wxWxid; lea edx, wxWxid;
lea ecx, buffer; lea ecx, buffer;
call sendCall2; call sendCall2;
mov success, eax; mov success, eax;
add esp, 0x18; add esp, 0x18;
lea ecx, buffer; lea ecx, buffer;
call sendCall3; call sendCall3;
popad; popad;
} }
} }
void SendImageMessage(string wxid, string path) void SendImageMessage(string wxid, string path)
{ {
if (g_WeChatWinDllAddr == 0) { if (g_WeChatWinDllAddr == 0) {
return; return;
} }
int success = 0; int success = 0;
DWORD tmpEAX = 0; DWORD tmpEAX = 0;
char buf[0x2D8] = { 0 }; char buf[0x2D8] = { 0 };
WxString_t imgWxid = { 0 }; WxString_t imgWxid = { 0 };
WxString_t imgPath = { 0 }; WxString_t imgPath = { 0 };
WxString_t nullbuffer = { 0 }; WxString_t nullbuffer = { 0 };
wstring wsWxid = String2Wstring(wxid); wstring wsWxid = String2Wstring(wxid);
wstring wspath = String2Wstring(path); wstring wspath = String2Wstring(path);
imgWxid.text = (wchar_t *)wsWxid.c_str(); imgWxid.text = (wchar_t *)wsWxid.c_str();
imgWxid.size = wsWxid.size(); imgWxid.size = wsWxid.size();
imgWxid.capacity = wsWxid.capacity(); imgWxid.capacity = wsWxid.capacity();
imgPath.text = (wchar_t *)wspath.c_str(); imgPath.text = (wchar_t *)wspath.c_str();
imgPath.size = wspath.size(); imgPath.size = wspath.size();
imgPath.capacity = wspath.capacity(); imgPath.capacity = wspath.capacity();
// 发送图片Call地址 = 微信基址 + 偏移 // 发送图片Call地址 = 微信基址 + 偏移
DWORD sendCall1 = g_WeChatWinDllAddr + g_WxCalls.sendImg.call1; DWORD sendCall1 = g_WeChatWinDllAddr + g_WxCalls.sendImg.call1;
DWORD sendCall2 = g_WeChatWinDllAddr + g_WxCalls.sendImg.call2; DWORD sendCall2 = g_WeChatWinDllAddr + g_WxCalls.sendImg.call2;
DWORD sendCall3 = g_WeChatWinDllAddr + g_WxCalls.sendImg.call3; DWORD sendCall3 = g_WeChatWinDllAddr + g_WxCalls.sendImg.call3;
DWORD sendCall4 = g_WeChatWinDllAddr + g_WxCalls.sendImg.call4; DWORD sendCall4 = g_WeChatWinDllAddr + g_WxCalls.sendImg.call4;
__asm { __asm {
pushad; pushad;
call sendCall1; call sendCall1;
sub esp,0x14; sub esp,0x14;
mov tmpEAX,eax; mov tmpEAX,eax;
lea eax,nullbuffer; lea eax,nullbuffer;
mov ecx,esp; mov ecx,esp;
lea edi,imgPath; lea edi,imgPath;
push eax; push eax;
call sendCall2; call sendCall2;
mov ecx,dword ptr [tmpEAX]; mov ecx,dword ptr [tmpEAX];
lea eax,imgWxid; lea eax,imgWxid;
push edi; push edi;
push eax; push eax;
lea eax,buf; lea eax,buf;
push eax; push eax;
call sendCall3; call sendCall3;
mov success,eax; mov success,eax;
lea ecx,buf; lea ecx,buf;
call sendCall4; call sendCall4;
popad; popad;
} }
} }
void SendFileMessage(string wxid, string path) void SendFileMessage(string wxid, string path)
{ {
if (g_WeChatWinDllAddr == 0) { if (g_WeChatWinDllAddr == 0) {
return; return;
} }
int success = 0; int success = 0;
DWORD tmpEAX = 0; DWORD tmpEAX = 0;
char buffer[0x2D8] = { 0 }; char buffer[0x2D8] = { 0 };
WxString_t fileWxid = { 0 }; WxString_t fileWxid = { 0 };
WxString_t filePath = { 0 }; WxString_t filePath = { 0 };
WxString_t nullbuffer = { 0 }; WxString_t nullbuffer = { 0 };
wstring wsWxid = String2Wstring(wxid); wstring wsWxid = String2Wstring(wxid);
wstring wspath = String2Wstring(path); wstring wspath = String2Wstring(path);
fileWxid.text = (wchar_t *)wsWxid.c_str(); fileWxid.text = (wchar_t *)wsWxid.c_str();
fileWxid.size = wsWxid.size(); fileWxid.size = wsWxid.size();
fileWxid.capacity = wsWxid.capacity(); fileWxid.capacity = wsWxid.capacity();
filePath.text = (wchar_t *)wspath.c_str(); filePath.text = (wchar_t *)wspath.c_str();
filePath.size = wspath.size(); filePath.size = wspath.size();
filePath.capacity = wspath.capacity(); filePath.capacity = wspath.capacity();
// 发送文件Call地址 = 微信基址 + 偏移 // 发送文件Call地址 = 微信基址 + 偏移
DWORD sendCall1 = g_WeChatWinDllAddr + g_WxCalls.sendFile.call1; DWORD sendCall1 = g_WeChatWinDllAddr + g_WxCalls.sendFile.call1;
DWORD sendCall2 = g_WeChatWinDllAddr + g_WxCalls.sendFile.call2; DWORD sendCall2 = g_WeChatWinDllAddr + g_WxCalls.sendFile.call2;
DWORD sendCall3 = g_WeChatWinDllAddr + g_WxCalls.sendFile.call3; DWORD sendCall3 = g_WeChatWinDllAddr + g_WxCalls.sendFile.call3;
DWORD sendCall4 = g_WeChatWinDllAddr + g_WxCalls.sendFile.call4; DWORD sendCall4 = g_WeChatWinDllAddr + g_WxCalls.sendFile.call4;
__asm { __asm {
pushad; pushad;
pushfd; pushfd;
call sendCall1; call sendCall1;
sub esp, 0x14; sub esp, 0x14;
mov tmpEAX, eax; mov tmpEAX, eax;
lea eax, nullbuffer; lea eax, nullbuffer;
mov ecx, esp; mov ecx, esp;
push eax; push eax;
call sendCall2; call sendCall2;
push 0x0; push 0x0;
sub esp, 0x14; sub esp, 0x14;
mov edi, esp; mov edi, esp;
mov dword ptr[edi], 0; mov dword ptr[edi], 0;
mov dword ptr[edi + 0x4], 0; mov dword ptr[edi + 0x4], 0;
mov dword ptr[edi + 0x8], 0; mov dword ptr[edi + 0x8], 0;
mov dword ptr[edi + 0xc], 0; mov dword ptr[edi + 0xc], 0;
mov dword ptr[edi + 0x10], 0; mov dword ptr[edi + 0x10], 0;
sub esp, 0x14; sub esp, 0x14;
lea eax, filePath; lea eax, filePath;
mov ecx, esp; mov ecx, esp;
push eax; push eax;
call sendCall2; call sendCall2;
sub esp, 0x14; sub esp, 0x14;
lea eax, fileWxid; lea eax, fileWxid;
mov ecx, esp; mov ecx, esp;
push eax; push eax;
call sendCall2; call sendCall2;
mov ecx, dword ptr[tmpEAX]; mov ecx, dword ptr[tmpEAX];
lea eax, buffer; lea eax, buffer;
push eax; push eax;
call sendCall3; call sendCall3;
mov al, byte ptr[eax + 0x38]; mov al, byte ptr[eax + 0x38];
movzx eax, al; movzx eax, al;
mov success, eax; mov success, eax;
lea ecx, buffer; lea ecx, buffer;
call sendCall4; call sendCall4;
popfd; popfd;
popad; popad;
} }
} }
void SendXmlMessage(string receiver, string xml, string path, int type) void SendXmlMessage(string receiver, string xml, string path, int type)
{ {
if (g_WeChatWinDllAddr == 0) { if (g_WeChatWinDllAddr == 0) {
return; return;
} }
// 发送消息Call地址 = 微信基址 + 偏移 // 发送消息Call地址 = 微信基址 + 偏移
DWORD sendXmlCall1 = g_WeChatWinDllAddr + g_WxCalls.sendXml.call1; DWORD sendXmlCall1 = g_WeChatWinDllAddr + g_WxCalls.sendXml.call1;
DWORD sendXmlCall2 = g_WeChatWinDllAddr + g_WxCalls.sendXml.call2; DWORD sendXmlCall2 = g_WeChatWinDllAddr + g_WxCalls.sendXml.call2;
DWORD sendXmlCall3 = g_WeChatWinDllAddr + g_WxCalls.sendXml.call3; DWORD sendXmlCall3 = g_WeChatWinDllAddr + g_WxCalls.sendXml.call3;
DWORD sendXmlCall4 = g_WeChatWinDllAddr + g_WxCalls.sendXml.call4; DWORD sendXmlCall4 = g_WeChatWinDllAddr + g_WxCalls.sendXml.call4;
DWORD sendXmlParam = g_WeChatWinDllAddr + g_WxCalls.sendXml.param; DWORD sendXmlParam = g_WeChatWinDllAddr + g_WxCalls.sendXml.param;
char buffer[0xFF0] = { 0 }; char buffer[0xFF0] = { 0 };
char nullBuf[0x1C] = { 0 }; char nullBuf[0x1C] = { 0 };
WxString_t wxReceiver = { 0 }; WxString_t wxReceiver = { 0 };
WxString_t wxXml = { 0 }; WxString_t wxXml = { 0 };
WxString_t wxPath = { 0 }; WxString_t wxPath = { 0 };
WxString_t wxNull = { 0 }; WxString_t wxNull = { 0 };
WxString_t wxSender = { 0 }; WxString_t wxSender = { 0 };
wstring wsSender = String2Wstring(GetSelfWxid()); wstring wsSender = String2Wstring(GetSelfWxid());
wstring wsReceiver = String2Wstring(receiver); wstring wsReceiver = String2Wstring(receiver);
wstring wsXml = String2Wstring(xml); wstring wsXml = String2Wstring(xml);
wxReceiver.text = (wchar_t *)wsReceiver.c_str(); wxReceiver.text = (wchar_t *)wsReceiver.c_str();
wxReceiver.size = wsReceiver.size(); wxReceiver.size = wsReceiver.size();
wxReceiver.capacity = wsReceiver.capacity(); wxReceiver.capacity = wsReceiver.capacity();
wxXml.text = (wchar_t *)wsXml.c_str(); wxXml.text = (wchar_t *)wsXml.c_str();
wxXml.size = wsXml.size(); wxXml.size = wsXml.size();
wxXml.capacity = wsXml.capacity(); wxXml.capacity = wsXml.capacity();
wxSender.text = (wchar_t *)wsSender.c_str(); wxSender.text = (wchar_t *)wsSender.c_str();
wxSender.size = wsSender.size(); wxSender.size = wsSender.size();
wxSender.capacity = wsSender.capacity(); wxSender.capacity = wsSender.capacity();
if (!path.empty()) { if (!path.empty()) {
wstring wsPath = String2Wstring(path); wstring wsPath = String2Wstring(path);
wxPath.text = (wchar_t *)wsPath.c_str(); wxPath.text = (wchar_t *)wsPath.c_str();
wxPath.size = wsPath.size(); wxPath.size = wsPath.size();
wxPath.capacity = wsPath.capacity(); wxPath.capacity = wsPath.capacity();
} }
DWORD sendtype = type; DWORD sendtype = type;
__asm { __asm {
pushad; pushad;
pushfd; pushfd;
lea ecx, buffer; lea ecx, buffer;
call sendXmlCall1; call sendXmlCall1;
mov eax, [sendtype]; mov eax, [sendtype];
push eax; push eax;
lea eax, nullBuf; lea eax, nullBuf;
lea edx, wxSender; lea edx, wxSender;
push eax; push eax;
lea eax, wxPath; lea eax, wxPath;
push eax; push eax;
lea eax, wxXml; lea eax, wxXml;
push eax; push eax;
lea edi, wxReceiver; lea edi, wxReceiver;
push edi; push edi;
lea ecx, buffer; lea ecx, buffer;
call sendXmlCall2; call sendXmlCall2;
add esp, 0x14; add esp, 0x14;
lea eax, wxNull; lea eax, wxNull;
push eax; push eax;
lea ecx, buffer; lea ecx, buffer;
call sendXmlCall3; call sendXmlCall3;
mov dl, 0x0; mov dl, 0x0;
lea ecx, buffer; lea ecx, buffer;
push sendXmlParam; push sendXmlParam;
push sendXmlParam; push sendXmlParam;
call sendXmlCall4; call sendXmlCall4;
add esp, 0x8; add esp, 0x8;
popfd; popfd;
popad; popad;
} }
} }
void SendEmotionMessage(string wxid, string path) void SendEmotionMessage(string wxid, string path)
{ {
if (g_WeChatWinDllAddr == 0) { if (g_WeChatWinDllAddr == 0) {
return; return;
} }
char buffer[0x1C] = { 0 }; char buffer[0x1C] = { 0 };
WxString_t emoWxid = { 0 }; WxString_t emoWxid = { 0 };
WxString_t emoPath = { 0 }; WxString_t emoPath = { 0 };
WxString_t nullbuffer = { 0 }; WxString_t nullbuffer = { 0 };
wstring wsWxid = String2Wstring(wxid); wstring wsWxid = String2Wstring(wxid);
wstring wspath = String2Wstring(path); wstring wspath = String2Wstring(path);
emoWxid.text = (wchar_t *)wsWxid.c_str(); emoWxid.text = (wchar_t *)wsWxid.c_str();
emoWxid.size = wsWxid.size(); emoWxid.size = wsWxid.size();
emoWxid.capacity = wsWxid.capacity(); emoWxid.capacity = wsWxid.capacity();
emoPath.text = (wchar_t *)wspath.c_str(); emoPath.text = (wchar_t *)wspath.c_str();
emoPath.size = wspath.size(); emoPath.size = wspath.size();
emoPath.capacity = wspath.capacity(); emoPath.capacity = wspath.capacity();
// 发送文件Call地址 = 微信基址 + 偏移 // 发送文件Call地址 = 微信基址 + 偏移
DWORD sendCall1 = g_WeChatWinDllAddr + g_WxCalls.sendEmo.call1; DWORD sendCall1 = g_WeChatWinDllAddr + g_WxCalls.sendEmo.call1;
DWORD sendCall2 = g_WeChatWinDllAddr + g_WxCalls.sendEmo.call2; DWORD sendCall2 = g_WeChatWinDllAddr + g_WxCalls.sendEmo.call2;
DWORD sendCall3 = g_WeChatWinDllAddr + g_WxCalls.sendEmo.call3; DWORD sendCall3 = g_WeChatWinDllAddr + g_WxCalls.sendEmo.call3;
__asm { __asm {
pushad; pushad;
pushfd; pushfd;
mov ebx, dword ptr[sendCall3]; mov ebx, dword ptr[sendCall3];
lea eax, buffer; lea eax, buffer;
push eax; push eax;
push 0x0; push 0x0;
sub esp, 0x14; sub esp, 0x14;
mov esi, esp; mov esi, esp;
mov dword ptr [esi], 0x0; mov dword ptr [esi], 0x0;
mov dword ptr [esi+0x4], 0x0; mov dword ptr [esi+0x4], 0x0;
mov dword ptr [esi+0x8], 0x0; mov dword ptr [esi+0x8], 0x0;
mov dword ptr [esi+0xC], 0x0; mov dword ptr [esi+0xC], 0x0;
mov dword ptr [esi+0x10], 0x0; mov dword ptr [esi+0x10], 0x0;
push 0x2; push 0x2;
lea eax, emoWxid; lea eax, emoWxid;
sub esp, 0x14; sub esp, 0x14;
mov ecx, esp; mov ecx, esp;
push eax; push eax;
call sendCall1; call sendCall1;
sub esp, 0x14; sub esp, 0x14;
mov esi, esp; mov esi, esp;
mov dword ptr [esi], 0x0; mov dword ptr [esi], 0x0;
mov dword ptr [esi+0x4], 0x0; mov dword ptr [esi+0x4], 0x0;
mov dword ptr [esi+0x8], 0x0; mov dword ptr [esi+0x8], 0x0;
mov dword ptr [esi+0xC], 0x0; mov dword ptr [esi+0xC], 0x0;
mov dword ptr [esi+0x10], 0x0; mov dword ptr [esi+0x10], 0x0;
sub esp, 0x14; sub esp, 0x14;
mov ecx, esp; mov ecx, esp;
lea eax, emoPath; lea eax, emoPath;
push eax; push eax;
call sendCall1; call sendCall1;
mov ecx, ebx; mov ecx, ebx;
call sendCall2; call sendCall2;
popfd; popfd;
popad; popad;
} }
} }

View File

@ -1,11 +1,11 @@
#pragma once #pragma once
#include <string> #include <string>
using namespace std; using namespace std;
void SendTextMessage(string wxid, string msg, string atWxids); void SendTextMessage(string wxid, string msg, string atWxids);
void SendImageMessage(string wxid, string path); void SendImageMessage(string wxid, string path);
void SendFileMessage(string wxid, string path); void SendFileMessage(string wxid, string path);
void SendXmlMessage(string receiver, string xml, string path, int type); void SendXmlMessage(string receiver, string xml, string path, int type);
void SendEmotionMessage(string wxid, string path); void SendEmotionMessage(string wxid, string path);

View File

@ -1,110 +1,110 @@
#pragma once #pragma once
#include "framework.h" #include "framework.h"
typedef struct UserInfoCall { typedef struct UserInfoCall {
DWORD wxid; DWORD wxid;
DWORD nickName; DWORD nickName;
DWORD mobile; DWORD mobile;
DWORD home; DWORD home;
} UserInfoCall_t; } UserInfoCall_t;
typedef struct RecvMsg { typedef struct RecvMsg {
DWORD hook; // Hook地址 DWORD hook; // Hook地址
DWORD call; // Call地址 DWORD call; // Call地址
DWORD type; // 消息类型地址 DWORD type; // 消息类型地址
DWORD isSelf; // 是否自己发送标志地址 DWORD isSelf; // 是否自己发送标志地址
DWORD msgId; // 消息ID地址 DWORD msgId; // 消息ID地址
DWORD msgXml; // 消息xml内容地址 DWORD msgXml; // 消息xml内容地址
DWORD roomId; // 群聊时为群ID私聊时为微信ID DWORD roomId; // 群聊时为群ID私聊时为微信ID
DWORD wxId; // 私聊时为空群聊时为发送者微信ID DWORD wxId; // 私聊时为空群聊时为发送者微信ID
DWORD content; // 消息内容地址 DWORD content; // 消息内容地址
DWORD thumb; // 缩略图 DWORD thumb; // 缩略图
DWORD extra; // 附加数据 DWORD extra; // 附加数据
} RecvMsg_t; } RecvMsg_t;
typedef struct SendText { typedef struct SendText {
DWORD call1; DWORD call1;
DWORD call2; DWORD call2;
DWORD call3; DWORD call3;
} SendText_t; } SendText_t;
typedef struct Sendfile { typedef struct Sendfile {
DWORD call1; DWORD call1;
DWORD call2; DWORD call2;
DWORD call3; DWORD call3;
DWORD call4; DWORD call4;
} Sendfile_t; } Sendfile_t;
typedef struct Contact { typedef struct Contact {
DWORD base; DWORD base;
DWORD head; DWORD head;
DWORD wxId; DWORD wxId;
DWORD wxCode; DWORD wxCode;
DWORD wxRemark; DWORD wxRemark;
DWORD wxName; DWORD wxName;
DWORD wxGender; DWORD wxGender;
DWORD wxCountry; DWORD wxCountry;
DWORD wxProvince; DWORD wxProvince;
DWORD wxCity; DWORD wxCity;
} Contact_t; } Contact_t;
typedef struct Sql { typedef struct Sql {
DWORD exec; DWORD exec;
DWORD base; DWORD base;
DWORD start; DWORD start;
DWORD end; DWORD end;
DWORD slot; DWORD slot;
DWORD name; DWORD name;
} Sql_t; } Sql_t;
typedef struct NewFriend { typedef struct NewFriend {
DWORD call1; DWORD call1;
DWORD call2; DWORD call2;
DWORD call3; DWORD call3;
DWORD call4; DWORD call4;
} NewFriend_t; } NewFriend_t;
typedef struct RoomMember { typedef struct RoomMember {
DWORD call1; DWORD call1;
DWORD call2; DWORD call2;
DWORD call3; DWORD call3;
} RoomMember_t; } RoomMember_t;
typedef struct Xml { typedef struct Xml {
DWORD call1; DWORD call1;
DWORD call2; DWORD call2;
DWORD call3; DWORD call3;
DWORD call4; DWORD call4;
DWORD param; DWORD param;
} Xml_t; } Xml_t;
typedef struct TF { typedef struct TF {
DWORD call1; DWORD call1;
DWORD call2; DWORD call2;
DWORD call3; DWORD call3;
} TF_t; } TF_t;
typedef struct WxCalls { typedef struct WxCalls {
DWORD login; // 登录状态 DWORD login; // 登录状态
UserInfoCall_t ui; // 用户信息 UserInfoCall_t ui; // 用户信息
SendText_t sendText; // 发送消息 SendText_t sendText; // 发送消息
RecvMsg_t recvMsg; // 接收消息 RecvMsg_t recvMsg; // 接收消息
Sendfile_t sendImg; // 发送图片 Sendfile_t sendImg; // 发送图片
Sendfile_t sendFile; // 发送文件 Sendfile_t sendFile; // 发送文件
Xml_t sendXml; // 发送XML Xml_t sendXml; // 发送XML
Sendfile_t sendEmo; // 发送表情 Sendfile_t sendEmo; // 发送表情
Contact_t contact; // 获取联系人 Contact_t contact; // 获取联系人
Sql_t sql; // 执行 SQL Sql_t sql; // 执行 SQL
NewFriend_t anf; // 通过好友申请 NewFriend_t anf; // 通过好友申请
RoomMember_t arm; // 添加群成员 RoomMember_t arm; // 添加群成员
RoomMember_t drm; // 删除群成员 RoomMember_t drm; // 删除群成员
TF_t tf; // 接收转账 TF_t tf; // 接收转账
} WxCalls_t; } WxCalls_t;
typedef struct WxString { typedef struct WxString {
wchar_t *text; wchar_t *text;
DWORD size; DWORD size;
DWORD capacity; DWORD capacity;
char fill[8]; char fill[8];
} WxString_t; } WxString_t;

View File

@ -119,7 +119,7 @@
</Link> </Link>
<PostBuildEvent> <PostBuildEvent>
<Command>xcopy /y $(OutDir)$(TargetFileName) $(SolutionDir)Out <Command>xcopy /y $(OutDir)$(TargetFileName) $(SolutionDir)Out
xcopy /y $(OutDir)$(TargetFileName) $(SolutionDir)python\wcferry</Command> xcopy /y $(OutDir)$(TargetFileName) $(SolutionDir)..\clients\python\wcferry</Command>
</PostBuildEvent> </PostBuildEvent>
<PostBuildEvent> <PostBuildEvent>
<Message>Copy files</Message> <Message>Copy files</Message>

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup /> <PropertyGroup />
</Project> </Project>

View File

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 56 KiB

View File

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 39 KiB

View File

Before

Width:  |  Height:  |  Size: 9.5 MiB

After

Width:  |  Height:  |  Size: 9.5 MiB

Some files were not shown because too many files have changed in this diff Show More