anti-junk instruction

首战去花 西湖论剑re3

下载后发现是32位pe文件,终于做到pe了,叹气
发现是mfc写的,掏出xspy找到按钮函数

image_1d80fvj9826dqm1tav1c19scd1p.png-31.3kB

可以看到按钮函数是0x002420直接进去看,然后进入第一个判断函数402600

image_1d80g2qpa180p4868501ibe1s5a2m.png-56.3kB

直接在这个地方下断点调试,getWindowsText一开始没有被识别,这是后来重命名的,我说怎么找getWindowsText没找到他的交叉引用,然后继续看

image_1d80ktqsg6vr1kkdl5mp108rs9.png-8.9kB

判断了输入长度是否为38,然后就是。。其实整个ida的分析结果是不正确的,有大量的花指令,

image_1d80n148j1j18afplp91d99r059.png-120.5kB

花指令的大致模板如下,从call $+5开始,call 00 00 00 00偏移处就是call自己,毫无意义,后面又是一堆在相邻地址之间的跳转,还有就是mov eax,1111h之类的,一看就是不正经的代码,总之就是从call $5一直到mov ebx,2222h都是花指令,我们只需要写一个脚本去取出
E8 00 00 00 00 58 89 45 D8 E8 03 00 00 00 EA EB 09
5B 43 53 B8 11 11 11 11 C3 E8 07 00 00 00 BB 33
33 33 33 EB 0D BB 11 11 11 11 5B BB 12 2C 2B 01
53 C3 BB 22 22 22 22 这些无效byte就ok,那我们就开始写idc脚本吧!

#include <idc.idc>
static main(){
auto i,j,from,size;
from=0x402600; 
size=0x4f0;//扫描数据块大小
for ( i=0; i < size;i++ ) {
  if ((Byte(from)==0xe8)&&(Byte(from+1)==0x00)&&(Byte(from+2)==0x00)&&(Byte(from+3)==0x00))
 {
       Message("\n" + "Find\n");
       for(j=0;j<59;j++)
      {
           PatchByte(from,0x90);
           from++;
        }
        continue;
   }
     from++;
}
Message("\n" + "OK\n");
}

大概就是匹配从2600开始的byte中以e8 00 00 00开始的指令流,全清零就ok,我数了下,从e8 00开始,一直到结尾的mov ebx,2222h,一共是59个字节,直接nop掉就完事了伙计,

image_1d813iaov1s3gud012qj1tsdmaom.png-70.1kB

image_1d813jbvslig38g54vmfa191o13.png-43.2kB

去花后的代码就不用我多说了吧,rc4+逆序,很简单的,把check的密文输入就可以得到明文了,总体来说,还是挺不错的体验(花指令较为简单,为固定byte的代码块)。