对themida(1.8.5.5)加密VC++程序的完美脱壳

 --------------------------------------------------------------------------------
【详细过程】
       我经过探索实现了对Themida(1.8.5.5版)加密VC++程序的完美脱壳.如果文中的方法只适用于这个特例,则本文就毫无价值....,我把我的方法提供给大家研究,对象是想升级的菜鸟们,请高手不要嘲笑我对脚本或程序的详细注释.
  
       一.脱壳思路
      Themida是一款强大的加密加壳工具,特别是1.8.5.5版,它破坏了程序的入口代码并用一段壳代码取代了它,根本模糊了OEP界线.要么脱壳不完全,要么进不了程序代码(菜鸟的肤浅认识).但Themida也暴露出了它自身的弱点:
      1.它对入口代码的破坏一般只有几十个字节,对一些固定模式的入口程序,如VC++,VB,Delphi等入口的发现和修复还是比较容易的.Themida对它不熟习的入口代码则脱壳后原样不变!这时,OEP就清晰了.
      2.和所有的加壳软件一样,Themida也只能在现场获取API地址,经加密后再写入程序代码中.正确的API地址一定会在某个寄存器中瞬间出现,这就暴露了它加密的蛛丝马迹,捕获在themida代码中出现API地址的代码段就成为了脱壳的突破口.
      3.任何程序运行完成后都会"返回到kernel32.7C816FD"(菜鸟的肤浅认识).因此当堆栈顶是"返回到kernel32.7C816FD"时,是从壳代码进入程序代码的重要标志.
      我就是抓住以上三点作为突破口实现了对Themida(1.8.5.5)版的完美脱壳.
       二.脱壳脚本的说明(测试程序和脚本见附件)
  --------------------------------------------------------
       完整的脱壳脚本:(ODbgScript 1.65.1.0版   OllyDBG 1.0.10.0版)
  data:
    var mem
    var mem1
    var temIAT
    var temESI
    var temAPI
    var APIstr
  
    bphwc
      
  start:  
    esto
    esto
    bphws 65d270,"w"
  
  reset: 
    esto 
    cmp [65d270],5ec103ad  //判断加密段代码是否出现
    jnz reset  
    bphwc 65d270
  
    bphws 65d992,"x"
      
  step:
    esto              //断点65d992 
    bphwc 
    cmp eip,65d273  //以API函数名装载方式则跳
    jz  step6
    cmp eip,65e1c8        //准备退出
    jz  step5
            //----以序列号方式装载则进入-------
    or  edx,80000000
    mov [eax],edx        //修复IAT表(写入序列号)
    mov temIAT,eax        //保存IAT地址
    bphws 65d9a0,"x"
    
  step2:
    esto              //断点65d9a0
    bphwc  
    cmp eax,FFFFFFFF      //判断当前函数是否加密新的地址
    jnz next
    bphws 65d992,"x"
    bphws 65d273,"x"
    bphws 65e1c8,"x"
    jmp step
  next:
    bphws 65d9d2,"x"  
  
    esto                  //断点65d9d2
    bphwc  
    mov mem1,eax          //eax是内存中呼叫API的地址
    mov temESI,[esi]      //获取转跳标记
    bphws 65da7c,"x"
  
    esto              //断点65da7c
    bphwc 65da7c
   
    cmp temESI,AAAAAAAA
    jnz step3
    mov [mem1],#FF25#      //修复代码中转跳地址
    mov [mem1+2],temIAT 
    bphws 65d9a0,"x" 
    jmp step2
  
  step3:
    mov [mem1],#FF15#      //修复代码中呼叫地址
    mov [mem1+2],temIAT
    bphws 65d9a0,"x"
    jmp step2
    
    
  step5:
    bphwc
  
  //---完善INT表,插入库函数名----- 
    add APIstr,"   MFC42D.dll MFCO42D.dll MSVCRTD.dll KERNEL32.dll"    //MFC42D前加4个空格
    mov [410000],APIstr   
  //--写入平衡堆栈,入口地址和跳出壳的代码                      
    mov [65e1cf],#83C44CB8902E400050C3#
  //--恢复应用程序入口代码
    mov [402e90],#558BEC6AFF687068410068F830400064A100000000506489250000000083C4945356578965E8C745FC000000006A02#
    sti
    sti
    sti
    sti
    sti
    pause            //成功脱壳,然后Dump,稍加修改PE头后,程序正常运行.
  
          //-----以函数名方式装载的进入---------
  step6:
    mov temAPI,eax     //eax 是API函数地址
    gn temAPI 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值