PE文件解析-资源中的对话框结构

VS2019/MFC学习笔记之三(对话框控件随窗口大小同比例缩放) 最近在做一个简易计算器的时候,发现窗口大小是可以随意拖动的,但是对话框内的控件并没有发现改变,这就会出现控件部分不动,加大了空白部分,影响美观,如下所示 于是通过查阅资料,找到了两种解决方案分别整理如下 一、直接禁止改变窗口大小 在工程里找到.rc文件,以文本的形式打开,找到STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU IDD_COUNT_DE. 阅读详情

一、概述

    想要获取一个可执行文件(PE文件)里包含的资源文件,首先要解析可执行文件,得到资源存储的地址及大小,可参考 https://blog.youkuaiyun.com/zhyulo/article/details/85717711 。然后,根据资源存储方式,得到各资源的数据内容及其大小,可参考 https://blog.youkuaiyun.com/zhyulo/article/details/85930045 。

    PE文件的资源中,对话框的资源类型ID=5。对话框不仅可以通过ID区别,也可以通过对话框名区别,也就是说对话框在资源树的第二层可能是数字,也可能是字符串,这点需要注意。

    对话框可以说是资源中最重要、最复杂的一种。它在结构上分为2种:基本对话框和扩展对话框。而由于对于一些属性,既可能是字符串ID,又可能直接就是字符串,所以在这里又把它们的存储设计了一种新的方式。而由于对话框上有不同控件,不同控件所需的参数又不尽相同,所以解析对话框在资源中的数据流一直是一个难点。在博主的不断的努力下,才揭开了它的神秘面纱。

    在RC文件中,基本对话框和扩展对话框的定义如下所示:

IDD_ABOUTBOX DIALOG DISCARDABLE  0, 0, 235, 55
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "关于 test"
FONT 9, "宋体"
BEGIN
    ICON            IDR_MAINFRAME,IDC_STATIC,11,17,20,20
    LTEXT           "test 1.0 版",IDC_STATIC,40,10,119,8,
                    SS_NOPREFIX
    LTEXT           "版权所有 (C) 2019",IDC_STATIC,40,25,119,8
    DEFPUSHBUTTON   "确定",IDOK,178,7, 50,14,WS_GROUP
END

IDD_TEST_DIALOG DIALOGEX  0, 0, 320, 200 
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "test"
FONT 9, "宋体"
BEGIN
    DEFPUSHBUTTON   "确定",IDOK,260,7,50,14
    PUSHBUTTON      "取消",IDCANCEL,260,23,50,14
    LTEXT           "TODO: 在这里设置对话控制。",IDC_STATIC,50,90,200,8
END

二、ID与字符串组合结构

    由于对于一些属性,既可能是字符串ID,又可能直接就是字符串,所以在这里又把它们的存储设计了一种新的方式。注意,这里的字符串都是Unicode字符串。如果该结构的第一个字是0xFFFF,说明该结构是一个ID,ID值为第二个字。否则,该结构是一个字符串,以'\0'结束。我们这里把这个结构定义为IDStr。

三、基本对话框的资源结构

    基本对话框包括对话框头和子控件2部分组成。对话框头与每一个子控件4字节对齐。

1.对话框头

    对话框头的结构如下所示:

struct DialogBoxHeader
{
	DWORD Style;//标准窗口样式
	DWORD ExStyle;//扩展窗口样式
	WORD DlgItems;//控件数量
	WORD x;//起点坐标
	WORD y;
	WORD cx;//宽
	WORD cy;//高
	IDStr menuName;//菜单名
	IDStr ClassName;//类名
	IDStr szCaption;//对话框标题
};

    如果Style的DS_SETFONT位为1,那么在DialogBoxHeader的结构后还有字体结构,字体结构如下:

struct DialogFont
{
	WORD wPointSize;//字体大小
	WCHAR FontName[1];
};

2.子控件

    基本对话框的子控件结构如下:

