首页 > 其他分享 >滴水逆向笔记系列-win32总结3-48.提取图标_修改标题-49.通用控件_实现LoadPE

滴水逆向笔记系列-win32总结3-48.提取图标_修改标题-49.通用控件_实现LoadPE

时间:2024-03-16 23:22:05浏览次数:21  
标签:控件 48 vitem 49 TEXT lv hListProcess pszText ListView

第四十八课 win32 提取图标_修改标题

1.添加图标

a,.右键添加icon时不要直接新建,导入
image.png
b. 加载图标
:::info
HICON hIcon;
hIcon = LoadIcon (hAppInstance, MAKEINTRESOURCE (IDI_ICON));

  • hAppInstance 应用程序句柄
  • IDI_ICON 图标编号
  • MAKEINTRESOURCE 用这个宏的主要原因是有的资源是用序号定义的,而不是字符串.所以要把数字转换成字符串指针
    :::
    c.设置图标
case WM_INITDIALOG :				
				
		hIcon = LoadIcon (hAppInstance, MAKEINTRESOURCE (IDI_ICON));		
		//设置图标		
		SendMessage(hDlg,WM_SETICON,ICON_BIG,(DWORD)hIcon);		
		SendMessage(hDlg,WM_SETICON,ICON_SMALL,(DWORD)hIcon);		
				
		return TRUE;		

注意:
整了半天,vs新建资源的坑是真多
得多看rc文件和resource.h文件更新了吗,经常没更新上,而且不知道为什么突然没办法同时打开这两个文件

2.资源图标

  • 只加了一个图标,编译器也会自动按不同分辨率情况添加这么多个图标
  • 图标组就是对图标消息的描述

image.png

  • exe里都是unicode编码存储字符串

3.资源表

引入

图标资源的二进制数据下载下来后,就算该成ico后缀也没办法变成一个有效资源
他需要通过某种预定格式把一些数据拼在一起才能成为一个有效资源
image.png

第四十九课 win32 通用控件_实现LoadPE

1.画窗口

终于找到vs在哪可以添加按钮和子控件了,找到旁边的工具箱就有,本来给默认藏起来了
image.png
这些都是这次用到的感觉常用的设置,知道了这些其他设置应该也知道怎么找了
image.png
image.png

2.标准控件与通用控件

image.png
image.png
特别说明:

//通用控件在使用前,需要通过INITCOMMONCONTROLSEX进行初始化						
//只要在您的程序中的任意地方引用了该函数就、会使得WINDOWS的程序加载器PE Loader加载该库				
				
INITCOMMONCONTROLSEX icex;				
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);				
icex.dwICC = ICC_WIN95_CLASSES;				
InitCommonControlsEx(&icex);				

但是现在vs可以直接跑起来,至少用到现在都可以

3.向子窗口添加数据

初始化列表信息

VOID InitProcessList(HWND hwndDlg)
{
	LV_COLUMN lv;
	HWND hListProcess;

	//初始化								
	memset(&lv, 0, sizeof(LV_COLUMN));
	//获取IDC_LIST_PROCESS句柄								
	hListProcess = GetDlgItem(hwndDlg, IDC_LIST_PROCESS);
	//设置整行选中								
	SendMessage(hListProcess, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);

	//第一列								
	lv.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
	lv.pszText = TEXT("进程");				//列标题				
	lv.cx = 200;								//列宽
	lv.iSubItem = 0;
	//ListView_InsertColumn(hListProcess, 0, &lv);								
	SendMessage(hListProcess, LVM_INSERTCOLUMN, 0, (DWORD)&lv);
	//第二列								
	lv.pszText = TEXT("PID");
	lv.cx = 100;
	lv.iSubItem = 1;
	//ListView_InsertColumn(hListProcess, 1, &lv);								
	SendMessage(hListProcess, LVM_INSERTCOLUMN, 1, (DWORD)&lv);
	//第三列								
	lv.pszText = TEXT("镜像基址");
	lv.cx = 100;
	lv.iSubItem = 2;
	ListView_InsertColumn(hListProcess, 2, &lv);
	//第四列								
	lv.pszText = TEXT("镜像大小");
	lv.cx = 100;
	lv.iSubItem = 3;
	ListView_InsertColumn(hListProcess, 3, &lv);

	AddProcess(hListProcess);
}							

向列表中新增数据

LV_ITEM vitem;						
						
//初始化						
memset(&vitem,0,sizeof(LV_ITEM));						
vitem.mask = LVIF_TEXT;						
						
