• 标 题:脚本实现三次内存断点法快速搞定Telock0.96+Aspack两层壳
  • 作 者:David
  • 时 间:2004-12-28,13:43
  • 链 接:http://bbs.pediy.com

【脱文标题】 三次内存断点法快速搞定Telock0.96+Aspack两层壳

【脱文作者】 weiyi75[Dfcg]
 
【作者邮箱】 weiyi75@sohu.com
 
【作者主页】 Dfcg官方大本营
 
【使用工具】 Peid,Ollydbg,LoadPe,Imprec1.42,Freeres
 
【破解平台】 Win2000/XP
 
【软件名称】 系统管家 V2.71
 
【下载地址】 http://www.skycn.com/soft/11570.html
 
【软件简介】 系统管家是一款强大的操作系统设置软件。个性化的设置满足初学者及设置高手们的需求。系统管家不但为您提供从桌面、个性、安全、网络、优化等方面的设置,它还包揽了系统注册表的清理、维护、备份及还原,系统垃圾文件、软件、ActiveX无效组件的清理及维护等工作。您是否还在为系统需要同时安装多种设置、维护软件互补而烦恼?系统管家可以为您的Windows98/2000/ME/XP/2003操作系统提供全方位的服务!系统管家内置的系统信息检测可显示操作系统及硬件设备的的大量信息,并且集合了进程管理、内存整理工具软件。目前系统管家提供了桌面设置、开始菜单、任务栏、输入法、窗口界面、系统信息、OEM信息、个性文件夹、安全设置、多用户、密码策略、控制面板、安全视窗、注册表备份/还原、磁盘隐藏、伪装文件、隐藏特殊项目、自动运行、系统启动、文件系统、存储系统、程序加速、多媒体、网络加速、IE浏览器、后台服务、注册表清理、磁盘清理、软件清理、组件清理等功能设置。 
 
【软件大小】 1852 KB
 
【加壳方式】 Telock0.96+Aspack
 
【脱壳声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
 
--------------------------------------------------------------------------------
 
【脱壳内容】

首先Peid查壳,tElock 0.96 -> tE!,然后用OD载入程序,Alt+M查看区段,发现里层还有一层Aspack。

Telock0.98我们在进阶篇看过,比较麻烦,断点不能乱下,如普通Int3断点,硬件断点都不能下。但还是可以通过内存断点中断的,Telock0.96较Telock0.98较弱。

OD载入程序,不忽略无效指令异常和内存异常。 

首先火力探测Telock有一次内存异常和2次无效指令异常然后程序运行。

重新载入程序。

0053CBA2 >^\E9 59E4FFFF     JMP NSSetWin.0053B000  //外壳入口
0053CBA7    0000            ADD BYTE PTR DS:[EAX],AL
0053CBA9    0000            ADD BYTE PTR DS:[EAX],AL
0053CBAB    0000            ADD BYTE PTR DS:[EAX],AL
0053CBAD    00D3            ADD BL,DL
0053CBAF    2BA3 0FEECB13   SUB ESP,DWORD PTR DS:[EBX+13CBEE0F]
0053CBB5    0000            ADD BYTE PTR DS:[EAX],AL
0053CBB7    0000            ADD BYTE PTR DS:[EAX],AL
0053CBB9    0000            ADD BYTE PTR DS:[EAX],AL
0053CBBB    0000            ADD BYTE PTR DS:[EAX],AL
0053CBBD    000E            ADD BYTE PTR DS:[ESI],CL
0053CBBF    CC              INT3
....................................................................

无效指令异常,必须Shift+F9过

