// 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的意思