1

私はかなり奇妙な問題を抱えています。

Xbox 360 の Winsock 機能に接続しています。送信します。この関数は、HTTP 要求情報をダンプしようとしているアプリケーションで頻繁に呼び出されます。

まず、コードを示して問題を説明します。

WritetoFile 関数。

BOOL WritetoFile(char* filename, char* buffer, DWORD len)
{

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

 //print
 printf("Creating %s\n", filename);

 //create our file
 HANDLE fileHandle = CreateFile(filename, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);

 //does file exist?
 if(fileHandle!=INVALID_HANDLE_VALUE)
 {
     //print
     printf("Writing to file... \n");

     //bytes written parameter
     DWORD wfbr;

     //write to our file
     if(WriteFile(fileHandle, (void*)&buffer, len, &wfbr, NULL))
     {
         printf("File written! (Bytes Written:%u) \n", wfbr);
     } else {
         printf("Error writing to file: (Error:%u)\n", GetLastError());
     }

    //close our file handle
    CloseHandle(fileHandle);
  } else {
      printf("Error creating file: (Error:%u)\n", GetLastError());
 }

 return true;
}

ウィンソックフック

INT WINSOCK_SEND_HOOK(SOCKET s,const char FAR *buf,int len,int flags) 
{
memcpy(SocketData.SendData, buf, len);

if(len>40)
{
    WINSOCK_SEND_COUNT +=1;

    char Filename[40];
    sprintf(Filename, "Hdd:\\Dump\\Send\\Winsock_Send_%d.txt", WINSOCK_SEND_COUNT);
    WritetoFile(Filename, SocketData.SendData, len);


} else { printf("Winsock skipped\n"); }
memset(SocketData.SendData, 0, 0x1388);

return send(s, buf, len, flags);
}

問題を説明するのはかなり難しいです。そのため、初めて .dll を実行してこの関数にフックしたとき、「Winsock_Send_85.txt」を作成しようとするまで問題なく動作しました。これを出力します:

  `Creating b0ZEK0EwSDBwSXR2RW5EdXd5ZXFnN1IrLzFQYno4RmN0ZnI2MnNnWWQwb2JXMGlYbEdQRkxGOXFkdHJabiszb1I2MG1vUFlkSjBJVW0xcFB4UzZxWEtqZEVYSjEvQmJtOHhmMUdVMDlZaHA2SUtWZTJjb0ZVU1RsUTlvYXJhc0NDOHJNUitlUDBaQmVSOTNUWVM1TU1hLzB0NlhGZmQ2dE1CVDRKVTRxdzliRUtlRmVvVGgvaVdoMUFBczBpNzhkcXNlVUYwaTlQT3B5ekdyeU9ZTzU0QWYyVXpUSXZiTDMzRWl4SXhzOUJOZDZxaWtDQUlNQmZkNHRYVTNaS2pKZngxRmd3dXE2QnRIYmkySlgxcE9vUjFyVlRpci9iZHdTZTZEOTJDSXFqNkNqM0lSaDY1N3VKUzhOQ3VxaFZpclhTUnZMZlJCN21mTS9aV2dCRUJNWHBVeUdZcGxqOVNGUÿÿexception code=0xc0000005 thread=0xf9000044 address=0x910d0a00 read=0x910d0a00 firstxbWatson: Xbox is restarting`

そしてクラッシュします。コンソールを再起動した後、もう一度実行すると正常に動作し、クラッシュしませんが、バッファが異なるデータを指していても、すべて同じ反復データであるファイルに間違ったデータを書き込んでいます。これはファイルに書き込むものです:

‘ÀÛ(       W              
 ÿÿÿÿÿÿÿÿ      ÿÿÿÿ‘Á  Hdd:\Dump\Send\Winsock_Send_87.txt   ‚i夀…Ü                  H>

その後、コンソールをすべての電源から完全に取り外すことで、これが起こらないようにする方法を発見しましたが、最初の問題に戻ります.

memcpy の不必要な使用と思われるものは無視してください。

4

1 に答える 1