0053B6A8    8DC0            LEA EAX,EAX                              ; 非法使用寄存器
0053B6AA    74 03           JE SHORT NSSetWin.0053B6AF
0053B6AC    CD 20           INT 20
0053B6AE    64:67:8F06 0000 POP DWORD PTR FS:[0]
0053B6B4    EB 02           JMP SHORT NSSetWin.0053B6B8
0053B6B6    CD 20           INT 20
0053B6B8    59              POP ECX
0053B6B9    61              POPAD
0053B6BA    F5              CMC
0053B6BB    8D7415 00       LEA ESI,DWORD PTR SS:[EBP+EDX]
0053B6BF    83C2 22         ADD EDX,22
0053B6C2    8BFE            MOV EDI,ESI
0053B6C4    B9 80120000     MOV ECX,1280
0053B6C9    2ADB            SUB BL,BL
0053B6CB    AC              LODS BYTE PTR DS:[ESI]
0053B6CC    32C3            XOR AL,BL
0053B6CE    FEC0            INC AL
....................................................................

内存异常,Shift+F9

0053BBA6    CD 68           INT 68
0053BBA8    66:05 7B0C      ADD AX,0C7B
0053BBAC    66:48           DEC AX
0053BBAE    74 55           JE SHORT NSSetWin.0053BC05
0053BBB0    8D85 450B0000   LEA EAX,DWORD PTR SS:[EBP+B45]
0053BBB6    894424 04       MOV DWORD PTR SS:[ESP+4],EAX
0053BBBA    64:67:8926 0000 MOV DWORD PTR FS:[0],ESP
0053BBC0    EB 1F           JMP SHORT NSSetWin.0053BBE1
0053BBC2    CD 20           INT 20
0053BBC4    8B6424 08       MOV ESP,DWORD PTR SS:[ESP+8]
0053BBC8    8B6C24 08       MOV EBP,DWORD PTR SS:[ESP+8]
0053BBCC    8D85 7A0B0000   LEA EAX,DWORD PTR SS:[EBP+B7A]
0053BBD2    50              PUSH EAX
0053BBD3    EB 01           JMP SHORT NSSetWin.0053BBD6
0053BBD5    E8 81AD291C     CALL 1C7D695B
0053BBDA    0000            ADD BYTE PTR DS:[EAX],AL
0053BBDC    E7 25           OUT 25,EAX                               ; I/O 命令
0053BBDE    A9 FEC3EB01     TEST EAX,1EBC3FE
0053BBE3    EB 33           JMP SHORT NSSetWin.0053BC18
....................................................................

无效指令异常

0053C6BD    8DC0            LEA EAX,EAX                              ; 非法使用寄存器
0053C6BF    EB 01           JMP SHORT NSSetWin.0053C6C2
0053C6C1    EB 68           JMP SHORT NSSetWin.0053C72B
0053C6C3    33C0            XOR EAX,EAX
0053C6C5  - EB FE           JMP SHORT NSSetWin.0053C6C5
0053C6C7    FFE4            JMP ESP
0053C6C9    CD 20           INT 20
0053C6CB    8B6424 08       MOV ESP,DWORD PTR SS:[ESP+8]
0053C6CF    33C0            XOR EAX,EAX
0053C6D1    FF6424 08       JMP DWORD PTR SS:[ESP+8]
0053C6D5  - E9 58508304     JMP 04D71732
0053C6DA    24 37           AND AL,37
0053C6DC    FFE0            JMP EAX
0053C6DE    CD 20           INT 20
0053C6E0    64:8F00         POP DWORD PTR FS:[EAX]
0053C6E3    58              POP EAX
0053C6E4    EB 02           JMP SHORT NSSetWin.0053C6E8
....................................................................

继续Shift+F9就略过第二层壳Aspack运行了。

Alt+M打开内存镜像。

内存镜像

地址       大小       Owner      区段       包含          类型   访问      初始访问  映射为

00400000   00001000   NSSetWin              PE header     Imag   RW        RWE
00401000   00001000   NSSetWin   .text      code          Imag   RW        RWE
00402000   00001000   NSSetWin   .rdata     data          Imag   RW        RWE
00403000   00133000   NSSetWin   .ecode                   Imag   RW        RWE
00536000   00002000   NSSetWin   .rsrc      resources     Imag   RW        RWE
00538000   00002000   NSSetWin   .aspack                  Imag   RW        RWE  //直接去Aspack必经之路下内存访问断点,Shift+F9运行立即中断。
0053A000   00001000   NSSetWin   .adata                   Imag   RW        RWE
0053B000   00004000   NSSetWin              SFX,imports,  Imag   RW        RWE 

