From 6026346e539e8430727e688e66de8ddef18573aa Mon Sep 17 00:00:00 2001 From: Karthik Date: Thu, 1 Nov 2018 21:52:31 +0530 Subject: [PATCH] Intial commit with working code --- .gitattributes | 63 +++ .gitignore | 261 +++++++++ PacketDumper.sln | 36 ++ PacketDumper/PacketDumper.cpp | Bin 0 -> 2530 bytes PacketDumper/PacketDumper.vcxproj | 171 ++++++ PacketDumper/PacketDumper.vcxproj.filters | 42 ++ PacketDumper/detours.h | 616 ++++++++++++++++++++++ PacketDumper/detours.lib | Bin 0 -> 178870 bytes PacketDumper/dllmain.cpp | Bin 0 -> 896 bytes PacketDumper/stdafx.cpp | Bin 0 -> 44 bytes PacketDumper/stdafx.h | Bin 0 -> 2080 bytes PacketDumper/targetver.h | Bin 0 -> 630 bytes README.md | 10 + 13 files changed, 1199 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 PacketDumper.sln create mode 100644 PacketDumper/PacketDumper.cpp create mode 100644 PacketDumper/PacketDumper.vcxproj create mode 100644 PacketDumper/PacketDumper.vcxproj.filters create mode 100644 PacketDumper/detours.h create mode 100644 PacketDumper/detours.lib create mode 100644 PacketDumper/dllmain.cpp create mode 100644 PacketDumper/stdafx.cpp create mode 100644 PacketDumper/stdafx.h create mode 100644 PacketDumper/targetver.h create mode 100644 README.md diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1ff0c42 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3c4efe2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,261 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# DNX +project.lock.json +project.fragment.lock.json +artifacts/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +#*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignoreable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +node_modules/ +orleans.codegen.cs + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc \ No newline at end of file diff --git a/PacketDumper.sln b/PacketDumper.sln new file mode 100644 index 0000000..e9e8042 --- /dev/null +++ b/PacketDumper.sln @@ -0,0 +1,36 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28010.2003 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PacketDumper", "PacketDumper\PacketDumper.vcxproj", "{6403049D-71E1-4176-9CB7-A07FAC097E2A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{655156BC-6BA2-4398-A595-D6D90B52183A}" + ProjectSection(SolutionItems) = preProject + README.md = README.md + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {6403049D-71E1-4176-9CB7-A07FAC097E2A}.Debug|x64.ActiveCfg = Debug|x64 + {6403049D-71E1-4176-9CB7-A07FAC097E2A}.Debug|x64.Build.0 = Debug|x64 + {6403049D-71E1-4176-9CB7-A07FAC097E2A}.Debug|x86.ActiveCfg = Debug|Win32 + {6403049D-71E1-4176-9CB7-A07FAC097E2A}.Debug|x86.Build.0 = Debug|Win32 + {6403049D-71E1-4176-9CB7-A07FAC097E2A}.Release|x64.ActiveCfg = Release|x64 + {6403049D-71E1-4176-9CB7-A07FAC097E2A}.Release|x64.Build.0 = Release|x64 + {6403049D-71E1-4176-9CB7-A07FAC097E2A}.Release|x86.ActiveCfg = Release|Win32 + {6403049D-71E1-4176-9CB7-A07FAC097E2A}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {5BFD300D-5F59-48F8-8B73-47B9440E19AA} + EndGlobalSection +EndGlobal diff --git a/PacketDumper/PacketDumper.cpp b/PacketDumper/PacketDumper.cpp new file mode 100644 index 0000000000000000000000000000000000000000..bcee4beda250a3b81e31925da1e56f0b111a6ec6 GIT binary patch literal 2530 zcmb`J*>2N76o${Ok$4BoT-0GnQ11xz0!Wb%6^#I?LZw2fiIa#Vt{SHeP+lGQ&P>MR zB_$M9BgeD+bC&-s&hK9x=}0Jj8Au{uWhlAyWGOQ_V}34ecF!20ba{I0r81E@?*;2z z#>_&V6_^Zs&io5IDKh5V%|U0(6rCD`ztxiiMu=wBFa?<~cQ@K{SMFe2$GmlZ&uC6S zF43WSBjo1H2gqJw>zExy>NA%2VCKe}te8JtpS|NOkqcyG;^y{D@2ZD6XGh$7&gjc) zRBqz)UFj?;RP|7m|Q&~*WMO6*CXmv za%^lOH~oUYe#zKZoUS&jUag$yz@p{HK)y4l*pzS4HI-SnWO^uG=!phRlwqn1^zOU|u=|hS- zmM3yjR9+dOy=~S&c)c0j!Rj8;17_%+$v5^UbuiDH}+`H)tZXvwQc#tD0ia+)1P!VDr~LaZzD&$z3t3ub<>t@cOpD4*Vi`u zCT6zXxw#Jg4r%UawK?9kAB~8O?WCWN4O!@_;d69u}P|V4bp#8xoE=IpJi_WZMq^ z0d`njF`C-y*e+OGqk-tCTj%j1$VWVmEBi$YDmB+8nl@XTR_cEv7ismE=|YLdTxHzz2y2W{Wp{mCB5ZQ))V{t2hy*I#Q*>R literal 0 HcmV?d00001 diff --git a/PacketDumper/PacketDumper.vcxproj b/PacketDumper/PacketDumper.vcxproj new file mode 100644 index 0000000..fcd57e6 --- /dev/null +++ b/PacketDumper/PacketDumper.vcxproj @@ -0,0 +1,171 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {6403049D-71E1-4176-9CB7-A07FAC097E2A} + Win32Proj + PacketDumper + 10.0.17134.0 + + + + DynamicLibrary + true + v141 + Unicode + + + DynamicLibrary + false + v141 + true + Unicode + + + DynamicLibrary + true + v141 + Unicode + + + DynamicLibrary + false + v141 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + Use + Level3 + Disabled + true + WIN32;_DEBUG;PACKETDUMPER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + + + Windows + true + + + + + Use + Level3 + Disabled + true + _DEBUG;PACKETDUMPER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + + + Windows + true + + + + + Use + Level3 + MaxSpeed + true + true + true + WIN32;NDEBUG;PACKETDUMPER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + + + Windows + true + true + true + false + + + + + Use + Level3 + MaxSpeed + true + true + true + NDEBUG;PACKETDUMPER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + + + Windows + true + true + true + + + + + + + + + + + + Create + Create + Create + Create + + + + + + + + + \ No newline at end of file diff --git a/PacketDumper/PacketDumper.vcxproj.filters b/PacketDumper/PacketDumper.vcxproj.filters new file mode 100644 index 0000000..51b5888 --- /dev/null +++ b/PacketDumper/PacketDumper.vcxproj.filters @@ -0,0 +1,42 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + + + + \ No newline at end of file diff --git a/PacketDumper/detours.h b/PacketDumper/detours.h new file mode 100644 index 0000000..e9acca5 --- /dev/null +++ b/PacketDumper/detours.h @@ -0,0 +1,616 @@ +////////////////////////////////////////////////////////////////////////////// +// +// File: detours.h +// Module: detours.lib +// +// Detours for binary functions. Version 1.5 (Build 46) +// +// Copyright 1995-2001, Microsoft Corporation +// + +#pragma once +#ifndef _DETOURS_H_ +#define _DETOURS_H_ + +#pragma comment(lib, "detours") + +////////////////////////////////////////////////////////////////////////////// +// +#ifndef GUID_DEFINED +#define GUID_DEFINED +typedef struct _GUID +{ + DWORD Data1; + WORD Data2; + WORD Data3; + BYTE Data4[ 8 ]; +} GUID; +#endif // !GUID_DEFINED + +#if defined(__cplusplus) +#ifndef _REFGUID_DEFINED +#define _REFGUID_DEFINED +#define REFGUID const GUID & +#endif // !_REFGUID_DEFINED +#else // !__cplusplus +#ifndef _REFGUID_DEFINED +#define _REFGUID_DEFINED +#define REFGUID const GUID * const +#endif // !_REFGUID_DEFINED +#endif // !__cplusplus +// +////////////////////////////////////////////////////////////////////////////// + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/////////////////////////////////////////////////// Instruction Target Macros. +// +#define DETOUR_INSTRUCTION_TARGET_NONE ((PBYTE)0) +#define DETOUR_INSTRUCTION_TARGET_DYNAMIC ((PBYTE)~0ul) + +/////////////////////////////////////////////////////////// Trampoline Macros. +// +// DETOUR_TRAMPOLINE(trampoline_prototype, target_name) +// +// The naked trampoline must be at least DETOUR_TRAMPOLINE_SIZE bytes. +// +#define DETOUR_TRAMPOLINE_SIZE 32 +#define DETOUR_SECTION_HEADER_SIGNATURE 0x00727444 // "Dtr\0" + +#define DETOUR_TRAMPOLINE(trampoline,target) \ +static PVOID __fastcall _Detours_GetVA_##target(VOID) \ +{ \ + return ⌖ \ +} \ +\ +__declspec(naked) trampoline \ +{ \ + __asm { nop };\ + __asm { nop };\ + __asm { call _Detours_GetVA_##target };\ + __asm { jmp eax };\ + __asm { ret };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ +} + +#define DETOUR_TRAMPOLINE_EMPTY(trampoline) \ +__declspec(naked) trampoline \ +{ \ + __asm { nop };\ + __asm { nop };\ + __asm { xor eax, eax };\ + __asm { mov eax, [eax] };\ + __asm { ret };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ +} + +/////////////////////////////////////////////////////////// Binary Structures. +// +#pragma pack(push, 8) +typedef struct _DETOUR_SECTION_HEADER +{ + DWORD cbHeaderSize; + DWORD nSignature; + DWORD nDataOffset; + DWORD cbDataSize; + + DWORD nOriginalImportVirtualAddress; + DWORD nOriginalImportSize; + DWORD nOriginalBoundImportVirtualAddress; + DWORD nOriginalBoundImportSize; + + DWORD nOriginalIatVirtualAddress; + DWORD nOriginalIatSize; + DWORD nOriginalSizeOfImage; + DWORD nReserve; +} DETOUR_SECTION_HEADER, *PDETOUR_SECTION_HEADER; + +typedef struct _DETOUR_SECTION_RECORD +{ + DWORD cbBytes; + DWORD nReserved; + GUID guid; +} DETOUR_SECTION_RECORD, *PDETOUR_SECTION_RECORD; +#pragma pack(pop) + +#define DETOUR_SECTION_HEADER_DECLARE(cbSectionSize) \ +{ \ + sizeof(DETOUR_SECTION_HEADER),\ + DETOUR_SECTION_HEADER_SIGNATURE,\ + sizeof(DETOUR_SECTION_HEADER),\ + (cbSectionSize),\ + \ + 0,\ + 0,\ + 0,\ + 0,\ + \ + 0,\ + 0,\ + 0,\ + 0,\ +} + +///////////////////////////////////////////////////////////// Binary Typedefs. +// +typedef BOOL (CALLBACK *PF_DETOUR_BINARY_BYWAY_CALLBACK)(PVOID pContext, + PCHAR pszFile, + PCHAR *ppszOutFile); +typedef BOOL (CALLBACK *PF_DETOUR_BINARY_FILE_CALLBACK)(PVOID pContext, + PCHAR pszOrigFile, + PCHAR pszFile, + PCHAR *ppszOutFile); +typedef BOOL (CALLBACK *PF_DETOUR_BINARY_SYMBOL_CALLBACK)(PVOID pContext, + DWORD nOrdinal, + PCHAR pszOrigSymbol, + PCHAR pszSymbol, + PCHAR *ppszOutSymbol); +typedef BOOL (CALLBACK *PF_DETOUR_BINARY_FINAL_CALLBACK)(PVOID pContext); +typedef BOOL (CALLBACK *PF_DETOUR_BINARY_EXPORT_CALLBACK)(PVOID pContext, + DWORD nOrdinal, + PCHAR pszName, + PBYTE pbCode); + +typedef VOID * PDETOUR_BINARY; +typedef VOID * PDETOUR_LOADED_BINARY; + +//////////////////////////////////////////////////////// Trampoline Functions. +// +PBYTE WINAPI DetourFunction(PBYTE pbTargetFunction, + PBYTE pbDetourFunction); + +BOOL WINAPI DetourFunctionWithEmptyTrampoline(PBYTE pbTrampoline, + PBYTE pbTarget, + PBYTE pbDetour); + +BOOL WINAPI DetourFunctionWithEmptyTrampolineEx(PBYTE pbTrampoline, + PBYTE pbTarget, + PBYTE pbDetour, + PBYTE *ppbRealTrampoline, + PBYTE *ppbRealTarget, + PBYTE *ppbRealDetour); + +BOOL WINAPI DetourFunctionWithTrampoline(PBYTE pbTrampoline, + PBYTE pbDetour); + +BOOL WINAPI DetourFunctionWithTrampolineEx(PBYTE pbTrampoline, + PBYTE pbDetour, + PBYTE *ppbRealTrampoline, + PBYTE *ppbRealTarget); + +BOOL WINAPI DetourRemove(PBYTE pbTrampoline, PBYTE pbDetour); + +////////////////////////////////////////////////////////////// Code Functions. +// +PBYTE WINAPI DetourFindFunction(PCHAR pszModule, PCHAR pszFunction); +PBYTE WINAPI DetourGetFinalCode(PBYTE pbCode, BOOL fSkipJmp); + +PBYTE WINAPI DetourCopyInstruction(PBYTE pbDst, PBYTE pbSrc, PBYTE *ppbTarget); +PBYTE WINAPI DetourCopyInstructionEx(PBYTE pbDst, + PBYTE pbSrc, + PBYTE *ppbTarget, + LONG *plExtra); + +///////////////////////////////////////////////////// Loaded Binary Functions. +// +HMODULE WINAPI DetourEnumerateModules(HMODULE hModuleLast); +PBYTE WINAPI DetourGetEntryPoint(HMODULE hModule); +BOOL WINAPI DetourEnumerateExports(HMODULE hModule, + PVOID pContext, + PF_DETOUR_BINARY_EXPORT_CALLBACK pfExport); + +PBYTE WINAPI DetourFindPayload(HMODULE hModule, REFGUID rguid, DWORD *pcbData); +DWORD WINAPI DetourGetSizeOfPayloads(HMODULE hModule); + +///////////////////////////////////////////////// Persistent Binary Functions. +// +BOOL WINAPI DetourBinaryBindA(PCHAR pszFile, PCHAR pszDll, PCHAR pszPath); +BOOL WINAPI DetourBinaryBindW(PWCHAR pwzFile, PWCHAR pwzDll, PWCHAR pwzPath); +#ifdef UNICODE +#define DetourBinaryBind DetourBinaryBindW +#else +#define DetourBinaryBind DetourBinaryBindA +#endif // !UNICODE + +PDETOUR_BINARY WINAPI DetourBinaryOpen(HANDLE hFile); +PBYTE WINAPI DetourBinaryEnumeratePayloads(PDETOUR_BINARY pBinary, + GUID *pGuid, + DWORD *pcbData, + DWORD *pnIterator); +PBYTE WINAPI DetourBinaryFindPayload(PDETOUR_BINARY pBinary, + REFGUID rguid, + DWORD *pcbData); +PBYTE WINAPI DetourBinarySetPayload(PDETOUR_BINARY pBinary, + REFGUID rguid, + PBYTE pbData, + DWORD cbData); +BOOL WINAPI DetourBinaryDeletePayload(PDETOUR_BINARY pBinary, REFGUID rguid); +BOOL WINAPI DetourBinaryPurgePayloads(PDETOUR_BINARY pBinary); +BOOL WINAPI DetourBinaryResetImports(PDETOUR_BINARY pBinary); +BOOL WINAPI DetourBinaryEditImports(PDETOUR_BINARY pBinary, + PVOID pContext, + PF_DETOUR_BINARY_BYWAY_CALLBACK pfByway, + PF_DETOUR_BINARY_FILE_CALLBACK pfFile, + PF_DETOUR_BINARY_SYMBOL_CALLBACK pfSymbol, + PF_DETOUR_BINARY_FINAL_CALLBACK pfFinal); +BOOL WINAPI DetourBinaryWrite(PDETOUR_BINARY pBinary, HANDLE hFile); +BOOL WINAPI DetourBinaryClose(PDETOUR_BINARY pBinary); + +/////////////////////////////////////////////// First Chance Exception Filter. +// +LPTOP_LEVEL_EXCEPTION_FILTER WINAPI +DetourFirstChanceExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelFilter); + +///////////////////////////////////////////////// Create Process & Inject Dll. +// +typedef BOOL (WINAPI *PDETOUR_CREATE_PROCESS_ROUTINEA) + (LPCSTR lpApplicationName, + LPSTR lpCommandLine, + LPSECURITY_ATTRIBUTES lpProcessAttributes, + LPSECURITY_ATTRIBUTES lpThreadAttributes, + BOOL bInheritHandles, + DWORD dwCreationFlags, + LPVOID lpEnvironment, + LPCSTR lpCurrentDirectory, + LPSTARTUPINFOA lpStartupInfo, + LPPROCESS_INFORMATION lpProcessInformation); + +typedef BOOL (WINAPI *PDETOUR_CREATE_PROCESS_ROUTINEW) + (LPCWSTR lpApplicationName, + LPWSTR lpCommandLine, + LPSECURITY_ATTRIBUTES lpProcessAttributes, + LPSECURITY_ATTRIBUTES lpThreadAttributes, + BOOL bInheritHandles, + DWORD dwCreationFlags, + LPVOID lpEnvironment, + LPCWSTR lpCurrentDirectory, + LPSTARTUPINFOW lpStartupInfo, + LPPROCESS_INFORMATION lpProcessInformation); + +BOOL WINAPI DetourCreateProcessWithDllA(LPCSTR lpApplicationName, + LPSTR lpCommandLine, + LPSECURITY_ATTRIBUTES lpProcessAttributes, + LPSECURITY_ATTRIBUTES lpThreadAttributes, + BOOL bInheritHandles, + DWORD dwCreationFlags, + LPVOID lpEnvironment, + LPCSTR lpCurrentDirectory, + LPSTARTUPINFOA lpStartupInfo, + LPPROCESS_INFORMATION lpProcessInformation, + LPCSTR lpDllName, + PDETOUR_CREATE_PROCESS_ROUTINEA + pfCreateProcessA); + +BOOL WINAPI DetourCreateProcessWithDllW(LPCWSTR lpApplicationName, + LPWSTR lpCommandLine, + LPSECURITY_ATTRIBUTES lpProcessAttributes, + LPSECURITY_ATTRIBUTES lpThreadAttributes, + BOOL bInheritHandles, + DWORD dwCreationFlags, + LPVOID lpEnvironment, + LPCWSTR lpCurrentDirectory, + LPSTARTUPINFOW lpStartupInfo, + LPPROCESS_INFORMATION lpProcessInformation, + LPCWSTR lpDllName, + PDETOUR_CREATE_PROCESS_ROUTINEW + pfCreateProcessW); + +#ifdef UNICODE +#define DetourCreateProcessWithDll DetourCreateProcessWithDllW +#define PDETOUR_CREATE_PROCESS_ROUTINE PDETOUR_CREATE_PROCESS_ROUTINEW +#else +#define DetourCreateProcessWithDll DetourCreateProcessWithDllA +#define PDETOUR_CREATE_PROCESS_ROUTINE PDETOUR_CREATE_PROCESS_ROUTINEA +#endif // !UNICODE + +BOOL WINAPI DetourContinueProcessWithDllA(HANDLE hProcess, LPCSTR lpDllName); +BOOL WINAPI DetourContinueProcessWithDllW(HANDLE hProcess, LPCWSTR lpDllName); + +#ifdef UNICODE +#define DetourContinueProcessWithDll DetourContinueProcessWithDllW +#else +#define DetourContinueProcessWithDll DetourContinueProcessWithDllA +#endif // !UNICODE +// +////////////////////////////////////////////////////////////////////////////// +#ifdef __cplusplus +} +#endif // __cplusplus + +/////////////////////////////////////////////////////////////////// Old Names. +// +#define ContinueProcessWithDll DetourContinueProcessWithDll +#define ContinueProcessWithDllA DetourContinueProcessWithDllA +#define ContinueProcessWithDllW DetourContinueProcessWithDllW +#define CreateProcessWithDll DetourCreateProcessWithDll +#define CreateProcessWithDllA DetourCreateProcessWithDllA +#define CreateProcessWithDllW DetourCreateProcessWithDllW +#define DETOUR_TRAMPOLINE_WO_TARGET DETOUR_TRAMPOLINE_EMPTY +#define DetourBinaryPurgePayload DetourBinaryPurgePayloads +#define DetourEnumerateExportsForInstance DetourEnumerateExports +#define DetourEnumerateInstances DetourEnumerateModules +#define DetourFindEntryPointForInstance DetourGetEntryPoint +#define DetourFindFinalCode DetourGetFinalCode +#define DetourFindPayloadInBinary DetourFindPayload +#define DetourGetSizeOfBinary DetourGetSizeOfPayloads +#define DetourRemoveWithTrampoline DetourRemove +#define PCREATE_PROCESS_ROUTINE PDETOUR_CREATE_PROCESS_ROUTINE +#define PCREATE_PROCESS_ROUTINEA PDETOUR_CREATE_PROCESS_ROUTINEA +#define PCREATE_PROCESS_ROUTINEW PDETOUR_CREATE_PROCESS_ROUTINEW +// + +//////////////////////////////////////////////// Detours Internal Definitions. +// +#ifdef __cplusplus +#ifdef DETOURS_INTERNAL + +////////////////////////////////////////////////////////////////////////////// +// +#ifdef IMAGEAPI // defined by IMAGEHLP.H +typedef LPAPI_VERSION (NTAPI *PF_ImagehlpApiVersionEx)(LPAPI_VERSION AppVersion); + +typedef BOOL (NTAPI *PF_SymInitialize)(IN HANDLE hProcess, + IN LPSTR UserSearchPath, + IN BOOL fInvadeProcess); +typedef DWORD (NTAPI *PF_SymSetOptions)(IN DWORD SymOptions); +typedef DWORD (NTAPI *PF_SymGetOptions)(VOID); +typedef BOOL (NTAPI *PF_SymLoadModule)(IN HANDLE hProcess, + IN HANDLE hFile, + IN PSTR ImageName, + IN PSTR ModuleName, + IN DWORD BaseOfDll, + IN DWORD SizeOfDll); +typedef BOOL (NTAPI *PF_SymGetModuleInfo)(IN HANDLE hProcess, + IN DWORD dwAddr, + OUT PIMAGEHLP_MODULE ModuleInfo); +typedef BOOL (NTAPI *PF_SymGetSymFromName)(IN HANDLE hProcess, + IN LPSTR Name, + OUT PIMAGEHLP_SYMBOL Symbol); +typedef BOOL (NTAPI *PF_BindImage)(IN LPSTR pszImageName, + IN LPSTR pszDllPath, + IN LPSTR pszSymbolPath); + +typedef struct _DETOUR_SYM_INFO +{ + HANDLE hProcess; + HMODULE hImageHlp; + PF_ImagehlpApiVersionEx pfImagehlpApiVersionEx; + PF_SymInitialize pfSymInitialize; + PF_SymSetOptions pfSymSetOptions; + PF_SymGetOptions pfSymGetOptions; + PF_SymLoadModule pfSymLoadModule; + PF_SymGetModuleInfo pfSymGetModuleInfo; + PF_SymGetSymFromName pfSymGetSymFromName; + PF_BindImage pfBindImage; +} DETOUR_SYM_INFO, *PDETOUR_SYM_INFO; + +PDETOUR_SYM_INFO DetourLoadImageHlp(VOID); + +#endif // IMAGEAPI + +////////////////////////////////////////////////////////////////////////////// +// +class CDetourEnableWriteOnCodePage +{ +public: + CDetourEnableWriteOnCodePage(PBYTE pbCode, LONG cbCode = DETOUR_TRAMPOLINE_SIZE) + { + m_pbCode = pbCode; + m_cbCode = cbCode; + m_dwOldPerm = 0; + m_hProcess = GetCurrentProcess(); + + if (m_pbCode && m_cbCode) { + if (!FlushInstructionCache(m_hProcess, pbCode, cbCode)) { + return; + } + if (!VirtualProtect(pbCode, + cbCode, + PAGE_EXECUTE_READWRITE, + &m_dwOldPerm)) { + return; + } + } + } + + ~CDetourEnableWriteOnCodePage() + { + if (m_dwOldPerm && m_pbCode && m_cbCode) { + DWORD dwTemp = 0; + if (!FlushInstructionCache(m_hProcess, m_pbCode, m_cbCode)) { + return; + } + if (!VirtualProtect(m_pbCode, m_cbCode, m_dwOldPerm, &dwTemp)) { + return; + } + } + } + + BOOL SetPermission(DWORD dwPerms) + { + if (m_dwOldPerm && m_pbCode && m_cbCode) { + m_dwOldPerm = dwPerms; + return TRUE; + } + return FALSE; + } + + BOOL IsValid(VOID) + { + return m_pbCode && m_cbCode && m_dwOldPerm; + } + +private: + HANDLE m_hProcess; + PBYTE m_pbCode; + LONG m_cbCode; + DWORD m_dwOldPerm; +}; + +////////////////////////////////////////////////////////////////////////////// +// +inline PBYTE DetourGenMovEax(PBYTE pbCode, UINT32 nValue) +{ + *pbCode++ = 0xB8; + *((UINT32*&)pbCode)++ = nValue; + return pbCode; +} + +inline PBYTE DetourGenMovEbx(PBYTE pbCode, UINT32 nValue) +{ + *pbCode++ = 0xBB; + *((UINT32*&)pbCode)++ = nValue; + return pbCode; +} + +inline PBYTE DetourGenMovEcx(PBYTE pbCode, UINT32 nValue) +{ + *pbCode++ = 0xB9; + *((UINT32*&)pbCode)++ = nValue; + return pbCode; +} + +inline PBYTE DetourGenMovEdx(PBYTE pbCode, UINT32 nValue) +{ + *pbCode++ = 0xBA; + *((UINT32*&)pbCode)++ = nValue; + return pbCode; +} + +inline PBYTE DetourGenMovEsi(PBYTE pbCode, UINT32 nValue) +{ + *pbCode++ = 0xBE; + *((UINT32*&)pbCode)++ = nValue; + return pbCode; +} + +inline PBYTE DetourGenMovEdi(PBYTE pbCode, UINT32 nValue) +{ + *pbCode++ = 0xBF; + *((UINT32*&)pbCode)++ = nValue; + return pbCode; +} + +inline PBYTE DetourGenMovEbp(PBYTE pbCode, UINT32 nValue) +{ + *pbCode++ = 0xBD; + *((UINT32*&)pbCode)++ = nValue; + return pbCode; +} + +inline PBYTE DetourGenMovEsp(PBYTE pbCode, UINT32 nValue) +{ + *pbCode++ = 0xBC; + *((UINT32*&)pbCode)++ = nValue; + return pbCode; +} + +inline PBYTE DetourGenPush(PBYTE pbCode, UINT32 nValue) +{ + *pbCode++ = 0x68; + *((UINT32*&)pbCode)++ = nValue; + return pbCode; +} + +inline PBYTE DetourGenPushad(PBYTE pbCode) +{ + *pbCode++ = 0x60; + return pbCode; +} + +inline PBYTE DetourGenPopad(PBYTE pbCode) +{ + *pbCode++ = 0x61; + return pbCode; +} + +inline PBYTE DetourGenJmp(PBYTE pbCode, PBYTE pbJmpDst, PBYTE pbJmpSrc = 0) +{ + if (pbJmpSrc == 0) { + pbJmpSrc = pbCode; + } + *pbCode++ = 0xE9; + *((INT32*&)pbCode)++ = pbJmpDst - (pbJmpSrc + 5); + return pbCode; +} + +inline PBYTE DetourGenCall(PBYTE pbCode, PBYTE pbJmpDst, PBYTE pbJmpSrc = 0) +{ + if (pbJmpSrc == 0) { + pbJmpSrc = pbCode; + } + *pbCode++ = 0xE8; + *((INT32*&)pbCode)++ = pbJmpDst - (pbJmpSrc + 5); + return pbCode; +} + +inline PBYTE DetourGenBreak(PBYTE pbCode) +{ + *pbCode++ = 0xcc; + return pbCode; +} + +inline PBYTE DetourGenRet(PBYTE pbCode) +{ + *pbCode++ = 0xc3; + return pbCode; +} + +inline PBYTE DetourGenNop(PBYTE pbCode) +{ + *pbCode++ = 0x90; + return pbCode; +} +#endif DETOURS_INTERAL +#endif // __cplusplus + +#endif // _DETOURS_H_ +// +//////////////////////////////////////////////////////////////// End of File. diff --git a/PacketDumper/detours.lib b/PacketDumper/detours.lib new file mode 100644 index 0000000000000000000000000000000000000000..56c6a8df6139dd9cfa43acc13b3bff2063dd53ec GIT binary patch literal 178870 zcmeFa3w+#Fl?Q$&&uNl2Nt?c)l(dv*p`;HAEstiBOq!vYWSV69KyaESX_JyBA(@oc z6>S-!3_}#O)v72UAflooCKvQ=etamQ^ggcv;2b)Zp?8^ZTNT ziiO&{p+G714@#Z&jlcZ8?toIxcc@CK{~x}d`)bvH$D39DA@x^$SJZSwdk6bhcJx%Y zc6V1+uJ?s}e*CYfsJu!gBd^@rmoYBbyUpLaJsBNHNy*raj>ImpW2S8zGq$~JtbE(Y zOgk`U+JTH^4h;@;rsf*aOswwhiFWl2c7*zS+d2jY)^q zqtY))B5;XcTZ#A;1ChQ}UEzU_e*gBij=pGDZ%<9vKwoRLt+S)QvT|`~>B@B>UpV4l zSM3kA1R5J6P5$b}rkcu1hE_K=wD{MxR904A&)7D`VRNK`Z1u;w1iWL>rfvv5ZJ1RBbD=Sy~{FUn>vOkLaGv}y58d|qz25IRW?78*?O0_T( zaVBC^afNadIaX0qK-`NO@$1ap$qD(^N%LJ1Svk6lqaxGGISRnNtVyuC%Jr1mb%DCj zQs|_0P)Sm4k$^M83ifq(ZSG+mNxo_23;6tXz`*3b?(W_;w6aPKGD=iJz8d_uWaPx4 zjX+LT8Qhvq70N7Klm!da3oZECuAWg`(C|szj-rGH z`=LbAM8)C>%i7#wk?JfcvUj4>x*~>~z7Hq{*-}FyP?N6oN0)_^?IL{p($5jAvNU$x`^nI_vPUY*VyfGxdlHD!aW?eB7LriK$&b@U4(q+l-j7&=XdUe(pp+P?#C zyRUNLBFi93hOQkIsuk9fR8ZZ@LajTxdr?icU8M0io7JMUgmw!tX$LA7E=@&EVYd*c zm$0#~qX&jZ3N0c@Hnz0LrVa>))x^`{P^Wf2X=Ttn2U%!J*A2FIQyYq%q75CGblTPl zX)FCoO0=(i%iut?r4_0S%E|#KO+jq=D+Q2BzM|F*q$*t97+UXdXlYtsxezVIFAA0L zOP8J`{KY2+U$rCJG4K~83H5hu>e_yC32RT1mfDk~rS>Fw8|WE`_792@NFl`P;QTTK z3-oN$8gq2bx>s9sYfo2nhgb*AI|ia1=s+Dwn|-2(A%hE-R&_;v?d|;-s-%EGZr0H# zuwWqk{jKa*9cUadix-WLM_|UnGZ5+D80>9tN-gZd)m8o~4oLdjIw*}TtsA>L(nJ_A zDbhO%KBe5Fq3xkr-wtPmBsBmtcEtF%Q*&_apxNQ?VWFhqHuhBaws(X$Fp&`n8j>`; z6${6QCBrpB48^N3%)2%@#1!jBhUxXtdNT5<>o&vFaHPiH(im=vG_Mav0u8l|l`;^r zd(iO;X-Pwd4(n=K_UlOm-1YI0vF+sT{c_k zcZ7PoU>@64A{ZpKc2h8t-4#Nmr`|NW`)KOe+PjUQCq0X|8$S+jV#n8y3YSxOza zPN}LPrE2fmBUGez>3PQ@?_ zw=*_N@t=-KPm|1-ITD6{bIrdj+h>I^eX_y2cA_WMod1u{K8&X_^i0d&XDQ57$Vtvp zoT#-XZyzgxOiCoam)3zOp&->H z{`(}9=7)0v=Hw@##Az9{50%DIp=a1x6`#+*N4lifLckv5$|y@u(O|DBV9Cp&&U znOVf~OqIXSIb!io)W4Z?Jh8cf6PuX)o0>qtWQE&oW+p|+Ik=M@@vitAoL&7tv+m1D zp8u&CpyW(Oaz6U+v(zUrORd$fwN>E1umN4=5 z+|+;DwAEOf7)&9osi)-RkQL%GY4v|(YAa=Rqo9q|czv{ULGQ*b+_{!%x7xyrils}J zmX|MFw(t@?(Y2wV-czBz@>1f`wna+K@nCWb&jQS7w?(&g=wC`rgJ*ZX^~?M%C;?o@ z#=*_=nyr{uF=_UNG`LDtQnjER3&9o;{$7Ol#)*yqcq>)Kz6H^a?NLW?CH#*9?hkmU zPEweI%2VYfp$+NzehF~P5dT}ee6sOYmLT6We6NDO>|&*UUZT`BrAkdyb6oMg47f8U zEA_i6f)2A`?)YXQ{LC^9yA2u*=je&0faDPI4A1fM9rt*>A4*}*2cwfQGnMb$!Aig&czjivYWya@2+#q1S zf%ivv$Ex3Bh`)D+pc}J%`vLO{ym>RnF5e8qC-CygMDO#M*MQjxAPgReCrI% zPWhV|-)9hi@!8|!3mcdlID-@3tU54ly1G7{9=DW)C zgMj-2;@4g?$Ms#srRmWkY{!6Lq}qXB4qQFZ-*&ar8c?~HsA;88Cn)PgxM$7NZm_GZzjvT_Q?&e?rgO_1vDeKOaJ)GH{3#r+}tDRNdUtq)GsI21*gOi&2D-J}Cy{r{dT51-!Y%*VGaYalv`51O#|4Y01GuWR@XQBY9I+szNYo65aCgvuWD?pmqb^ikP%bJQxN$@QdEm1EhuTE z*|)|Y@iqB<=xV&B`6Q@W%3kO9)%cqP1Ns?teH(WBMxsK@9F#S*wz|&Oq|QJh)^@l8R{(b%9!86(}|&O+P>_@8l zkfRiuP2XiHQbJj&ElFuG!bV}T_I(TXx!`2YT5JgyDd`^`vdmRx< zJ+dWGebk2}`AqzzoVbVy(-BewQrb}c(xjA2O;SF(P>$*`CJ}9!st<`|QxGw90EeA| z$P&(FzM6lm(^pW!vFmiL=z&KF=MXQFkjo5Y=NGeU;IC-w=A^Em%sz{B^&vNjqIPLY zO{2&&DuBpn4M6EwOK{x`!F}?LMUWEkM<19dH9^#OAjTGqNJMdZyS{5)bbwK@XLDlvJfTFeXtn$fCBoh&6H_v@Z!l-^ zzC*c>u`9S{zZU|d6f9~q#@TS!hz}MC21E?gV+M9x9yI}Owpt7~M_mjzU$NWr;+Ily zx&VemrANjHoH9u#}mwL3f&26O_BK zvuB`P{S z;V(lym8>4#^9I7LN-Ek?*{MoORAPu}LR(ZK=w1DeR7G405_?jLGnjiY7u85qgQq;s zQtWz@ZbE>Di*Ab#6K*(sv}sGFL6(r9)f5Sh5dx8W@F}Dk779WMp=x!fAlk$9O$om@ z73ZFjwb|aIOmqQ|M>7Q*|55^2qX{hA?uL(IB2v8Kz3P&nuhm~M@^uN zk-A98(W4Mzmn<&KiajYTL#kQAv*Io9BqYKV2~|Z=Hek_-iDAMUb|w7B62HCX8A|3V zym^YY?h^6sg3DiJ>N9X*Gb8p%xGTi>3|tL&1io`5tO)t&u+!kst5g--TD2MO zO4S9oQGFV2NZkpyS=|S>MLhy{t$G6PRq9!|?@~X2dyV=L+;_XSbWWwP$&f1RA)U^a zzEl;bv~;E+46*)GvZV)lwqUl&Xu!tqcHqpl(!s>&8t8Oy?lVktFGrqzn;e=FT~%Qz z3nnoexw~3|$`CXcZ<`L93Mk4WgW9ie>BJ;jd!QYrUSTQapWRVk`}H)hxuY!Ff%+*d zWz+r^%HFn-5nRqdpc(k zM68(k$UGYw(**Fi}Q+`*C%1yj87=L<{4^4T@G&i%S@So87G~xi!x9~xSuEM z$hQfn4IQLerDhRysp-?DrcX+U4gu9gM|VC(;a~F%3(L`Ko+uG^>3JCRVP;i)6c2Xp zd1B011Y*(-HSR_x#VY+7k4&Z^46*(qNhbE9I<$|^7O^z|(`3@8$)r!n6zlCmr}Z{m zud>iX7ioJS#P0V1pkdg#n{OS6D^sV#?G+z8GdAHe)dtt%02OYwG}0V(3H3EyhvMr;U#7)uswD|g^HFX{1uj%ar_YXA2^gh;upb71P>rh zg)NUqfaS0rT*RI&GiVmZZa7~>CvPdyB{<(gR+I?Niv22Q==s5dMEHoYI%W95Zlgj5 zA2*=vd18p`p$PX@vw@VUINT44?*X{lVA}`Zd-3L}_rT>}npMScbHupMm7z?j3L<2( zS`Bx)+6{Mx+6(s-G5AhZUxoiP^*G$w>RGtu>Up?xTy@0v5i=e$v0mu(hlih?^*X|j4IN|tVZ^y%hDpESQ+hdc8*QDXQoVs;(e3GT*z z^?H2x4j>=i^Le=OJ$vECZYWdH&V+vkT4UL2Ao?Q^NqdbwTa*|gc*QJ$sPp#Ff63N-~~Tc|FCyGX5qyI2O#OH>U0i)7fmREEkItDhodnJPfZE>$z(V&DyT zh4RC#R4d`usb07NbsgN*Dgn1i4Z{tq&%#}!?uENqeHrc+^%&f1)l+c0U3(+09#a8P zrCZMgcpz+cZ?rhgFlQRV5bLXCmOP%6A@_-nw>i$G)$JVTvU9@dN{_Thjlo&caulyG zIRTE3hkY#F$-iE2C&#Lj?CW)OJfykJ%9K!@0r zRK&#I!^4Epjvg5!Q(d!T_MmWnkwZs8W(~NlPJ#lc zI|=%9CqZ9<%+|yujAf%wIu11L@2JNxa*jRii3h!y>*5q+mIUN5!0)~088$D=1m&cA zmdp}m%j^;lXpJ7JvDxtP>ObPr6n6^5MQP><(-7t?ygx|_gf`c)TV3BoBwQz22iG~N z!s-{U;|hYocnt1w>#D8-f;;BUc zHi&OKS>joAO+0;?c>0pWKRyoe>^J^4h;Khx;#qV}JbjvY`jW&yH4gD3fd1PcexU0l z#hyji#M7sVr!PtTx5pu#*1_Kf@$Dx|Jd3W0r%w}4Uy}GI$042u(ccE~8~aYO=2>)2 zJbjvY`jW(dYaHSa0Qzr(_<@rpo<-Nh)2E52FG+moIK=-B(0_g67oTK5&l~tovff#6 zO*(y=bozvJS&httArtqPfC1m}9E6n<+wY0f)+veY%f$rL{O1rBF8~l065@Vs_HYzn zv4fUsmYLC+4S%jIIOnP5@aMalK$jtg4-FIRNjHHOrLl%-2t%yT(s-4}EI7ji!bOd4 zoS{j`Y_v%Ppqc?~C))P!Mg%tZw}Aw`;!M&s!|2ltqtBgT2TqV-9FYC@GAvz|#$#A@ zYj^iwhhwBobBsRCG5R#e{+hF&J7o5As&n>}^Y8JXWBN0E0E2QfJBqRP5e()JTT>vT zr$7CN0du}J-BOeY&x-vzXXq77fBKJ@S)sJ)&zYc1Pk-vE{P&_>d-0aZkoSY)`vP1& zEPon4LgcCGNXNh9Pk-(K%nbDjxTh!%@K2Qi`)TS4_-Ctsgj=p&fIG*valMR~lb!x# z8kUS$|9J`=d92+WF4LcD?deZF@1JS{qZDwH@%|Yzr<=3J+_u`**GHkLY{OR61zqiD%{xtTzBN1L zSPBZIvOUuXnDRJ}hG5PEFg%o!`Z$lHup`L!Tx0+i-FnS0w0B-YXYz8of zhkN1IJWS_$%GO`QL!F*3@sz7958HDkULL2>PXt$Jbz`bTKY&pSHf}P%^jty*3n_a_ z>|nK^Tf?xeldcZ6phJgLS|O6^0&x)}kCPiriP}LtkKt_i{WT~8ft}pQ7Z@JLu_`go z_MIshscp)EXFh%r7mxKMpW37sbn$r?UhZ>Y?tJwYXYs(%Fdwjf+9CIh3fVU*SVsXmjM z%5hk$05RDfUFTV9$Ahn7wwfe6WrNGQ*`ANXwPd5f_F4QX5Gtw+j6PC@A8OwAd5bSu za>>P{pLyk_$UH+dUCw$>)()jaU~IZrf@G@C;aBo;)(-8*BwcF`%-=kku89IOK-VBC zvgx|a)O(T86+}F9)U@lS60G>?vLm$_@Y78*P{l~se(2LfZ$MeNB`%TiN0+82A`@oEr81z?;tIN7G_X@hyPDhJGU zfFwtGZKw)((|Ywns0xPg18I?ZM!Rz)meO zRba9pLRM=kv#I#G!CaWfVy+rz~i9vM8p=YexaQ%a%A_VDPSC4JLu-+89Y(^NTNJ`70W`dT?W z_7gw|7owOKB?~)3O)C1em&;hzqrJDMgs|5e=!hB+a8-O?Oo4IA2J_M!OJTa*51xg1 zfw4Kpawk)Lz~rR=IAw!&PPXS9iO5yc9X{{gcsDfUq<4?y1jbnxkJihg^C{ml2qt} zzVM__!MrpT(^Jdiph93$s7R(dH8qukih01Cq~c>=+R!taiZcbqNyR*yifx99c|yf6 z0ZA(K@nU#Vs9;{2irJ~E?N8xDQBr!n3k8Nfl|{t@p~A9T5Iu(7 zVjmB8%n{}1Fb#4M+D}1-ECG+WC!ezo3`0`wUY1#NV+V_BKNdG8Aw*zoZV-Di)hAO^ zIS$EJ0M4pY8!bGQD2sJPQN}Mutw`Bago87@4qPq)#O?h2ghM3KwY4u2k*_4^jjxqU z)I5FU2=fCMEnIAYtZnUz*7o){HWM)ndxGWXu zo2fL@@pT9sLpSV3hR&)m>;`y+N)-ZTLkYllVYCP&YkSEOyS8z&okq-Sxo{&HdOiKK0UTk`Za&&*Lg%TBM}{Tx3PxQsyERh^SBnn|QBS$M&}L8?zRbr#{w=SxYWi zwnWG9#;ij1W!#uGbD}==LdE2EW7dl)Y7IaxH)dT3MfPjJmF5wPo2kAHFMu8fzPaeB_Tw$V^rhQPPR{}E&xrqyS7T*|<92h< zc7(qHn5!|jyccgCCWPGZagw~U01J_vy~V?R&<)>egkNZ2cFJE&7P{R0bqH`jLj1Rj z;K5^;&(Vo6oJPby85sWNLq7l4Zd!3l5st(Due@pH991MYifEn;L^j$V3)C8l+72xb zr&i|x^3zi^oKpB&qT>sLxSkqE{V>v>So(PjymZCyYk*yrdXr4%%V9>} z26G0|l8N=9mc~$|-oM6Q?ywyP;31>$|Ht6%Y+Q*4YbeIU^q#adpo*V?=EtR{lCSy@`^hSL4rVQt6J=X8HOh9egE;K7m z7vk?_vE(ruWgME-R>wxgmSY>57qCF~oQVbH$su#>@C-5v+G!f01XDxQLr z;IB~E!(AxlNlHcP6#=xP`0(#%NxnQrDk7O1JMWI5R8V90X_0B_XafWFo<(YQ937R> zjJ-36TDqeTtaaWm;qUM7?U!^o9wWzJ+OKcwhz|Dm$mvd7uH1#{d=%kayoGXPmOis{ z&ug8P)Hm$3OP$B%76}oTLPtbi=1lH+=ds@AD$j z={t@x?em%m*v$L9Hd#Zjzw$mW4y7=%a6F^;d2txU=f#3=e_#8st83A+iz+HeJ=Fz{ z5i(@SvSsYBQbI0br{$Ws(wqa-kfvJmv7Q1RPo>pLrh34;b+-O$l+%u(C9IPVqh~k^Hsh6j{>(W6vov zzhtUMQ&Tzk!y;vSs9-rr4J`O3dSDjAxvog=XL~qU)#YSsA#OhPrp&lX6fiUyh>L?> z{Wz&$UYZJaUCGCyLU+J`v8f=gWU3D&lfdV!WoDP{p}OHtmQBC>b;W2Z$fIn}A-V*^ zGr^`}uc2asP(cHWxONs2ijR{D=B24POX4iYqJs0g0%KD_T**{ctJCQWpIi8g*}2W{ zK7rEly9_5Z?yIa^jL*8@E9YUyNJnnYD`-FTGgDab|6|dJr>fpF_(#%gAi{%vudZW(mzi=i@T7_RYCym}zj8E;DN! zFDzW{M5dI?tT|K$V>jb%G;rULzlE+dQdq}S#}NPVOPNYHJ+~RI*Ae%1!0fq9sVDK~ zz$$f{;kpZO(=l{=R1e>zDZAmLz5HXqWSiDT#pQMs+%8v%1cC809Y%f50|B_Wi0e_pJXK2Fjh9a*dgmkV+Xm)M`J3yC@0)=0Rx9;1UOt)dZ9v>F0kZ-E+l)60ov~Z_ zb_4Fih(E&*51vf;9z&cDFn`2*Q7yTL&37*RdjxQIBR;&6*fQgri?{*6?7@2{UVi=4 z4c~_V_ax$1)e&1}eAgnb%fS3d{<_OEFQZ-%0AH>Ybkf9sm5dZHD8ecyCxRsAx_a%+EJQ44^ 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 OQDt4mH~x-^Z~X_?9czaG literal 0 HcmV?d00001 diff --git a/README.md b/README.md new file mode 100644 index 0000000..4a75f7d --- /dev/null +++ b/README.md @@ -0,0 +1,10 @@ +# Packet Dumper + +A simple Microsoft detour based packet logging DLL written using C++ which hooks into **Ws2_32.send** as well as **Ws2_32.recv** of a target application. + +It logs packet into a folder name **PacketLog** in the parent directory where the injected executable is situated. + +## Usage + +* Build the solution using Visual Studio 2017. +* Inject PacketDumper.dll into the target process using your favourite DLL injection tool such as DLLInjector. \ No newline at end of file