vitem.pszText = "csrss.exe";						
vitem.iItem = 0;						
vitem.iSubItem = 0;						
//ListView_InsertItem(hListProcess, &vitem);						
SendMessage(hListProcess, LVM_INSERTITEM,0,(DWORD)&vitem);						
						
vitem.pszText = TEXT("448");						
vitem.iItem = 0;						
vitem.iSubItem = 1;						
ListView_SetItem(hListProcess, &vitem);						
						
vitem.pszText = TEXT("56590000");						
vitem.iItem = 0;						
vitem.iSubItem = 2;						
ListView_SetItem(hListProcess, &vitem);						
						
vitem.pszText = TEXT("000F0000");						
vitem.iItem = 0;						
vitem.iSubItem = 3;						
ListView_SetItem(hListProcess, &vitem);						
						
vitem.pszText = TEXT("winlogon.exe");						
vitem.iItem = 1;						
vitem.iSubItem = 0;						
//ListView_InsertItem(hListProcess, &vitem);						
SendMessage(hListProcess, LVM_INSERTITEM,0,(DWORD)&vitem);						
						
vitem.pszText = TEXT("456");						
vitem.iSubItem = 1;						
ListView_SetItem(hListProcess, &vitem);						
						
vitem.pszText = TEXT("10000000");						
vitem.iSubItem = 2;						
ListView_SetItem(hListProcess, &vitem);						
						
vitem.pszText = TEXT("000045800");						
vitem.iSubItem = 3;						
ListView_SetItem(hListProcess, &vitem);						

注意:

  • 第16行ListView_InsertColumn其实是一个宏,实现的功能和SendMessage是一样的
  • 添加数据时第11行SendMessage()里面的LVM_INSERTITEM值需要注意,第一列才需要,后面都是LVM_SERTITEM
  • 注意添加函数要放在初始化函数里面且看看传参

4.WM_NOTIFY消息类型

用处

比如遇到下面这种情况,我们点击按钮可以通过按钮ID设置左键点击右键点击等各种事件,但是在进程子窗口内我们有很多可以点击的地方,我们很难去设置每个地方各种事件情况,所以用到了WM_NOTIFY消息类型,他可以存很多类型消息且可以拓展
image.png

  • 该消息类型与WM_COMMAND类型相似,都是由子窗口向父窗口发送的消息。
  • WM_NOTIFY可以包含比WM_COMMAND更丰富的信息
  • Windows通用组件中有很多消息,都是通过WM_NOTIFY来描述的.

WM_NOTIFY消息中的参数

如下:
:::info
wParam:控件ID
lParam:指向一个结构

typedef struct tagNMHDR {
HWND hwndFrom; //发送通知消息的控制窗口句柄
UINT idFrom; //发送通知消息的控制ID值
UINT code; //通知码,如LVM_SELCHANGED
} NMHDR;
:::
这个结构体能满足一般的要求,但能描述的信息还是有限的
解决方案:对每种不同用途的通知消息都定义另一种结构来表示

typedef struct tagNMLVCACHEHINT {						
	    NMHDR   hdr;						
	    int     iFrom;						
	    int     iTo;						
	} NMLVCACHEHINT, *PNMLVCACHEHINT;						
							
	typedef struct tagLVDISPINFO {						
	    NMHDR hdr;						
	    LVITEM item;						
	} NMLVDISPINFO, FAR *LPNMLVDISPINFO;						
							
	typedef struct _NMLVFINDITEM {						
	    NMHDR hdr;						
	    int iStart;						
	    LVFINDINFO lvfi;						
	} NMLVFINDITEM, *PNMLVFINDITEM;				

页面完整代码:

#include<windows.h>
#include "resource.h"
#include <commctrl.h>
void AddProcess(HWND hListProcess);

VOID InitProcessList(HWND hwndDlg)
{
	LV_COLUMN lv;
	HWND hListProcess;

	//初始化								
	memset(&lv, 0, sizeof(LV_COLUMN));
	//获取IDC_LIST_PROCESS句柄								
	hListProcess = GetDlgItem(hwndDlg, IDC_LIST_PROCESS);
	//设置整行选中								
	SendMessage(hListProcess, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);

	//第一列								
	lv.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
	lv.pszText = TEXT("进程");				//列标题				
	lv.cx = 200;								//列宽
	lv.iSubItem = 0;
	//ListView_InsertColumn(hListProcess, 0, &lv);								
	SendMessage(hListProcess, LVM_INSERTCOLUMN, 0, (DWORD)&lv);
	//第二列								
	lv.pszText = TEXT("PID");
	lv.cx = 100;
	lv.iSubItem = 1;
	//ListView_InsertColumn(hListProcess, 1, &lv);								
	SendMessage(hListProcess, LVM_INSERTCOLUMN, 1, (DWORD)&lv);
	//第三列								
	lv.pszText = TEXT("镜像基址");
	lv.cx = 100;
	lv.iSubItem = 2;
	ListView_InsertColumn(hListProcess, 2, &lv);
	//第四列								
	lv.pszText = TEXT("镜像大小");
	lv.cx = 100;
	lv.iSubItem = 3;
	ListView_InsertColumn(hListProcess, 3, &lv);

	AddProcess(hListProcess);
}