当前位置0053C6E4还在0053B000Telock外壳段内,我们知道组合壳或单层壳的解压顺序是由下往上运行的。

00538001    60              PUSHAD    //进入第二层壳Aspack入口
00538002    E8 03000000     CALL NSSetWin.0053800A  可以到这里后用esp定律到Aspack出口。
00538007  - E9 EB045D45     JMP 45B084F7
0053800C    55              PUSH EBP
0053800D    C3              RETN
0053800E    E8 01000000     CALL NSSetWin.00538014
00538013    EB 5D           JMP SHORT NSSetWin.00538072
00538015    BB EDFFFFFF     MOV EBX,-13
0053801A    03DD            ADD EBX,EBP
0053801C    81EB 00801300   SUB EBX,138000
00538022    83BD 22040000 0>CMP DWORD PTR SS:[EBP+422],0
00538029    899D 22040000   MOV DWORD PTR SS:[EBP+422],EBX
0053802F    0F85 65030000   JNZ NSSetWin.0053839A
00538035    8D85 2E040000   LEA EAX,DWORD PTR SS:[EBP+42E]
0053803B    50              PUSH EAX
0053803C    FF95 4D0F0000   CALL DWORD PTR SS:[EBP+F4D]
..................................................................

再次

Alt+M打开内存镜像。

内存镜像

地址       大小       Owner      区段       包含          类型   访问      初始访问  映射为

00400000   00001000   NSSetWin              PE header     Imag   RW        RWE
00401000   00001000   NSSetWin   .text      code          Imag   RW        RWE
00402000   00001000   NSSetWin   .rdata     data          Imag   RW        RWE  //先在data过渡段下内存访问断点,F9运行。
00403000   00133000   NSSetWin   .ecode                   Imag   RW        RWE
00536000   00002000   NSSetWin   .rsrc      resources     Imag   RW        RWE
00538000   00002000   NSSetWin   .aspack                  Imag   RW        RWE  
0053A000   00001000   NSSetWin   .adata                   Imag   RW        RWE
0053B000   00004000   NSSetWin              SFX,imports,  Imag   RW        RWE 
..................................................................

0053875F    8A18            MOV BL,BYTE PTR DS:[EAX]  //内存访问中断。
00538761    40              INC EAX
00538762    885C24 0C       MOV BYTE PTR SS:[ESP+C],BL
00538766    8902            MOV DWORD PTR DS:[EDX],EAX
00538768    8B42 08         MOV EAX,DWORD PTR DS:[EDX+8]
0053876B    8B7C24 0C       MOV EDI,DWORD PTR SS:[ESP+C]
0053876F    C1E0 08         SHL EAX,8
00538772    81E7 FF000000   AND EDI,0FF
00538778    0BC7            OR EAX,EDI
0053877A    8B7A 04         MOV EDI,DWORD PTR DS:[EDX+4]
0053877D    03FE            ADD EDI,ESI
0053877F    8942 08         MOV DWORD PTR DS:[EDX+8],EAX
00538782    8BC7            MOV EAX,EDI
00538784    897A 04         MOV DWORD PTR DS:[EDX+4],EDI
00538787    3BC1            CMP EAX,ECX
00538789  ^ 73 D2           JNB SHORT NSSetWin.0053875D
..................................................................

再次

Alt+M打开内存镜像。

内存镜像

地址       大小       Owner      区段       包含          类型   访问      初始访问  映射为

00400000   00001000   NSSetWin              PE header     Imag   RW        RWE
00401000   00001000   NSSetWin   .text      code          Imag   RW        RWE  //对401000 Code段下内存访问断点,F9运行。
00402000   00001000   NSSetWin   .rdata     data          Imag   RW        RWE  
00403000   00133000   NSSetWin   .ecode                   Imag   RW        RWE
00536000   00002000   NSSetWin   .rsrc      resources     Imag   RW        RWE
00538000   00002000   NSSetWin   .aspack                  Imag   RW        RWE  
0053A000   00001000   NSSetWin   .adata                   Imag   RW        RWE
0053B000   00004000   NSSetWin              SFX,imports,  Imag   RW        RWE 
..................................................................

