You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
2.2 KiB
83 lines
2.2 KiB
#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(); |
|
} |