【脱文标题】 三次内存断点法快速搞定Telock0.96+Aspack两层壳
【脱文作者】 weiyi75[Dfcg]
【作者邮箱】 [email]weiyi75@sohu.com[/email]
【作者主页】 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 //处理完毕
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)