Here is source code I would like to share with you.
* Requirements *
Little bit of brain.
A computer, or a high-performance toaster.
And... something that can compile this.
common.h:
Code:
#ifndef HG_COMMON #define HG_COMMON #pragma comment(lib, "detours.lib") #define _CRT_SECURE_NO_WARNINGS #include <Windows.h> #include <iostream> #endif
apihook.h:
Code:
#ifndef HG_APIHOOK #define HG_APIHOOK #include "common.h" class apihook { public: static void Init(bool randomVolSerial, bool randomMac); private: static void SetupVolumeSerialHook(); static void SetupMacAddrHook(); }; #endif
Code:
#include "apihook.h" #include "detours\detours.h" #include <IPHlpApi.h> #pragma comment(lib, "iphlpapi.lib") //----------------------------------- typedef BOOL (WINAPI * pGetVolumeInformationA)( LPCSTR lpRootPathName, LPSTR lpVolumeNameBuffer, DWORD nVolumeNameSize, LPDWORD lpVolumeSerialNumber, LPDWORD lpMaximumComponentLength, LPDWORD lpFileSystemFlags, LPSTR lpFileSystemNameBuffer, DWORD nFileSystemNameSize); typedef BOOL (WINAPI* pGetVolumeInformationW)( LPCTSTR lpRootPathName, LPTSTR lpVolumeNameBuffer, DWORD nVolumeNameSize, LPDWORD lpVolumeSerialNumber, LPDWORD lpMaximumComponentLength, LPDWORD lpFileSystemFlags, LPTSTR lpFileSystemNameBuffer, DWORD nFileSystemNameSize); typedef DWORD (WINAPI* pGetAdaptersInfo)( PIP_ADAPTER_INFO pAdapterInfo, PULONG pOutBufLen); //----------------------------------- //Handles etc HMODULE hKernel32; HMODULE hIphlpapi; pGetVolumeInformationA p_origGetVolumeInformationA; pGetVolumeInformationW p_origGetVolumeInformationW; pGetAdaptersInfo p_origGetAdaptersInfo; void apihook::Init(bool randomVolSerial, bool randomMac) { srand(time(NULL)); hKernel32 = GetModuleHandleA("Kernel32.dll"); hIphlpapi = GetModuleHandleA("Iphlpapi.dll"); if(randomVolSerial) apihook::SetupVolumeSerialHook(); if(randomMac) apihook::SetupMacAddrHook(); } //----------------------------------- //Volume serial hooks //Just see typedef BOOL WINAPI MyGetVolumeInformationA(LPCTSTR lpRootPathName,LPTSTR lpVolumeNameBuffer,DWORD nVolumeNameSize,LPDWORD lpVolumeSerialNumber,LPDWORD lpMaximumComponentLength,LPDWORD lpFileSystemFlags,LPTSTR lpFileSystemNameBuffer,DWORD nFileSystemNameSize) { BOOL res = p_origGetVolumeInformationA(lpRootPathName, lpVolumeNameBuffer, nVolumeNameSize, lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize); std::cout << "MyGetVolumeInformationA -> Old serial " << *lpVolumeSerialNumber << std::endl; DWORD newSerial = GetTickCount() + rand(); std::cout << "MyGetVolumeInformationA -> New serial " << newSerial << std::endl; *lpVolumeSerialNumber = newSerial; return res; } //----------------------------------- //Volume serial hooks //Just see typedef BOOL WINAPI MyGetVolumeInformationW(LPCTSTR lpRootPathName, LPTSTR lpVolumeNameBuffer, DWORD nVolumeNameSize, LPDWORD lpVolumeSerialNumber, LPDWORD lpMaximumComponentLength, LPDWORD lpFileSystemFlags, LPTSTR lpFileSystemNameBuffer, DWORD nFileSystemNameSize) { BOOL res = p_origGetVolumeInformationW(lpRootPathName, lpVolumeNameBuffer, nVolumeNameSize, lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize); std::cout << "MyGetVolumeInformationW -> Old serial " << *lpVolumeSerialNumber << std::endl; //Override DWORD newSerial = GetTickCount() + rand(); std::cout << "MyGetVolumeInformationW -> New serial " << newSerial << std::endl; *lpVolumeSerialNumber = newSerial; return res; } void apihook::SetupVolumeSerialHook() { p_origGetVolumeInformationA = (pGetVolumeInformationA)GetProcAddress(hKernel32, "GetVolumeInformationA"); p_origGetVolumeInformationW = (pGetVolumeInformationW)GetProcAddress(hKernel32, "GetVolumeInformationW"); DetourTransactionBegin(); DetourAttach(&(PVOID&)p_origGetVolumeInformationA, MyGetVolumeInformationA); DetourTransactionCommit(); DetourTransactionBegin(); DetourAttach(&(PVOID&)p_origGetVolumeInformationW, MyGetVolumeInformationW); DetourTransactionCommit(); std::cout << "Volume serial number hook initialized" << std::endl; } DWORD WINAPI MyGetAdaptersInfo(PIP_ADAPTER_INFO pAdapterInfo, PULONG pOutBufLen) { DWORD res = p_origGetAdaptersInfo(pAdapterInfo, pOutBufLen); //BYTE_IP_ADAPTER_INFO::Address for(int i = 0; i < 8; i++) pAdapterInfo->Address[i] = rand() % 0xFF; std::cout << "MyGetAdaptersInfo -> Address override" << std::endl; return res; } void apihook::SetupMacAddrHook() { p_origGetAdaptersInfo = (pGetAdaptersInfo)GetProcAddress(hIphlpapi, "GetAdaptersInfo"); DetourTransactionBegin(); DetourAttach(&(PVOID&)p_origGetAdaptersInfo, MyGetAdaptersInfo); DetourTransactionCommit(); std::cout << "MAC address hook initialized" << std::endl; }
hwfck.cpp:
Code:
#include "common.h" #include "apihook.h" BOOL WINAPI DllMain(HMODULE module, DWORD callReason, LPVOID reserved) { switch(callReason) { case DLL_PROCESS_ATTACH: { DisableThreadLibraryCalls(module); AllocConsole(); freopen("CONOUT$", "w", stdout); std::cout << "hwfck init" << std::endl; apihook::Init(true, true); } break; } return TRUE; }
Good luck.
#27.09.2017
Added hook on GetVolumeInformationA