struct ControlData
{
	DWORD Style;//标准窗口样式
	DWORD ExStyle;//扩展窗口样式
	WORD x;//左上角坐标
	WORD y;
	WORD cx;//长
	WORD cy;//高
	WORD id;//控件ID
	IDStr ClassID;//控件类型
	IDStr Text;//控件名称
	WORD ExtraStuff;
};

四、扩展对话框的资源结构

    与基本对话框一样,扩展对话框也由扩展对话框头和子控件2部分组成。扩展对话框头与每一个子控件4字节对齐。

1.扩展对话框头

    扩展对话框头的结构如下所示:

struct DialogBoxHeaderEx
{
	DWORD SignEx;//0xFFFF0001
	DWORD Version;
	DWORD ExStyle;//扩展窗口样式
	DWORD Style;//标准窗口样式
	WORD DlgItems;//控件数量
	WORD x;//起点坐标
	WORD y;
	WORD cx;//宽
	WORD cy;//高
	IDStr menuName;//菜单名
	IDStr ClassName;//类名
	IDStr szCaption;//对话框标题
};

    如果Style的DS_SETFONT位为1,那么在DialogBoxHeaderEx的结构后还有字体结构,字体结构如下:

struct DialogFontEx
{
	WORD wPointSize;//字体大小
	WORD Weight;
	BYTE Italic;
	BYTE CharSet;
	WCHAR FontName[1];
};

2.子控件

    扩展对话框的子控件结构如下:

struct ControlDataEx
{
	DWORD helpID;//帮助ID
	DWORD ExStyle;//扩展窗口样式
	DWORD Style;//标准窗口样式
	WORD x;//左上角坐标
	WORD y;
	WORD cx;//长
	WORD cy;//高
	WORD id;//控件ID
	WORD ;
	IDStr ClassID;//控件类型
	IDStr Text;//控件名称
	WORD ExtraStuffLen;
	BYTE ExtraBuf[1];
};

五、实例代码

    以下程序展示了如何从PE文件的对话框资源流中读取并输出成RC文件形式的代码。

