2014-11-06 53 views
1

我有一个非常特殊的问题,我需要解决。外部处理不同长度的C#字符串

我有一个编译的C#应用​​程序,我需要能够替换它中的某些字符串。现在,我知道如果我想用自己的长度相同的字符串替换字符串,我可以简单地更改字节。问题是,一些字符串可能比需要的短,我需要以某种方式无效终止。

如果这是C,我只需要添加一个空字节后,我加入,我想替换字符串,但在C#显然空字节包含字符串中,这将导致问题为我的应用

你们有没有解决方案,如何做到这一点?

谢谢

+4

你可能会用一些反编译器对代码进行逆向工程,然后再编译一遍。总而言之,如果你没有消息来源,你就会头痛不已。 – paqogomez 2014-11-06 18:14:58

+1

你可以做到这一点,所以你需要改变的字符串在应用程序的配置文件,而不是试图改变代码中的位? – 2014-11-06 18:16:56

+0

“我有一个编译好的C#应用​​程序”,是你拥有的全部?或者你有源代码吗?如果你不能修改原来的程序,这可能会变得很难看。 – 2014-11-06 18:20:24

回答

1

我想你可以使用一些免费工具来做到这一点。一个是Telerik的JustDecompile,另一个是JustDecompile的插件,可以让你很容易地编辑现有的程序集。该插件是Reflixil。您可以使用JustDecompile中的插件配置功能来下载并安装它。

为了查看它是否有效,我用一个简单的winform应用程序做了一些测试。我拖动exe文件,将其放到JustDecompile上,然后加载exe程序集。然后,我在插件菜单下单击了Reflexil以启用插件窗格。我点击了一个我想改变为测试的字符串的方法。

作为测试,我试图改变“秒”到“秒经过”,有目的地选择一个较长的字符串长度。在Reflexil窗格中,我发现IL代码,引用的文字:

右单击该行,并选择编辑。这让我只需输入不同的字符串。编辑它后,线路出现了这样的Reflexil窗格:

enter image description here

然后我去了左窗格中,右键我的组装点击,并从弹出菜单中选择Reflexil,并选择从下面的菜单中保存并重新加载。然后我跑我的程序,以及低你看,这是我改变了文本如何显示了形式:

所以,这一切的一切,那是相当容易的,而且似乎让我做的正是您要求的内容,即直接编辑现有C#/ .Net程序集中的字符串。

1

如果你要修改已编译的程序,您可以包括插座。这样程序可以获得修改字符串的请求。或者在运行时接受命令行中的命令。但我猜你不想触摸编译的程序。如果它是一个cstring,那么你的记忆编辑会起作用(只要你知道位置)。

1

字符串存储在C#编译代码中的方式与C++的方式不同。我没有真正看过这些位,但我相信这些字符串以与存储在内存中相同的方式存储在可执行文件中。这意味着某个地方有一组字节,它告诉系统字符串有多长,字符串实际上没有终止。为了让您按照您认为需要查找这些字节并将其更改为反映长度的方式使其工作。

如果您有权访问代码,则可能需要更改代码,以便使用配置文件中的值而不是代码中存储的值。