【问题标题】:Detour GetComputerNameW绕道GetComputerNameW
【发布时间】:2015-12-10 22:14:53
【问题描述】:

您好,我正在尝试使用 Microsoft 绕道拦截 GetComputerNameW,但似乎不可能。我已经设法绕过 GetVolumeInforation,但这似乎有所不同。 我正在尝试将计算机名称从 DKKKK 更改为 ABCDE。

结果不走弯路

绕道而行的结果

我错过了什么?

#include <detours.h>
#pragma comment(lib,"detours.lib")
HMODULE hLib = GetModuleHandle(L"Kernel32.dll");

typedef BOOL (WINAPI *CPNMPtr)(LPWSTR lpBuffer,LPDWORD &lpnSize);
CPNMPtr pCPNM = (CPNMPtr)GetProcAddress(hLib, "GetComputerNameW");


BOOL WINAPI MyGetComputerNameW(LPWSTR a0, LPDWORD a1)
{
    BOOL rv = 0;
    rv = pCPNM(a0, a1);
    wchar_t* wcBuff = L"ABCDE"; 
    a0 = wcBuff;
    printf("GetComputerNameW(%ls,) -> %p\n", a0, rv);

    return rv;
}

int _tmain(int argc, _TCHAR* argv[])
{
    DetourRestoreAfterWith();

    DetourTransactionBegin();
    DetourUpdateThread(GetCurrentThread());
    DetourAttach(&(PVOID&)pCPNM, MyGetComputerNameW);
    DetourTransactionCommit();

    WCHAR wzComputerName[MAX_COMPUTERNAME_LENGTH+1];
    DWORD dwSize = sizeof(wzComputerName)/sizeof(wzComputerName[0]);

    if (GetComputerName(wzComputerName, &dwSize))
    printf ("GetComputerName returned %S of length %u\n", wzComputerName, dwSize);
}

【问题讨论】:

    标签: c++ hook detours


    【解决方案1】:

    您只是覆盖了a0 的本地指针值,而您应该覆盖它的内容。

    试试这个:

    wcsncpy(a0, L"ABCDE", *a1);
    *a1 = wcslen(a0);
    

    正如 Remy Lebeau 指出的那样:您对原始 GetComputerNameW() 的调用将修改 *a1 的值,因此您可以先复制它的值。

    无论如何,既然您是自己生成名称,我认为没有理由调用原始的GetComputerNameW()。

    【讨论】:

    • 由于代码在修改a0中的数据之前调用了原始的GetComputerNameW(),所以a1将包含调用wcsncpy()之前修改后的缓冲区大小。您需要指定完整的缓冲区大小(修改前a1 的值)。此外,在调用wcsncpy() 后,您需要更新a1 以指定实际复制的字符数。如果代码在真实姓名长度不是5个字符的计算机上运行,​​修改后的缓冲区数据将无法正确解释。
    【解决方案2】:

    除了 Wouter 所说的之外,您对 MyGetComputerNameW() 的实现还有其他一些逻辑漏洞。即误用wcsncpy()的输入值,复制修改后的数据后不更新a1的值。

    试试这样的:

    BOOL WINAPI MyGetComputerNameW(LPWSTR a0, LPDWORD a1)
    {
        DWORD size = *a1;
        BOOL rv = pCPNM(a0, a1);
        if (rv)
        {
            //if (wcscmp(a0, L"DKKKK") == 0)
            {
                if (size > 5)
                {
                    wcsncpy(a0, L"ABCDE", size);
                    *a1 = 5;
                }
                else
                {
                    *a1 = 6;
                    SetLastError(ERROR_BUFFER_OVERFLOW);
                    rv = FALSE;
                }
            }
        }    
        return rv;
    }
    

    【讨论】:

      猜你喜欢
      • 2019-08-12
      • 2015-03-20
      • 2019-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多