• 标 题:脱一个很炫的屏保--ASProtect 1.23 RC4
  • 作 者:辉仔Yock
  • 时 间:2003年12月17日 10:57
  • 链 接:http://bbs.pediy.com

【前    言】:由于上一篇赶时间睡觉,随便写的,所以没有写好,很多人都投诉!所以这次写一贴精简详细一些的!

【软件名称】: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