当我在Google上搜索时,我发现了一个有用的类,它允许我们使用以下代码行更改任何.exe
文件的图标:
WindowsFormsApplication1.IconInjector.InjectIcon("myfile.exe", "myicon.ico", 200, 1);
其中200和1分别是图标GroupID
和图标BaseID
,我可以使用Resource Hacker确定。在这种情况下,文件的图标会成功更改而不会破坏文件。
所以我打算在我的程序上使用这个类,这是一个SFX /软件保护程序,输出文件总是没有图标,我在资源黑客上看到的所有内容如下:
我无法看到图标组ID或基本ID,不管怎么说(在这种情况下,我不知道要放什么而不是200和1)所以我尝试使用提到的相同代码行更改图标上面,我使用了以下代码行(与上面相同):
WindowsFormsApplication1.IconInjector.InjectIcon("myfile.exe", "myicon.ico", 200, 1);
文件图标已成功更改,但该文件不再有效!
当我尝试使用ResourceHacker重新打开文件时,我找到了以下内容:
似乎图标资源已成功添加,但我无法弄清楚为什么该文件不再起作用,似乎已损坏。
任何帮助都将不胜感激。
注意:我尝试将此类与不受保护的文件一起使用,它就像一个魅力!
我正在使用的课程如下:
// IconInjector.cs
using System;
using System.Runtime.InteropServices;
using System.Diagnostics;
namespace WindowsFormsApplication1
{
/// <summary>
/// IconInjectorクラスの定義
/// </summary>
public class IconInjector
{
[DllImport("kernel32.dll", SetLastError = true)]
//static extern bool UpdateResource(IntPtr hUpdate, string lpType, string lpName, ushort wLanguage, IntPtr lpData, uint cbData);
static extern int UpdateResource(IntPtr hUpdate, uint lpType, uint lpName, ushort wLanguage, byte[] lpData, uint cbData);
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr BeginUpdateResource(string pFileName,
[MarshalAs(UnmanagedType.Bool)]bool bDeleteExistingResources);
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool EndUpdateResource(IntPtr hUpdate, bool fDiscard);
/// <summary>
/// アプリケーションのメイン エントリ ポイントです。
/// </summary>
[STAThread]
public static void InjectIcon(string execFileName, string iconFileName, uint iconGroupID, uint iconBaseID)
{
const uint RT_ICON = 3;
const uint RT_GROUP_ICON = 14;
// アイコンファイルの読み込み
IconFile iconFile = new IconFile();
iconFile.Load(iconFileName);
// リソースの更新開始
IntPtr hUpdate = BeginUpdateResource(execFileName, false);
Debug.Assert(hUpdate != IntPtr.Zero);
// RT_GROUP_ICON 書き込み
byte[] data = iconFile.CreateIconGroupData(iconBaseID);
UpdateResource(hUpdate, RT_GROUP_ICON, iconGroupID, 0, data, (uint)data.Length);
// RT_ICON書き込み
for (int i = 0; i < iconFile.GetImageCount(); i++)
{
byte[] image = iconFile.GetImageData(i);
UpdateResource(hUpdate, RT_ICON, (uint)(iconBaseID + i), 0, image, (uint)image.Length);
}
// リソースの更新終了
EndUpdateResource(hUpdate, false);
}
}
}
有关将图标添加到受保护文件而不会破坏它的任何帮助或建议吗?
答案 0 :(得分:1)
听起来保护应用程序正在验证文件的内容是否未被篡改。注入图标绝对是一种篡改形式,除非更新保护软件以忽略它,否则它将始终失败。或者,如果您拥有保护软件,则可以将其更新为不剥离图标。
答案 1 :(得分:0)
我刚刚遇到了与7zip Self-Extractor exe相同的问题。
在创建Self-Extractor exe之前更新7zS.sfx(而不是exe)的图标可以解决问题,并且exe不会被破坏。
答案 2 :(得分:-1)
可以使用Resource Hacker.等工具将您的应用程序图标添加到此可执行文件中 并访问http://georezo.net/jparis/MI_Enviro/Icons/adding_w_RH.htm