char* GetDialogItem(char *buf, bool isExtra)
{
	DWORD Style, ExStyle, NotStyle;
	struct ControlData//标准对话框组件结构
	{
		DWORD Style;//标准窗口样式
		DWORD ExStyle;//扩展窗口样式
		WORD x;//左上角坐标
		WORD y;
		WORD cx;//长
		WORD cy;//高
		WORD id;//控件ID
	} *Item;
	DWORD *helpID = NULL;//只有扩展对话框才有帮助ID
	WCHAR *ClassID, *Text, *ExtraStuff;
	if(isExtra)
	{
		helpID = (DWORD*)buf;
		Item = (ControlData*)(helpID + 1);
	}
	else Item = (ControlData*)buf;
	Style = isExtra ? Item->ExStyle : Item->Style;
	ExStyle = isExtra ? Item->Style : Item->ExStyle;

	Puts("\t");
	//控件类型
	ClassID = (WCHAR*)&Item->id + 1;
	if(isExtra) ClassID++;
	const char *pStyle[] = {"", "button", "static"};
	int isControl = 0;
	if(*ClassID == 0xFFFF)
	{
		Text = ClassID + 2;
		switch(ClassID[1])
		{
		case 0x0080:
			switch(Style & 0x0FL)
			{
			case BS_PUSHBUTTON: Puts("PUSHBUTTON"); NotStyle = BS_PUSHBUTTON | WS_TABSTOP; break;
			case BS_DEFPUSHBUTTON: Puts("DEFPUSHBUTTON"); NotStyle = BS_DEFPUSHBUTTON | WS_TABSTOP; break;
			case BS_CHECKBOX: Puts("CHECKBOX"); NotStyle = BS_CHECKBOX | WS_TABSTOP; break;
			case BS_AUTOCHECKBOX: Puts("AUTOCHECKBOX"); NotStyle = BS_AUTOCHECKBOX; break;
			case BS_RADIOBUTTON: Puts("RADIOBUTTON"); NotStyle = BS_RADIOBUTTON; break;
			case BS_3STATE: Puts("STATE3\t"); NotStyle = BS_3STATE; break;
			case BS_AUTO3STATE: Puts("AUTO3STATE"); NotStyle = BS_AUTO3STATE; break;
			case BS_GROUPBOX: Puts("GROUPBOX"); NotStyle = BS_GROUPBOX; break;
			case BS_AUTORADIOBUTTON: Puts("AUTORADIOBUTTON"); NotStyle = BS_AUTORADIOBUTTON; break;
			default: Puts("CONTROL\t"); NotStyle = 0; isControl = 1;
			}
			break;
		case 0x0081: Puts("EDITTEXT"); NotStyle = ES_LEFT | WS_BORDER | WS_TABSTOP; break;
		case 0x0082:
			switch(Style & 0x0FL)
			{
			case SS_LEFT: Puts("LTEXT\t"); NotStyle = SS_LEFT | WS_GROUP; break;
			case SS_RIGHT: Puts("RTEXT\t"); NotStyle = SS_RIGHT | WS_GROUP; break;
			case SS_CENTER: Puts("CTEXT\t"); NotStyle = SS_CENTER | WS_GROUP; break;
			case SS_ICON: Puts("ICON\t"); NotStyle = SS_ICON; break;
			default: Puts("CONTROL\t"); NotStyle = 0; isControl = 2;
			}
			break;
		case 0x0083: Puts("LISTBOX\t"); NotStyle = WS_BORDER | LBS_NOTIFY; break;
		case 0x0084: Puts("SCROLLBAR"); NotStyle = 0; break;
		case 0x0085: Puts("COMBOBOX"); NotStyle = 0; break;
		default: Puts("CONTROL\t"); NotStyle = 0; isControl = -2;
		}
	}
	else
	{
		Text = ClassID;
		while(*Text) Text++;
		Text++;
		Puts("CONTROL\t");
		NotStyle = 0;
		isControl = -1;
	}
	Puts("\t");
	NotStyle |= WS_CHILD | WS_VISIBLE;
	Style &= ~NotStyle;
	NotStyle &= ~(isExtra ? Item->ExStyle : Item->Style);
	//控件名称
	if(*Text == 0xFFFF)
	{
		PutIDName(Text[1]);//控件ID
		Puts(", ");
		ExtraStuff = Text + 2;
	}
	else
	{
		if(!isControl && (ClassID[1] == 0x0081 || ClassID[1] == 0x0083//EDITTEXT,LISTBOX无需此项
			|| ClassID[1] == 0x0084 || ClassID[1] == 0x0085))
		{
			ExtraStuff = Text;
			while(*ExtraStuff) ExtraStuff++;
			ExtraStuff++;
		}
		else
		{
			Puts("\"");
			ExtraStuff = (WCHAR*)WPuts(Text);
			Puts("\", ");
		}
	}
	//控件ID
	PutIDName(Item->id, "IDC_");
	//扩展控件类型
	if(isControl)
	{
		Puts(", ");
		if(isControl == -1)
		{
			Puts("\"");
			WPuts(ClassID);
			Puts("\"");
		}
		else if(isControl > 0) Puts(pStyle[isControl]);
		else Print("%d", ClassID[1]);
		//标准窗口样式
		if(Style || !NotStyle) Print(", %#x", Style);
		if(NotStyle)
		{
			if(Style) Puts(" |");
			else Puts(",");
			Print(" NOT %#x", NotStyle);
		}
		Style = NotStyle = 0;
	}

	Print(", %d,%d,%d,%d",Item->x,Item->y,Item->cx,Item->cy);
	if(Style || NotStyle || ExStyle || (isExtra && *helpID))
	{
		if(Style || (!NotStyle && !isControl)) Print(", %#x", Style);
		if(NotStyle)
		{
			if(Style) Puts(" |");
			else Puts(",");
			Print(" NOT %#x", NotStyle);
		}
		if(ExStyle || (isExtra && *helpID))
		{
			if(ExStyle == WS_EX_STATICEDGE)
				Puts(", WS_EX_STATICEDGE");
			else Print(", %#x", ExStyle);
			if(isExtra && *helpID)
			{
				Puts(", ");
				PutIDName(Item->id, "HIDC_");
			}
		}
	}
	Puts("\n");
	buf = (char*)(ExtraStuff + 1);
	if(isExtra) buf += *ExtraStuff;
	return buf;
}

