2012-03-21 21 views
4

私はGoogleで検索して、私たちは、次のコード行を使用して、任意の.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

アイコンリソースが正常に追加されたようですが、ファイルは「doesnの理由を私は把握することはできませんもう仕事は、それは壊れているようです。

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

入力ファイル(保護するファイル)にデフォルトでアイコンがない場合はどうなりますか? –

+0

@mohamedmaache:入力実行ファイルに注入した場合、実行可能ファイルに注入すると、保護システムはそれを渡しますか?もしそうなら、それはうまくいくはずです。 – Guvante

+0

私はそれを試してみましょう。 –

0

を訪問することができます。

セルフエクストラクターexeを作成する前に、(exeの代わりに)7zS.sfxのアイコンを更新すると、そのトリックとexeファイルは破損しません。

関連する問題