首页
社区
课程
招聘
[原创]菜鸟脱壳心得--PeShield v0.25
发表于: 2009-3-23 23:36 7103

[原创]菜鸟脱壳心得--PeShield v0.25

2009-3-23 23:36
7103

【文章标题】: 菜鸟脱壳--PeShield v0.25
【文章作者】: zyqex
【软件名称】: 记事本
【加壳方式】: PeShield v0.25
【使用工具】: od
【操作平台】: xp2
【作者声明】: 菜鸟的一点心得,失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  【一点啰嗦话】:
  此文是我学二哥的《手动脱壳进阶第六篇PE-SHiELD V0.25 》后的自身探讨的脱壳方法,贻笑大方了!(一个老壳,
  壳的简介就不说了,如有需要请参看附件里二哥的脱文)
  【开始】
  异常设置:只忽略“在kernel32中的内存访问异常”。
  od载入加壳记事本,断在:
  0040D000 N>  60              pushad      (^_^ ESP定律? 行不通!)
  0040D001     E8 2B000000     call    0040D031
  0040D006     0D 0A0D0A0D     or      eax, 0D0A0D0A
  F9运行后经过两次shilft+F9程序跑起来,所以我们重来(用到一点最后一次异常法的知识),
  来到最后一次异常处:
  0040D4D7    8DC0            lea     eax, eax                         ; 非法使用寄存器
  0040D4D9    CD20 648F038B   vxdjump 8B038F64
  0040D4DF  ^ E0 8B           loopdne short 0040D46C
  此时堆栈窗口显示:
  0013FF9C   0013FFE0  指向下一个 SEH 记录的指针
  0013FFA0   0040D4AC  SE处理程序             (地址0040D4AC下断)
  bp 0040D4AC,F9运行
  断在:
  0040D4AC    8B4424 0C       mov     eax, dword ptr [esp+C]       (CONTEXT结构地址)
  0040D4B0    8380 B8000000 0>add     dword ptr [eax+B8], 4        (改变CONTEXT.regEip的值)
  0040D4B7    53              push    ebx
  0040D4B8    33DB            xor     ebx, ebx
  0040D4BA    8958 04         mov     dword ptr [eax+4], ebx
  0040D4BD    8958 08         mov     dword ptr [eax+8], ebx
  0040D4C0    C740 18 5501000>mov     dword ptr [eax+18], 155
  0040D4C7    8958 0C         mov     dword ptr [eax+C], ebx
  0040D4CA    8958 10         mov     dword ptr [eax+10], ebx
  0040D4CD    5B              pop     ebx
  0040D4CE    33C0            xor     eax, eax
  0040D4D0    C3              retn
  注意0040D4B0    8380 B8000000 0>add     dword ptr [eax+B8], 4 这一行,程序将跳到[eax+B8]这个地址
  去执行(当然不是马上)。
  所以在这句步过后,d eax+0b8
  bp  [eax+0b8]      ([eax+0b8]地址处下断)
  F9运行,断下:
  0040D4DB    64:8F03         pop     dword ptr fs:[ebx]               ; 0013FFE0
  0040D4DE    8BE0            mov     esp, eax
  接下来用插件清一下花指令,F8继续,直到
  0040D6BA    8D8D 1E080000   lea     ecx, dword ptr [ebp+81E]         ; Thread function address
  0040D6C0    90              nop
  0040D6C1    90              nop
  0040D6C2    90              nop
  0040D6C3    52              push    edx
  0040D6C4    90              nop
  0040D6C5    90              nop
  0040D6C6    90              nop
  0040D6C7    6A 00           push    0
  0040D6C9    90              nop
  0040D6CA    90              nop
  0040D6CB    90              nop
  0040D6CC    83C2 04         add     edx, 4
  0040D6CF    90              nop
  0040D6D0    90              nop
  0040D6D1    90              nop
  0040D6D2    52              push    edx
  0040D6D3    90              nop
  0040D6D4    90              nop
  0040D6D5    90              nop
  0040D6D6    51              push    ecx                              ; Thread function address
  0040D6D7    90              nop
  0040D6D8    90              nop
  0040D6D9    90              nop
  0040D6DA    6A 00           push    0
  0040D6DC    90              nop
  0040D6DD    90              nop
  0040D6DE    90              nop
  0040D6DF    6A 00           push    0
  0040D6E1    90              nop
  0040D6E2    90              nop
  0040D6E3    90              nop
  0040D6E4    8B85 6C110000   mov     eax, dword ptr [ebp+116C]        ; kernel32.CreateThread
  0040D6EA    90              nop
  0040D6EB    90              nop
  0040D6EC    90              nop
  0040D6ED    E8 C9060000     call    0040DDBB  (这里可跟进去看看,它会调用CreateThread函数)
  (在脱壳脚本里我将CreateThread选为断点函数)
  此时我们下断  bp  ecx     
  如果再继续单步走,不久会进入系统领空,程序会跑起来,我为什么选择在这里下断呢?
  因为我注意到了0040D6ED处将间接调用CreateThread函数,这个函数会创建一个线程,并跑到线程函数地址
  处去执行。
  
  断在此:
  0040D81E    BD 00D04000     mov     ebp, offset <模块入口点>
  0040D823    8DB5 C5100000   lea     esi, dword ptr [ebp+10C5]
  0040D829    83EC 20         sub     esp, 20
  
  下面就单步走吧,此过程中会遇到一些循环(要打断循环往下走,不然很是浪费时间),跳出循环的方法具体看
  二哥的相关教程吧(^_^,偷下懒)
  到此处:
  0040DC00    894424 1C       mov     dword ptr [esp+1C], eax         
  看到寄存器窗口显示:EAX为004010CC ,不就是熟悉的记事本OEP吗?呵呵。
  继续往下走,一小会到这里
  0040DC3B    FFE0            jmp     eax      ; eax=004010CC,脱壳脚本中我将此处选为特征性命令
  够直接了吧!
  F8步过后:
  
  
  直接用插件dump后程序可以运行。
  -------------------------------------------------
  下面是针对此过程写的脱壳脚本:
  //StrongOD 设置:全打勾(省点事吧,运行完脚本后不要忘记清除skip some exception这项哦,不然以后调试
  //程序时可能会异常断不下来)
  //异常设置:忽略所有异常
  
  var temp
  gpa "CreateThread","Kernel32.dll"
  bp $RESULT+2                                 //加2是因为直接断不下来
  run
  bc $RESULT+2
  bp ecx                                       //此时ecx就是线程函数地址
  mov temp,ecx
  run
  bc temp
  find eip, #FFE0#                               //搜索jmp eax命令
  go $RESULT
  sto
  MSG "Get to OEP ! ^_^"
  
  经测试其他用PeShield v0.25加壳程序也适用(不排除存在bug 的可能性^_^)