void GetDialog(char *buf, CStrID id)
{
	if(*(DWORD*)buf == 0xFFFF0001)
	{
		GetDialogEx(buf, id);
		return;
	}
	if(id.IsID()) PutIDName(id.GetID(), "IDD_DIALOG");
	else Puts(id.GetStr());
	Puts(" DIALOG");

	struct DialogBoxHeader
	{
		DWORD Style;//标准窗口样式
		DWORD ExStyle;//扩展窗口样式
		WORD DlgItems;//控件数量
		WORD x;//起点坐标
		WORD y;
		WORD cx;//宽
		WORD cy;//高
		WCHAR menuName[1];//菜单名
	} *Header = (DialogBoxHeader*)buf;
	Print(" DISCARDABLE %d, %d, %d, %d\n",//对话框坐标
		Header->x,Header->y,Header->cx,Header->cy);
	Print("STYLE 0x%.8X\n", Header->Style & (~DS_SETFONT));//标准窗口样式
	if(Header->ExStyle) Print("EXSTYLE 0x%.8X\n", Header->ExStyle);//扩展窗口样式
	WCHAR *ClassName,*szCaption;
	char *ItemData;
	//菜单名
	if(Header->menuName[0] == 0xFFFF)
	{
		Print("MENU %d\n",Header->menuName[1]);
		ClassName = Header->menuName + 2;
	}
	else if(Header->menuName[0])
	{
		Puts("MENU \"");
		ClassName = (WCHAR*)WPuts(Header->menuName);
		Puts("\"\n");
	}
	else ClassName = Header->menuName + 1;
	//类名
	if(*ClassName == 0xFFFF)
	{
		Print("CLASS %d\n",ClassName[1]);
		szCaption = ClassName + 2;
	}
	else if(*ClassName)
	{
		Puts("CLASS \"");
		szCaption = (WCHAR*)WPuts(ClassName);
		Puts("\"\n");
	}
	else szCaption = ClassName + 1;
	//对话框标题
	if(*szCaption)
	{
		Puts("CAPTION \"");
		ItemData = (char*)WPuts(szCaption);
		Puts("\"\n");
	}
	else ItemData = (char*)(szCaption + 1);
	if(Header->Style & DS_SETFONT)//字体结构
	{
		struct DialogFont
		{
			WORD wPointSize;//字体大小
			WCHAR FontName[1];
		} *Font = (DialogFont*)ItemData;
		Print("FONT %d, \"", Font->wPointSize);
		ItemData = (char*)WPuts(Font->FontName);
		Puts("\"\n");
	}

	Puts("BEGIN\n");
	for(int i=0; i<Header->DlgItems; i++)
	{
		ItemData = (ItemData - buf + 3) /4*4 + buf;
		ItemData = GetDialogItem(ItemData, false);
	}
	Puts("END\n");
}