void AddProcess(HWND hListProcess)
{
	LV_ITEM vitem;

	//初始化						
	memset(&vitem, 0, sizeof(LV_ITEM));
	vitem.mask = LVIF_TEXT;

	vitem.pszText = "csrss.exe";
	vitem.iItem = 0;
	vitem.iSubItem = 0;
	//ListView_InsertItem(hListProcess, &vitem);						
	SendMessage(hListProcess, LVM_INSERTITEM, 0, (DWORD)&vitem);

	vitem.pszText = TEXT("448");
	vitem.iItem = 0;
	vitem.iSubItem = 1;
	ListView_SetItem(hListProcess, &vitem);

	vitem.pszText = TEXT("56590000");
	vitem.iItem = 0;
	vitem.iSubItem = 2;
	ListView_SetItem(hListProcess, &vitem);

	vitem.pszText = TEXT("000F0000");
	vitem.iItem = 0;
	vitem.iSubItem = 3;
	ListView_SetItem(hListProcess, &vitem);

	vitem.pszText = TEXT("winlogon.exe");
	vitem.iItem = 1;
	vitem.iSubItem = 0;
	//ListView_InsertItem(hListProcess, &vitem);						
	SendMessage(hListProcess, LVM_INSERTITEM, 0, (DWORD)&vitem);

	vitem.pszText = TEXT("456");
	vitem.iSubItem = 1;
	ListView_SetItem(hListProcess, &vitem);

	vitem.pszText = TEXT("10000000");
	vitem.iSubItem = 2;
	ListView_SetItem(hListProcess, &vitem);

	vitem.pszText = TEXT("000045800");
	vitem.iSubItem = 3;
	ListView_SetItem(hListProcess, &vitem);
}
VOID EnumModules(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
	LV_ITEM lv;
	TCHAR szPid[20];
	DWORD dwRowId;

	memset(&lv, 0, sizeof(LV_ITEM));
	memset(szPid, 0, 0x20);

	//选择行
	dwRowId = SendMessage(hWnd,LVM_GETNEXTITEM,-1,LVNI_SELECTED);
	if (dwRowId == -1)
	{
		MessageBox(NULL, TEXT("请选择进程"), TEXT("出错啦"), MB_OK);
		return;
	}
	lv.iSubItem = 1;
	lv.pszText = szPid;
	lv.cchTextMax = 0x20;
	SendMessage(hWnd,LVM_GETNEXTITEM,dwRowId, (LPARAM)&lv);
	MessageBox(NULL, lv.pszText,TEXT("PID"), MB_OK);


}

BOOL CALLBACK DialogProc(
	HWND hwndDlg,  // handle to dialog box			
	UINT uMsg,     // message			
	WPARAM wParam, // first message parameter			
	LPARAM lParam  // second message parameter			
)
{

	switch (uMsg)
	{
	case  WM_CLOSE:

		EndDialog(hwndDlg, 0);

		return TRUE;

	case  WM_INITDIALOG:

		InitProcessList(hwndDlg);
		

		return TRUE;

	case WM_NOTIFY:
	{
		NMHDR* pNMHDR = (NMHDR*)lParam;
		if (wParam == IDC_LIST_PROCESS && pNMHDR->code == NM_CLICK)
		{
			EnumModules(GetDlgItem(hwndDlg, IDC_LIST_PROCESS), wParam, lParam);
		}

		return TRUE;
	}
	case  WM_COMMAND:

		switch (LOWORD(wParam))
		{
		case   IDC_PE:

			

			return TRUE;

		case   IDC_ABOUT:



			return TRUE;

		case   IDC_LOGOUT:
			

			EndDialog(hwndDlg, 0);

			return TRUE;
		}
		break;
	}

	return FALSE;
}