-------------------------------------------------------------------------------
【结束】
--------------------------------------------------------------------------------
【经验总结】
  再一点啰嗦,^_^,文章真是不好写 ,向论坛里无私奉献的所有朋友致敬!


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (6)
雪    币: 152
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
比较简单。。。。断ZwContinue几次,然后下面就是加花的一堆乱七八糟的东西。。。。。
直接跳花,找popad,然后就OEP了。。。。。。
直接DUMP+修复。。。。。没什么难度
上传的附件:
2009-3-24 00:57
0
雪    币: 152
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不过那个通过ExitThread()来调用CreateThread()比较有意思,下次研究下。。。。。
而且会在SEH中清CreateThread()的断点,所以先断CreateThread()是没什么用的。
要在ExitThread()里面断下后再在CreateThread()下断才好使。。。。。

如果断了ZwContinue(),也可以不断CreateThread(),直接跳花找OEP。。。。。

我原来还不知道是98的NOTEPAD。。。。等到一看到跳OEP那里是4010CC。。。。。。。

每次受伤的都是98notepad。。。。。。这个OEP实在太熟了。。。。。
2009-3-24 01:02
0
雪    币: 229
活跃值: (11)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
XSJS 见解相当不错(这个壳就是反调试稍稍有些强度,暂时没有全程跟踪过,有兴趣的可以试试,还是比较有意思的)!!
2009-3-24 15:47
0
雪    币: 152
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我OD载入直接F9就跑起来了。。。。好像没什么反调试的。。。。。有点反跟踪倒是。。。。。
2009-3-24 17:05
0
雪    币: 229
活跃值: (11)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
  说错了,谢谢更正,在我脱壳的过程中是会检查软件断点,另外SEH handler里还会清除调试寄存器来使下硬件断点无效.
请教过xsjs的方法如下:
“断ZwContinue之后
ctrl+g,输入[ecx+0b8]
下断就可以了”
2009-3-24 19:08
0
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
楼主好文。
要知其所以然并不容易。
别人给的方法往往不讲原理,使用完之后好像自己会了,其实并没有掌握。
向楼主学习。
2009-12-1 17:49
0
游客
登录 | 注册 方可回帖
返回
//