void GetDialogEx(char *buf, CStrID id)
{
	if(id.IsID()) PutIDName(id.GetID(), "IDD_DIALOG");
	else Puts(id.GetStr());
	Puts(" DIALOGEX");

	struct DialogBoxHeaderEx
	{
		DWORD SignEx;//0xFFFF0001
		DWORD Version;
		DWORD ExStyle;//扩展窗口样式
		DWORD Style;//标准窗口样式
		WORD DlgItems;//控件数量
		WORD x;//起点坐标
		WORD y;
		WORD cx;//宽
		WORD cy;//高
		WCHAR menuName[1];//菜单名
	} *Header = (DialogBoxHeaderEx*)buf;
	Print(" DISCARDABLE %d, %d, %d, %d\n",//对话框坐标
		Header->x,Header->y,Header->cx,Header->cy);
	Print("STYLE 0x%.8X\n", Header->Style & (~DS_SETFONT));//标准窗口样式
	if(Header->ExStyle) Print("EXSTYLE 0x%.8X\n", Header->ExStyle);//扩展窗口样式
	WCHAR *ClassName,*szCaption;
	char *ItemData;
	//菜单名
	if(Header->menuName[0] == 0xFFFF)
	{
		Print("MENU %d\n",Header->menuName[1]);
		ClassName = Header->menuName + 2;
	}
	else if(Header->menuName[0])
	{
		Puts("MENU \"");
		ClassName = (WCHAR*)WPuts(Header->menuName);
		Puts("\"\n");
	}
	else ClassName = Header->menuName + 1;
	//类名
	if(*ClassName == 0xFFFF)
	{
		Print("CLASS %d\n",ClassName[1]);
		szCaption = ClassName + 2;
	}
	else if(*ClassName)
	{
		Puts("CLASS \"");
		szCaption = (WCHAR*)WPuts(ClassName);
		Puts("\"\n");
	}
	else szCaption = ClassName + 1;
	//对话框标题
	if(*szCaption)
	{
		Puts("CAPTION \"");
		ItemData = (char*)WPuts(szCaption);
		Puts("\"\n");
	}
	else ItemData = (char*)(szCaption + 1);
	if(Header->Style & DS_SETFONT)//字体结构
	{
		struct DialogFontEx
		{
			WORD wPointSize;//字体大小
			WORD Weight;
			BYTE Italic;
			BYTE CharSet;
			WCHAR FontName[1];
		} *Font = (DialogFontEx*)ItemData;
		Print("FONT %d, \"", Font->wPointSize);
		ItemData = (char*)WPuts(Font->FontName);
		Print("\", %d, %d, %d\n", Font->Weight, Font->Italic, Font->CharSet);
	}

	Puts("BEGIN\n");
	for(int i=0; i<Header->DlgItems; i++)
	{
		ItemData = (ItemData - buf + 3) /4*4 + buf;
		ItemData = GetDialogItem(ItemData, true);
	}
	Puts("END\n");
}

 

WindowsPE 第七章 资源表 第七章 资源表     在程序设计中,总会设计一些数据。这些数据可能是源代码内部需要用到的常量,菜单选项、界面描述等;也可能是源代码外部的,比如程序的图标文件、北京音乐文件、配置文件等,以上这些数据统称为资源。按照程序与数据分离的设计思想,最理想的方案是单独为程序所需要的数据安排一节来存储-PE中的资源就是这么做的。 7.1资源分类     资源数据在PE里是最复杂的一种。其难度主要体现在对 阅读详情

相关推荐

PE-bear实战指南:从PE文件格式解析到逆向工程应用

可执行文件格式是理解程序在磁盘与内存中如何组织与运行的基础。以Windows平台广泛使用的PE(Portable Executable)格式为例,其结构定义了代码、数据、资源等关键信息的布局方式。掌握PE格式的解析原理,是进行软件逆向分析、安全研究、性能优化等工作的核心技术前提。通过静态分析工具直接解析PE头部、节表、导入表等结构,工程师可以深入理解程序的加载、执行流程与依赖关系。这一技术对于恶意软件分析、软件漏洞挖掘、程序兼容性调试及软件保护研究等场景具有重要价值。本文以PE-bear这一专注于PE文件格

weixin_29325955的博客 282

构造DLGTEMPLATE

对话框构造流程如下: 在对话框的标准模板中,DLGTEMPLATE结构后总是紧跟着三个变长数组,它们分别指定了对话框的菜单,类,标题。如果设置了DS_SETFONT属性,这些数组之后还紧跟着一个指定字体大小的16-bit数和另一个指定字体名的变长数组。每个数组由一或更多的16-bit元素组成。菜单,类,标题和字体数组必须在WORD边界上对齐。 紧跟DLGTEMPLATE结构之后的是一个

3521

PE Explorer 1.99 R5 实战:3步定位并修改EXE软件界面资源(附汉化案例)

本文详细介绍了如何使用PE Explorer 1.99 R5进行EXE软件界面资源的定位与修改,包括工具准备、资源结构解析和实战汉化案例。通过3步操作流程,帮助用户快速掌握反编译工具的应用技巧,实现软件界面的高效定制与本地化。

