[原创]Phoenix RDK的妙用
发表于:
2007-1-7 14:14
12206
Phoenix RDK的妙用
什么是RDK。RDK是Research Development Kit的缩写,可以理解成未正式发布的SDK。Phoenix RDK是微软的一个有关编译器的项目,官方网址http://research.microsoft.com/phoenix/。由于文档很少,也没有什么tutorial,一直没有深入进去。不过今天一不小心发现了phx 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直播授课