2012-03-21 73 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文件也不會損壞。

相關問題