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

📄 packetlistview.cpp

📁 网络分析工具
💻 CPP
字号:
// PacketListView.cpp : implementation file
//

#include "stdafx.h"

/*************************************************************/
/*			CPacketListView									 */
/*															 */
/*	A list view class for showing a results document with	 */
/*	a color formatted packet list.							 */
/*************************************************************/

	/*************************************************************/
	/*			Constructor / Destructor						 */
	/*************************************************************/

		//init
		CPacketListView::CPacketListView()
		{
			m_PHPOutputFile[0] = 0;
		}

		//free
		CPacketListView::~CPacketListView()
		{
		}

	/*************************************************************/
	/*			View Events										 */
	/*************************************************************/

		//list view load code
		int CPacketListView::OnCreate(LPCREATESTRUCT lpCreateStruct)
		{
			if (CListView::OnCreate(lpCreateStruct) == -1)
				return -1;

			return 0;
		}

		//selection changed
		void CPacketListView::OnLvnItemchanged(NMHDR *pNMHDR, LRESULT *pResult)
		{
			NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

			// get selected item
			POSITION p = m_listctrl.GetFirstSelectedItemPosition();
			int nItem = m_listctrl.GetNextSelectedItem(p);

			if (!(pNMListView->uNewState & LVIS_SELECTED) || (pNMListView->uOldState & LVIS_SELECTED))
				return;

			// select all packet data in that range
			CString txt = m_listctrl.GetItemText(nItem, 0);
	
			if(txt.FindOneOf(" "))
			{
				PESApp.GetMainFrm().LoadPacketView(atoi(txt), m_hHookHandle);
				return;
			}

			GetFarItem(nItem, PCKLIST_TOP);
			GetFarItem(nItem, PCKLIST_BOTTOM);

			*pResult = 0;
		}

		//initial update
		void CPacketListView::OnInitialUpdate()
		{
			DWORD dwStyle = ListView_GetExtendedListViewStyle(GetListCtrl());

			dwStyle |= LVS_EX_FULLROWSELECT;

			ListView_SetExtendedListViewStyle( GetListCtrl(), dwStyle);
		}

		// VIEW WRAPPER CODE
		
			BOOL CPacketListView::PreCreateWindow(CREATESTRUCT& cs)
			{
				cs.style |= LVS_REPORT | LVS_NOSORTHEADER ;

				return CListView::PreCreateWindow(cs);
			}

			BOOL CPacketListView::PreTranslateMessage(MSG* pMsg)
			{
				if( ! CListView::PreTranslateMessage(pMsg) )
					return m_listctrl.PreTranslateMessage(pMsg);

				return FALSE;
			}

			LRESULT CPacketListView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
			{
				LRESULT lResult = 0;
				if (!OnWndMsg(message, wParam, lParam, &lResult))
					if( !m_listctrl.OnWndMsg(message, wParam, lParam, &lResult))
						lResult = DefWindowProc(message, wParam, lParam);
				return lResult;
			}

			BOOL CPacketListView::OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam,
										LRESULT* pLResult)
			{
				if( !CListView::OnChildNotify(message, wParam, lParam, pLResult) )
					return m_listctrl.OnChildNotify(message, wParam, lParam, pLResult) ;

				return FALSE;
			}

		//view has been brought to the front
		void CPacketListView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView)
		{
			CMainFrame &MainFrm = PESApp.GetMainFrm();

			CView::OnActivateView(bActivate, pActivateView, pDeactiveView);

			if(bActivate && m_PHPOutputFile[0])
				MainFrm.LoadPHPResultsView(m_PHPOutputFile);
		}

	/*************************************************************/
	/*			Display Methods									 */
	/*************************************************************/

		//call before adding members
		void CPacketListView::InitList()
		{
			// set up vars
			m_listctrl.m_hWnd = m_hWnd;
			m_listctrl.m_pfnSuper = m_pfnSuper;
			m_listctrl.PreSubclassWindow();

			// set up columns
			m_listctrl.InsertColumn(0, "Index", LVCFMT_LEFT, -1, 1);
			m_listctrl.InsertColumn(1, "Data", LVCFMT_LEFT, -1, 1);
			m_listctrl.InsertColumn(2, "Size", LVCFMT_LEFT, -1, 1);
			m_listctrl.InsertColumn(3, "", LVCFMT_LEFT, -1, 1);

			m_listctrl.SetColumnWidth(0, 75);
			m_listctrl.SetColumnWidth(1, 475);
			m_listctrl.SetColumnWidth(2, 55);
			m_listctrl.SetColumnWidth(3, 174);

			m_index = 0;
		}

		//insert a new packet into the list
		void CPacketListView::InsertRow(int id, char *route, char *func, int size, unsigned char *packet)
		{
			static char octal[STATIC_BUFFER_SIZE],
						hex[STATIC_BUFFER_SIZE*6],
						ascii[STATIC_BUFFER_SIZE],
						tmp[STATIC_BUFFER_SIZE];
			unsigned int i;

			// create a font for displaying (should be fixed size)
			static CFont font;

			if(!font.GetSafeHandle())
				font.CreatePointFont(60, "Courier");

			// get a formatted data dump of the packet (up to 0x40 bytes)
			full_dump(octal, hex, ascii, packet, size, 0x40);

			// row[1] column[1] = the index of the packet
			m_listctrl.InsertItem(m_index, itoa(id));

			// row[1] column[2] = packet route
			strcpy_s(tmp, STATIC_BUFFER_SIZE, "        ");
			strcat_s(tmp, STATIC_BUFFER_SIZE, route);

			m_listctrl.SetItemText(m_index, 1, route);

			// row[1] column[3] = data size
			m_listctrl.SetItemText(m_index, 2, itoa(size));

			// row[1] column[3] = winsock function
			strcpy_s(tmp, STATIC_BUFFER_SIZE, "        ");
			strcat_s(tmp, STATIC_BUFFER_SIZE, func);
			m_listctrl.SetItemText(m_index, 3, tmp);

			// set header colors and styles
			m_listctrl.SetRowBgColor(m_index, RGB(0x45, 0x45, 0x45), false);
			m_listctrl.SetRowTxtColor(m_index,RGB(0xff, 0xff, 0xff),false);
			m_listctrl.SetRowStyle(m_index, LIS_BGCOLOR | LIS_TXTCOLOR | LIS_BOLD);
			++m_index;

			// create each data row (with the octal data) column[1]
			char *ptr;
			size_t len;

			unsigned int back_ind1 = m_index;
			for(i = 0, ptr = octal, len = strlen(octal); i < len; ++i)
				if(octal[i] == '\n')
				{
					octal[i] = '\0';
					m_listctrl.InsertItem(m_index, ptr);
					m_listctrl.SetRowFont(m_index, &font, false);
					m_listctrl.SetRowBgColor(m_index, RGB(0xcf, 0xcf, 0xcf), false);
					m_listctrl.SetRowTxtColor(m_index, RGB(0x0a,0x24,0x6a), false);
					m_listctrl.SetRowStyle(m_index, LIS_BGCOLOR | LIS_TXTCOLOR);
					ptr = &octal[i+1];
					++m_index;
				}

			// add hex and ascii data (column[2] and column[3])
			unsigned int back_ind2 = back_ind1;
			for(i = 0, ptr = hex, len = strlen(hex); i <= len; ++i)
				if(hex[i] == '\n' || hex[i] == '\0')
				{
					hex[i] = '\0';
					m_listctrl.SetItemText(back_ind1, 1, ptr);
					ptr = &hex[i+1];
					++back_ind1;
				}

			for(i = 0, ptr = ascii, len = strlen(ascii); i <= len; ++i)
				if(ascii[i] == '\n' || ascii[i] == '\0')
				{
					ascii[i] = '\0';
					m_listctrl.SetItemText(back_ind2, 3, ptr);
					ptr = &ascii[i+1];
					++back_ind2;
				}

			// spacer before next item
			m_listctrl.InsertItem(m_index, " ");

			++m_index;
		}

		//gets the index of the furthest extent of the selected packet (pos)
		//in the (top_bottom) direction
		int CPacketListView::GetFarItem(int pos, int top_bottom)
		{
			int to, i;

			// make sure index is valid
			int max = m_listctrl.GetItemCount() - 1;

			if(pos < 0 || pos > max)
				return -1;

			int from = pos;

			// get topmost index
			if(top_bottom == PCKLIST_TOP)
			{
				to = 0;
				for(i = from; i >= to; --i)
				{
					if(m_listctrl.GetItemState(i, LVIS_SELECTED) != LVIS_SELECTED)
						m_listctrl.SetItemState(i, LVIS_SELECTED, LVIS_SELECTED);

					CString txt = m_listctrl.GetItemText(i, 0);
					if(txt.GetAllocLength())
						if(txt.FindOneOf(" "))
							break;
				}
			}

			// get bottommost index
			else
			{
				to = max;

				for(i = from; i <= to; ++i)
				{
					CString txt = m_listctrl.GetItemText(i, 0);
					if(txt.FindOneOf(" ") && i != from)
						break;

					if(m_listctrl.GetItemState(i, LVIS_SELECTED) != LVIS_SELECTED)
						m_listctrl.SetItemState(i, LVIS_SELECTED, LVIS_SELECTED);
				}
			}

			return -1;
		}

	/*************************************************************/
	/*			Hook Setup										 */
	/*************************************************************/

		//the associated hook handle
		HOOK_HANDLE CPacketListView::GetHookHandle()
		{
			return m_hHookHandle;
		}

		//sets the associated hook handle (only call once)
		void CPacketListView::SetHookHandle(HOOK_HANDLE hHook)
		{
			CMainFrame &MainFrm = PESApp.GetMainFrm();

			// load php output window
			if(PESApp.GetLoadPHP())
			{
				strcpy_s(m_PHPOutputFile, 512, PESApp.GetAppDirectory());
				strcat_s(m_PHPOutputFile, 512, "\\logs\\php\\");
				strcat_s(m_PHPOutputFile, 512, PESApp.GetHookExe());
				strcat_s(m_PHPOutputFile, 512, "\\output-");
				strcat_s(m_PHPOutputFile, 512, itoa(hHook));
				strcat_s(m_PHPOutputFile, 512, ".html");
				MainFrm.LoadPHPResultsView(m_PHPOutputFile);
			}
			else
				MainFrm.LoadPHPResultsView("about:blank");

			m_hHookHandle = hHook;
		}

	/*************************************************************/
	/*			Debug Helper Functions							 */
	/*************************************************************/

		#ifdef _DEBUG
			void CPacketListView::AssertValid() const
			{
				CListView::AssertValid();
			}

			#ifndef _WIN32_WCE
				void CPacketListView::Dump(CDumpContext& dc) const
				{
					CListView::Dump(dc);
				}
			#endif
		#endif


/*************************************************************/
/*			CPacketListView Message Map						 */
/*************************************************************/

IMPLEMENT_DYNCREATE(CPacketListView, CListView)

BEGIN_MESSAGE_MAP(CPacketListView, CListView)
	ON_NOTIFY_REFLECT(LVN_ITEMCHANGED, OnLvnItemchanged)
END_MESSAGE_MAP()

⌨️ 快捷键说明

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