www.pudn.com > PIPMasq.zip > main.cpp
// main.cpp : Defines the entry point for the console application. //www.programsalon.com, Paladin(netcom@163.net) #include "stdafx.h" #include "PIPMasq.h" #include "packet32.h" #includebool double_start_check(void); bool getAdapterInfo( const char* nicIPAddress, // input char* AdapterName, // output unsigned char* macAddr // output ) { // string that contains a list of the network adapters WCHAR TempBuffer[1024]; char adapterList[Max_Num_Adapter][512]; char adapterList2[Max_Num_Adapter][512]; char AdapterName2[512]; __u32 ipAddr; // IP Address __u32 maskAddr; // Mask (Subnet) Address DWORD dwVersion=GetVersion(); DWORD dwWindowsMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion))); // Windows NT if (!(!(dwVersion >= 0x80000000 && dwWindowsMajorVersion >= 4))) return false; ULONG AdapterLength = 1024; memset(TempBuffer,0, sizeof(TempBuffer)); memset(adapterList,0, sizeof(adapterList)); memset(adapterList2,0, sizeof(adapterList2)); PacketGetAdapterNames((char *)TempBuffer,&AdapterLength); WCHAR *temp,*temp1; temp=TempBuffer; temp1=TempBuffer; int i = 0; while ((*temp!='\0')||(*(temp-1)!='\0')) { if (*temp=='\0') { memcpy(adapterList[i],temp1,(temp-temp1)*2); temp1=temp+1; i++; } temp++; } // Change adapterList the part of "/" to "//" for Windows NT int AdapterNum = i; for (i=0;i j ; k--) { *(temp1 + k + 1) = *(temp1 + k); } *(temp + 1) = 0x005c; // add "/" temp++; adapterList2Length++; } j++; temp++; } } __u32 nicAddr = htonl(inet_addr(nicIPAddress)); for (i=0;i hFile == INVALID_HANDLE_VALUE)) { DWORD dwErrorCode=GetLastError(); return false; } // Check the Adapter Type (It should be Ethernet) NetType netType; PacketGetNetType(temp_lpAdapter, &netType); if (netType.LinkType != NdisMedium802_3) return false; // Get the MAC Address PACKET_OID_DATA pod; pod.Oid = OID_802_3_PERMANENT_ADDRESS; pod.Length = ETH_ALEN /* sizeof(macAddr) */; if (PacketRequest(temp_lpAdapter, 0, &pod) == NULL) { return false; } memcpy(macAddr, pod.Data, pod.Length); PacketCloseAdapter(temp_lpAdapter); return true; } } return false; } unsigned int __stdcall _outWardThread(void *wardInfo) { struct wardInfo *wi = (struct wardInfo *)wardInfo; COutward _outWard( wi->tableMgr, wi->portMgr, wi->arpMgr, wi->psuedIF, wi->threadMgr, wi->ftpMgr, wi->lanIPAddr, wi->wanIPAddr, wi->subWanIPAddr, wi->defaultWanGWAddr); _outWard.start(); return(0); } unsigned int __stdcall _inWardThread(void *wardInfo) { struct wardInfo *wi = (struct wardInfo *)wardInfo; CInward _inWard( wi->tableMgr, wi->portMgr, wi->arpMgr, wi->pingSvr, wi->psuedIF, wi->threadMgr, wi->lanIPAddr, wi->wanIPAddr, wi->pingDown ); try { _inWard.start(); } catch(panic panic) { int i=0; // revist } return(0); } unsigned int __stdcall _timeMgrThread(void *wardInfo) { struct wardInfo *wi = (struct wardInfo *)wardInfo; TimeMgr _timeMgr( wi->tableMgr, wi->threadMgr); _timeMgr.start(); return(0); } unsigned int __stdcall _consoleMgrThread(void *wardInfo) { struct wardInfo *wi = (struct wardInfo *)wardInfo; ConsoleMgr _consoleMgr( wi->tableMgr, wi->threadMgr, wi->pseudIPAddr, wi->lanIPAddr, wi->wanIPAddr, wi->subWanIPAddr, wi->defaultWanGWAddr, wi->pingDown ); _consoleMgr.start(); return(0); } struct wardInfo wi; bool getDefaultGWMacAddr( char* wanIPAddr, char* subWanIPAddr, char* defaultWanGWAddr, unsigned char* defaultGWMacAddr) { CArp _carp(wanIPAddr, subWanIPAddr, defaultWanGWAddr); if (_carp.isArpVaild == false) return false; __u32 defaultWanGWAddr_u32 = inet_addr(defaultWanGWAddr); if (_carp.arpSendRecv(defaultWanGWAddr_u32, (char*)defaultGWMacAddr) == false) return false; return true; } bool loadNetInfo( char* pseudIPAddr, char* wanIPAddr, char* subWanIPAddr, char* defaultWanGWAddr, char* lanIPAddr, bool* pingDown ) { // You should prepare the configuration file that is named "pipmasq.cfg" // // PSEUD=15.2.117.199 // OUTER=15.2.117.197 // NETWORK=255.255.248.0 // GATEWAY=15.2.112.1 // INTRA=192.168.0.2 memset(pseudIPAddr, 0, 16); memset(wanIPAddr, 0, 16); memset(subWanIPAddr, 0, 16); memset(defaultWanGWAddr, 0, 16); memset(lanIPAddr, 0, 16); FILE *f; char string[200]; char buffer[MAX_PATH]; int counter = 0; if (GetCurrentDirectory(MAX_PATH, buffer) == 0) return false; char configFileName[MAX_PATH]; strcpy(configFileName, buffer); strcat(configFileName, "\\pipmasq.cfg"); f = fopen(configFileName,"r"); if (!f) { strcat(configFileName, " is not found.\n"); return false; } while((string[counter++] = fgetc(f)) != EOF); counter--; string[counter] = NULL; fclose(f); bool pseudIPAddr_flag = false; bool wanIPAddr_flag = false; bool subWanIPAddr_flag = false; bool defaultWanGWAddr_flag = false; bool lanIPAddr_flag = false; char seps[] = "= \t\n"; char *token; token = strtok( string, seps ); while( token != NULL ) { if (strcmp(token,"PSEUD") == 0) { if ((token = strtok( NULL, seps )) == NULL) return false; strcpy(pseudIPAddr, token); pseudIPAddr_flag = true; } else if (strcmp(token,"OUTER") == 0) { if ((token = strtok( NULL, seps )) == NULL) return false; strcpy(wanIPAddr, token); wanIPAddr_flag = true; } else if (strcmp(token,"NETWORK") == 0) { if ((token = strtok( NULL, seps )) == NULL) return false; strcpy(subWanIPAddr, token); subWanIPAddr_flag = true; } else if (strcmp(token,"GATEWAY") == 0) { if ((token = strtok( NULL, seps )) == NULL) return false; strcpy(defaultWanGWAddr, token); defaultWanGWAddr_flag = true; } else if (strcmp(token,"INTRA") == 0) { if ((token = strtok( NULL, seps )) == NULL) return false; strcpy(lanIPAddr, token); lanIPAddr_flag = true; } else if (strcmp(token,"PINGDOWN") == 0) { if ((token = strtok( NULL, seps )) == NULL) return false; if ((strcmp(token,"ON") == 0)|| (strcmp(token,"on") == 0)) *pingDown = true; } token = strtok( NULL, seps ); } if (pseudIPAddr_flag & wanIPAddr_flag & subWanIPAddr_flag & defaultWanGWAddr_flag & lanIPAddr_flag) { return true; } else { return false; } } void openingMessage(void) { cout <<"==========================================================="<< endl; cout <<" "<< endl; cout <<" "<< endl; cout <<" Pseud IP Masquerade on Win32 "<< endl; cout <<" "<< endl; cout <<" Ver " << VERSION << endl; cout <<" "<< endl; cout <<" Tomoichi Ebata "<< endl; cout <<" "<< endl; cout <<" http://www.ff.iij4u.or.jp/~ebata/soft/pipmasq/ "<< endl; cout <<" "<< endl; cout <<" "<< endl; cout <<" This product includes software developed by "<< endl; cout <<" the Politecnico di Torino, and its contributors. "<< endl; cout <<" "<< endl; cout <<" http://netgroup-serv.polito.it/winpcap/ "<< endl; cout <<" "<< endl; cout <<" "<< endl; cout <<"==========================================================="<< endl; } void _sigCatch(int sig) { printf("\n'Ctrl-c' is not available now. Try 'exit' \n"); signal(SIGINT,_sigCatch); } #if _NTS DWORD ServiceThread(LPDWORD param) // This is for NT Service #else int main(void) #endif { if (double_start_check() == false) { openingMessage(); printf("\n\n"); printf("Another PIPMasq has already started.\n"); printf("\n"); printf("Existing"); // Waiting time to show the above message to user for (int i=0; i<4; i++) { printf("."); Sleep(500); } return -1; } signal(SIGINT,_sigCatch); openingMessage(); char lanIPAddr[16]; char wanIPAddr[16]; char subWanIPAddr[16]; char defaultWanGWAddr[16]; char pseudIPAddr[16]; bool pingDown = false; if (!loadNetInfo( pseudIPAddr, wanIPAddr, subWanIPAddr, defaultWanGWAddr, lanIPAddr, &pingDown )) { printf("loadNetInfo failed! pseudIPAddr:%s, wanIPAddr:%s, subWanIPAddr:%s,defaultWanGWAddr:%s, lanIPAddr:%s\n", pseudIPAddr, wanIPAddr, subWanIPAddr, defaultWanGWAddr, lanIPAddr); return -1; } unsigned char defaultGWMacAddr[ETH_ALEN]; printf("config: pseudIPAddr:%s, wanIPAddr:%s, subWanIPAddr:%s,defaultWanGWAddr:%s, lanIPAddr:%s\n", pseudIPAddr, wanIPAddr, subWanIPAddr, defaultWanGWAddr, lanIPAddr); if (getDefaultGWMacAddr( wanIPAddr, subWanIPAddr, defaultWanGWAddr, defaultGWMacAddr) == false) return -1; PortMgr _portMgr; TableMgr _tableMgr(&_portMgr); FtpMgr _ftpMgr(&_tableMgr, &_portMgr, pseudIPAddr); PseudIF _pseudIF(wanIPAddr, pseudIPAddr, subWanIPAddr, defaultGWMacAddr); ArpMgr _arpMgr(&_pseudIF); PingServer _pingSvr(&_pseudIF); ThreadMgr _threadMgr; wi.tableMgr = &_tableMgr; wi.portMgr = &_portMgr; wi.arpMgr = &_arpMgr; wi.pingSvr = &_pingSvr; wi.psuedIF = &_pseudIF; wi.threadMgr = &_threadMgr; wi.pseudIPAddr = pseudIPAddr; wi.lanIPAddr = lanIPAddr; wi.wanIPAddr = wanIPAddr; wi.subWanIPAddr = subWanIPAddr; wi.defaultWanGWAddr = defaultWanGWAddr; wi.pingDown = pingDown; wi.ftpMgr = &_ftpMgr; HANDLE threadHandle[3]; unsigned threadID; // Start Outward thread threadHandle[0] = (HANDLE)_beginthreadex(NULL, 0, &_outWardThread, &wi, 0, &threadID); // Start Inward thread threadHandle[1] = (HANDLE)_beginthreadex(NULL, 0, &_inWardThread, &wi, 0, &threadID); // Start TimeMgr thread threadHandle[2] = (HANDLE)_beginthreadex(NULL, 0, &_timeMgrThread, &wi, 0, &threadID); #if _NTS #else HANDLE threadHandleConsole; unsigned threadIDConsole; // Start ConsoleMgr thread threadHandleConsole = (HANDLE)_beginthreadex(NULL, 0, &_consoleMgrThread, &wi, 0, &threadIDConsole); #endif WaitForMultipleObjects(3, threadHandle, TRUE, INFINITE); for(int i = 0; i < 3; i++) { CloseHandle(threadHandle[i]); } #if _NTS #else // Force to finish ConsoleMgr TerminateThread(threadHandleConsole,0); CloseHandle(threadHandleConsole); #endif printf("\n\nStart Terminating.......\n"); printf("Please wait a few seconds to terminate completely.....\n\n\n"); return 0; }