-1

这就是我想要实现的目标;我正在连接 HttpSendRequest 函数(在 Xbox 上是 XHttp)并尝试转储 pcszHeaders 中大小为 0x1F0E 的证书。

现在的问题;它似乎只写了 4 个字节,我什至尝试分配额外的内存并将每个位设置为 0 以查看它是否是 Headers 的大小,并且它继续只写 4 个字节。我已经能够远程转储 pcszHeaders,因为我在调试时获得了地址,但我需要在运行时转储它。

我在调试时注意到的东西 - pcszHeaders 的地址仅在本地显示,直到它到达;

 printf("XHttpSendRequest: %s\n", "Creating Certificate.bin...");

一旦它到达 printf() 上面的地址更改为 0x00000000(坏 ptr),但它仍然正确写入 pcszHeaders 正确数据的第一个字节,但仅此而已。

这是整个钩子;

BOOL XHTTP_SEND_REQUEST_HOOK(
     HINTERNET hRequest,
     const CHAR *pcszHeaders,
     DWORD dwHeadersLength,
     const VOID *lpOptional,
     DWORD dwOptionalLength,
     DWORD dwTotalLength,
     DWORD_PTR dwContext)
{

  if(pcszHeaders != XHTTP_NO_ADDITIONAL_HEADERS)
  {

 printf("XHttpSendRequest: %s\n", "Creating Certificate.bin...");

  // Setup expansion 
 doMountPath("Hdd:", "\\Device\\Harddisk0\\Partition1");    

 //create our file
 HANDLE fileHandle = CreateFile("Hdd:\\Certificate.bin", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);

 //does file exist?
 if(GetLastError()!=ERROR_ALREADY_EXISTS
     ||fileHandle!=INVALID_HANDLE_VALUE)
 {
     printf("XHttpSendRequest: %s\n", "Writing to file...");

     DWORD wfbr;

     //write to our file
     if(WriteFile(fileHandle, pcszHeaders, 0x2000, &wfbr, NULL))
     {
         printf("XHttpSendRequest: %s\n", "File written!");
         printf("%s\n", "Request has ended.");

         CloseHandle(fileHandle);
         return XHttpSendRequest(hRequest, pcszHeaders, dwHeadersLength, lpOptional, dwOptionalLength, dwTotalLength, dwContext);
      }
    }
  }
}

编辑:我稍微更改了代码,并将 pcszHeaders 数据复制到我创建的另一段内存中,我的指针似乎具有所有正确的数据,我尝试将其写入文件,但它仍然只写入4字节。我什至使用 sizeof() 而不是硬编码的 0x2000。

4

2 回答 2

0

终于问题解决了!

首先,我为要存储的数据创建了一个空数组。

CHAR xtoken[0x2000];
memset(xtoken, 0, 0x2000);

钩子的第一部分是存储标头数据。

DWORD bufferLength = dwHeadersLength;
memcpy(xtoken, pcszHeaders, bufferLength);

然后我将数据写入文件

WriteFile(fileHandle, (void*)&xtoken, bufferLength, &wfbr, NULL))

成功!我猜问题是参数 2 WriteFile()不正确。

于 2014-10-18T00:19:26.567 回答
0

pcszHeaders是一个char*指针。 sizeof(pcszHeaders)在 32 位应用程序中为 4(在 64 位应用程序中为 8)。您需要改用该dwHeadersLength参数,它会告诉您pcszHeaders.

另外,您的GetLastError()检查CreateFile()是错误的。如果CreateFile()由于除 之外的任何原因而失败ERROR_ALREADY_EXISTS,则您正在输入代码块,从而将数据写入无效的文件句柄。使用时CREATE_NEW,如果文件已经存在则CreateFile()返回。INVALID_HANDLE_VALUE你不需要检查,自己GetLastError()检查INVALID_HANDLE_VALUE就足够了。如果要覆盖现有文件,请CREATE_ALWAYS改用。

WriteFile()如果失败,您也会泄漏文件句柄。

HttpSendRequest() 只有当您成功将标题写入文件时,您才会调用原始文件。如果没有标头,或者创建/写入失败,则您不允许请求继续。那是你真正想要的吗?

试试这个:

BOOL XHTTP_SEND_REQUEST_HOOK(
     HINTERNET hRequest,
     const CHAR *pcszHeaders,
     DWORD dwHeadersLength,
     const VOID *lpOptional,
     DWORD dwOptionalLength,
     DWORD dwTotalLength,
     DWORD_PTR dwContext)
{
    if (pcszHeaders != XHTTP_NO_ADDITIONAL_HEADERS)
    {
        printf("XHttpSendRequest: Creating Certificate.bin...\n");

        // Setup expansion 
        doMountPath("Hdd:", "\\Device\\Harddisk0\\Partition1");    

        //create our file
        HANDLE fileHandle = CreateFile("Hdd:\\Certificate.bin", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);

        //is file open?
        if (fileHandle != INVALID_HANDLE_VALUE)
        {
            printf("XHttpSendRequest: Writing to file...\n");

            DWORD wfbr;

            //write to our file
            if (WriteFile(fileHandle, pcszHeaders, dwHeadersLength, &wfbr, NULL))
                printf("XHttpSendRequest: File written!\n");
            else
                printf("XHttpSendRequest: Error writing to file: %u\n", GetLastError());

            CloseHandle(fileHandle);
        }
        else
            printf("XHttpSendRequest: Error creating file: %u\n", GetLastError());
    }

    printf("Request has ended.\n");
    return XHttpSendRequest(hRequest, pcszHeaders, dwHeadersLength, lpOptional, dwOptionalLength, dwTotalLength, dwContext);
}
于 2014-10-17T19:04:34.810 回答