首页
社区
课程
招聘
[求助]NET程序代码的问题
发表于: 2009-11-8 14:20 6290

[求助]NET程序代码的问题

2009-11-8 14:20
6290
NET程序代码的问题

   L_001a: ldarg.0
    L_001b: ldfld bool cz::a1
    L_0020: brtrue L_003e

请问怎么修改可以让  ldfld bool cz::a1这里等于TRUE或FALSE

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 83
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
使用winhex 修改 为 16 或 17
2009-11-8 14:48
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
可以说的详细点吗?
L_001b: ldfld bool cz::a1
    L_0020: brtrue L_003e
程序里有很多。我想只改一个字节而不都用改掉
2009-11-8 16:34
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
用ILDASM打开,查到函数的RVA, 然后再用HEX工具打开,找到偏移改就是了。
2009-11-8 18:04
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
ILDASM打开,查到函数的RVA,
不是很明白
2009-11-8 19:05
0
雪    币: 83
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
这样都不懂,很难告诉你的,希望你学点破.NET的基础
2009-11-8 20:18
0
雪    币: 1137
活跃值: (10)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
7
用ildasm打开程序,ildasm的视图菜单下的"显示字节"需要勾选.
这时候就可以看到这段代码所在方法的RVA.然后在用编辑器工具打开,算计出文件的偏移...然后进行修改

用Reflector的Reflexil插件修改就比较方便
2009-11-8 21:42
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
.method public hidebysig instance void  bq(object A_0,
                                           class [mscorlib]System.EventArgs A_1) cil managed
// SIG: 20 02 01 1C 12 45
{
  // 方法在 RVA 0x29e64 处开始
  // 代码大小       1 (0x1)
  .maxstack  8
  IL_0000:  /* 2A   |                  */ ret
} // end of method 'cf'::bq
RVA 0X29E64 对吧?
2009-11-11 19:50
0
雪    币: 83
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
是 ,就是 29e64
2009-11-11 20:11
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
转换成偏移00028E64后,周围没有看到16或17
2009-11-11 20:38
0
雪    币: 83
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
在ildasm 看 L_001b: ldfld bool cz::a1 偏移地址 TO 16 00 00 00 00 或 17 00 00 00 00
2009-11-11 22:33
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
  IL_005d:  /* 02   |                  */ ldarg.0
    IL_005e:  /* 7B   | (04)000433       */ldfld bool cz::a1*0200005A*/::bj /* 04000433 */
    IL_0063:  /* 2D   | 79               */ brtrue.s   IL_00de
谢谢ATRM的回复.可是我的idasm里看不到偏移地址
2009-11-12 09:54
0
雪    币: 1137
活跃值: (10)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
13
// SIG: 20 02 01 1C 12 45
{
// 方法在 RVA 0x29e64 处开始
// 代码大小 1 (0x1)
.maxstack 8


这里的0x29e64就是该方法的偏移地址

而atrm说的16或17指的是 0x16或0x17 对应的指令即: ldc.i4.0 和 idc.i4.1

IL_005e: /* 7B | (04)000433 */ldfld bool cz::a1*0200005A*/::bj /* 04000433 */


你可以在这里把栈里面压入 0或者1 从而影响下在的跳转
7B   | (04)000433  
7B对应的是ldfld 这个操作指令  (04)000433 是 cz:al这个字段的token

这里可的操作指令可以改为 16 或 17(看你想怎么样控制跳转了)  后面的 04 000433 改为 00 000000 即 nop nop nop nop空指令了..

如果有问题的话...可能堆栈不平衡..这时候可能还需要一些改动

`````````````````````````````````````````````````````````````````````````````````````

我刚实验了一下..我修改后堆栈就出了问题..不过我的情况比较简单..稍微改一下就好了

代码如下:
using System;

public class MyClass
{
	public static void Main()
	{
		Pro p=new Pro();
		if(p.i)
		{
			Console.WriteLine("ture");
		}
		else
		{
			Console.WriteLine("false");
		}
	}
}

public class Pro
{
	public Pro()
	{
	}
	public bool i=false;
}


ildasm 代码
.method public hidebysig static void  Main() cil managed
// SIG: 00 00 01
{
  .entrypoint
  // 方法在 RVA 0x2050 处开始
  // 代码大小       49 (0x31)
  .maxstack  2
  .locals init ([0] class Pro p,
           [1] bool CS$4$0000)
  IL_0000:  /* 00   |                  */ nop
  IL_0001:  /* 73   | (06)000003       */ newobj     instance void Pro::.ctor()
  IL_0006:  /* 0A   |                  */ stloc.0
  IL_0007:  /* 06   |                  */ ldloc.0
  IL_0008:  /* 7B   | (04)000001       */ ldfld      bool Pro::i
  IL_000d:  /* 16   |                  */ ldc.i4.0
  IL_000e:  /* FE01 |                  */ ceq
  IL_0010:  /* 0B   |                  */ stloc.1
  IL_0011:  /* 07   |                  */ ldloc.1
  IL_0012:  /* 2D   | 0F               */ brtrue.s   IL_0023
  ...  ...

IL_0008:  /* 7B   | (04)000001       */ ldfld      bool Pro::i
根据方法偏移到文件偏移  找到 7B 01 00 00 04 改为 17 00 00 00 00 保存运行 System.InvalidProgramException
这里就是因为堆栈不平衡所引起的

改后的代码:
   .entrypoint
  // 方法在 RVA 0x2050 处开始
  // 代码大小       49 (0x31)
  .maxstack  2
  .locals init ([0] class Pro p,
           [1] bool CS$4$0000)
  IL_0000:  /* 00   |                  */ nop
  IL_0001:  /* 73   | (06)000003       */ newobj     instance void Pro::.ctor()
  IL_0006:  /* 0A   |                  */ stloc.0
  IL_0007:  /* 06   |                  */ ldloc.0
  IL_0008:  /* 17   |                  */ ldc.i4.1
  IL_0009:  /* 00   |                  */ nop
  IL_000a:  /* 00   |                  */ nop
  IL_000b:  /* 00   |                  */ nop
  IL_000c:  /* 00   |                  */ nop
  IL_000d:  /* 16   |                  */ ldc.i4.0
  IL_000e:  /* FE01 |                  */ ceq

ceq指令从栈顶取两个...这里对栈却有三个压入的操作... 这里为了堆栈平衡...把  IL_0007:  /* 06   |                  */ ldloc.0 这里的 06也改为00 nop掉就行了

在次运行程序...返回 true

希望我这样说了之后bobylove能够明白...也希望我没有理解错atrm的关于16 或 17的意思
2009-11-12 11:09
0
雪    币: 290
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
现在貌似讨论.net的有些多了
2009-11-12 15:58
0
雪    币: 7121
活跃值: (4060)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
帮你顶,我也很想知道...
2009-11-14 13:41
0
游客
登录 | 注册 方可回帖
返回
//