1 Star 0 Fork 0

李勃/editPEResource

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
editPEResource.py 2.50 KB
一键复制 编辑 原始数据 按行查看 历史
李勃 提交于 2022-02-28 17:53 +08:00 . 试验
import struct
import win32api # pip3 install pywin32
import win32con
"""
struct ICONDIR
{
WORD idReserved;
WORD idType;
WORD idCount;
ICONDIRENTRY idEntries[];
};
struct ICONDIRENTRY
{
BYTE bWidth;
BYTE bHeight;
BYTE bColorCount;
BYTE bReserved;
WORD wPlanes;
WORD wBitCount;
DWORD dwBytesInRes;
DWORD dwImageOffset;
};
struct GRPICONDIRENTRY
{
BYTE bWidth;
BYTE bHeight;
BYTE bColorCount;
BYTE bReserved;
WORD wPlanes;
WORD wBitCount;
DWORD dwBytesInRes;
WORD nID;
};
"""
def replaceIcon(pe_file, icon_file, icon_group_id, icon_id, lang_id, icon_width):
class ICONDIRENTRY:
def __init__(self, data):
self.bWidth, self.bHeight, self.bColorCount, self.bReserved, self.wPlanes, self.wBitCount, self.dwBytesInRes, self.dwImageOffset = struct.unpack('<4B2H2I', data)
self.data = b''
def pack(self, nid):
return struct.pack('<3H4B2HIH', 0, 1, 1, self.bWidth, self.bHeight, self.bColorCount, self.bReserved, self.wPlanes, self.wBitCount, self.dwBytesInRes, nid)
icon_list = []
with open(icon_file, 'rb') as f:
data = f.read(6)
idReserved, idType, idCount = struct.unpack('<3H', data)
print(icon_file)
print('idCount:', idCount)
for i in range(idCount):
data = f.read(16)
icon = ICONDIRENTRY(data)
icon_list.append(icon)
print(i+1, 'Width: %d, Height: %d, BitCount: %d' % (icon.bWidth, icon.bHeight, icon.wBitCount))
data = f.read()
head_offset = 6 + idCount * 16
for icon in icon_list:
offset = icon.dwImageOffset - head_offset
icon.data = data[offset : offset + icon.dwBytesInRes]
for icon in icon_list:
# 只写入一张指定宽度和位深的图片
if icon.bWidth == icon_width:
data_IconGroup = icon.pack(icon_id)
data_Icon = icon.data
try:
hdst = win32api.BeginUpdateResource(pe_file, 0)
win32api.UpdateResource(hdst, win32con.RT_GROUP_ICON, icon_group_id, data_IconGroup, lang_id)
win32api.UpdateResource(hdst, win32con.RT_ICON, icon_id, data_Icon, lang_id)
win32api.EndUpdateResource (hdst, 0)
return True
except Exception as e:
print(e)
break
return False
if __name__ == '__main__':
print(replaceIcon('WDUIServer.exe', 'win-install.ico', 4008, 1, 2052, 32))
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Python
1
https://gitee.com/firexmoon/edit-pe-resource.git
git@gitee.com:firexmoon/edit-pe-resource.git
firexmoon
edit-pe-resource
editPEResource
master

搜索帮助