これが私が達成しようとしていることです。私は 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() を使用したこともあります。