2014-10-17 2 views
-1

Вот что я пытаюсь достичь; Я подключаюсь к функции HttpSendRequest (на Xbox это XHttp) и пытается сбросить сертификат, который находится в pcszHeaders, размер которого равен 0x1F0E.C++ WriteFile записывает только 4 байта

Теперь проблема; он только кажется, что пишет 4 байта, я даже попытался выделить дополнительную память и установить каждый бит в 0, чтобы увидеть, является ли это размером заголовков, и он продолжает писать только 4 байта. Я смог удаленно удалять файлы pcszHeaders, потому что я получил адрес во время отладки, но мне нужно сбросить его во время выполнения.

Что-то, что я замечаю во время отладки - адрес pcszHeaders отображается только в локальных сетях до тех пор, пока он не достигнет;

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

После того, как он достигнет Е() выше адрес изменяется на 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); 
     } 
    } 
    } 
} 

EDIT: Я немного изменил код, и я скопировал данные pcszHeaders в другой раздел памяти, который я создал, и мои указатели, кажется, есть все правильные данные и я попытался Записав его в файл, и он все еще записывает только 4 байта. Я даже использовал sizeof() вместо жестко закодированного 0x2000.

+0

** TL; DR; ** Используете ли вы 'sizeof ()' где-то, а не размер данных, указатель указывает на?!? –

+0

άάτα ῥεῖ - Да, я пробовал это. – Corona

+1

@Corona: В этом суть - НЕ используйте 'sizeof ()', это неправильно. –

ответ

0

Наконец проблема была решена!

Сначала я создал пустой массив для хранения данных.

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

Первая часть крючка - это сохранение данных заголовка.

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

Затем я пишу данные в файл

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

успеха! Я думаю, проблема была в том, что параметр 2 из WriteFile() был неправильным.

+1

Вам не нужен актерский состав или адрес-оператор. –

+0

Вам НЕ нужно копировать байты в локальный массив. Если вы можете читать из исходной памяти, чтобы сделать свою копию, 'WriteFile()' также может читать из исходной памяти. –

+0

Листинг и адрес оператора - это то, как я получил его на работу. Локальное хранилище предназначено для личного использования, когда вызывается другая функция. – Corona

0

pcszHeaders - char* Указатель. sizeof(pcszHeaders) - 4 в 32-битном приложении (8 в 64-битном приложении). Вместо этого вам нужно использовать параметр 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); 
} 
+0

Я пробовал код, который вы указали, и он все еще записывает только 4 байта в файл. – Corona

+0

'HttpSendRequest()' имеет как версии Ansi, так и Unicode. Возможно ли, что вы подключили версию Unicode с помощью функции Ansi? Можете ли вы показать свой код, который фактически выполняет привязку? –

+0

Это Xbox 360, а не Windows. Вот различие, показанное в SDK - http://gyazo.com/98bf25a6365ad0170e088cac555e2a7a – Corona