-1

これが私が達成しようとしていることです。私は HttpSendRequest 関数 (Xbox では XHttp) に接続し、サイズが 0x1F0E の pcszHeaders にある証明書をダンプしようとしています。

今問題です。4バイトしか書き込まないようです。追加のメモリを割り当て、各ビットを0に設定して、ヘッダーのサイズであるかどうかを確認し、4バイトしか書き込みません。デバッグ中にアドレスを取得したため、pcszHeaders をリモートでダンプできましたが、実行時にダンプする必要があります。

デバッグ中に気づいたこと - pcszHeaders のアドレスは、到達するまでローカルにのみ表示されます。

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

上記の printf() に達すると、アドレスは 0x00000000 (bad 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 バイト。ハードコーディングされた 0x2000 の代わりに sizeof() を使用したこともあります。

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))

成功!WriteFile()問題は、パラメータ 2が間違っていたことだと思います 。

于 2014-10-18T00:19:26.567 に答える