aoanping0730的博客 361

PE文件资源解析(十一)对话框资源的解析

对话框资源,在这里指的是资源类型为RT_DIALOG的资源信息。通过ResHacker看到的效果图如下: 待续......

老狼的专栏 404

PE总结13 --PE文件结构之 解析资源表

// 资源表2.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include #include DWORD RVA2Offset(DWORD dwRva, PIMAGE_NT_HEADERS32 pNt) { DWORD dwOffset = 0; PIMAGE_SECTION_HEADER pSection = I

oBuYiSeng的博客 2898

《Windows PE》7.2 资源表

在资源表中,IMAGE_RESOURCE_DIRECTORY_ENTRY 的 OffsetToData 字段指向一个 IMAGE_RESOURCE_DATA_ENTRY 结构,该结构描述了资源数据的位置和相关属性。PE 对话框资源的起始位置 01 00 FF FF 00 00 00 00 00 00 00 00 是对话框资源的标识符,用于识别和定位对话框资源在 PE 文件中的位置。资源的每一级目录都会有一个资源目录头,它标识 了该类资源的属性、创建日期和版本等信息,其中也包含了随后的目录项的数量描述信息。

bcdaren的博客 1269

Win32 API 函数列表1(格式有点乱)

  西安邮电学院 徐兆元ID编号 函数名 函数说明 详细说明 Win16支持 Win9x支持 WinNT支持1 AbortDoc 终止一项打印作业  Yes Yes Yes2 AbortPath 终止或取消DC中的一切路径  No Yes Yes3 AbortPrinter 删除打印机缓冲文件  No Yes Yes4 AbortSystemShutdowna 停止系统工作  No Yes Y

FLxyzsby的专栏 8335

[系统安全] 十六.PE文件逆向基础知识(PE解析和PE编辑工具)

您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更加聚焦,更加系统,更加深入,也是作者的慢慢成长史。换专业确实挺难的,逆向分析也是块硬骨头,但我也试试,看看自己未来四年究竟能将它学到什么程度,漫漫长征路,偏向虎山行。享受过程,一起加油~ 作者前面介绍了三个漏洞,包括Chrome浏览器保留密码渗透解析、通过Chrome浏

杨秀璋的专栏 1万+

windows常见窗口样式和控件风格以及类样式

Windows常见窗口样式和控件风格 王佰营 徐丽红 一、窗口样式 WS_POPUP 弹出式窗口(不能与WS_CHILDWINDOW样式同时使用) WS_CHILDWINDOW 子窗口(不能与WS_POPUP合用) WS_MINIMIZE 创建窗口拥有最小化按钮 WS_MINIMIZEBOX 创建窗口拥有最小化按钮,须同时指定WS_SYSTEM样式 WS_VISIBLE 可见状态 WS_DISABLED 不可用状态 WS_CLIPSIBLINGS 使窗口排除子窗口之间的相对区域 WS_CLIPCHIL

u011109761的专栏 2732

eXeScope工具深度解析与DLL/PE文件修改实战

eXeScope是一款经典的PE文件资源查看与编辑工具,广泛应用于逆向工程、软件本地化及界面定制领域。它能够直接解析Windows可执行文件中的资源结构,支持图标、位图、对话框、菜单及字符串表的提取与修改。其无需源码即可对资源进行可视化操作的特性,使其成为快速修改第三方程序界面元素的实用工具。尤其在老旧软件维护、汉化项目和安全研究中,eXeScope提供了轻量级且高效的分析入口,是理解PE资源组织机制的理想起点。

weixin_30700095的博客 511

ResHacker 3.5资源编辑器全面应用实战

ResHacker 3.5是一款轻量级但功能强大的Windows资源编辑器,支持对EXE、DLL、OCX等PE格式文件中的资源进行查看、修改、替换和删除。其主要应用场景包括软件本地化(如汉化)、界面定制(修改对话框、图标)、逆向工程分析及UI修复。工具无需安装即可运行,兼容Windows XP至Windows 11系统,广泛被开发者、安全研究人员和IT运维人员使用。在现代软件开发和本地化工程中,用户界面(UI)的可读性、可用性和文化适配性是决定用户体验的关键因素。

