久久久久久久性爱潮,国产又粗又猛又爽又黄下载视频,尤物国产在线一区视频,欧美日本国产在线不卡

<sup id="4uqqy"><ol id="4uqqy"></ol></sup>
  • <th id="4uqqy"></th>

      • <strike id="4uqqy"><nobr id="4uqqy"><ins id="4uqqy"></ins></nobr></strike><sup id="4uqqy"></sup><strong id="4uqqy"><u id="4uqqy"></u></strong>
        <sub id="4uqqy"></sub>

          游戲封包截取工具下載 最新軟件|熱門排行|軟件分類|軟件專題|廠商大全

          您的位置: 首頁游戲下載游戲工具 → 游戲封包截取發(fā)送工具 綠色免費(fèi)版

          游戲封包截取發(fā)送工具

          綠色免費(fèi)版 游戲封包截取發(fā)送工具 網(wǎng)友評分:8

          同類相關(guān)游戲

          游戲介紹

          游戲標(biāo)簽: 游戲封包 游戲工具

          游戲封包截取工具是一款非常好用的游戲工具,功能強(qiáng)大,使用方便,有需要的朋友不要錯過了,還等什么,快約上你的小伙伴,一起來綠色資源網(wǎng)下載使用!

          游戲封包截取工具軟件升級

          對游戲數(shù)據(jù)包進(jìn)行抓取截圖,有序要的朋友可以看看。截獲API是個很有用的東西,比如你想分析一下別人的程序是怎樣工作的。這里我介紹一下一種我自己試驗通過的方法。

          游戲封包截取工具使用方式

          首先

          我們必須設(shè)法把自己的代碼放到目標(biāo)程序的進(jìn)程空間里去。Windows Hook可以幫我們實現(xiàn)這一點。SetWindowsHookex的聲明如下:

          HHOOK SetWindowsHookEx(

          int idHook, // hook type

          HOOKPROC lpfn, // hook procedure

          HINSTANCE hMod, // handle to application instance

          DWORD dwThreadId // thread identifier

          );

          具體的參數(shù)含義可以翻閱msdn,沒有msdn可謂寸步難行。

          這里Hook本身的功能并不重要,我們使用它的目的僅僅只是為了能夠讓W(xué)indows把我們的代碼植入別的進(jìn)程里去。hook Type我們?nèi)芜x一種即可,只要保證是目標(biāo)程序肯定會調(diào)用到就行,這里我用的是WH_CALLWNDPROC。lpfn和hMod分別指向我們的鉤子代碼及其所在的dll,dwThreadId設(shè)為0,表示對所有系統(tǒng)內(nèi)的線程都掛上這樣一個hook,這樣我們才能把代碼放到別的進(jìn)程里去。

          之后,我們的代碼就已經(jīng)進(jìn)入了系統(tǒng)內(nèi)的所有進(jìn)程空間了。必須注意的是,我們只需要截獲我們所關(guān)心的目標(biāo)程序的調(diào)用,因此還必須區(qū)分一下進(jìn)程號。我們自己的鉤子函數(shù)中,第一次運(yùn)行將進(jìn)行最重要的API重定向的工作。也就是通過將所需要截獲的API的開頭幾個字節(jié)改為一個跳轉(zhuǎn)指令,使其跳轉(zhuǎn)到我們的API中來。這是最關(guān)鍵的部分。這里我想截三個調(diào)用,ws2_32.dll中的send和recv、user32.dll中的GetMessageA。

          DWORD dwCurrentPID = 0;

          HHOOK hOldHook = NULL;

          DWORD pSend = 0;

          DWORD pRecv = 0;

          GETMESSAGE pGetMessage = NULL;

          BYTE btNewBytes[8] = { 0x0B8, 0x0, 0x0, 0x40, 0x0, 0x0FF, 0x0E0, 0 };

          DWORD dwOldBytes[3][2];

          HANDLE hDebug = INVALID_HANDLE_value;

          LRESULT CALLBACK CallWndProc( int nCode, WPARAM wParam, LPARAM lParam )

          {

          DWORD dwSize;

          DWORD dwPIDWatched;

          HMODULE hLib;

          if( dwCurrentPID == 0 )

          {

          dwCurrentPID = GetcurrentProcessId();

          HWND hwndMainHook;

          hwndMainHook = ::FindWindow( 0, "MainHook" );

          dwPIDWatched = ::SendMessage( hwndMainHook, (WM_USER+100), 0, 0 );

          hOldHook = (HHOOK)::SendMessage( hwndMainHook, (WM_USER+101), 0, 0 );

          if( dwCurrentPID == dwPIDWatched )

          {

          hLib = LoadLibrary( "ws2_32.dll" );

          pSend = (DWORD)GetProcAddress( hLib, "send" );

          pRecv = (DWORD)GetProcAddress( hLib, "recv" );

          ::ReadProcessMemory( INVALID_HANDLE_value, (void *)pSend, (void *)dwOldBytes[0], sizeof(DWORD)*2, &dwSize );

          *(DWORD *)( btNewBytes + 1 ) = (DWORD)new_send;

          ::WriteProcessMemory( INVALID_HANDLE_value, (void *)pSend, (void *)btNewBytes, sizeof(DWORD)*2, &dwSize );

          ::ReadProcessMemory( INVALID_HANDLE_value, (void *)pRecv, (void *)dwOldBytes[1], sizeof(DWORD)*2, &dwSize );

          *(DWORD *)( btNewBytes + 1 ) = (DWORD)new_recv;

          ::WriteProcessMemory( INVALID_HANDLE_value, (void *)pRecv, (void *)btNewBytes, sizeof(DWORD)*2, &dwSize );

          hLib = LoadLibrary( "user32.dll" );

          pGetMessage = (GETMESSAGE)GetProcAddress( hLib, "GetMessageA" );

          ::ReadProcessMemory( INVALID_HANDLE_value, (void *)pGetMessage, (void *)dwOldBytes[2], sizeof(DWORD)*2, &dwSize );

          *(DWORD *)( btNewBytes + 1 ) = (DWORD)new_GetMessage;

          ::WriteProcessMemory( INVALID_HANDLE_value, (void *)pGetMessage, (void *)btNewBytes, sizeof(DWORD)*2, &dwSize );

          hDebug = ::CreateFile( "C:\\Trace.log", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0 );

          if( hOldHook != NULL )

          return CallNextHookEx( hOldHook, nCode, wParam, lParam );

          return 0;

          上面的鉤子函數(shù),只有第一次運(yùn)行時有用,就是把三個函數(shù)的首8字節(jié)修改一下(實際上只需要7個)。btNewBytes中的指令實際就是

          mov eax, 0x400000

          jmp eax

          這里的0x400000就是新的函數(shù)的地址,比如new_recv/new_send/new_GetMessage,此時,偷梁換柱已經(jīng)完成。再看看我們的函數(shù)中都干了些什么。以GetMessageA為例:

          BOOL _stdcall new_GetMessage( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax )

          DWORD dwSize;

          char szTemp[256];

          BOOL r = false;

          //Watch here before it's executed.

          sprintf( szTemp, "Before GetMessage : HWND 0x%8.8X, msgMin 0x%8.8X, msgMax 0x%8.8x \r\n", hWnd, wMsgFilterMin, wMsgFilterMax );

          ::WriteFile( hDebug, szTemp, strlen(szTemp), &dwSize, 0 );

          //Watch over

          // restore it at first

          ::WriteProcessMemory( INVALID_HANDLE_value, (void *)pGetMessage, (void *)dwOldBytes[2], sizeof(DWORD)*2, &dwSize );

          // execute it

          r = pGetMessage( lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax );

          // hook it again

          *(DWORD *)( btNewBytes + 1 ) = (DWORD)new_GetMessage;

          ::WriteProcessMemory( INVALID_HANDLE_value, (void *)pGetMessage, (void *)btNewBytes, sizeof(DWORD)*2, &dwSize );

          //Watch here after it's executed

          sprintf( szTemp, "Result of GetMessage is %d.\r\n", r );

          ::WriteFile( hDebug, szTemp, strlen( szTemp ), &dwSize, 0 );

          if( r )

          {

          sprintf( szTemp, "Msg : HWND 0x%8.8X, MSG 0x%8.8x, wParam 0x%8.8X, lParam 0x%8.8X\r\nTime 0x%8.8X, X %d, Y %d\r\n",

          lpMsg->hwnd, lpMsg->message,

          lpMsg->wParam, lpMsg->lParam, lpMsg->time,

          lpMsg->pt.x, lpMsg->pt.y );

          ::WriteFile( hDebug, szTemp, strlen( szTemp ), &dwSize, 0 );

          }

          strcpy( szTemp, "\r\n" );

          ::WriteFile( hDebug, szTemp, strlen( szTemp ), &dwSize, 0 );

          //Watch over

          return r;

          先將截獲下來的參數(shù),寫入到一個log文件中,以便分析。然后恢復(fù)原先保留下來的GetMessageA的首8字節(jié),然后執(zhí)行真正的GetMessageA調(diào)用,完畢后再將執(zhí)行結(jié)果也寫入log文件,然后將GetMessageA的執(zhí)行結(jié)果返回給調(diào)用者。

          整個截獲的過程就是這樣。你可以把其中的寫log部分改成你自己想要的操作。這里有個不足的地方是,截獲動作是不能夠并發(fā)進(jìn)行的,如果目標(biāo)進(jìn)程是多線程的,就會有問題。解決辦法是,可以在每次new_GetMessage中加入一個CriticalSection的鎖和解鎖,以使調(diào)用變?yōu)榇羞M(jìn)行,但這個我沒有試驗過。

          網(wǎng)絡(luò)游戲的封包技術(shù)是大多數(shù)編程愛好者都比較關(guān)注的關(guān)注的問題之一,在這一篇里就讓我們一起研究一下這一個問題吧。

          別看這是封包這一問題,但是涉及的技術(shù)范圍很廣范,實現(xiàn)的方式也很多(比如說APIHOOK,VXD,Winsock2都可以實現(xiàn)),在這里我們不可能每種技術(shù)和方法都涉及,所以我在這里以Winsock2技術(shù)作詳細(xì)講解,就算作拋磚引玉。

          由于大多數(shù)讀者對封包類編程不是很了解,我在這里就簡單介紹一下相關(guān)知識:

          APIHooK:

          由于Windows的把內(nèi)核提供的功能都封裝到API里面,所以大家要實現(xiàn)功能就必須通過API,換句話說就是我們要想捕獲數(shù)據(jù)封包,就必須先要得知道并且捕獲這個API,從API里面得到封包信息。

          VXD:

          直接通過控制VXD驅(qū)動程序來實現(xiàn)封包信息的捕獲,不過VXD只能用于win9X。

          winsock2:

          winsock是Windows網(wǎng)絡(luò)編程接口,winsock工作在應(yīng)用層,它提供與底層傳輸協(xié)議無關(guān)的高層數(shù)據(jù)傳輸編程接口,winsock2是winsock2.0提供的服務(wù)提供者接口,但只能在win2000下用。

          好了,我們開始進(jìn)入winsock2封包式編程吧。

          在封包編程里面我準(zhǔn)備分兩個步驟對大家進(jìn)行講解:1、封包的捕獲,2、封包的發(fā)送。

          首先我們要實現(xiàn)的是封包的捕獲:

          Delphi的封裝的winsock是1.0版的,很自然winsock2就用不成。如果要使用winsock2我們要對winsock2在Delphi里面做一個接口,才可以使用winsock2。

          1、如何做winsock2的接口?

          1)我們要先定義winsock2.0所用得到的類型,在這里我們以WSA_DATA類型做示范,大家可以舉一仿三的來實現(xiàn)winsock2其他類型的封裝。

          我們要知道WSA_DATA類型會被用于WSAStartup(wVersionRequired: word; var WSData: TWSAData): Integer;,大家會發(fā)現(xiàn)WSData是引用參數(shù),在傳入?yún)?shù)時傳的是變量的地址,所以我們對WSA_DATA做以下封裝:

          const

          WSADESCRIPTION_LEN = 256;

          WSASYS_STATUS_LEN = 128;

          type

          PWSA_DATA = ^TWSA_DATA;

          WSA_DATA = record

          wVersion: Word;

          wHighVersion: Word;

          szDescription: array[0..WSADESCRIPTION_LEN] of Char;

          游戲截圖

          下載地址 電腦版

          點擊報錯 軟件無法下載或下載后無法使用,請點擊報錯,謝謝!

          用戶評論

          熱門評論

          最新評論

          發(fā)表評論 查看所有評論(0)

          昵稱:
          請不要評論無意義或臟話,我們所有評論會有人工審核.
          字?jǐn)?shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)