代码:
【文章标题】: 让阿蛋-VP再升级一次吧
【文章作者】: liuhqiang(wuqing1501)
【软件名称】: VP加壳的VB程序
【下载地址】: 自己搜索下载
【保护方式】: VP全选项IAT最高等级加密
【使用工具】: 老三样
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
      前段时间学习了一下VP1.72demo的脱壳方法,找到了VP  IAT加密最高等级的特征码,根据特征码就可以很简单的修复IAT了,但是在随后的几次升级中,阿蛋和谐了那几个特征码,不过经过对VP1.75DEMO 和1.76demo的分析,修复IAT的特征码发生了变化在1.72版中特征码是:#595B588BC18B4F24519D03C38B5F4489039C58#,而在VP1.75&1.76版中,特征码变成了这个:#588B5F448D04878B008903#,所以脚本需要稍微修改一下了!
      其他的没有太多好说了,详细找OEP还有脱壳的流程可以参看我前面的文章,这里呢,我说下和原来有些不一样的地方。
      先说下自己的分析思路吧!
      对于一个加密壳,如何修复IAT,好像目前常见的方式有两种吧,一种是在到达oep以前,找到壳处理IAT的地方先path掉加密(比如大多数的TMD的脱壳脚本都是这样的),然后到达OEP后DUMP IR修复;另外一种就是先到达OEP,然后找几个加密后的IAT分析是怎么加密变形的,然后根据加密的方式再找到相应的处理方法(比如ZP壳脱壳脚本,还有VMP1.7脚本等),相对来说,我个人感觉第二种方法其实更简单一些更适合像我这样的菜鸟。所以我还是用菜鸟的办法吧。其实上次文章那里KISSYMM给出了更好的修复IAT 的方法,也就是应该和他和谐VMP一样的方法吧,但是很可惜我水平太菜了,到目前为止用KMM的那个脚本脱VMP的壳一次都没有成功过,所以对于那种方法修复VP加壳后的程序我就更不知道怎么做了,所以还是延续比较简单的修复IAT的方式吧,到OEP以后再修复。
      对于VP加壳后的程序,大家可以看一下,使用最简单加密的时候,修复的时候反而最不容易修复,因为修复很简单但是用的时间却很长,因为都是很简短的代码很难在里面找到相应的特征码,所以写脚本修复的时候只要不停的让脚本F7运行,然后判断EAX或者ESP中是否是真实的API地址就可以了。对于VP加密的中或者高等级加密来说,你要是不停的F7你就发现这个是不行的因为这两种加密方式都使用了VP特有的垃圾堆指令,修复一个API就不停的跑那些垃圾代码等你修复一个程序,阿蛋早就更新了N个版本了!所以对于这两种加密方式我个人感觉唯一的方法就是在那些垃圾代码中找到特征码。如果想详细分析VP的话可能要详细分析那些垃圾指令了,所以这个时候就需要用到我上次的文章中所用到的垃圾指令清楚脚本,不过当时那个脚本不能直接使用的,原因就是把所有的垃圾指令都NOP 掉了,但是软件运行中就会发现ESP貌似就不一样了,所以运行会出错的,只要把那个垃圾指令脚本中的"??"修改诚相应个数的”90”就可以了用了,用完脚本后再分析的话就很容易的发现,整个垃圾指令中主要是对 ESP 和EAX进行操作,(具体怎么操作的,大家可以看加壳的程序,因为我水平菜没有看懂),经过一些列的操作后通过JMP eax (也就是FFE0) 来确定跳转的地址,通过不停的跳转最后用一个RET 返回到某个地址。详细的分析搞不定,有兴趣的可以研究一下。
      具体怎么在这么多的垃圾指令中到大特征码呢?还是用到了上次那个小脚本,就是在vm中找IAT地址的那个,通过对所有寄存器的值来判断那个寄存器是壳使用的以及相应的出现真实API地址的代码,最好把某一个API 解密过程中所有出现真实地址的代码都记下来, 当然也可以写成一个小脚本记录,我呢就手动了。等脚本跑完后,在所有出现真实地址的地方下断,然后运行程序,看程序运行过程中调用API真实地址都是通过那个共同代码的那么那个代码就可以认定是特征码了!对于VP加密的程序,这个过程就是个体力活。其实这个方法虽然是最笨的但是对于但多数的加密壳来说我感觉应该都是通用的。 
      找到了特征码那么修复就变得简单多了,直接写个脚本就可以了。
      在这里我贴出,自己写的分析加密的VB程序的脚本,具有一定的通用性 但仅限于VB程序,因为VB简单所以研究的话也是最方便的,用别的语言的话查找加密后的IAT稍微费力气一点不过修复的时候都是一样的,原理相通。不过需要注意的是用脚本修复完IAT后, 用UIF修复一下,然后DUMP,用IR修复的时候要注意那些地址还有大小最好都是自己根据程序里面的值自己写,尤其是RVA这个值最好是自己根据程序的实际情况来写,因为我在脱壳过程中发现如果自己简单的用UIF修复后 直接填写个值的话会出错的,不知道是共性问题还是我自己脱壳的问题。
      对于新版的VP,好像还有个ANTIdump,这个也不知道是共性问题还是我自己的脱壳问题,也就是脱壳后的程序所有的段都被设置成了只读的属性,而程序运行中却要往段内写入数据所以就造成了出错,针对这个的话可以用LP将脱壳后的程序的段全部设置成可读写可执行,那样程序就没有问题了,可以运行了。
      另外对于新版的VP,最快速度的加密中,好像也有一个特征码就是#33c3e9#,这个还不能完全确定。
      好了这次就到这里吧没有任何的代码,是因为我感觉在前面的文章中,已经说的很详细了,在这里只是略作补充吧,这里只是说出了我分析的方法,希望对于想分析这个壳的朋友提供一点点的思路呵呵!
  下面这个脚本是脱VP1.75&1.76DEMO加壳的VB程序专用的脚本大家可以测试一下。
  
  ///////////////////////////////////////////////////////////////////
  //VP 1.75&1.76demo VB IAT 修复脚本                               //
  //1、本脚本适用于VP 1.75&1.76 DEMO  IAT 中等强度和最高等级       //
  //2、本脚本仅适用于VB程序                                        //
  //3、本脚本到达oep后使用                                         //
  //4、到达OEP的方法:                                             //
  //   1)CODE段下硬件写入断点(可使用StrongOD和PhantOm 两个插件) //
  //   2)断下后,F7、F8各一次                                     //
  //   3)code段下内存访问断点(或F2断点)到达oep                  //
  //code by wuqing1501                                             //
  //2010-08-19                                                     //
  ///////////////////////////////////////////////////////////////////
  
  var neicuncodebase             
  var neicuncodesize    
  var oep 
  var ptr
  var ip1 
  var addr
  var refaddr
  var temesp
  var ptr1
  var code
  var kebase
  var iataddr
  
  
  mov kebase,0040e000  //VP 第一个壳段
  mov oep,eip 
  mov temesp,esp
  
  findkebase1tzm3:
  
                 mov eip,kebase
                 find  eip, #588B5F448D04878B008903# //vp1.75和1.76修复IAT的特征码
                 cmp   $RESULT,0 
                 je exit
                 add  $RESULT,9
                 bp $RESULT
                 
                 mov esp,temesp
                 mov eip,00401000 //查找的起始位置
                 mov ptr1,eip
  
  tzm3iatfind: 
                 
                 mov temesp,esp
                 find  ptr1, #e9????????90# //VB程序比较特殊,AT被变形后 一般是这个遇到特殊的时候可适当修改
                 je    exit  
                 mov   ptr,$RESULT   
                 mov   ptr1,ptr 
                 mov   eip,ptr
                 mov   refaddr, ptr 
    
  
                 
  
  tzm3iataddrfind:
  
                 esto
                 mov iataddr,eax
                 gn iataddr
                 cmp   $RESULT,0 
                 je tzm3iataddrfind
  
  tzm3iatfix:
  
                 
                 sub eax,refaddr
                 sub eax,5
                 mov refaddr,ptr
                 mov [refaddr],#e9#
                 add refaddr,1
                 mov [refaddr],eax,4
                 mov esp,temesp
  
  
  nextfind:
                 add ptr1,6
                 cmp ptr1,oep  //针对VB程序的特殊性在这里添加一下限制,判断需要修复的IAT是否是在OEP上面,如果其他的程序的话,根据实际情况,可怎加相应的判断防止修复过程中跑飞。
                 ja exit              
                 jmp tzm3iatfind
  
  
  
  
  
  exit:
                mov esp,temesp
                mov eip,oep
                ret


附件:
包含所有的脚本和试练品(加壳和脱壳后文件)
--------------------------------------------------------------------------------
【经验总结】
  1、自己分析总结经验还是很重要的。有时候技术是一方面,努力和思路也是一方面。
  2、对于自己来说这个壳还是太难了,看来学习基础知识是十分必要的,还是要静下心来。
  
--------------------------------------------------------------------------------
【版权声明】: 没有什么版权, 但转载请注明作者并保持文章的完整, 谢谢!

                                                       2010年08月19日 12:33:21
上传的附件 VP1.75-1.76demo样品及所有的脚本.rar