📄 superchargerdlg.cpp
字号:
// SuperChargerDlg.cpp : implementation file
//
#include "stdafx.h"
#include "SuperCharger.h"
#include "SuperChargerDlg.h"
#include <winsock2.h>
#include "MSTcpIP.h"
#include "IPStructs.h"
#include "ipadddel.h"
#include "DomainDlg.h"
#include "Registry.h"
#include "HostsFile.h"
// NEEDED FOR REMOVE TABS
//////////////////////////////////////////////
//#include <fstream.h> //includes <iostream.h>
#include <stdlib.h>
#include <string.h>
#include <direct.h>
//////////////////////////////////////////////
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
UINT DoRawListen(void *pptr);
int GetDNSName(char *lpDNSName, char *DottedName);
#define MAXPACKETSIZE 1600
#define SELECTARRAYSIZE 200
extern CSuperChargerDlg *g_pDlg;
int hSHandle;
static BOOL IsListening;
static BOOL DoBeep;
/////////////////////////////////////////////////////////////////////////////
// CSuperChargerDlg dialog
CSuperChargerDlg::CSuperChargerDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSuperChargerDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CSuperChargerDlg)
m_save_filename = _T("");
m_save_file_text = _T("");
m_append_box = FALSE;
m_number_received = 0;
m_total_requests = 0;
//}}AFX_DATA_INIT
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
CSuperChargerDlg::~CSuperChargerDlg()
{
//Don't forget to wipe your ass!
}
void CSuperChargerDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSuperChargerDlg)
DDX_Control(pDX, IDC_PIC1, m_Picture1);
DDX_Control(pDX, IDC_STATUS, m_edtStatus);
DDX_Control(pDX, CBO_OPT, m_cboOpt);
DDX_Control(pDX, LIST_HOSTS, m_dns_name_list);
DDX_Control(pDX, IDC_COMBO1, m_ip_address_box);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSuperChargerDlg, CDialog)
//{{AFX_MSG_MAP(CSuperChargerDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(BTN_START, OnStartButton)
ON_BN_CLICKED(BTN_STOP, OnStopButton)
ON_BN_CLICKED(BTN_SAVE, OnSaveListButton)
ON_BN_CLICKED(BTN_RESET, OnResetButton)
ON_BN_CLICKED(CHK_BEEP, OnBeep)
ON_BN_CLICKED(BTN_ADD_DOMAIN, OnAddDomain)
ON_BN_CLICKED(BTN_BROWSE, OnBrowse)
ON_NOTIFY(NM_DBLCLK, LIST_HOSTS, OnDblClkHosts)
ON_BN_CLICKED(BTN_APPLY_DUN, OnApplyDun)
ON_BN_CLICKED(BTN_HELP, OnHelp)
ON_BN_CLICKED(BTN_ADD_SUPER_HOSTS, OnAddSuperHosts)
ON_WM_DESTROY()
ON_WM_QUERYENDSESSION()
ON_BN_CLICKED(IDC_cmdQuit, OncmdQuit)
ON_WM_CLOSE()
ON_BN_CLICKED(IDC_cmdAbout, OncmdAbout)
ON_BN_CLICKED(BTN_TVTOOLBAR, OnTVToolbar)
ON_CBN_SELCHANGE(CBO_OPT, OnSelChangeOpt)
ON_CBN_SELCHANGE(IDC_COMBO1, OnSelChangeCombo1)
ON_WM_TIMER()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_LOADHOSTS_FINISHED, OnLoadHostsFinished)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSuperChargerDlg message handlers
BOOL CSuperChargerDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
if (m_Picture1.Load(MAKEINTRESOURCE(IDR_GIF1),_T("GIF"))) {
m_Picture1.Draw();
}
char szMsg[120];
struct WSAData zWSAData ;
int rc = WSAStartup ( 0x0101 , &zWSAData );
if ( rc ) {
if ( rc == WSASYSNOTREADY )
wsprintf ( szMsg , "Drivers Not Loaded!!" );
else
wsprintf ( szMsg , "Start up Error %d", rc );
::MessageBox(GetSafeHwnd(), szMsg, "Winsock Init Error",MB_OK);
return 1;
}
//char windir[64];
//GetEnvironmentVariable("windir",windir,64);
//m_save_filename = "\\temphosts";
m_save_filename = (LPCSTR)g_Global.szHosts;
m_number_received = 0;
m_total_requests = 0;
UpdateData(FALSE);
ip_entry iptable[100]; //Table of strucures containing IP addresses and subnet masks
int nNumberOfIPs = GetAllIPAddresses( &iptable[0],100);
for (int i=0; i< nNumberOfIPs; i++)
m_ip_address_box.AddString (iptable[i].ip_address);
m_ip_address_box.SetCurSel(0);
///////////////////////////////////////////////////////
CListCtrl* pList = (CListCtrl*) GetDlgItem(LIST_HOSTS);
ASSERT(pList != NULL);
pList->InsertColumn(0, _T("IP - Domain - #Comments"));
pList->SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_CHECKBOXES|LVS_EX_FLATSB|LVS_EX_FULLROWSELECT);
pList->SetColumnWidth(0,500);
CBAddStringAndData(this, CBO_OPT, _T("Append Hosts"), 0);
CBAddStringAndData(this, CBO_OPT, _T("Replace Hosts"), 1);
CBAddStringAndData(this, CBO_OPT, _T("Save List As"), 2);
m_cboOpt.SetCurSel(1);
//////////////////////////////////////////////////////////
OSVersion();
//SetDlgItemText(IDC_WINVER, WinVer);
csMaxMTU.Empty();
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
CComboBox* pCBoxMaxMTU = (CComboBox*)GetDlgItem(IDC_CBO_MAXMTU);
pCBoxMaxMTU->SetCurSel(0);
CButton* pChkMaxMTU = (CButton*)GetDlgItem(IDC_CHK_MAXMTU);
pChkMaxMTU->SetCheck(TRUE);
////////////////////////////////////////////////////////////
CComboBox* pCBoxRWIN = (CComboBox*)GetDlgItem(IDC_CBO_RWIN);
pCBoxRWIN->SetCurSel(0);
CButton* pChkRWIN = (CButton*)GetDlgItem(IDC_CHK_RWIN);
pChkRWIN->SetCheck(TRUE);
////////////////////////////////////////////////////////////
CComboBox* pCBoxTTL = (CComboBox*)GetDlgItem(IDC_CBO_TTL);
pCBoxTTL->SetCurSel(2);
CButton* pChkTTL = (CButton*)GetDlgItem(IDC_CHK_TTL);
pChkTTL->SetCheck(TRUE);
////////////////////////////////////////////////////////////
CComboBox* pCBoxSKA = (CComboBox*)GetDlgItem(IDC_CBO_SKA);
pCBoxSKA->SetCurSel(0);
CButton* pChkSKA = (CButton*)GetDlgItem(IDC_CHK_SKA);
pChkSKA->SetCheck(TRUE);
////////////////////////////////////////////////////////////
CComboBox* pCBoxKAT = (CComboBox*)GetDlgItem(IDC_CBO_KAT);
pCBoxKAT->SetCurSel(0);
CButton* pChkKAT = (CButton*)GetDlgItem(IDC_CHK_KAT);
pChkKAT->SetCheck(TRUE);
////////////////////////////////////////////////////////////
CComboBox* pCBoxKAI = (CComboBox*)GetDlgItem(IDC_CBO_KAI);
pCBoxKAI->SetCurSel(0);
CButton* pChkKAI = (CButton*)GetDlgItem(IDC_CHK_KAI);
pChkKAI->SetCheck(TRUE);
////////////////////////////////////////////////////////////
CButton* pChkAutoDiscovery = (CButton*)GetDlgItem(IDC_CHK_AUTODIS);
pChkAutoDiscovery->SetCheck(1);
SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW);
return TRUE; // return TRUE unless you set the focus to a control
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CSuperChargerDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
HCURSOR CSuperChargerDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
// Don't want dialog to close when user presses Enter.
void CSuperChargerDlg::OnOK()
{
/*
UpdateData(TRUE);
if (IsListening) {
UpdateData(TRUE);
closesocket ( hSHandle );
m_edtStatus.SetWindowText("Not Listening");
UpdateData(FALSE);
IsListening = FALSE;
::MessageBox(NULL, _T("Will Close Listening Mode\nPress Button Again!"),
_T("Must Stop Listening First!"),
MB_ICONINFORMATION|MB_OK|MB_DEFBUTTON1);
return;
}
*/
return;
}
// Handles WM_QUERYENDSESSION
BOOL CSuperChargerDlg::OnQueryEndSession()
{
// Force current operation (if any) to abort.
//m_bUserAbort = TRUE;
//if (!CDialog::OnQueryEndSession())
// return FALSE;
return TRUE;
}
void CSuperChargerDlg::OnStartButton()
{
UINT (AFX_CDECL *MyThread)(LPVOID);
#define IP_HDRINCL 2 /* header is included with data */
int rc;
struct sockaddr_in sa_in;
DWORD dwBytesReturned=0;
DWORD dwBufferLen;
ULONG rcvall = 1;
int on = 1;
CString szMsg;
if (IsListening) {
MessageBeep(100);
return;
}
UpdateData(TRUE);
hSHandle = WSASocket ( AF_INET, SOCK_RAW , 0 , NULL,0,WSA_FLAG_OVERLAPPED );
if ( hSHandle == SOCKET_ERROR )
{
szMsg.Format("socket() failed, errno=%d", WSAGetLastError());
::MessageBox(GetSafeHwnd(), szMsg,"socket",MB_OK);
return;
}
// int bufsize = 32000;
// rc = setsockopt(hSHandle,IPPROTO_RAW, SO_RCVBUF ,(char*)&bufsize,sizeof(int));
// if ( rc == SOCKET_ERROR ) {
// szMsg.Format("SetSockOpt RECVBUSSIZE Failed eroro = %d", GetLastError());
// closesocket(hSHandle);
// ::MessageBox(GetSafeHwnd(), szMsg,"setsockopt",MB_OK);
// return;
// }
sa_in.sin_family = AF_INET;
sa_in.sin_port = 0;
CString csIP;
int nDx = m_ip_address_box.GetCurSel();
m_ip_address_box.GetLBText(nDx,csIP);
sa_in.sin_addr.s_addr = inet_addr(csIP);
rc = bind ( hSHandle, (struct sockaddr *) &sa_in , sizeof( sa_in ) );
if ( rc == SOCKET_ERROR ) {
rc = WSAGetLastError();
if ( rc != WSAEINPROGRESS ) {
szMsg.Format( "bind() failed, errno=%d", rc );
::MessageBox(GetSafeHwnd(), szMsg,"BIND",MB_OK);
closesocket ( hSHandle );
return;
}
}
rc = WSAIoctl(hSHandle, SIO_RCVALL, &rcvall, sizeof(ULONG), &dwBufferLen,
sizeof(dwBufferLen),&dwBytesReturned, NULL, NULL);
if ( rc == SOCKET_ERROR ) {
rc = WSAGetLastError();
if ( rc != WSAEINPROGRESS ) {
szMsg.Format("Ioctl() failed, errno=%d\n", rc );
::MessageBox(GetSafeHwnd(), szMsg, "Network Ioctl",MB_OK);
}
}
IsListening = TRUE;
CString m_status;
m_status.Format("%s%d/%d","Listening ",m_number_received,m_total_requests);
m_edtStatus.SetWindowText((LPCSTR)m_status);
MyThread = (DoRawListen);
AfxBeginThread (MyThread , NULL );
UpdateData(FALSE);
}
void CSuperChargerDlg::OnStopButton()
{
UpdateData(TRUE);
closesocket ( hSHandle );
m_edtStatus.SetWindowText("Not Listening");
UpdateData(FALSE);
IsListening = FALSE;
}
void CSuperChargerDlg::AddName(CString name_to_add)
{
char iTemp[32];
itoa(++m_total_requests,iTemp,10);
//m_total_requests_ctrl.SetWindowText(iTemp);
//int nDx = m_dns_name_list.FindStringExact (0, name_to_add);
//int nDx = m_dns_name_list.FindItem(FindStringExact (0, name_to_add);
//if ( nDx != LB_ERR ) return; //already in list
LPCTSTR lpszmyString = name_to_add;
LVFINDINFO info;
info.flags = LVFI_PARTIAL|LVFI_STRING;
info.psz = lpszmyString;
if(m_dns_name_list.FindItem(&info) != -1)
return;
int i = m_dns_name_list.GetItemCount();
CString csData;
csData = "127.0.0.1 "+name_to_add+" #IP Blocker(tm)";
InsertIPDomain(i,csData,0);
itoa(++m_number_received,iTemp,10);
CString m_status;
if (IsListening)
{
m_status.Format("%s%d/%d","Listening ",m_number_received,m_total_requests);
m_edtStatus.SetWindowText((LPCSTR)m_status);
}
else
m_edtStatus.SetWindowText("NOT Listening");
}
UINT DoRawListen(void *pptr)
{
#define DNSPORT 53
#define MAXDNSNAMESIZE 1024
struct sockaddr saddr;
int rc,fromlen=sizeof(struct sockaddr);
PIPHEADER iphdr;
char buf[MAXPACKETSIZE],add_name[MAXDNSNAMESIZE];
CString szMsg;
while(1) {
if (IsListening == FALSE) break;
rc = recvfrom( hSHandle ,buf,MAXPACKETSIZE,NULL, &saddr, &fromlen);
if ( rc == SOCKET_ERROR ) {
rc = WSAGetLastError();
if ( rc != WSAEINPROGRESS ) {
szMsg.Format("recvfrom() failed, error =%d", rc );
return 1;;
}
}
// Your Filter goes here. Don't do too much processing,
// or you may drop packets
iphdr = (PIPHEADER) buf;
int dsnport = htons(DNSPORT);
if ((iphdr->UDP_src_port == dsnport) ||
(iphdr->UDP_DEST_port == dsnport)) {
if (DoBeep)
MessageBeep(5000);
GetDNSName(&iphdr->data[12], add_name);
g_pDlg->AddName(add_name);
}
}
closesocket ( hSHandle );
AfxEndThread(0);
return 0;
}
//DNS name in request packet is length followed by name.
//Zero length denotes end of DNS name
int GetDNSName(char *lpDNSName, char *DottedName)
{
int tot_len, len;
char *ptr1, *ptr2;
ptr1 = lpDNSName;
ptr2 = DottedName;
*ptr2 = 0;
if ( *ptr1 == 0 ) return 0;
tot_len = 0;
while ( 1 ) {
if ( *ptr1 == 0 ) break;
len = (int) *ptr1++;
tot_len += len+1;
for (int i=0; i<len; i++)
*ptr2++ = *ptr1++;
*ptr2++ = '.';
}
*ptr2--;
*ptr2 = 0;
return tot_len+1;
}
void CSuperChargerDlg::OnResetButton()
{
UpdateData(TRUE);
if (IsListening) {
UpdateData(TRUE);
closesocket ( hSHandle );
m_edtStatus.SetWindowText("Not Listening");
UpdateData(FALSE);
IsListening = FALSE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -