83 lines
2.2 KiB
C++
83 lines
2.2 KiB
C++
|
#include "pch.h"
|
||
|
#include "Utils.h"
|
||
|
|
||
|
bool Utils::Detour32(char* src, char* dst, const intptr_t len)
|
||
|
{
|
||
|
if (len < 5) return false;
|
||
|
|
||
|
DWORD curProtection;
|
||
|
VirtualProtect(src, len, PAGE_EXECUTE_READWRITE, &curProtection);
|
||
|
|
||
|
intptr_t relativeAddress = (intptr_t)(dst - (intptr_t)src) - 5;
|
||
|
|
||
|
*src = (char)'\xE9';
|
||
|
*(intptr_t*)((intptr_t)src + 1) = relativeAddress;
|
||
|
|
||
|
VirtualProtect(src, len, curProtection, &curProtection);
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
char* Utils::TrampHook32(char* src, char* dst, const intptr_t len)
|
||
|
{
|
||
|
// Make sure the length is greater than 5
|
||
|
if (len < 5) return 0;
|
||
|
|
||
|
// Create the gateway (len + 5 for the overwritten bytes + the jmp)
|
||
|
void* gateway = VirtualAlloc(0, len + 5, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
|
||
|
|
||
|
if (gateway == NULL) return 0;
|
||
|
|
||
|
// Write the stolen bytes into the gateway
|
||
|
memcpy(gateway, src, len);
|
||
|
|
||
|
// Get the gateway to destination addy
|
||
|
intptr_t gatewayRelativeAddr = ((intptr_t)src - (intptr_t)gateway) - 5;
|
||
|
|
||
|
// Add the jmp opcode to the end of the gateway
|
||
|
*(char*)((intptr_t)gateway + len) = 0xE9;
|
||
|
|
||
|
// Add the address to the jmp
|
||
|
*(intptr_t*)((intptr_t)gateway + len + 1) = gatewayRelativeAddr;
|
||
|
|
||
|
// Perform the detour
|
||
|
Detour32(src, dst, len);
|
||
|
|
||
|
return (char*)gateway;
|
||
|
}
|
||
|
|
||
|
int spotifyVer = -1;
|
||
|
int Utils::GetSpotifyVersion()
|
||
|
{
|
||
|
if (spotifyVer != -1)
|
||
|
return spotifyVer;
|
||
|
|
||
|
LPCWSTR lpszFilePath = L"Spotify.exe";
|
||
|
DWORD dwDummy;
|
||
|
DWORD dwFVISize = GetFileVersionInfoSize(lpszFilePath, &dwDummy);
|
||
|
LPBYTE lpVersionInfo = new BYTE[dwFVISize];
|
||
|
GetFileVersionInfo(lpszFilePath, 0, dwFVISize, lpVersionInfo);
|
||
|
UINT uLen;
|
||
|
VS_FIXEDFILEINFO* lpFfi;
|
||
|
VerQueryValue(lpVersionInfo, _T("\\"), (LPVOID*)&lpFfi, &uLen);
|
||
|
DWORD dwFileVersionMS = lpFfi->dwFileVersionMS;
|
||
|
DWORD dwFileVersionLS = lpFfi->dwFileVersionLS;
|
||
|
delete[] lpVersionInfo;
|
||
|
|
||
|
DWORD dwLeftMost = HIWORD(dwFileVersionMS);
|
||
|
DWORD dwSecondLeft = LOWORD(dwFileVersionMS);
|
||
|
DWORD dwSecondRight = HIWORD(dwFileVersionLS);
|
||
|
DWORD dwRightMost = LOWORD(dwFileVersionLS);
|
||
|
|
||
|
return spotifyVer = dwSecondRight;
|
||
|
}
|
||
|
|
||
|
std::string Utils::HexString(BYTE* data, int len)
|
||
|
{
|
||
|
std::stringstream ss;
|
||
|
ss << std::hex;
|
||
|
|
||
|
for (int i(0); i < len; ++i)
|
||
|
ss << std::setw(2) << std::setfill('0') << (int)data[i];
|
||
|
|
||
|
return ss.str();
|
||
|
}
|