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

第四十八课 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;
}

posted @ 2024-03-16 23:19  小新07  阅读(87)  评论(0编辑  收藏  举报