Lynr 10 發表於 August 29, 2011 檢舉 Share 發表於 August 29, 2011 不知道各位有沒有聽過虛擬區域網路老實說我不太確定這個名詞適不適合用在我正在開發的程式上因為我覺得在某些方面看來似乎兩者並不完全相同有許多單機的遊戲都會提供可以在區域網路連線的功能也出現了一些可以透過各種方式讓遊戲也可以在網際網路上連線的程式有些模擬了一個虛擬的網路卡有些則是Hook遊戲網路連線的API我目前是採用Hook API的方式或者說是我只能採用這種方式畢竟要怎樣虛擬一個硬體裝置我是連點皮毛都不知道目前是把它用在魔獸爭霸3上有一款叫做garena的軟體也是有這種功能而且它的規模似乎挺大的或者是大陸也有許多類似的軟體我本身就時常玩魔獸爭霸3當作悠閒只是那些平台上的玩家的水準真令人不敢領教惡意的謾罵或是人身攻擊幾乎是隨處可見我又剛好對程式設計頗有興趣的我就想試著寫寫看我第一次知道Hook API這種東西大概是在三年前而這一次我還是第一次把它付諸實行看了三年的瑣碎文章都沒做出什麼來而這次只花了一個禮拜就一口氣寫出來了我是覺得寫的過程挺多阻礙的說起程式語言我似乎沒有很正式的學過什麼好像只在高一的電腦課聽了點幾乎都沒什麼幫助的東西老師連什麼叫做型別什麼叫做變數都沒提到同學們只是依樣畫葫蘆罷了前些陣子我看到了這些文章http://blog.ez2learn.com/category/chinese-articles/我想我或許更幸運了些畢竟我至少比他小個五六歲或許是個更好的世代也許是看了這篇我才在暑假的最後幾天寫了出來其實寫的過程有很多東西我都是一知半解的更何況C語言我其實根本不會多少我目前只完成到可以Hook API而已大致的作法是用CreateRemoteThread讓遊戲去呼叫LoadLibrary把我編寫的DLL載入到遊戲的程序中在Dllmain的地方再去修改遊戲的IAT讓遊戲在呼叫API時先跳到我的函式在跳到API去執行這個過程我就可以攔截到呼叫API的參數或是修改等等我目前大致知道這遊戲是透過用255.255.255.255廣播來在區域網路散布訊息的我想攔截這個訊息將它發送到網路網路特定的電腦上或許就可以了只是沒有適合的方式測試不過我想是可以的那些部分都是用C語言寫的或許混雜一些C++的剩下的部分我可能會想要用VB.Net其實說了以上這麼多我只是想說一下為什麼想寫這個程式而已我是想要看看有沒有願意參與開發的因為我其實真的蠻想完成它的不過我覺得要做到真的能讓多人連線還能保證它的穩定性不是一個人可以完成的我前面也說了對於程式設計我大概只能算是入門中的入門不管會什麼語言都可以或者說是完全不會也沒關係任何事都會有一個開始的更何況我覺得我需要許多意見我目前還沒有寫過任何程式是由多人一起編寫的我在想人多一點或許會更有趣感覺有點像是看電影應該很少有人會一個人去看電影的吧其實我蠻久之前就知道有這個論壇了只是第一次這麼仔細注意它是為了打現在這篇主題感覺在這裡或許比較容易找到感興趣的人雖然沒有什麼必要性不過還是打出我目前寫的部分寫的方式或許會有些愚蠢的部分可能也不是相當完美不過至少能正確執行了以下是執行檔#include "stdafx.h"DWORD Fix ();DWORD Injection (LPCTSTR, LPCTSTR, LPCTSTR, LPHANDLE, LPHANDLE);DWORD ReadThread(LPHANDLE);int _tmain (int argc, _TCHAR* argv[]){ DWORD Code; Code = Fix (); if (Code != 0) { return Code; } HANDLE OutputRead; HANDLE InputWrite; Code = Injection (_T("C:\\Warcraft III\\War3.exe"), _T("-window"), _T("Dll.dll"), &OutputRead, &InputWrite); if (Code != 0) { return Code; } SECURITY_ATTRIBUTES sa; HANDLE ReadThreadHandle = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)ReadThread, &OutputRead, 0, NULL); CloseHandle (ReadThreadHandle); while (TRUE) { Sleep(INFINITE); } return 0;}DWORD ReadThread (LPHANDLE OutputRead){ while (TRUE) { if (PeekNamedPipe (*OutputRead, NULL, 0, NULL, NULL, NULL)) { LPSTR Buffer = new CHAR[256]; DWORD Read; ReadFile (*OutputRead, Buffer, 255, &Read, NULL); Buffer[Read] = '\0'; printf ("%s",Buffer); fflush (stdout); } else { Sleep(200); } }}DWORD Fix(){ LPTSTR WorkDirectory = new TCHAR[MAX_PATH]; DWORD WorkDirectoryBufferLength = GetModuleFileName (NULL, WorkDirectory, MAX_PATH); if (WorkDirectoryBufferLength == 0) { return GetLastError (); } DWORD i = WorkDirectoryBufferLength - 1; for (; i >= 0 ; i--) { if (WorkDirectory[i] == '\\') { WorkDirectory[i] = '\0'; break; } } if (SetCurrentDirectory (WorkDirectory) == FALSE) { return GetLastError (); } return 0;}DWORD Injection(LPCTSTR ExeFile, LPCTSTR ExeCmd, LPCTSTR DllFile, LPHANDLE OutputRead, LPHANDLE InputWrite){ DWORD ExePathBufferLength = GetFullPathName (ExeFile, 0, NULL, NULL); if (ExePathBufferLength == 0) { return GetLastError (); } LPTSTR ExeFilePath = new TCHAR [ExePathBufferLength]; LPTSTR ExeFileName; DWORD ExePathLength = GetFullPathName (ExeFile, ExePathBufferLength, ExeFilePath, &ExeFileName); if (ExePathLength == 0) { return GetLastError (); } DWORD ExeDirectoryLength = ExePathLength - wcslen (ExeFileName) - 1; LPTSTR ExeFileDirectory = new TCHAR [ExeDirectoryLength + 1]; wcsncpy_s (ExeFileDirectory, ExeDirectoryLength + 1, ExeFilePath, ExeDirectoryLength); DWORD DllPathBufferLength = GetFullPathName (DllFile, 0, NULL, NULL); if (DllPathBufferLength == 0) { return GetLastError (); } LPTSTR DllFilePath = new TCHAR [DllPathBufferLength]; LPTSTR DllFileName; DWORD DllPathLength = GetFullPathName (DllFile, DllPathBufferLength, DllFilePath, &DllFileName); if (DllPathLength == 0) { return GetLastError (); } DWORD DllDirectoryLength = DllPathLength - wcslen (DllFileName) - 1; LPTSTR DllFileDirectory = new TCHAR [DllDirectoryLength + 1]; wcsncpy_s (DllFileDirectory, DllDirectoryLength + 1, DllFilePath, DllDirectoryLength); DWORD CommandLength = ExePathLength + wcslen (ExeCmd) + 3; LPTSTR Command = new TCHAR [CommandLength + 1]; wcscpy_s (Command, CommandLength + 1, _T("\"")); wcscat_s (Command, CommandLength + 1, ExeFilePath); wcscat_s (Command, CommandLength + 1, _T("\" ")); wcscat_s (Command, CommandLength + 1, ExeCmd); HANDLE InputRead,OutputWrite; SECURITY_ATTRIBUTES sa; sa.nLength = sizeof (SECURITY_ATTRIBUTES); sa.bInheritHandle = TRUE; sa.lpSecurityDescriptor = NULL; CreatePipe (&InputRead, InputWrite, &sa, 0); CreatePipe (OutputRead, &OutputWrite, &sa, 0); STARTUPINFO StarupInfo = {NULL}; StarupInfo.cb = sizeof (STARTUPINFO); StarupInfo.dwFlags = STARTF_USESTDHANDLES; StarupInfo.hStdInput = InputRead; StarupInfo.hStdOutput = OutputWrite; StarupInfo.hStdError = OutputWrite; PROCESS_INFORMATION ProcessInfo; if (!CreateProcess (ExeFilePath, Command, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS | CREATE_SUSPENDED, NULL, ExeFileDirectory, &StarupInfo, &ProcessInfo)) { return GetLastError (); } LPVOID DllPathMemory = VirtualAllocEx (ProcessInfo.hProcess, NULL, sizeof (TCHAR) * DllPathBufferLength, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); if (DllPathMemory == NULL) { return GetLastError (); } if (!WriteProcessMemory (ProcessInfo.hProcess, DllPathMemory, DllFilePath, sizeof (TCHAR) * DllPathBufferLength, NULL)) { return GetLastError (); } HANDLE RemoteThreadHandle = CreateRemoteThread (ProcessInfo.hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)GetProcAddress (GetModuleHandle (_T("kernel32.dll")), "LoadLibraryW"), DllPathMemory, 0, NULL); if (RemoteThreadHandle == NULL) { return GetLastError (); } if (WaitForSingleObject (RemoteThreadHandle, INFINITE) != WAIT_OBJECT_0) { return GetLastError (); } VirtualFreeEx (ProcessInfo.hProcess, DllPathMemory, sizeof (TCHAR) * DllPathBufferLength, MEM_RELEASE); ResumeThread (ProcessInfo.hThread); CloseHandle(InputRead); CloseHandle(OutputWrite); CloseHandle(RemoteThreadHandle); CloseHandle(ProcessInfo.hProcess); CloseHandle(ProcessInfo.hThread); return 0;}以下是DLL#include "stdafx.h"void Hook (LPCWSTR, LPCWSTR, LPCSTR, PROC);HMODULE WINAPI MyLoadLibraryA (__in LPCSTR);BOOL APIENTRY DllMain (HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved){ switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: printf("HOOK\n"); fflush(stdout); Hook (NULL, _T("kernel32.dll"), "LoadLibraryA", GetProcAddress (GetModuleHandle (_T("DLL.dll")), "MyLoadLibraryA")); break; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE;}void Hook (LPCWSTR module, LPCWSTR dll, LPCSTR proc, PROC m){ HMODULE hModule = GetModuleHandle (module); ULONG Size; PIMAGE_IMPORT_DESCRIPTOR pid = (PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData (hModule, TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, &Size); while (pid->Name) { LPTSTR hd = new TCHAR[256]; MultiByteToWideChar (CP_ACP,0,(LPCSTR)((LPBYTE)hModule+pid->Name),-1,hd,256); if (lstrcmpi (hd, dll) == 0) { PIMAGE_THUNK_DATA ptd = (PIMAGE_THUNK_DATA)((LPBYTE)hModule + pid->FirstThunk); while (ptd->u1.Function) { PROC *fe = (PROC*)&(ptd->u1.Function); if (*fe == GetProcAddress (GetModuleHandle (dll), proc)) { MEMORY_BASIC_INFORMATION mi; VirtualQuery (fe, &mi,sizeof (mi)); VirtualProtect (mi.BaseAddress, mi.RegionSize, PAGE_READWRITE, &mi.Protect); WriteProcessMemory (GetCurrentProcess(), fe, &m, sizeof(PROC*), NULL); VirtualProtect (mi.BaseAddress, mi.RegionSize, mi.Protect, &mi.Protect); } ptd++; } } pid++; }}HMODULE WINAPI MyLoadLibraryA (__in LPCSTR lpLibFileName){ HMODULE Dll = LoadLibraryA (lpLibFileName); if (lstrcmpiA (lpLibFileName, "Game.dll") == 0) { Hook (_T("Game.dll"), _T("wsock32.dll"), "accept", GetProcAddress (GetModuleHandle (_T("DLL.dll")), "Myaccept"));//連入 Hook (_T("Game.dll"), _T("wsock32.dll"), "bind", GetProcAddress (GetModuleHandle (_T("DLL.dll")), "Mybind"));//綁定 //Hook (_T("Game.dll"), _T("wsock32.dll"), "closesocket", GetProcAddress (GetModuleHandle (_T("DLL.dll")), "Myclosesocket")); Hook (_T("Game.dll"), _T("wsock32.dll"), "connect", GetProcAddress (GetModuleHandle (_T("DLL.dll")), "Myconnect"));//連接 //Hook (_T("Game.dll"), _T("wsock32.dll"), "getpeername", GetProcAddress (GetModuleHandle (_T("DLL.dll")), "Mygetpeername")); //Hook (_T("Game.dll"), _T("wsock32.dll"), "getsockname", GetProcAddress (GetModuleHandle (_T("DLL.dll")), "Mygetsockname")); //Hook (_T("Game.dll"), _T("wsock32.dll"), "htons", GetProcAddress (GetModuleHandle (_T("DLL.dll")), "Myhtons")); //Hook (_T("Game.dll"), _T("wsock32.dll"), "inet_addr", GetProcAddress (GetModuleHandle (_T("DLL.dll")), "Myinet_addr")); //Hook (_T("Game.dll"), _T("wsock32.dll"), "inet_ntoa", GetProcAddress (GetModuleHandle (_T("DLL.dll")), "Myinet_ntoa")); Hook (_T("Game.dll"), _T("wsock32.dll"), "ioctlsocket", GetProcAddress (GetModuleHandle (_T("DLL.dll")), "Myioctlsocket"));//設定 Hook (_T("Game.dll"), _T("wsock32.dll"), "listen", GetProcAddress (GetModuleHandle (_T("DLL.dll")), "Mylisten"));//接聽 //Hook (_T("Game.dll"), _T("wsock32.dll"), "ntohl", GetProcAddress (GetModuleHandle (_T("DLL.dll")), "Myntohl")); //Hook (_T("Game.dll"), _T("wsock32.dll"), "ntohs", GetProcAddress (GetModuleHandle (_T("DLL.dll")), "Myntohs")); Hook (_T("Game.dll"), _T("wsock32.dll"), "recv", GetProcAddress (GetModuleHandle (_T("DLL.dll")), "Myrecv"));//接收 Hook (_T("Game.dll"), _T("wsock32.dll"), "recvfrom", GetProcAddress (GetModuleHandle (_T("DLL.dll")), "Myrecvfrom"));//接收 Hook (_T("Game.dll"), _T("wsock32.dll"), "select", GetProcAddress (GetModuleHandle (_T("DLL.dll")), "Myselect"));//非同步 Hook (_T("Game.dll"), _T("wsock32.dll"), "send", GetProcAddress (GetModuleHandle (_T("DLL.dll")), "Mysend"));//發送 Hook (_T("Game.dll"), _T("wsock32.dll"), "sendto", GetProcAddress (GetModuleHandle (_T("DLL.dll")), "Mysendto"));//發送 Hook (_T("Game.dll"), _T("wsock32.dll"), "setsockopt", GetProcAddress (GetModuleHandle (_T("DLL.dll")), "Mysetsockopt"));//設定 Hook (_T("Game.dll"), _T("wsock32.dll"), "socket", GetProcAddress (GetModuleHandle (_T("DLL.dll")), "Mysocket"));//建立 //Hook (_T("Game.dll"), _T("wsock32.dll"), "gethostbyname", GetProcAddress (GetModuleHandle (_T("DLL.dll")), "Mygethostbyname")); //Hook (_T("Game.dll"), _T("wsock32.dll"), "gethostname", GetProcAddress (GetModuleHandle (_T("DLL.dll")), "Mygethostname")); //Hook (_T("Game.dll"), _T("wsock32.dll"), "WSAGetLastError", GetProcAddress (GetModuleHandle (_T("DLL.dll")), "MyWSAGetLastError")); //Hook (_T("Game.dll"), _T("wsock32.dll"), "WSAStartup", GetProcAddress (GetModuleHandle (_T("DLL.dll")), "MyWSAStartup")); //Hook (_T("Game.dll"), _T("wsock32.dll"), "WSACleanup", GetProcAddress (GetModuleHandle (_T("DLL.dll")), "MyWSACleanup")); } return Dll;}以下是DLL的匯出函式#include "stdafx.h"//接受SOCKET PASCAL FAR Myaccept (__in SOCKET s, __out_bcount_opt(*addrlen) struct sockaddr FAR *addr, __inout_opt int FAR *addrlen){ printf("Call accept\n Socket:%x\n", s); fflush(stdout); SOCKET r = accept (s, addr, addrlen); printf(" Socket:%x\n Addr:%s\n Port:%d\n", r, inet_ntoa(((sockaddr_in*)addr)->sin_addr), ((sockaddr_in*)addr)->sin_port); fflush(stdout); return r;}//綁定int PASCAL FAR Mybind (__in SOCKET s, __in_bcount(namelen) const struct sockaddr FAR *addr, __in int namelen){ printf("Call bind\n Socket:%x\n Addr:%s\n Port:%d\n", s, inet_ntoa(((sockaddr_in*)addr)->sin_addr), ((sockaddr_in*)addr)->sin_port); fflush(stdout); int r = bind (s, addr, namelen); printf(" bind返回:%d\n", r); fflush(stdout); return r;}//int PASCAL FAR Myclosesocket (IN SOCKET s)//{// printf ("Call closesocket\n");// return closesocket (s);//}//連接int PASCAL FAR Myconnect (__in SOCKET s, __in_bcount(namelen) const struct sockaddr FAR *name, __in int namelen){ printf("Call connect\n Socket:%x\n Addr:%s\n Port:%d\n", s, inet_ntoa(((sockaddr_in*)name)->sin_addr), ((sockaddr_in*)name)->sin_port); fflush(stdout); int r = connect (s, name, namelen); printf(" connect返回:%d\n", r); fflush(stdout); return r;}//int PASCAL FAR Mygetpeername (__in SOCKET s, __out_bcount_part(*namelen, *namelen) struct sockaddr FAR *name, __inout int FAR * namelen)//{// printf("Call getpeername\n");// printf("Socket:%x 長度:%d\n", s, namelen);// int r = getpeername (s, name, namelen);// return r;//}////int PASCAL FAR Mygetsockname (__in SOCKET s, __out_bcount_part(*namelen, *namelen) struct sockaddr FAR *name, __inout int FAR * namelen)//{// printf("Call getsockname\n");// printf("Socket:%x 長度:%d\n", s, namelen);// int r = getsockname (s, name, namelen);// return r;//}//u_short PASCAL FAR Myhtons (__in u_short hostshort)//{// printf("Call htons\n");// u_short r = htons (hostshort);// printf("%d %d\n", hostshort, r);// return r;//}//unsigned long PASCAL FAR Myinet_addr (__in const char FAR * cp)//{// printf("Call inet_addr\n");// return inet_addr (cp);//}//char FAR * PASCAL FAR Myinet_ntoa (__in struct in_addr in)//{// printf("Call inet_ntoa\n");// return inet_ntoa (in);//}//設置Socketint PASCAL FAR Myioctlsocket (__in SOCKET s, __in long cmd, __inout u_long FAR *argp){ printf("Call ioctlsocket\n Socket:%x\n Cmd:%x\n Before Argp:%d\n", s, cmd, *argp); fflush(stdout); int r = ioctlsocket (s, cmd, argp); printf(" After Argp:%d\n ioctlsocket返回:%d\n", *argp, r); fflush(stdout); return r;}//接聽int PASCAL FAR Mylisten (__in SOCKET s, __in int backlog){ printf("Call listen\n Socket:%x\n Backlog:%d\n", s, backlog); fflush(stdout); int r = listen (s, backlog); printf(" listen返回:%d\n", r); fflush(stdout); return r;}//u_long PASCAL FAR Myntohl (__in u_long netlong)//{// printf("Call ntohl\n");// return ntohl (netlong);//}//u_short PASCAL FAR Myntohs (__in u_short netshort)//{// printf("Call ntohs\n");// return ntohs (netshort);//}//接收int PASCAL FAR Myrecv (__in SOCKET s, __out_bcount_part(len, return) __out_data_source(NETWORK) char FAR * buf, __in int len, __in int flags){ printf("Call recv\n"); fflush(stdout); int r = recv (s, buf, len, flags); printf(" Socket:%x\n Flags:%d\n Data:%s\n recvfrom返回:%d\n", s, flags, buf, r); fflush(stdout); return r;}//接收int PASCAL FAR Myrecvfrom (__in SOCKET s, __out_bcount_part(len, return) __out_data_source(NETWORK) char FAR * buf, __in int len, __in int flags, __out_bcount_opt(*fromlen) struct sockaddr FAR * from, __inout_opt int FAR * fromlen){ printf("Call recvfrom\n"); fflush(stdout); int r = recvfrom (s, buf, len, flags, from, fromlen); printf(" Socket:%x\n Flags:%d\n Addr:%s\n Port:%d\n Data:%s\n recvfrom返回:%d\n", s, flags, inet_ntoa(((sockaddr_in*)from)->sin_addr), ((sockaddr_in*)from)->sin_port, buf, r); fflush(stdout); return r;}//非同步int PASCAL FAR Myselect (__in int nfds, __inout_opt fd_set FAR *readfds, __inout_opt fd_set FAR *writefds, __inout_opt fd_set FAR *exceptfds, __in_opt const struct timeval FAR *timeout){ printf("Call select\n"); fflush(stdout); int r = select (nfds, readfds, writefds, exceptfds, 0); printf(" select返回:%d\n", r); fflush(stdout); return r;}//發送int PASCAL FAR Mysend (__in SOCKET s, __in_bcount(len) const char FAR * buf, __in int len, __in int flags){ printf("Call send\n Socket:%x\n Flags:%d\n Data:%s\n", s, flags, buf); fflush(stdout); int r = send (s, buf, len, flags); printf(" send返回:%d\n", r); fflush(stdout); return r;}//發送int PASCAL FAR Mysendto (__in SOCKET s, __in_bcount(len) const char FAR * buf, __in int len, __in int flags, __in_bcount_opt(tolen) const struct sockaddr FAR *to, __in int tolen){ printf("Call sendto\n Socket:%x\n Flags:%d\n Addr:%s\n Port:%d\n Data:%s\n", s, flags, inet_ntoa(((sockaddr_in*)to)->sin_addr), ((sockaddr_in*)to)->sin_port, buf); fflush(stdout); //sockaddr_in *a = (sockaddr_in*) to; //a->sin_addr.S_un.S_addr = inet_addr("123.195.128.247"); int r = sendto (s, buf, len, flags, (sockaddr*)to, tolen); printf(" sendto返回:%d\n", r); fflush(stdout); return r;}//設定Socket選項int PASCAL FAR Mysetsockopt (__in SOCKET s, __in int level, __in int optname, __in_bcount_opt(optlen) const char FAR * optval, __in int optlen){ printf("Call setsockopt\n Socket:%x\n Level:%x\n", s, level); fflush(stdout); switch (optname) { case SO_BROADCAST: printf (" Option Name:廣播\n"); fflush(stdout); break; case SO_REUSEADDR: printf (" Option Name:重用\n"); fflush(stdout); break; default: printf(" Option Name:%d\n", optname); fflush(stdout); } printf(" Option Value:%d\n", *optval); fflush(stdout); int r = setsockopt (s, level, optname, optval, optlen); printf(" setsockopt返回:%d\n", r); fflush(stdout); return r;}//建立SocketSOCKET PASCAL FAR Mysocket (__in int af, __in int type, __in int protocol){ //AF 1 IPv4 //Type 1 TCP //Type 2 UDP //Protocol 6 TCP //Protocol 17 UDP printf("Call socket\n"); fflush(stdout); switch (af) { case AF_INET: printf (" Address Family:IPv4\n"); fflush(stdout); break; default: printf(" Address Family:%d\n", af); fflush(stdout); } switch (type) { case SOCK_STREAM: printf (" Type:TCP\n"); fflush(stdout); break; case SOCK_DGRAM: printf (" Type:UDP\n"); fflush(stdout); break; default: printf("Type:%d\n", type); fflush(stdout); } switch (protocol) { case IPPROTO_TCP: printf (" Protocol:TCP\n"); fflush(stdout); break; case IPPROTO_UDP: printf (" Protocol:UDP\n"); fflush(stdout); break; default: printf(" Protocol:%d\n", type); fflush(stdout); } SOCKET r = socket (af, type, protocol); printf(" Socket:%x\n", r); fflush(stdout); return r;}//struct hostent FAR * PASCAL FAR Mygethostbyname (__in_z const char FAR * name)//{// printf ("Call gethostbyname\n");// printf ("名稱:%s\n", name);//// hostent *r = gethostbyname (name);// if (r == 0)// {// printf ("錯誤\n");// }// else// {// printf ("域名:%s\n", r->h_name);// printf ("備用域名:%s\n", *r->h_aliases);// printf ("類型:%d\n", r->h_addrtype);// printf ("長度:%d\n", r->h_length);// printf ("地址:%s\n", *r->h_addr_list);// }// return r;//}////int PASCAL FAR Mygethostname (__out_bcount_part(namelen, return) char FAR * name, __in int namelen)//{// printf("Call gethostname\n");// return gethostname (name, namelen);//}//int PASCAL FAR MyWSAStartup (__in WORD wVersionRequired, __out LPWSADATA lpWSAData)//{// printf ("Call WSAStartup\n");// printf ("要求版本:%x.%x\n", LOBYTE (wVersionRequired), HIBYTE (wVersionRequired));// int r = WSAStartup (wVersionRequired, lpWSAData);// printf ("目前版本:%x.%x\n", LOBYTE (lpWSAData->wVersion), HIBYTE (lpWSAData->wVersion));// printf ("最高版本:%x.%x\n", LOBYTE (lpWSAData->wHighVersion), HIBYTE (lpWSAData->wHighVersion));// printf ("描述:%s\n", lpWSAData->szDescription);// printf ("狀態:%s\n", lpWSAData->szSystemStatus);// printf ("MaxSockets:%d\n", lpWSAData->iMaxSockets);// printf ("MaxUdpDg:%d\n", lpWSAData->iMaxUdpDg);// printf ("VendorInfo:%s\n", lpWSAData->lpVendorInfo);// printf ("WSAStartup返回:%d\n", r);// return r;//}//int PASCAL FAR MyWSACleanup ()//{// printf ("Call WSACleanup\n");// int r = WSACleanup ();// printf ("WSACleanup返回:%d\n", r);// return r;//}//int PASCAL FAR MyWSAGetLastError ()//{// printf ("Call WSAGetLastError\n");// int r = WSAGetLastError ();// printf ("錯誤碼:%d\n", r);// return r;//}一些標頭// stdafx.h : 可在此標頭檔中包含標準的系統 Include 檔,// 或是經常使用卻很少變更的// 專案專用 Include 檔案//#pragma once#include "targetver.h"#define WIN32_LEAN_AND_MEAN // 從 Windows 標頭排除不常使用的成員// Windows 標頭檔:#include <windows.h>#include <tchar.h>#include <stdio.h>#include <stdlib.h>#pragma comment(lib,"Dbghelp.lib")#include <Dbghelp.h>#pragma comment(lib,"wsock32.lib")#include <WinSock.h>// TODO: 在此參考您的程式所需要的其他標頭 鏈接文章 分享到其他網站
Recommended Posts
請登入後來留意見
在登入之後,您才能留意見
立即登入