私はGoogleで検索して、私たちは、次のコード行を使用して、任意の.exe
ファイルのアイコンを変更でき有用なクラスが見つかりました:私は既存の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を使用してファイルを再度開くしようとしたとき
、私は以下のが見つかりました:
アイコンリソースが正常に追加されたようですが、ファイルは「doesnの理由を私は把握することはできませんもう仕事は、それは壊れているようです。
任意の助けいただければ幸いです。
注:保護されていないファイルでこのクラスを使用しようとしましたが、それは魅力的です!
私が使用していたクラスは以下の通りです:
// 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);
}
}
}
それを破壊することなく、保護されたファイルにアイコンを追加することで任意のヘルプや提案?
入力ファイル(保護するファイル)にデフォルトでアイコンがない場合はどうなりますか? –
@mohamedmaache:入力実行ファイルに注入した場合、実行可能ファイルに注入すると、保護システムはそれを渡しますか?もしそうなら、それはうまくいくはずです。 – Guvante
私はそれを試してみましょう。 –