【前 言】:由于上一篇赶时间睡觉,随便写的,所以没有写好,很多人都投诉!所以这次写一贴精简详细一些的!
【软件名称】:Halloween 3D Screensaver v1.0
【下载页面】:ftp://ftp.univie.ac.at/mirror/WinSite/win95/screensaver/castle.exe
【软件大小】:有点大!
【应用平台】:WIN9X/WINNT/WIN2K/WINXP
【软件简介】:Halloween 3D screensaver brings the spirit of this strange holiday right to your computer monitor. Expecting a pumpkin? You will get a horrifying Jack O'Lantern served together with skeletons, skulls, shrieking sounds. Are you already scared?
"Yock:这个屏保真的好棒,我好喜欢!主页还有好多屏保,谁有注册码记得发一个给我"
【软件限制】:ASProtect 1.23 RC4 - 1.3.08.24 -> Alexey Solodovnikov
【文章作者】:辉仔Yock
【作者声明】:本人发表这篇文章只是为了学习和研究!!!请不用于商业用途或是将本文方法制作的注册机或是补丁文件任意传播,读者看了文章后所做的事情与我无关,我也不会负责,请读者看了文章后三思而后行!最后希望大家在经济基础好的时候,支持共享软件!(在这里最此软件的作者以万二分的歉意鞠躬...)
【破解工具】:OD lordpe impor
—————————————————————————————————
【过 程】:
首先去到%SystemRoot%System32找到Ancient Castle 3D Screensaver.scr这个文件!然后把.scr改成.EXE
用OD载入Ancient Castle 3D Screensaver.EXE调试!
读者看之前一定要紧记住ASProtect可的地址每次都不同的,所以不要看代码地址,要学会理解我所做的!
OD载入后隐藏OD!忽略所有异常(除内存)
F9运行,会异常,用Shift+F9通过异常25次到下面这里!
00AE39EC 3100 XOR [EAX],EAX
//第二十五次异常在这里!
00AE39EE 64:8F05 0000000>POP DWORD PTR FS:[0] ; 0012FFE0
00AE39F5 58 POP EAX ; 0012FFE0
00AE39F6 833D B07EAE00 0>CMP DWORD PTR [AE7EB0],0
00AE39FD 74 14 JE SHORT 00AE3A13
00AE39FF 6A 0C PUSH 0C
00AE3A01 B9 B07EAE00 MOV ECX,0AE7EB0
00AE3A06 8D45 F8 LEA EAX,[EBP-8]
00AE3A09 BA 04000000 MOV EDX,4
00AE3A0E E8 2DD1FFFF CALL 00AE0B40
00AE3A13 FF75 FC PUSH DWORD PTR [EBP-4]
00AE3A16 FF75 F8 PUSH DWORD PTR [EBP-8]
00AE3A19 8B45 F4 MOV EAX,[EBP-C] ; Ancient_.0047288A
00AE3A1C 8338 00 CMP DWORD PTR [EAX],0
00AE3A1F 74 02 JE SHORT 00AE3A23
00AE3A21 FF30 PUSH DWORD PTR [EAX]
00AE3A23 FF75 F0 PUSH DWORD PTR [EBP-10] ; Ancient_.00400000
00AE3A26 FF75 EC PUSH DWORD PTR [EBP-14]
00AE3A29 C3 RETN
//在这里下断,然后按Shift+F9断在这里,然后返回00AF4D64
========================================================
//返回这里!一下过程比较多花指令,我就不写那么细了,因为代码不好复制!
//读者跟多几次就明白我所说的!
00AF4D64 BB 0E26C276 MOV EBX,76C2260E
00AF4D69 E8 0A000000 CALL 00AF4D78
00AF4D6E 1A4B 28 SBB CL,[EBX+28]
00AF4D71 41 INC ECX
00AF4D72 E6 27 OUT 27,AL ; I/O 命令
00AF4D74 D4 7D AAM 7D
00AF4D76 ^ 72 C3 JB SHORT 00AF4D3B
00AF4D78 8BD9 MOV EBX,ECX
00AF4D7A 5F POP EDI ; Ancient_.00400000
00AF4D7B 66:81D9 5825 SBB CX,2558
00AF4D80 81C7 BE150000 ADD EDI,15BE
00AF4D86 0FBFD9 MOVSX EBX,CX
00AF4D89 66:B9 E9BA MOV CX,0BAE9
00AF4D8D BA 00000000 MOV EDX,0
00AF4D92 E8 0A000000 CALL 00AF4DA1
00AF4D97 7A 2B JPE SHORT 00AF4DC4
--------------------
//一下是在花指令中的一个跳除循环的地方:
00AF4E2E /0F87 04000000 JA 00AF4E38
00AF4E34 |66:BE 87E3 MOV SI,0E387
00AF4E38 59 POP ECX ; Ancient_.00400000
00AF4E39 83EA 04 SUB EDX,4
00AF4E3C 66:8BF0 MOV SI,AX
00AF4E3F 81FA 54EBFFFF CMP EDX,-14AC
00AF4E45 0F85 15000000 JNZ 00AF4E60
00AF4E4B BE 119DA01E MOV ESI,1EA09D11
00AF4E50 E9 2F000000 JMP 00AF4E84
//在这个地址F2设断,然后F9断下就可以跳出循环了!
00AF4E55 ^ 77 E4 JA SHORT 00AF4E3B
................
................
................
之后会来到这里!
00AF4E84 5B POP EBX ; Ancient_.00400000
//返回这里后基本上就到OEP了!注意看下面我标记的地方!
00AF4E85 58 POP EAX ; Ancient_.00400000
00AF4E86 05 5EA96AAC ADD EAX,AC6AA95E
00AF4E8B 5C POP ESP ; Ancient_.00400000
00AF4E8C EB 44 JMP SHORT 00AF4ED2
00AF4E8E EB 01 JMP SHORT 00AF4E91
00AF4E90 9A 51579CFC BF0>CALL FAR 00BF:FC9C5751 ; 远距呼叫
00AF4E97 0000 ADD [EAX],AL
00AF4E99 00B9 00000000 ADD [ECX],BH
00AF4E9F F3:AA REP STOS BYTE PTR ES:[EDI]
00AF4EA1 9D POPFD
00AF4EA2 5F POP EDI ; Ancient_.00400000
00AF4EA3 59 POP ECX ; Ancient_.00400000
00AF4EA4 C3 RETN
//这里会返回00428DBE
----------------------------
00AF4EA5 55 PUSH EBP
00AF4EA6 8BEC MOV EBP,ESP
00AF4EA8 53 PUSH EBX
00AF4EA9 56 PUSH ESI
00AF4EAA 8B75 0C MOV ESI,[EBP+C]
00AF4EAD 8B5D 08 MOV EBX,[EBP+8] ; Ancient_.0047247A
//就是这里了!这里就是OEP的指令,复制下来!
----------------------------
00AF4EB0 EB 11 JMP SHORT 00AF4EC3
================================================================
00428DBE C3 RETN
//然后这里就返回OEP附近了!光明顶到了!
//这里返回至485BDB
================================================================
----------
0042673D 0000 ADD [EAX],AL
0042673F 0000 ADD [EAX],AL
00426741 0000 ADD [EAX],AL
00426743 00E8 ADD AL,CH
00426745 3B26 CMP ESP,[ESI]
00426747 0000 ADD [EAX],AL
//这里就是要用刚才代码复制回来的地方!OEP=0042673D
----------
00426749 BF 94000000 MOV EDI,94
//哈哈,就是这里了!
//往上看!
//把之前复制的代码都贴上,还有一个字节就补一个NOP
0042674E 8BC7 MOV EAX,EDI
00426750 E8 9BF5FFFF CALL 00425CF0
00426755 8965 E8 MOV [EBP-18],ESP
00426758 8BF4 MOV ESI,ESP
0042675A 893E MOV [ESI],EDI
0042675C 56 PUSH ESI
0042675D FF15 D8404300 CALL [4340D8]
=================================================================
我怕有一些朋友看不懂,我就照了两个像,给大家对比一下!
把代码复制好以后就可以用LordPE把他DUMP出来!
然后就是用ImportREC修复(OEP=0042673D),会有一个函数指针找不到,是Krenel32.dll的TerminateThread
195K->544K
Microsoft Visual C++ 6.0编译(还可以再加一个壳!)
好了,说到这里都应该会了把!
要是看不懂我说什么的话就先去看看怎么手脱UPX的壳吧!
后话:很多人问为什么要复制代码,原因很简单,lwh51这个脱壳牛人说过"ASProtect"的壳会把OEP的地方在壳里面完成,所以要找到他,再复制回来!就那么简单!
有什么问题可以写信给我!我QQ暴了!加不了人!
辉仔Yock
EMail:Yock_99@163.com
2003.12.17