00401000      E8            DB E8  //到达这里,右键-分析-分析代码还原汇编指令。
00401001      06            DB 06
00401002      00            DB 00
00401003      00            DB 00
00401004      00            DB 00
00401005      50            DB 50                                    ;  CHAR 'P'
00401006      E8            DB E8
00401007      A1            DB A1
00401008      01            DB 01
00401009      00            DB 00
0040100A      00            DB 00
0040100B      55            DB 55                                    ;  CHAR 'U'
0040100C      8B            DB 8B
0040100D      EC            DB EC
0040100E      81            DB 81
0040100F      C4            DB C4
00401010      F0            DB F0
00401011      FE            DB FE
..................................................................

00401000   .  E8 06000000   CALL NSSetWin.0040100B  //又是易语言,和系统风云一样的。
00401005   .  50            PUSH EAX                                 ; /ExitCode
00401006   .  E8 A1010000   CALL NSSetWin.004011AC                   ; \ExitProcess
0040100B  /$  55            PUSH EBP  //可以在401000脱壳,但我喜欢F7到这里然后用Loadpe脱壳,标准一些。
0040100C  |.  8BEC          MOV EBP,ESP
0040100E  |.  81C4 F0FEFFFF ADD ESP,-110
00401014  |.  EB 6D         JMP SHORT NSSetWin.00401083
00401016  |.  6B 72 6E 6C 6>ASCII "krnln.fnr",0
00401020  |.  6B 72 6E 6C 6>ASCII "krnln.fne",0
0040102A  |.  47 65 74 4E 6>ASCII "GetNewSock",0
00401035  |.  53 6F 66 74 7>ASCII "Software\FlySky\"
00401045  |.  45 5C 49 6E 7>ASCII "E\Install",0
0040104F  |.  50 61 74 68 0>ASCII "Path",0
..................................................................

运行ImprotREC,选中程序进程,OEP处填入00100B,点自动搜索,然后点“获取输入表”,看见尾部被Telock填充了一个垃圾指针,Telock喜欢填垃圾指针,这个是无法修复的,直接用剪刀剪掉。

然后Loadpe编辑脱壳文件,删除aspack,adata 两个Aspack的垃圾区段,壳都脱了,还要它们干什么?重建Pe正常运行。

然后用Freeres载入脱壳程序提示资源被压缩,真烦人,和Upx一样,资源脱壳后没有释放,于是Freeres释放资源,仍然正常运行。

-------------------------------------------------------------------------------- 

【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!


我以二哥的三次内存断点法快速搞定Telock0.96+Aspack两层壳作范文

目的是用脚本使任意区段设内存访问断点

首先还是要写脚本你必须会手动脱这个壳。

要知道你想哪些区段的内存断点,如区段1,区段4,区段2等

这个程序依次是

内存镜像,项目 16  区段5
 地址=00538000
 大小=00002000 (8192.)
 Owner=NSSetWin 00400000
 区段=.aspack
 类型=Imag 01001002
 访问=R
 初始访问=RWE

内存镜像,项目 13  区段2
 地址=00402000
 大小=00001000 (4096.)
 Owner=NSSetWin 00400000
 区段=.rdata
 包含=data
 类型=Imag 01001002
 访问=R
 初始访问=RWE


内存镜像,项目 12   区段1
 地址=00401000
 大小=00001000 (4096.)
 Owner=NSSetWin 00400000
 区段=.text
 包含=code
 类型=Imag 01001002
 访问=R
 初始访问=RWE

内存断点参数,主要是两个

区段虚拟地址

区段大小

在脚本中实现主要用这个模块形式

gmi eip,MODULEBASE      //模块基地址400000
mov imgbase,$RESULT
mov k,imgbase
add k,3C              
mov k,[k]
add k,imgbase         
add k,f8                 //第一区段名
add k,28                //第二区段名
add k,28               //第三区段名
add k,28              //第四区段名
add k,28             //第五区段名

