2012-03-21 118 views
4

当我在谷歌搜索,我发现它让我们用下面的代码行更改任何.exe文件的图标,一类有用:如何将图标添加到现有的exe文件(默认没有图标)?

WindowsFormsApplication1.IconInjector.InjectIcon("myfile.exe", "myicon.ico", 200, 1); 

其中200和1分别图标GroupID和图标BaseID我可以使用Resource Hacker来确定。在这种情况下,文件的图标会成功更改而不会破坏文件。

所以我打算用我的这个程序类,这是一个SFX /软件保护,输出文件始终没有一个图标,所有我能够在资源黑客看到的是如下:

Resource Hacker view of PuTTY_Protected.exe prechange

我无法看到图标组ID和基本ID,无论如何(我不知道该如何放置,而不是200和1在这种情况下)所以我试图改变图标使用相同的代码行提到上面,我用了下面的代码行(与上面相同):

WindowsFormsApplication1.IconInjector.InjectIcon("myfile.exe", "myicon.ico", 200, 1); 

文件图标已成功更改,但文件不再有效!

当我试图重新使用ResourceHacker文件,我发现下面的:

Resource Hacker view of PuTTY_Protected.exe after change

看来,成功添加的图标资源,但我不明白,为什么没有按文件”工作了,它似乎已损坏。

PuTTY_protected.exe has stopped working

任何帮助,将不胜感激。

注:我试过使用这个类与不受保护的文件,它的作品就像一个魅力!

我使用的类是如下:

// 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); 
    } 
} 
} 

上添加图标受保护的文件,而不会破坏任何帮助或建议?

回答

1

听起来像保护应用程序正在验证文件的内容没有被篡改。注入图标绝对是一种篡改形式,除非保护软件更新为忽略它,否则它总是会失败。或者,如果您拥有保护软件,则可以将其更新为不剥离图标。

+0

如果输入文件(要保护的文件)默认没有图标,怎么办? – 2012-03-21 19:12:47

+0

@mohamedmaache:如果将其注入到输出可执行文件中,如果将其注入输出可执行文件,保护系统是否会将其传递给输出可执行文件?如果这样,应该工作。 – Guvante 2012-03-21 19:15:58

+0

好吧,我会试一试。 – 2012-03-21 19:20:40

0

我刚刚经历过同样的问题,用7zip的自解压exe文件。

在创建自解压缩exe文件之前更新7zS.sfx(而不是exe文件)的图标会诀窍,exe文件也不会损坏。