weixin_36173034的博客 1342

WINDOWS+PE权威指南读书笔记(13)

目录 资源表 菜单资源解析: 图标资源解析: 图标组资源解析: 对话框资源解析: 资源表编程: 更改图标实验: 提取程序图标实例: 更改程序图标实例: 总结: 资源表 菜单资源解析: 以下内容以 PE.exe 为例,首先来看对菜单资源的解析。 首先回顾一下前面菜单目录的菜单的汇编语言语法: 菜单项的语法格式如下: 菜单资源定位: 从 PEInfo 中查看到菜单资源的位置和大小分别是: 口文件位置: 0x00001018 口菜单项大小: 1

沐一 · 林 的博客 1062

PE文件节区添加并弹出简单的对话框

PE文件自动添加节区,并弹出一个简单的对话框(可以自己修改成其它的东西)

WINDOWS+PE权威指南读书笔记(12)

目录 资源表 资源分类和定义: 位图、光标、图标资源: 菜单资源: 对话框资源: 自定义资源: PE 资源表组织: 资源表的组织方式: 资源表数据定位: 资源目录头IMAGE_RESOURCE_DIRECTORY: 资源目录项 IMAGE_RESOURCE_DIRECTORY_ENTRY: 资源数据项 IMAGE_RESOURCE_DATA_ENTRY: 三级结构中目录项的区别: 资源表遍历: PE 资源深度解析: 资源脚本示例: 使用 PElnfo 分析资源表: 资

沐一 · 林 的博客 1289

使用LogisticRegression和LightGBM模型对信贷违约进行预测----基于kaggle比赛数据

3.分离数值型变量与类别型变量,发现有些数值型变量因为输入不规范,比如数值中含有字符(28_,_10000_等)被划分为类别型变量 ,比如 'Age','Annual_Income','Num_of_Loan', 'Num_of_Delayed_Payment', 'Changed_Credit_Limit','Credit_Mix','Monthly_Balance', 'Outstanding_Debt' ,'Amount_invested_monthly'等。三、分箱,woe编码,计算IV值。

I_am_a_big_tiger的博客 1682

腾讯云运维工程师认证TCA--真题(最新2022.11)

解析:云原生应用的12要素,1.基准代码:一份基准代码,多份部署;解析:腾讯云主账号具备对其名下资源(包括存储桶)的最大权限,您虽然可以在存储桶策略中限制几乎所有操作,但主账号始终具备 PUT Bucket Policy 操作的权限,主账号调用该操作不检查存储桶策略。解析:瀑布模型将软件生命周期划分为制定计划、需求分析、软件设计、程序编写、软件测试和运行维护等六个基本活动,并且规定了它们自上而下、相互衔接的固定次序,如同瀑布流水,逐级下落。解答:云原生五大关键技术:微服务、容器化、DevOps、持续交付。

e1210101的博客 9915

软件本地化实战:从WINRAR汉化到通用PE资源修改技术

软件本地化是软件工程中实现多语言支持的关键技术,其核心原理在于处理可执行文件的资源段。在Windows平台,遵循PE(Portable Executable)格式的EXE或DLL文件,其界面文字、图标、对话框等资源通常存储在独立的资源段(.rsrc)中,而非硬编码在程序逻辑里。通过修改这些资源数据,如字符串表和对话框模板,即可实现界面语言的切换,而无需改动程序的核心代码逻辑,这保证了软件的稳定性。这项技术的工程价值在于,它提供了一种安全、可控的方式来自定义软件界面,是理解软件内部结构和进行安全定制的基石。其

ciqiaofu0192的博客 453

人体分割笔记总结

人体分割 人体分割(human parsing),属于语义分割任务的子任务,旨在对人类图像进行像素级的是细粒度分割(例如,划分出身体部位和服装)。根据不同的场景,又可以分为单人人体解析(single-person human parsing)和多人人体解析(multi-person human parsing,或者 instance-level human parsing)。除此之外,按照处理媒介分类,还可以分为基于图像的人体解析和基于视频的人体解析。 对于人体解析任务,常用的度量指标包括 Pixel a