对语法而言,举个例子,随便在某语句后面插入

log k

pause  类似int3

ret    类似int3

查看记录,然后命令行 d xxxxx

简单分析一下,所有需要的东西都可以计算出来,这个没有扎实的理论基础光看不实际操作根本无法明白的。

004001A8  2E 74 65 78 74 00 00 00  .text...
004001B0  00 10 00 00 00 10 00 00  ......
004001B8  00 02 00 00 00 04 00 00  ......
004001C0  00 00 00 00 00 00 00 00  ........
004001C8  00 00 00 00 40 00 00 C0  ....@..

004001D0  2E 72 64 61 74 61 00 00  .rdata..  其中区段名,区段大小,虚拟地址尽在其中。
004001D8  00 10 00 00 00 20 00 00  .... ..
004001E0  00 02 00 00 00 06 00 00  ......
004001E8  00 00 00 00 00 00 00 00  ........
004001F0  00 00 00 00 40 00 00 C0  ....@..

004001F8  2E 65 63 6F 64 65 00 00  .ecode..
00400200  00 30 13 00 00 30 00 00  .0..0..
00400208  00 0E 04 00 00 08 00 00  .....
00400210  00 00 00 00 00 00 00 00  ........
00400218  00 00 00 00 40 00 00 C0  ....@..

00400220  2E 72 73 72 63 00 00 00  .rsrc...
00400228  00 20 00 00 00 60 13 00  . ...`.
00400230  00 02 00 00 00 16 04 00  .....
00400238  00 00 00 00 00 00 00 00  ........
00400240  00 00 00 00 40 00 00 C0  ....@..

00400248  2E 61 73 70 61 63 6B 00  .aspack.
00400250  00 20 00 00 00 80 13 00  . ....
00400258  00 0C 00 00 00 18 04 00  ......
00400260  00 00 00 00 00 00 00 00  ........
00400268  00 00 00 00 40 00 00 C0  ....@..

00400270  2E 61 64 61 74 61 00 00  .adata..
00400278  00 10 00 00 00 A0 13 00  ....?.
00400280  00 00 00 00 00 00 00 00  ........
00400288  00 00 00 00 00 00 00 00  ........
00400290  00 00 00 00 40 00 00 C0  ....@..

以下就是脚本



// 三次内存断点法脚本制作演示
// 作者: Mr.David
// 主页: www.chinadfcg.com

msg "请设置OD异常设置不忽略错误的或有特权的指令,其它全部忽略,然后从菜单处继续运行脚本"

//pause

var cbase

gmi eip, CODEBASE
mov cbase, $RESULT    
log cbase            //记录代码段基地址,一般是401000

var k1
var k1s
var k2
var k2s
var k5
var k5s
var imgbase

gmi eip,MODULEBASE      //模块基地址400000
mov imgbase,$RESULT
mov k1,imgbase
add k1,3C              
mov k1,[k1]
add k1,imgbase         
add k1,f8                 //第一区段名
mov k2,k1

add k1,8              //地址加8字节的偏移就是区段大小      
mov k1,[k1]           //第一区段大小
log k1        

add k2,28            //第二区段名
mov k5,k2
log k2

mov k2s,k2
add k2s,4
mov k2s,[k2s]           
add k2s,imgbase       //第二区段虚拟地址

add k2,8              //地址加8字节的偏移就是区段大小      
mov k2,[k2]           //第二区段大小
log k2       

add k5,28           
add k5,28  
add k5,28             //第五区段名
log k5

add k5,8              //地址加8字节的偏移就是区段大小  
 
mov k5s,k5
add k5s,4
mov k5s,[k5s]           
add k5s,imgbase        //第五区段虚拟地址
log k5  

mov k5,[k5]           //第五区段大小
log k5       

eoe seh
esto

retn:

bprm k5s, k5            //一次内存断点
esto

bprm k2s, k2          //二次内存断点
run
 
bprm cbase, k1      //三次内存断点
run

bpmc
an eip
ret

seh:             //异常处理

coe
esto

jmp retn  //处理完毕