int CALLBACK WinMain(
	_In_  HINSTANCE hInstance,
	_In_  HINSTANCE hPrevInstance,
	_In_  LPSTR lpCmdLine,
	_In_  int nCmdShow
)
{
	DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc);
	return 0;
}

标签:控件,48,vitem,49,TEXT,lv,hListProcess,pszText,ListView
From: https://www.cnblogs.com/xiaoxin07/p/18077870

相关文章

  • Qt教程 — 3.4 深入了解Qt 控件:Input Widgets部件(3)
    目录1 InputWidgets简介2如何使用InputWidgets部件2.1Dial组件-模拟车速表2.2 QScrollBar组件-创建水平和垂直滚动条2.3 QSlider组件-创建水平和垂直滑动条 2.4 QKeySequenceEdit组件-捕获键盘快捷键InputWidgets部件部件较多,将分为三篇文章介绍文章1(Qt......
  • Codeforces 1948G MST with Matching
    因为贡献是两个之和,考虑固定下一个,求解另一个的最优。\(\text{MST}\)似乎找不到什么好的办法固定,便考虑固定下最大匹配。对于树的最大匹配,考虑到因为树也是二分图,所以树的最大匹配\(=\)最小点覆盖。考虑如果知道了最小点覆盖内的点,那就说明如果一条边两个端点都不在点集中,是......
  • 491. 非递减子序列c
    /***Returnanarrayofarraysofsize*returnSize.*Thesizesofthearraysarereturnedas*returnColumnSizesarray.*Note:Bothreturnedarrayand*columnSizesarraymustbemalloced,assumecallercallsfree().*/inttemp[30];voiddfs(int**......
  • 酷睿i9 14900hx参数 i914900hx核显什么水平
    i914900hx采用Intel7制程工艺,有24核心,其中8个高性能核心,16个高效能核心,共32线程,P核心最大睿频5.8GHz,全核最大睿频5.2GHz;E核心最大睿频/全核心最大睿频4.1GHz,L2缓存32MB、L3缓存36MB,TDP55W,最大可配置功耗为157W,内存支持DDR55600MHz。i914900hx怎么样这些点很重要 http:/......
  • Codeforces 1948E Clique Partition
    考虑到有\(|i-j|\),所以肯定是让相邻的一部分在一个团里。考虑构造出一个最长长度的,后面类似复制几遍即可。考虑到\(|k-1|=k-1\),且因为\(a_i\)为一个排列,差的绝对值至少为\(1\),所以只考虑两端最长长度也只可能为\(k\)。不妨先假设最长长度为\(k\)来构造。那么......
  • CF1948F 题解
    对于每个询问,可以把这\(r-l+1\)个袋子包合并成一个有\(\sum\limits_{i=l}^ra_i\)个金币和\(\sum\limits_{i=l}^rb_i\)个银币的袋子。\([l,r]\)外的袋子同理也可以这样合并。假设\(sum_a=\sum\limits_{i=1}^na_i,sum_b=\sum\limits_{i=1}^nb_i\),\(......
  • lc493 统计重要翻转对的数目
    给定一个数组nums[n],如果i<j并且nums[i]>2*nums[j],则称(i,j)是一个重要翻转对。求nums[n]中重要翻转对的数量。1<=n<=5e4;nums[i]在int范围内直接套平衡树模板即可。template<typenameTYPE>structTreap{structNode{TYPEdata,sum;intrnd,siz......
  • Canvas 控件
    在C#中中设置控件坐标Labellabel=newLabel{Content="测试",FontSize=14,Foreground=newSolidColorBrush((Color)ColorConverter.ConvertFromString("#FF0000"))};Canvas.SetTop(label,10.9);//在c#后台代码中动态设置Canvas.SetLeft(label,......
  • QT TreeWidget控件实现文件树 展示目录结构
    目录1、获取盘符,以及一级子文件2、getFileOnDirectory函数,遍历指定文件夹的一级子文件3、绑定展开信号和槽函数,遍历指定文件4、QTreeWidgetItem::setData()用法如图所示,这里仅仅实现展示目录结构,对于新增文件、修改文件、删除文件会后续补充。 思路:这里我并没有在程序......
  • 645协议和RS485协议
    智能电表是一种能够实现远程抄表、远程控制和远程费率管理的电能计量设备。智能电表通常采用一种或多种通信协议来与上位机或其他设备进行数据交换。本文将介绍两种常见的通信协议:645协议和RS485协议,以及它们之间的区别。645协议是一种国家标准,规定了智能电表的数据格式、传输方......