jacke121的专栏 4255

PE资源结构及读取

  PE资源结构及读取作者:Sunline               lisunlin0@yahoo.com.cn       2007 年 7 月源代码下载:http://download.youkuaiyun.com/source/359338  其中的Source文件夹中.       下面的一些函数是我在学习PE结构时参考Matt Pietrek的《A Tour of the Win32 P

Dustfly的专栏 2726

Codex 100个真实案例 - 用AI生成Blender 3D建模脚本(建模师要失业了?)

本案例将展示如何用 Codex 生成 Blender Python API(bpy)脚本,自动创建完整的 3D 模型。我们将从基础几何体开始,逐步实现布尔运算、材质设置、光照配置,最终完成一张精美桌子的 3D 建模——包括桌面、桌腿、倒角、木纹材质。还会实现参数化批量生成不同风格的桌子、渲染输出 PNG 图片、以及 360 度旋转动画。全程用自然语言驱动 Codex,让建模从"点鼠标"变成"说人话"!

yueyeguzhuo的专栏 632

动量因子在A股市场的有效性分析:量化实证研究

验证动量因子在A股市场的有效性及时间周期性分析不同时间窗口(短期/中期/长期)对动量效应的影响量化交易成本、市场流动性对动量策略收益的侵蚀程度比较A股与成熟市场(如美股)动量效应的差异特征理论框架:行为金融学解释动量效应的产生机制技术实现:Python全流程代码实现动量因子计算与回测实证分析:统计检验、风险收益指标、敏感性分析应用拓展:结合市场微观结构的策略优化方案动量因子(Momentum Factor)

2501_92132293的博客 2481

PE-资源表

PE资源表 PE中的相关资源可以通过程序进行深度定位,所获取的二进制字节码与资源脚本语句之间是一一对应的这些数据可能是源代码内部需要用到的常景,比如 菜单选项、界面描述等;也可能是源代码外部的,比如程序的图标文件、背景音乐文件、配置 文件等,以上这些数据统称为资源。

megaparsec 2344

Qt Quick/QML入门到精通_专栏demo对应文章目录(目前50个左右demo/长期更新)

自定义图标下拉列表框的效果如下所示:自定义三态按钮的效果如下所示:传送门:53.qt quick-自定义三态按钮、自定义图标下拉列表框_诺谦的博客-优快云博客传送门:59.qt quick-qml调色板(颜色取色器)实现、自定义QQuickStyle样式_诺谦的博客-优快云博客63.qt quick-QML侧边滑动栏(不需要任何图片资源,支持自定义左右方向和大小)_诺谦的博客-优快云博客_qt实现好看侧边栏。...

抵抗时间扭曲,坚持做一件有意义的事 2万+

[逆向工程]深入解析PE文件结构(二)

PE文件是Windows操作系统下的可执行文件格式标准,涵盖.exe.dll.sys等类型。跨平台兼容性:适应不同CPU架构(如x86、x64)模块化加载:支持动态链接库(DLL)的按需加载内存高效管理:通过Section实现代码与数据的分离优化。

曼岛_的博客 1777

知识图谱大模型系列之 12 LLM 知识图谱构建器:从零到 GraphRAG 使用 LLM 知识图谱生成器在 GenAI 应用中提取和使用知识图谱(教程含源码)

为了更深入地了解 LLM 知识图谱构建器,GitHub 存储库提供了大量信息,包括源代码和文档。此外,我们的文档提供了详细的入门指南,而GenAI 生态系统则提供了有关可用更广泛工具和应用程序的进一步见解。

iCloudEnd的博客 2037

《Python星球日记》 第43天:机器学习概述与Scikit-learn入门

《Python星球日记》 第43天:机器学习概述与Scikit-learn入门

Code_流苏:在代码中寻诗意,在实践中觅真知 933
上一篇: PE文件解析-资源中的快捷键结构
下一篇: windows系统API中CreateWindow函数窗口的风格
zhyulo
博客等级 码龄10年 86粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值