Detours Hook:GetVolumeInformation 随机卷序列

Posted

技术标签:

【中文标题】Detours Hook:GetVolumeInformation 随机卷序列【英文标题】:Detours Hook: GetVolumeInformation Random Volume Serial 【发布时间】:2015-08-24 03:06:39 【问题描述】:

我正在尝试使用 Detours Express (3.0) 挂钩 GetVolumeInformation,以更改音量序列。 问题是每次调用挂钩函数时,它都会返回一个随机卷序列。

#include <fstream>
#include <string>
#include <windows.h>
#include <detours.h>
#include <fcntl.h>
#include <stdio.h>
#include <io.h>
#pragma comment(lib,"detours.lib")
#pragma comment(lib,"ws2_32.lib")
std::string rcvBuf;

HANDLE CreateConsole();

HANDLE CreateConsole()

    int hConHandle = 0;
    HANDLE lStdHandle = 0;
    FILE *fp = 0;

    // Allocate a console
    AllocConsole();

    // redirect unbuffered STDOUT to the console
    lStdHandle = GetStdHandle(STD_OUTPUT_HANDLE);
    hConHandle = _open_osfhandle(PtrToUlong(lStdHandle), _O_TEXT);
    fp = _fdopen(hConHandle, "w");
    *stdout = *fp;
    setvbuf(stdout, NULL, _IONBF, 0);

    return lStdHandle;


HMODULE hLib = GetModuleHandle("Kernel32.dll");
typedef BOOL (WINAPI *HWIDPtr)(LPCTSTR lpRootPathName, LPTSTR lpVolumeNameBuffer, DWORD nVolumeNameSize, LPDWORD &lpVolumeSerialNumber, LPDWORD lpMaximumComponentLength, LPDWORD lpFileSystemFlags, LPTSTR lpFileSystemNameBuffer, DWORD nFileSystemNameSize);
HWIDPtr pHWID = (HWIDPtr)GetProcAddress(hLib, "GetVolumeInformationW");

BOOL WINAPI MyHWID(LPCTSTR lpRootPathName, LPTSTR lpVolumeNameBuffer, DWORD nVolumeNameSize, LPDWORD lpVolumeSerialNumber, LPDWORD lpMaximumComponentLength, LPDWORD lpFileSystemFlags, LPTSTR lpFileSystemNameBuffer, DWORD nFileSystemNameSize)

    printf( ("Real : %u"),&lpVolumeSerialNumber);
    return pHWID(lpRootPathName, lpVolumeNameBuffer, nVolumeNameSize, lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize);


BOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved)


if (DetourIsHelperProcess()) 
    return TRUE;


if (dwReason == DLL_PROCESS_ATTACH) 

    CreateConsole();
    DetourRestoreAfterWith();

    DetourTransactionBegin();
    DetourUpdateThread(GetCurrentThread());
    DetourAttach(&(PVOID&)pHWID, MyHWID);
    if(DetourTransactionCommit() == NO_ERROR)
               printf("Attached successfuly!@");

else if (dwReason == DLL_PROCESS_DETACH) 

    DetourTransactionBegin();
    DetourUpdateThread(GetCurrentThread());
    DetourDetach(&(PVOID&)pHWID, MyHWID);
    DetourTransactionCommit();

return TRUE;

任何建议将不胜感激。

【问题讨论】:

【参考方案1】:

如果您指的是钩子函数内部的 printf() 调用输出随机垃圾这一事实 - 这是完全有道理的,因为 lpVolumeSerialNumber 是一个输出参数,因此它可能(并且很可能会)在原始函数调用。如果你想查看原始函数返回的值,你应该按照以下方式重写你的钩子函数:

BOOL WINAPI MyHWID(LPCTSTR lpRootPathName, LPTSTR lpVolumeNameBuffer, DWORD nVolumeNameSize, LPDWORD lpVolumeSerialNumber, LPDWORD lpMaximumComponentLength, LPDWORD lpFileSystemFlags, LPTSTR lpFileSystemNameBuffer, DWORD nFileSystemNameSize)

    BOOL retval = pHWID(lpRootPathName, lpVolumeNameBuffer, nVolumeNameSize, lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize);
    printf( ("Real : %u"), *lpVolumeSerialNumber);
    return retval;

请注意,我还将“&”更改为“*” - 如果您想取消引用指针而不是获取其地址,则应该使用它。

希望对你有帮助

【讨论】:

已经找到了自己,非常感谢您提供“易于理解”的解释!

以上是关于Detours Hook:GetVolumeInformation 随机卷序列的主要内容,如果未能解决你的问题,请参考以下文章

Detours简介 (拦截x86机器上的任意的win32 API函数)

Delphi Detours Library

Hook CreateProcess

Windows Dll InjectionProcess InjectionAPI Hook

Linux Ubuntu下的绕行功能

MinHook库的使用 64位下,过滤LoadLibraryExW