⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.cpp

📁 OICQ探索器程序源代码可找出自己的oicq所使用的端口号 可找出在线好友的ip
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
extern void AnimateShowForm(TForm*);
typedef DWORD WINAPI (*GGetTcpTable)(PMIB_TCPTABLE,PDWORD,BOOL);
typedef DWORD WINAPI (*GGetUdpTable)(PMIB_UDPTABLE,PDWORD,BOOL);
//---------------------------------------------------------------------------
VOID CALLBACK ChangeImage(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime)
{
static int index=0;
//bool delay=false;
Form1->ILIcq->Draw(Form1->SBAbout->Canvas,0,0,index,true);
Form1->SBAbout->Invalidate();
index++;
if(index>2)
	index=0;

}

unsigned long ServerToIp(char*_GServer)
{
unsigned long ip;
hostent *host;
if((ip=inet_addr(_GServer))==INADDR_NONE)
	{
		host=gethostbyname(_GServer);
		if(host)
			ip=*((unsigned long*)host->h_addr_list[0]);		
		else
			return INADDR_NONE;
	}
return ip;
}

__fastcall TForm1::TForm1(TComponent* Owner)
	 : TForm(Owner)
{
WSAData wsa;
if(WSAStartup(0x101,&wsa))
	MessageBox(Handle,"Winsock版本不可用!\n后续操作将无法进行!","",MB_OK|MB_ICONINFORMATION);
skTrace=INVALID_SOCKET;
datalen=0;
dataTime=0;
ZeroMemory(szBuffer,DataSize);
IsScan=FALSE;
SetTimer(Handle,100,500,(TIMERPROC)ChangeImage);
ZeroMemory(&notify,sizeof(notify));
notify.cbSize =sizeof(notify);
notify.hWnd =Handle;
notify.uID =1;
notify.uFlags =NIF_ICON|NIF_MESSAGE|NIF_TIP;
notify.uCallbackMessage =WM_SHELLICON;
notify.hIcon =Icon->Handle;
strcpy(notify.szTip,"TraceIcq+");
Shell_NotifyIcon(NIM_ADD,&notify);
Application->OnMinimize =Mini;
IsMini=false;
}
//---------------------------------------------------------------------------


