【问题标题】:Change resources in other Win32-dll/exe更改其他 Win32-dl​​l/exe 中的资源
【发布时间】:2012-02-26 10:00:36
【问题描述】:

有一个Resource Hacker 程序允许更改其他win32(64) dll 和exe 文件中的资源。

我需要做同样的事情,但要以编程方式。是否可以使用.Net框架来做到这一点?做这件事的好起点是什么?

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    你必须使用BeginUpdateResourceUpdateResourceEndUpdateResource WinApi函数,尝试this page检查这些函数的pinvoke .Net签名,你也可以检查这个项目ResourceLib

    【讨论】:

      【解决方案2】:

      作者指向另一个工具“XN Resource Editor”,它带有源代码(虽然是Delphi,而不是.NET)。

      这应该足以查看正在使用哪些函数并使用它们的 .NET 等效项。

      【讨论】:

        【解决方案3】:

        看看Anolis.Resourcer。这似乎是你需要的东西

        作为 Anolis.Core 的测试平台开发的 ResHacker 克隆并替换 ResHacker(因为 ResHacker 不支持 x64,XN 资源编辑器(ResHacker 的精神续集)不支持多语言资源并且经常崩溃,以及其他实用程序休息要花实际的钱。它具有强大而简化的 UI,不会重复命令或将用户与特殊情况的处理程序混淆(ResHacker 和 XN 都有)。

        【讨论】:

          【解决方案4】:

          请注意,如果您正在处理签名的 EXE 或 DLL,这些都不起作用。

          【讨论】:

          • 感谢您的信息,顺便说一句,您知道为什么吗?
          • 因为一旦更改资源,签名将不匹配。如果没有您没有的私钥,您将无法再次签名。
          • 我知道,我以为你的意思是我们不能修改已签名的 EXE/DLL 中的资源。
          【解决方案5】:

          好吧,我认为这不是一件容易的事,所以我将使用 Resource Hacker 的command line interface

          【讨论】:

            【解决方案6】:

            如果您想直接从 .NET 执行此操作,则有一个名为 Ressy 的库正是用于此目的。它既提供对资源的低级操作(即处理原始字节流),也提供高级操作(即替换图标、清单、版本信息等)。

            添加或覆盖资源:

            using Ressy;
            
            var portableExecutable = new PortableExecutable("C:/Windows/System32/notepad.exe");
            
            portableExecutable.SetResource(
                new ResourceIdentifier(
                    ResourceType.Manifest,
                    ResourceName.FromCode(1),
                    new Language(1033)
                ),
                new byte[] { 0x01, 0x02, 0x03 }
            );
            

            获取资源数据:

            using Ressy;
            
            var portableExecutable = new PortableExecutable("C:/Windows/System32/notepad.exe");
            
            var resource = portableExecutable.GetResource(new ResourceIdentifier(
                ResourceType.Manifest,
                ResourceName.FromCode(1),
                new Language(1033)
            ));
            
            var resourceData = resource.Data; // byte[]
            var resourceString = resource.ReadAsString(Encoding.UTF8); // string
            

            设置文件图标:

            using Ressy;
            using Ressy.HighLevel.Icons;
            
            var portableExecutable = new PortableExecutable("C:/Windows/System32/notepad.exe");
            
            portableExecutable.SetIcon("new_icon.ico");
            

            有关更多示例,请参阅readme

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-03-18
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多