首页
社区
课程
招聘
[求助]请问如何修改.net的字符串常量(元数据?)
发表于: 2012-1-12 13:58 6936

[求助]请问如何修改.net的字符串常量(元数据?)

2012-1-12 13:58
6936
我需要修改一个.net程序的字符串常量。可是.net的字符串常量是在元数据中的,我也查了些资料,看了元数据结构,可没找到如何在文件中定位具体一个字符串信息的资料。
比如我用.net写个例子
private void Form1_Load(object sender, EventArgs e)
        {
            string s;
            s = "(";
            s = s + ")";
            s = s + "-";
            this.Text = s;
        }


编译成exe后用IL打开

  .maxstack  2
  .locals init ([0] string s)
  IL_0000:  /* 00   |                  */ nop
  IL_0001:  /* 72   | (70)00000D       */ ldstr      "("
  IL_0006:  /* 0A   |                  */ stloc.0
  IL_0007:  /* 06   |                  */ ldloc.0
  IL_0008:  /* 72   | (70)000011       */ ldstr      ")"
  IL_000d:  /* 28   | (0A)00001E       */ call       string [mscorlib]System.String::Concat(string,
                                                                                            string)
  IL_0012:  /* 0A   |                  */ stloc.0
  IL_0013:  /* 06   |                  */ ldloc.0
  IL_0014:  /* 72   | (70)000015       */ ldstr      "-"
  IL_0019:  /* 28   | (0A)00001E       */ call       string [mscorlib]System.String::Concat(string,
                                                                                            string)
  IL_001e:  /* 0A   |                  */ stloc.0
  IL_001f:  /* 02   |                  */ ldarg.0
  IL_0020:  /* 06   |                  */ ldloc.0
  IL_0021:  /* 6F   | (0A)000019       */ callvirt   instance void [System.Windows.Forms]System.Windows.Forms.Control::set_Text(string)
  IL_0026:  /* 00   |                  */ nop
  IL_0027:  /* 2A   |                  */ ret


看到IL_0001:  /* 72   | (70)00000D       */ ldstr      "(" 加载7000000D地址的元数据。
可具体这个元数据在该exe文件的什么位置?如何才能修改它?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 504
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
反匯編將變量重命名就可以了,,,
2012-1-12 14:37
0
雪    币: 221
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不加密和不混淆的程序直接可以用16进制工具改的吧。
2012-1-13 12:57
0
雪    币: 382
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
2L 你的方法我知道,可我的测试代码只是一个简单的例子。实际上这个工程有很多的代码,反编回来或许还会有错误,再手工排错,在编译等等工程量很大。而我只需要更改一个字符串常量的值。

3L 我也知道用16进制编辑器更改,比如我想调换字符串的顺序那很简单,对应的16进制串调换顺序就行了。
可是在.net中,字符串在元数据中保存,比如例子中的 “(” 是元数据中的 (70)00000D,我不清楚在16进制文件中,对应的位置在哪。

请熟悉IL语言的高手指教
2012-1-14 10:41
0
雪    币: 504
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
嘗試reflexil插件修改
2012-1-14 18:07
0
雪    币: 221
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
一定要16进制找么?
其实你这种修改需求用reflexil就可以解决了

不过实在要用16进制修改的话
可以在cff中修改
按你的例子,在#US中找偏移00000D
这个字节是决定后续字符串流的长度,长度按压缩算法计算
如果你这个例子的话,应该值是3,表示包含长度字节在内总共占3个字节
由于#US流内的字符表示都是unicode的,所以一个字符占两个字节
直接修改后保存就ok

如果一定要用winhex等16进制软件编辑的话,估计就麻烦些了,需要深入了解pe结构
但如果可以用cff的话,也是蛮简单的,cff中都有说明各节的offset和size,根据相关数据进行换算计算就可以了
2012-1-15 21:45
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
用这个修改很简单,或者用SAE,都很方便,按楼主的意思,就是改ldstr后的内容
2012-2-15 20:50
0
游客
登录 | 注册 方可回帖
返回
//