[原创]Phoenix RDK的妙用
发表于:
2007-1-7 14:14
12434
Phoenix RDK的妙用
什么是RDK。RDK是Research Development Kit的缩写,可以理解成未正式发布的SDK。Phoenix RDK是微软的一个有关编译器的项目,官方网址4d5K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4u0W2M7$3g2S2M7X3y4Z5i4K6u0W2L8h3W2U0M7X3!0K6L8$3k6@1i4K6u0W2j5$3!0E0i4K6u0r3M7r3S2G2k6h3&6A6P5q4)9J5c8W2!0q4x3#2)9^5x3q4)9^5x3W2!0q4y4#2)9&6y4q4!0n7x3g2!0q4y4q4!0n7b7g2)9^5c8g2!0q4y4W2)9&6y4W2)9^5y4#2!0q4y4W2!0m8x3g2!0m8x3#2!0q4y4g2!0n7c8g2)9^5z5q4!0q4y4g2!0n7x3q4)9&6x3g2!0q4c8W2!0n7b7#2)9^5b7#2!0q4y4q4!0n7z5g2)9&6c8W2!0q4y4W2!0n7x3W2!0m8x3g2!0q4y4W2)9&6b7#2)9^5z5g2!0q4y4q4!0n7b7W2)9^5x3q4!0q4y4q4!0n7z5g2)9^5z5s2c8#2N6r3!0J5K9h3q4D9i4@1g2r3i4@1u0o6i4K6S2o6i4@1f1@1i4@1t1^5i4K6R3H3i4@1f1%4i4K6W2n7i4@1t1@1i4@1f1$3i4@1t1J5i4@1p5I4i4@1f1$3i4K6W2o6i4K6R3&6i4@1f1$3i4@1t1%4i4@1t1I4i4@1f1#2i4K6R3#2i4@1p5#2i4@1f1^5i4@1u0r3i4K6W2n7i4@1f1#2i4K6S2q4i4@1u0n7i4@1f1K6i4K6R3H3i4K6R3J5i4@1f1@1i4@1t1^5i4K6S2p5i4@1f1^5i4@1u0r3i4K6R3%4i4@1f1@1i4@1u0n7i4K6S2m8i4@1f1#2i4@1p5@1i4@1p5&6i4@1f1@1i4@1t1^5i4K6R3H3i4@1f1@1i4@1t1^5i4K6S2p5i4@1f1#2i4@1t1H3i4K6S2r3i4@1f1#2i4@1u0r3i4K6R3K6i4@1f1#2i4K6S2r3i4K6V1I4i4@1f1%4i4K6S2q4i4@1t1H3i4@1f1@1i4@1u0m8i4K6R3$3M7r3S2^5 rdk有自动优化的功能,可以运用于部分.net程序流程混淆的自动反混淆。
下面来看实例。一个.net可执行文件,用reflector打开后,当解码显示为C#时,出错:
将解码换成il,可以看到报错的原因是前4行语句:
.method family hidebysig virtual instance bg69HSMjsC.BAwiRPXqUI3RVh GenerateSearchBase(int32, object) cil managed
{
.maxstack 7
.locals init (
[0] bg69HSMjsC.BAwiRPXqUI3RVh vh1,
[1] bg69HSMjsC.BAwiRPXqUI3RVh vh2,
[2] bool flag1)
L_0000: br L_0007
L_0005: pop
L_0006: ldc.i4.0
L_0007: nop
L_0008: ldarg.2
L_0009: ldnull
L_000a: ceq
L_000c: ldc.i4.0
据dreaman分析,reflector之类的反编译软件以堆栈作为解码依据,大意是每句指令开始与结束必须椎栈为空,且语句执行过程中不能出现椎栈的underflow。(overflow一般不大可能出现。)所以,L_0005处的pop在椎栈为空时进行出栈操作,尽管这两句不会运行,但reflector仍然报错。
这种流程混淆是最原始的了,更高级的混淆及相应分析见dreaman的文章。
Phx rdx有自动优化功能,运用这个功能,参照phx的sample源代码,写了个最简单的工具replace.exe。(源码请参考phx rdk中的addnoptool的sample源码)。
运行后输入:replace input.exe output.exe
再用reflector打开output.exe,反编译同一个方法:
已经成功解码成C#了。切换成il可以看到,前4行语句已经被编译器的优化去除了:
.method family hidebysig virtual instance bg69HSMjsC.BAwiRPXqUI3RVh GenerateSearchBase(int32, object) cil managed
{
.maxstack 2
.locals init (
[0] bg69HSMjsC.BAwiRPXqUI3RVh vh1,
[1] bg69HSMjsC.BAwiRPXqUI3RVh vh2,
[2] bool flag1)
L_0000: nop
L_0001: ldarg.2
L_0002: ldnull
L_0003: ceq Phoenix RDK的功能太强大了,已经有人利用phx写出了混淆器等。有兴趣研究的一起来学习吧。(附件见2、3、7楼)
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课