找回密码
 注册
搜索
热搜: 回贴

脚本实现三次内存断点法快速搞定Telock0.96 Aspack两层壳,断点,脱壳技术

2010-1-30 18:21| 发布者: admin| 查看: 111| 评论: 0|原作者: 琴姬


脚本实现三次内存断点法快速搞定Telock0.96 Aspack两层壳,断点,脱壳技术
2008年06月23日 星期一 下午 05:25
【脱文标题】 三次内存断点法快速搞定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 /$Content$nbsp; 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 //处理完毕




最新评论

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-29 21:33 , Processed in 0.276249 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

返回顶部