假设有一个exe,我现在要感染它,因为上面的原因决定,我只能选择一个迂回的路线。
把exe用ildasm搞成.il代码,然后把我的il代码加进去,然后ilasm重新编译该il,呵呵。这样做,需要被感染的机器安装有ildasm(如果不装sdk,没这玩意儿)。
简单的例子:我想输入hello,fqq!那么写一个最小的代码,如下:
using System;
namespace DebugDemo{
public class Demo{
public static void Main(){
Console.WriteLine("hello,fqq!");
}
}
}
namespace DebugDemo{
public class Demo{
public static void Main(){
Console.WriteLine("hello,fqq!");
}
}
}
然后用csc,ildasm,得到.il代码,main里面唯一的一行,会输出为:
IL_0000: ldstr "hello,fqq!"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
然后,用ildasm 要感染的文件.exe /output=tmp.il
然后找到il中的.entrypoint,把上面两行插进去,并修改后面的il行号(是否需要修改?我没有试验过,不过我是都修改了),然后,用ilasm重新编译一次,把原来的文件覆盖即可。
虽然着很滥,不过确实很直接的做法,呵呵。
这是被感染文件,修改前的il代码:
.entrypoint
// Code size 25 (0x19)
.maxstack 3
.locals init (int32 V_0,
int32 V_1,
int32 V_2,
int32 V_3)
IL_0000: ldc.i4.s 10
IL_0002: stloc.0
IL_0003: ldc.i4.s 20
IL_0005: stloc.1
IL_0006: ldc.i4.s 30
IL_0008: stloc.2
IL_0009: ldloc.0
IL_000a: ldloc.1
IL_000b: ldloc.2
IL_000c: call int32 DebugDemo.Demo::Sum(int32,
int32,
int32)
IL_0011: stloc.3
IL_0012: ldloc.3
IL_0013: call void [mscorlib]System.Console::WriteLine(int32)
IL_0018: ret
// Code size 25 (0x19)
.maxstack 3
.locals init (int32 V_0,
int32 V_1,
int32 V_2,
int32 V_3)
IL_0000: ldc.i4.s 10
IL_0002: stloc.0
IL_0003: ldc.i4.s 20
IL_0005: stloc.1
IL_0006: ldc.i4.s 30
IL_0008: stloc.2
IL_0009: ldloc.0
IL_000a: ldloc.1
IL_000b: ldloc.2
IL_000c: call int32 DebugDemo.Demo::Sum(int32,
int32,
int32)
IL_0011: stloc.3
IL_0012: ldloc.3
IL_0013: call void [mscorlib]System.Console::WriteLine(int32)
IL_0018: ret
下面是被感染文件修改后的代码:
.entrypoint
// Code size 25 (0x19)
.maxstack 3
.locals init (int32 V_0,
int32 V_1,
int32 V_2,
int32 V_3)
IL_0000: ldstr "hello,fqq!"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_000a: ldc.i4.s 10
IL_000c: stloc.0
IL_000d: ldc.i4.s 20
IL_000f: stloc.1
IL_0010: ldc.i4.s 30
IL_0012: stloc.2
IL_0013: ldloc.0
IL_0014: ldloc.1
IL_0015: ldloc.2
IL_0016: call int32 DebugDemo.Demo::Sum(int32,
int32,
int32)
IL_001b: stloc.3
IL_001c: ldloc.3
IL_001d: call void [mscorlib]System.Console::WriteLine(int32)
IL_0022: ret
// Code size 25 (0x19)
.maxstack 3
.locals init (int32 V_0,
int32 V_1,
int32 V_2,
int32 V_3)
IL_0000: ldstr "hello,fqq!"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_000a: ldc.i4.s 10
IL_000c: stloc.0
IL_000d: ldc.i4.s 20
IL_000f: stloc.1
IL_0010: ldc.i4.s 30
IL_0012: stloc.2
IL_0013: ldloc.0
IL_0014: ldloc.1
IL_0015: ldloc.2
IL_0016: call int32 DebugDemo.Demo::Sum(int32,
int32,
int32)
IL_001b: stloc.3
IL_001c: ldloc.3
IL_001d: call void [mscorlib]System.Console::WriteLine(int32)
IL_0022: ret
注意IL_0000和IL_0005两行,被我插入了。
注意!!!这不是什么病毒教程,如果病毒要这么写,作者早就被人扁死了。