void __fastcall TForm1::bbTraceClick(TObject *Sender)
{
AnsiString asError;
BOOL bReUse=1;
if(skTrace!=INVALID_SOCKET)
	{
		WSAAsyncSelect(skTrace,Handle,0,0);
		closesocket(skTrace);
		skTrace=INVALID_SOCKET;
	}
try
{
	iPort=edPort->Text.ToInt();
	if(iPort<=0||iPort>65535)
		throw 1;
	sock.sin_family=AF_INET;
	sock.sin_port=htons(iPort);
	if(CBAuto->Checked)
		sock.sin_addr.s_addr=LocalIp();
	else
		sock.sin_addr.s_addr=inet_addr(EDHost->Text.c_str());
	if(sock.sin_addr.s_addr==INADDR_NONE)throw 2;
	EDHost->Text =inet_ntoa(sock.sin_addr);
	skTrace=socket(AF_INET,SOCK_DGRAM,0);
	if(skTrace==INVALID_SOCKET)
		throw 3;
	if(setsockopt(skTrace,SOL_SOCKET,SO_REUSEADDR,(char*)&bReUse,sizeof(bReUse))==SOCKET_ERROR)
		throw 4;
	if(bind(skTrace,(sockaddr*)&sock,sizeof(sock))==SOCKET_ERROR)
		throw 5;
	if(WSAAsyncSelect(skTrace,Handle,WM_TRACEICQ,FD_READ|FD_CLOSE)==SOCKET_ERROR)
		throw 6;
	bbTrace->Enabled =false;
	bbCancel->Enabled =true;
	EDHost->Enabled =false;
	edPort->Enabled =false;
	mmResult->Lines->Add("已经进入监听模式!");
	PCTrace->ActivePage =TabSheet1;
	dataTime=0;
	return;
}
catch(int Err)
	{
		switch(Err)
		{
		 case 1:asError="错误的端口号\n端口号必须为1-65535";break;
		 case 2:asError="获取本机IP失败!";break;
		 case 3:asError="Winsock错误!\n创建套接字失败!";break;
		 case 4:asError="Winsock错误!\n设置套接字选项失败!";break;
		 case 5:asError="与本地名字绑定失败!\n请确认所用的IP是否有效!\n建议选中自动获取IP!";break;
		 case 6:asError="Winsock错误!\n无法进入消息模式!";break;
		}
		MessageBox(Handle,asError.c_str(),"",MB_OK|MB_ICONINFORMATION);
	}
catch(...){MessageBox(Handle,"错误的端口号\n端口号必须为1-65535","",MB_OK|MB_ICONINFORMATION);}
if(skTrace!=INVALID_SOCKET)closesocket(skTrace);
skTrace=INVALID_SOCKET;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormDestroy(TObject *Sender)
{
if(skTrace)bbCancelClick(NULL);
if(IsScan)BBEndClick(NULL);
KillTimer(Handle,100);
Shell_NotifyIcon(NIM_DELETE,&notify);
WSACleanup();
}
//---------------------------------------------------------------------------
u_long  TForm1::LocalIp()
{
	char szhBuffer[1024];
	hostent*host;
try
{
	if(gethostname(szhBuffer,1023)==SOCKET_ERROR)
		throw 1;
	host=gethostbyname(szhBuffer);
	if(host==NULL)throw 2;
	return *((u_long*)host->h_addr_list[0]);
}
catch(...)
{
return INADDR_NONE;
}
}

void __fastcall TForm1::OnTrace(TMessage& Msg)
{
static AnsiString asZero=AnsiString("");
sockaddr_in sockin;
int sockinlen;
char szErrorBuf[56];
if(skTrace==INVALID_SOCKET)return;
dataTime++;
PCTrace->ActivePage =TabSheet1;
if(WSAGETSELECTERROR(Msg.LParam))
	{
		if(WSAGETSELECTERROR(Msg.LParam)==WSAENOTSOCK)return;
		wsprintf(szErrorBuf,"网络错误,错误码:%d!",WSAGetLastError());
		mmResult->Lines->Add(szErrorBuf);
		if(CBContinue->Checked)
			bbTraceClick(NULL);
		else
			bbCancelClick(NULL);
		return;
	}
if(WSAGETSELECTEVENT(Msg.LParam)==FD_READ)
{
ZeroMemory(szBuffer,DataSize);
sockinlen=sizeof(sockin);
datalen=recvfrom(skTrace,szBuffer,DataSize,0,(sockaddr*)&sockin,&sockinlen);
if(datalen>0)
	{
		wsprintf(szText,
					"IP:%s端口:%d数据:%d字节",
					inet_ntoa(sockin.sin_addr),
					ntohs(sockin.sin_port),
					datalen);
		mmResult->Lines->Add(szText);
		if(RBBinary->Checked)
			RBBinaryClick(NULL);
		else
			RBTextClick(NULL);
	if(!CBContinue->Checked||dataTime>RepeatTime)
		bbCancelClick(NULL);
	}
else if(datalen==SOCKET_ERROR)
	{
		if(WSAGetLastError()==WSAENOTSOCK)return;
		wsprintf(szErrorBuf,"网络错误,错误码:%d!",WSAGetLastError());
		mmResult->Lines->Add(szErrorBuf);
		if(CBContinue->Checked&&dataTime<RepeatTime)
			bbTraceClick(NULL);
		else
			bbCancelClick(NULL);
		return;
	}
}
else
	bbCancelClick(NULL);
//bbCancelClick(NULL);
}
void __fastcall TForm1::bbCancelClick(TObject *Sender)
{
WSAAsyncSelect(skTrace,Handle,0,0);
closesocket(skTrace);
skTrace=INVALID_SOCKET;
bbTrace->Enabled =true;
bbCancel->Enabled =false;
edPort->Enabled =true;
if(!CBAuto->Checked)EDHost->Enabled =true;
dataTime=0;
mmResult->Lines->Add("已经退出监听模式!");
PCTrace->ActivePage =TabSheet1;
}
//---------------------------------------------------------------------------


void __fastcall TForm1::FormShow(TObject *Sender)
{
AnimateShowForm(this);
SBAbout->Invalidate();
Label1->Invalidate();
Bevel1->Invalidate();
Bevel2->Invalidate();
PCTrace->ActivePage=TabSheet1;
int j;
for(j=0;j<=16;j++)
	SGData->Cells[j][0]=IntToStr(j);
for(j=0;j<256;j++)
	SGData->Cells[0][j]=IntToStr(j);
u_long lip=LocalIp();
in_addr inaddr;
inaddr.s_addr=lip;
if(lip!=INADDR_NONE)EDHost->Text =inet_ntoa(inaddr);
}
//---------------------------------------------------------------------------


void __fastcall TForm1::CBAutoClick(TObject *Sender)
{
EDHost->Enabled =!CBAuto->Checked;
if(!CBAuto->Checked)ShowMessage("除非你的机器是多IP的电脑\n否则建议你选中自动获取IP\n以便程序自动获取IP");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::SBAboutClick(TObject *Sender)
{
ShellAbout(Handle,"TraceIcq+","作者:Bcbhua\n欢迎访问LoveBcb.yeah.net",Icon->Handle);

}
//---------------------------------------------------------------------------



void __fastcall TForm1::BBTcpClick(TObject *Sender)
{
//TCP
#define TcpNum 256
HINSTANCE hInst=LoadLibrary("iphlpapi.dll");
GGetTcpTable GetTcp;
DWORD dwSize=sizeof(MIB_TCPROW)*TcpNum+sizeof(DWORD);
char* cTmp=new char[dwSize];
TListItem*list;
in_addr inaddr;
AnsiString asState;
ZeroMemory(cTmp,dwSize);
PMIB_TCPTABLE pTcp=(PMIB_TCPTABLE)cTmp;
try
{
if(hInst==NULL)
	throw 1;
GetTcp=(GGetTcpTable)GetProcAddress(hInst,"GetTcpTable");
if(GetTcp==NULL)
	throw 2;
if(GetTcp(pTcp,&dwSize,FALSE))
{
delete[]cTmp;
cTmp=new char[dwSize];
pTcp=(PMIB_TCPTABLE)cTmp;
if(GetTcp(pTcp,&dwSize,FALSE))throw 3;
}
for(DWORD i=0;i<pTcp->dwNumEntries;i++)
{
list=LVTable->Items->Add();
inaddr.s_addr=pTcp->table[i].dwLocalAddr;
list->Caption=AnsiString(inet_ntoa(inaddr));
list->SubItems->Add(ntohs(pTcp->table[i].dwLocalPort));
if(pTcp->table[i].dwState==MIB_TCP_STATE_ESTAB)
{
	inaddr.s_addr=pTcp->table[i].dwRemoteAddr;
	list->SubItems->Add(inet_ntoa(inaddr));
	list->SubItems->Add(ntohs(pTcp->table[i].dwRemotePort));
}
else
{
	list->SubItems->Add("------");
	list->SubItems->Add("------");
}
switch(pTcp->table[i].dwState)
{
 case MIB_TCP_STATE_CLOSED:asState="已关闭";break;
 case MIB_TCP_STATE_CLOSING:asState="正在关闭";break;
 case MIB_TCP_STATE_CLOSE_WAIT:asState="等待关闭";break;
 case MIB_TCP_STATE_DELETE_TCB:asState="删除";break;
 case MIB_TCP_STATE_ESTAB:asState="已连接";break;
 case MIB_TCP_STATE_FIN_WAIT1:asState="第一次握手";break;
 case MIB_TCP_STATE_FIN_WAIT2:asState="第二次握手";break;
 case MIB_TCP_STATE_LAST_ACK:asState="最后确认";break;
 case MIB_TCP_STATE_LISTEN:asState="监听...";break;
 case MIB_TCP_STATE_SYN_RCVD:asState="同步接收";break;
 case MIB_TCP_STATE_SYN_SENT:asState="同步发送";break;
 case MIB_TCP_STATE_TIME_WAIT:asState="超时等待";break;
 default:asState="未知状态";break;
}
list->SubItems->Add(asState);
}
TListItem*nlist=LVTable->Items->Add();
nlist->Caption =AnsiString::StringOfChar('-',list->Caption.Length());
nlist->SubItems->Add(AnsiString::StringOfChar('-',list->SubItems->Strings[0].Length()));
nlist->SubItems->Add(AnsiString::StringOfChar('-',list->SubItems->Strings[1].Length()));
nlist->SubItems->Add(AnsiString::StringOfChar('-',list->SubItems->Strings[2].Length()));
nlist->SubItems->Add(AnsiString::StringOfChar('-',list->SubItems->Strings[3].Length()));
}
catch(int Error)
{
	switch(Error)
	{
	 case 1:MessageBox(Handle,"无法装载IpHlpApi.dll\n可能系统的版本太低!","",MB_OK|MB_ICONINFORMATION);
	 case 2:MessageBox(Handle,"无法取出IpHlpApi.dll中的函数地址\n可能系统的版本太低!","",MB_OK|MB_ICONINFORMATION);
	 default:
		list=LVTable->Items->Add();
		list->Caption ="--------";
		list->SubItems->Add("------");
		list->SubItems->Add("--------");
		list->SubItems->Add("------");
		list->SubItems->Add("------");
	}
}
delete[]cTmp;
if(hInst)FreeLibrary(hInst);

}
//---------------------------------------------------------------------------

void __fastcall TForm1::BBUdpClick(TObject *Sender)
{
//UDP
#define UdpNum 256
HINSTANCE hInst=LoadLibrary("iphlpapi.dll");
GGetUdpTable GetUdp;
DWORD dwSize=sizeof(MIB_UDPROW)*UdpNum+sizeof(DWORD);
char* cTmp=new char[dwSize];
TListItem*list;
in_addr inaddr;
AnsiString asState;
ZeroMemory(cTmp,dwSize);
PMIB_UDPTABLE pUdp=(PMIB_UDPTABLE)cTmp;
try
{
if(hInst==NULL)
	throw 1;
GetUdp=(GGetUdpTable)GetProcAddress(hInst,"GetUdpTable");
if(GetUdp==NULL)
	throw 2;
if(GetUdp(pUdp,&dwSize,FALSE))
{
delete[]cTmp;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -