gpt4 book ai didi

.net - 编译后,在 .net exe 中操作字符串?

转载 作者:行者123 更新时间:2023-12-03 20:19:21 25 4
gpt4 key购买 nike

我知道对此的任何答案都可能非常笨拙。我完全赞成,我喜欢突破界限,看看有什么可能并在此过程中学习。

我想编写一个程序来操作一个已知的 exe 来改变它里面的一个字符串。我目前有一个非常简单的 C# 程序,它是已知的 exe:

using System;

namespace Target {
class Program {

public static String str = "TESTSTRING";

static void Main(string[] args) {
Console.WriteLine(str);
}
}
}

编译后,在十六进制编辑器中,我看到字符串的第一个字母位于字节 1898。它似乎是从那里以 Unicode 存储的。

Hex editor screenshot showing string in compiled exe

一点编译器优化将字符串直接放入 Console.WriteLine call 并且似乎正在调用一些构造函数(至少我认为 .cctor 是这样)。我玩过其他相同长度的琴弦,以确保我知道一切是什么。我编写了一个成功替换 TESTSTRING 的应用程序与 XXXXXXXXXX (请注意,它们的长度相同)并运行修改后的 exe。它工作得很好。

但是,如果我尝试用不同长度的字符串替换该字符串,则输出 exe 将无法运行。我发现紧接在字符串之前的字节似乎包含长度。它似乎是 unicode 字符串的字节数 + 1(我不知道 +1 是什么,也许是一个空终止符?)。但是,如果我用适当的更新值替换该长度,它仍然不会运行。字符串结尾之后似乎有几个字节,对于不同长度的字符串是不同的。我的猜测是构造函数类似于 new String(...)并且那些其他字节是构造函数的其他参数(第一个参数是 char[]byte[] 前面是它的长度),但我无法解释其他参数具体是什么。

我知道我正在打破通常单独留下的东西,但我对这种可能性感到好奇。我对 .Net exe 的结构有什么不知道的,知道这将使我能够做到这一点?要将已编译的 EXE 中的一个字符串替换为另一个长度不同的字符串?另外我如何解释长度超过 127 的字符串?任何比这更长的东西都会影响存储字符串长度所需的字节数。

我希望能够使用任何任意替换字符串来做到这一点。所以预编译一个特定的字符串,然后只用那个预编译的字符串修补 exe 并且它的元数据不是一个选项。我应该能够在没有反编译器/编译器的情况下做到这一点。我绝对想以编程方式执行此操作,因此 Reflector 不是一种选择。这能可靠地完成吗?

最佳答案

你可以用 ildasm 来做到这一点.它不是反编译器,而是反汇编器。它会产生一个 MSIL 文本输出,你可以改变然后用 ilasm 重新编译。 .

编辑:我怎么会忘记? Mono.Cecil应该是 很棒 对你感兴趣。

一些备注:

  • .cctor是类构造函数的缩写,又名静态构造函数,而不是实例构造函数。
  • 字符串的内部表示仍然以空值结尾,这就是为什么您在文件中看到 length + 1 的原因。这仅用于更容易的互操作性 (P/Invoke)
  • 更改长度和偏移字节不起作用,因为我猜它会破坏存储偏移量的文件中的其他一些数据。您必须更新存储在 exe 中的每个偏移量才能使其工作。这可能意味着......拆卸它。这就是 ildasm 的用途。
  • 关于.net - 编译后,在 .net exe 中操作字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26185776/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com