SkinEngine 1.0 控件采用CC方式对NAG的100%破解

【破解作者】 aCaFeeL
【我的主页】 http://cztool.ys168.com/
【使用工具】 ODbyDKY 1.10(感谢Dyk158打造的这把利器)
【破解平台】 Win98SE
【软件名称】 SkinEngine v1.0
【下载地址】 http://www.ksdev.com/ 
【软件简介】 这是一个(2005年11月15日)新出的界面控件,支持 Visual Basic,Visual C++,Borland Delphi, C++ Builder,Visual Basic.NET, Visual C#.NET,Visual J++.NET,Bolrand Delphi.NET, C# Builder等众多编译程序。未注册版本编译后的程序,在程序开始和结束时都会出现nag提示窗口。
【破解声明】 是§看雪§领我进了破解的这道门,而来了§看雪§这么久,通过前辈们的许多帖子,感觉自己也不断的有所收获!因此,出于对破解的爱好,自己斗胆也发一帖,将一点心得和体会拿出来与大家分享!不足之处还请多包含!
【破解内容】
    安装完skinengine控件后,通过分析它的说明文件和unins000.dat文件,知道了在它的"redist"目录以及在系统的"Windows\System"或"Windows\System32"目录下都安装了skinengine.dll文件,而这就是SkinEngine控件的核心部分。分析skinengine.dll文件,发现它是被UPX压缩了的,故将其解压。
 
    用ODbyDYK打开用了SkinEngine控件编译后的Exe文件,在CPU窗口中,点击鼠标右键,选择‘搜索-》所有参考文本串’,在新弹出的文本字符串参考窗口中,却没有找到任何与NAG窗口有关的信息 :-( 。

    于是按(Alt+E)键打开执行模块窗口,怪了!!窗口中居然也没有显示skinengine.dll的信息,而作为控件的核心,这个dll是一定要被导入的呀!嘿嘿,看来控件作者对自己产品的加密还是用了心的,没将它写入被编译程序的导入表中!那运行一下试试?按(F9)键运行,这时出现了NAG窗口,不要慌着按NAG窗口的“Close”按钮,而是在ODbyDKY中按(F12)键暂停,这时发现 模块窗口 中skinengine.dll却出现了,鼠标双击这一行后,便来到了skinengine.dll的领空,再搜索“所有参考文本串”,还是没有任何有价值的信息可供参考,看来只有从skinengine.dll的入口点开始一步一步的找了,这就是破解所需要的耐心了!

    而通过上面的分析,知道了控件是在运行中才调用skinengine.dll的,而要从skinengine.dll的入口点开始分析,就要在skinengine.dll的入口点周围找地方插入一个Int3(即机器码CC),以便程序一运行到skinengine.dll的入口点周围就被中断下来,这样才能对skinengine.dll进行详细的分析。

    在skinengine.dll的领空下,按(Ctrl+N)键打开“显示当前模块名称(标签)”的窗口,点击“类型”后,找到导出类型中的<ModuleEntryPoint>这一行,鼠标双击后来到skinengine.dll的入口点,看到如下代码:
。。。。。。
00DEA230 >  55              PUSH EBP                    //来到这里,skinengine.dll的入口点
00DEA231    8BEC            MOV EBP,ESP
00DEA233    83C4 C4         ADD ESP,-3C
00DEA236    B8 789EDE00     MOV EAX,SKINENGI.00DE9E78  //发现周围无法修改任何一个命令为Int3
00DEA23B    E8 B0C6F3FF     CALL SKINENGI.00D268F0     //因此决定进入该Call看看
00DEA240    E8 9BA0F3FF     CALL SKINENGI.00D242E0
00DEA245    8D40 00         LEA EAX,DWORD PTR DS:[EAX]
00DEA248    0000            ADD BYTE PTR DS:[EAX],AL
00DEA24A    0000            ADD BYTE PTR DS:[EAX],AL
00DEA24C    0000            ADD BYTE PTR DS:[EAX],AL
00DEA24E    0000            ADD BYTE PTR DS:[EAX],AL
00DEA250    0000            ADD BYTE PTR DS:[EAX],AL
00DEA252    0000            ADD BYTE PTR DS:[EAX],AL
00DEA254    0000            ADD BYTE PTR DS:[EAX],AL
00DEA256    0000            ADD BYTE PTR DS:[EAX],AL
。。。。。。

    于是,来到了虚拟地址: 00D268F0 处,看到如下的代码:
。。。。。。
00D268E9    E8 F6F6FFFF     CALL SKINENGI.00D25FE4
00D268EE    C3              RETN                        //上一个子程序的结束
00D268EF    90              NOP                         //**呵呵**重要** 可将此处改为: Int3
00D268F0    BA A8B0DE00     MOV EDX,SKINENGI.00DEB0A8   //这便是00DEA23B处的Call所调用的开始处了
00D268F5    837D 0C 01      CMP DWORD PTR SS:[EBP+C],1
00D268F9    75 2A           JNZ SHORT SKINENGI.00D26925
00D268FB    50              PUSH EAX
00D268FC    52              PUSH EDX
00D268FD    C605 64E6DE00 0>MOV BYTE PTR DS:[DEE664],1
00D26904    8B4D 08         MOV ECX,DWORD PTR SS:[EBP+8]
00D26907    890D 68E6DE00   MOV DWORD PTR DS:[DEE668],ECX
00D2690D    894A 04         MOV DWORD PTR DS:[EDX+4],ECX
00D26910    C742 08 0000000>MOV DWORD PTR DS:[EDX+8],0
00D26917    C742 0C 0000000>MOV DWORD PTR DS:[EDX+C],0
00D2691E    E8 C1FFFFFF     CALL SKINENGI.00D268E4
00D26923    5A              POP EDX
00D26924    58              POP EAX
00D26925    FF35 6CE6DE00   PUSH DWORD PTR DS:[DEE66C]
00D2692B    B9 C0B0DE00     MOV ECX,SKINENGI.00DEB0C0
00D26930    E8 5BD7FFFF     CALL SKINENGI.00D24090
00D26935    C3              RETN                         //00DEA23B处的Call的结束
。。。。。。

    发现虚拟地址:00D268EF 处居然有 NOP 命令,呵呵,如果猜得不错,这是控件作者自己留下的!

    因此将虚拟地址:00D268EF 处的 NOP  命令
                            改为 INT3 命令,相应的,
    也要将虚拟地址:00DEA23B 处的 CALL SKINENGI.00D268F0 命令
                            改为 CALL SKINENGI.00D268EF 命令,以便能够调用到 00D268EF 处的INT3;
    然后点击鼠标右键,选择‘复制到可执行文件-》所有修改’,在新弹出的窗口中,再次点击鼠标右键,选择‘保存文件’,将修改后的skinengine.dll文件保存。

    在ODbyDYK中按(Alt+F2)键结束调试,然后将被保存的skinengine.dll文件拷贝到Windows\system目录中覆盖掉原来的skinengine.dll文件,再在ODbyDYK中按(Ctrl+F2)键重新装载被调试程序,按(F9)键运行,这时程序中断在了skinengine.dll领空中的 00D268F0 处,按(F8)键一步一步的运行,到如下代码:
。。。。。。
00D268EF    CC              INT3                        //修改后所插入的CC
00D268F0    BA A8B0DE00     MOV EDX,SKINENGI.00DEB0A8   //重新装载程序后,便中断在了此处
00D268F5    837D 0C 01      CMP DWORD PTR SS:[EBP+C],1
00D268F9    75 2A           JNZ SHORT SKINENGI.00D26925
00D268FB    50              PUSH EAX
00D268FC    52              PUSH EDX
00D268FD    C605 64E6DE00 0>MOV BYTE PTR DS:[DEE664],1
00D26904    8B4D 08         MOV ECX,DWORD PTR SS:[EBP+8]
00D26907    890D 68E6DE00   MOV DWORD PTR DS:[DEE668],ECX
00D2690D    894A 04         MOV DWORD PTR DS:[EDX+4],ECX
00D26910    C742 08 0000000>MOV DWORD PTR DS:[EDX+8],0
00D26917    C742 0C 0000000>MOV DWORD PTR DS:[EDX+C],0
00D2691E    E8 C1FFFFFF     CALL SKINENGI.00D268E4
00D26923    5A              POP EDX
00D26924    58              POP EAX
00D26925    FF35 6CE6DE00   PUSH DWORD PTR DS:[DEE66C]
00D2692B    B9 C0B0DE00     MOV ECX,SKINENGI.00DEB0C0
00D26930    E8 5BD7FFFF     CALL SKINENGI.00D24090       //F8键运行此Call之后弹出NAG,因此,在之处需按F7键,进入此Call中
00D26935    C3              RETN
。。。。。。


    进入 CALL SKINENGI.00D24090 后,来到如下的代码:

。。。。。。
00D24090    51              PUSH ECX
00D24091    56              PUSH ESI
00D24092    57              PUSH EDI
00D24093    BE 38E6DE00     MOV ESI,SKINENGI.00DEE638
00D24098    8D7D C4         LEA EDI,DWORD PTR SS:[EBP-3C]
00D2409B    B9 0B000000     MOV ECX,0B
00D240A0    F3:A5           REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI>
00D240A2    8F05 58E6DE00   POP DWORD PTR DS:[DEE658]
00D240A8    8F05 54E6DE00   POP DWORD PTR DS:[DEE654]                     ; SKINENGI.00D20000
00D240AE    892D 4CE6DE00   MOV DWORD PTR DS:[DEE64C],EBP
00D240B4    891D 50E6DE00   MOV DWORD PTR DS:[DEE650],EBX
00D240BA    A3 40E6DE00     MOV DWORD PTR DS:[DEE640],EAX
00D240BF    8915 48E6DE00   MOV DWORD PTR DS:[DEE648],EDX
00D240C5    8D4D C4         LEA ECX,DWORD PTR SS:[EBP-3C]
00D240C8    890D 38E6DE00   MOV DWORD PTR DS:[DEE638],ECX
00D240CE    31C9            XOR ECX,ECX
00D240D0    837D 0C 00      CMP DWORD PTR SS:[EBP+C],0
00D240D4    75 02           JNZ SHORT SKINENGI.00D240D8
00D240D6    8B08            MOV ECX,DWORD PTR DS:[EAX]
00D240D8    890D 44E6DE00   MOV DWORD PTR DS:[DEE644],ECX
00D240DE    B8 6013D200     MOV EAX,<JMP.&KERNEL32.RaiseException>
00D240E3    A3 14E0DE00     MOV DWORD PTR DS:[DEE014],EAX
00D240E8    B8 6813D200     MOV EAX,<JMP.&KERNEL32.RtlUnwind>
00D240ED    A3 18E0DE00     MOV DWORD PTR DS:[DEE018],EAX
00D240F2    E8 91FEFFFF     CALL SKINENGI.00D23F88
00D240F7    8B45 0C         MOV EAX,DWORD PTR SS:[EBP+C]
00D240FA    40              INC EAX
00D240FB    A2 60E6DE00     MOV BYTE PTR DS:[DEE660],AL
00D24100    48              DEC EAX
00D24101    59              POP ECX
00D24102    8B11            MOV EDX,DWORD PTR DS:[ECX]
00D24104    8915 5CE6DE00   MOV DWORD PTR DS:[DEE65C],EDX
00D2410A    74 07           JE SHORT SKINENGI.00D24113
00D2410C    3C 03           CMP AL,3
00D2410E    7D 03           JGE SHORT SKINENGI.00D24113
00D24110    FF1481          CALL DWORD PTR DS:[ECX+EAX*4]
00D24113    51              PUSH ECX
00D24114    8B4C24 08       MOV ECX,DWORD PTR SS:[ESP+8]
00D24118    85C9            TEST ECX,ECX
00D2411A    74 08           JE SHORT SKINENGI.00D24124
00D2411C    8B45 0C         MOV EAX,DWORD PTR SS:[EBP+C]
00D2411F    8B55 10         MOV EDX,DWORD PTR SS:[EBP+10]
00D24122    FFD1            CALL ECX
00D24124    59              POP ECX
00D24125    8B45 0C         MOV EAX,DWORD PTR SS:[EBP+C]
00D24128    3C 03           CMP AL,3
00D2412A    7C 03           JL SHORT SKINENGI.00D2412F
00D2412C    FF1481          CALL DWORD PTR DS:[ECX+EAX*4]
00D2412F    833D 30E0DE00 0>CMP DWORD PTR DS:[DEE030],0
00D24136    75 0D           JNZ SHORT SKINENGI.00D24145
00D24138    C605 38E0DE00 0>MOV BYTE PTR DS:[DEE038],1
00D2413F    D93D 24B0DE00   FSTCW WORD PTR DS:[DEB024]
00D24145    8B45 0C         MOV EAX,DWORD PTR SS:[EBP+C]
00D24148    48              DEC EAX
00D24149    0F85 91010000   JNZ SKINENGI.00D242E0         //此处不跳转!
00D2414F    E8 DCFEFFFF     CALL SKINENGI.00D24030        //F8键运行此Call之后弹出NAG,因此,在之处需按F7键,进入此Call中
00D24154    C2 0400         RETN 4
00D24157    C3              RETN
。。。。。。


    进入 CALL SKINENGI.00D24030 后,来到如下的代码:

。。。。。。
00D24030    55              PUSH EBP
00D24031    8BEC            MOV EBP,ESP
00D24033    53              PUSH EBX
00D24034    56              PUSH ESI
00D24035    57              PUSH EDI
00D24036    A1 40E6DE00     MOV EAX,DWORD PTR DS:[DEE640]
00D2403B    85C0            TEST EAX,EAX
00D2403D    74 4B           JE SHORT SKINENGI.00D2408A
00D2403F    8B30            MOV ESI,DWORD PTR DS:[EAX]
00D24041    33DB            XOR EBX,EBX
00D24043    8B78 04         MOV EDI,DWORD PTR DS:[EAX+4]
00D24046    33D2            XOR EDX,EDX
00D24048    55              PUSH EBP
00D24049    68 7640D200     PUSH SKINENGI.00D24076
00D2404E    64:FF32         PUSH DWORD PTR FS:[EDX]
00D24051    64:8922         MOV DWORD PTR FS:[EDX],ESP
00D24054    3BF3            CMP ESI,EBX
00D24056    7E 14           JLE SHORT SKINENGI.00D2406C
00D24058    8B04DF          MOV EAX,DWORD PTR DS:[EDI+EBX*8]
00D2405B    43              INC EBX                          //在此处按F2键下断点,然后按F9键,一直到 EBX=6D 时,弹出NAG窗口
00D2405C    891D 44E6DE00   MOV DWORD PTR DS:[DEE644],EBX
00D24062    85C0            TEST EAX,EAX
00D24064    74 02           JE SHORT SKINENGI.00D24068
00D24066    FFD0            CALL EAX                         //因此,在 EBX=6C 时,按F8键来到此处,按F7键进入此 Call EAX 中
00D24068    3BF3            CMP ESI,EBX
00D2406A  ^ 7F EC           JG SHORT SKINENGI.00D24058       //开始循环叠加
00D2406C    33C0            XOR EAX,EAX
00D2406E    5A              POP EDX
00D2406F    59              POP ECX
00D24070    59              POP ECX
00D24071    64:8910         MOV DWORD PTR FS:[EAX],EDX
00D24074    EB 14           JMP SHORT SKINENGI.00D2408A
00D24076  ^ E9 59F9FFFF     JMP SKINENGI.00D239D4
00D2407B    E8 50FFFFFF     CALL SKINENGI.00D23FD0
00D24080    E8 27FDFFFF     CALL SKINENGI.00D23DAC
00D24085    E8 76FDFFFF     CALL SKINENGI.00D23E00
00D2408A    5F              POP EDI
00D2408B    5E              POP ESI
00D2408C    5B              POP EBX
00D2408D    5D              POP EBP
00D2408E    C3              RETN
。。。。。。


    在 EBX=6C 时进入 CALL EAX 后,来到如下的代码:

。。。。。。
00DBDC28    55              PUSH EBP
00DBDC29    8BEC            MOV EBP,ESP
00DBDC2B    83C4 F8         ADD ESP,-8
00DBDC2E    832D E472E000 0>SUB DWORD PTR DS:[E072E4],1
00DBDC35    73 57           JNB SHORT SKINENGI.00DBDC8E
00DBDC37    E8 10E3FFFF     CALL SKINENGI.00DBBF4C
00DBDC3C    A1 74B7DB00     MOV EAX,DWORD PTR DS:[DBB774]
00DBDC41    E8 D6F5F7FF     CALL SKINENGI.00D3D21C
00DBDC46    A1 34B9DB00     MOV EAX,DWORD PTR DS:[DBB934]
00DBDC4B    8945 F8         MOV DWORD PTR SS:[EBP-8],EAX
00DBDC4E    A1 ECBBDB00     MOV EAX,DWORD PTR DS:[DBBBEC]
00DBDC53    8945 FC         MOV DWORD PTR SS:[EBP-4],EAX
00DBDC56    8D45 F8         LEA EAX,DWORD PTR SS:[EBP-8]
00DBDC59    BA 01000000     MOV EDX,1
00DBDC5E    E8 29F6F7FF     CALL SKINENGI.00D3D28C
00DBDC63    A1 94DADE00     MOV EAX,DWORD PTR DS:[DEDA94]
00DBDC68    C600 01         MOV BYTE PTR DS:[EAX],1
00DBDC6B    A1 58D7DE00     MOV EAX,DWORD PTR DS:[DED758]
00DBDC70    C700 00C5DB00   MOV DWORD PTR DS:[EAX],SKINENGI.00DBC500
00DBDC76    E8 FDB3FDFF     CALL SKINENGI.00D99078          //F8键运行此Call之后弹出NAG,故将此Call屏蔽 NOP 掉,便可!
00DBDC7B    833D DCD3DE00 0>CMP DWORD PTR DS:[DED3DC],0
00DBDC82    74 0A           JE SHORT SKINENGI.00DBDC8E
00DBDC84    A1 DCD3DE00     MOV EAX,DWORD PTR DS:[DED3DC]
00DBDC89    E8 6658F6FF     CALL SKINENGI.00D234F4
00DBDC8E    59              POP ECX
00DBDC8F    59              POP ECX
00DBDC90    5D              POP EBP
00DBDC91    C3              RETN
。。。。。。


    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    !!!!!!这时可以点击NAG窗口的“Close”按钮进入被编译程序的界面窗口了。!!!!!!
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    然后点击被编译程序的关闭按钮,这时,程序又中断在了skinengine.dll领空中的 00D268F0 处,按(F8)键一步一步的运行,到如下代码:

。。。。。。
00D268EF    CC              INT3                        //修改后所插入的CC
00D268F0    BA A8B0DE00     MOV EDX,SKINENGI.00DEB0A8   //程序再次中断在了此处
00D268F5    837D 0C 01      CMP DWORD PTR SS:[EBP+C],1
00D268F9    75 2A           JNZ SHORT SKINENGI.00D26925 //跳转成功
00D268FB    50              PUSH EAX
00D268FC    52              PUSH EDX
00D268FD    C605 64E6DE00 0>MOV BYTE PTR DS:[DEE664],1
00D26904    8B4D 08         MOV ECX,DWORD PTR SS:[EBP+8]
00D26907    890D 68E6DE00   MOV DWORD PTR DS:[DEE668],ECX
00D2690D    894A 04         MOV DWORD PTR DS:[EDX+4],ECX
00D26910    C742 08 0000000>MOV DWORD PTR DS:[EDX+8],0
00D26917    C742 0C 0000000>MOV DWORD PTR DS:[EDX+C],0
00D2691E    E8 C1FFFFFF     CALL SKINENGI.00D268E4
00D26923    5A              POP EDX
00D26924    58              POP EAX
00D26925    FF35 6CE6DE00   PUSH DWORD PTR DS:[DEE66C]   //跳到此处
00D2692B    B9 C0B0DE00     MOV ECX,SKINENGI.00DEB0C0
00D26930    E8 5BD7FFFF     CALL SKINENGI.00D24090       //F8键运行此Call之后弹出NAG,因此,在之处需按F7键,进入此Call中
00D26935    C3              RETN
。。。。。。


    进入 CALL SKINENGI.00D24090 后,来到如下的代码:

。。。。。。
00D24090    51              PUSH ECX                                      ; SKINENGI.00DEB0C0
00D24091    56              PUSH ESI
00D24092    57              PUSH EDI
00D24093    BE 38E6DE00     MOV ESI,SKINENGI.00DEE638
00D24098    8D7D C4         LEA EDI,DWORD PTR SS:[EBP-3C]
00D2409B    B9 0B000000     MOV ECX,0B
00D240A0    F3:A5           REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI>
00D240A2    8F05 58E6DE00   POP DWORD PTR DS:[DEE658]
00D240A8    8F05 54E6DE00   POP DWORD PTR DS:[DEE654]
00D240AE    892D 4CE6DE00   MOV DWORD PTR DS:[DEE64C],EBP
00D240B4    891D 50E6DE00   MOV DWORD PTR DS:[DEE650],EBX
00D240BA    A3 40E6DE00     MOV DWORD PTR DS:[DEE640],EAX
00D240BF    8915 48E6DE00   MOV DWORD PTR DS:[DEE648],EDX
00D240C5    8D4D C4         LEA ECX,DWORD PTR SS:[EBP-3C]
00D240C8    890D 38E6DE00   MOV DWORD PTR DS:[DEE638],ECX
00D240CE    31C9            XOR ECX,ECX
00D240D0    837D 0C 00      CMP DWORD PTR SS:[EBP+C],0
00D240D4    75 02           JNZ SHORT SKINENGI.00D240D8
00D240D6    8B08            MOV ECX,DWORD PTR DS:[EAX]
00D240D8    890D 44E6DE00   MOV DWORD PTR DS:[DEE644],ECX
00D240DE    B8 6013D200     MOV EAX,<JMP.&KERNEL32.RaiseException>
00D240E3    A3 14E0DE00     MOV DWORD PTR DS:[DEE014],EAX
00D240E8    B8 6813D200     MOV EAX,<JMP.&KERNEL32.RtlUnwind>
00D240ED    A3 18E0DE00     MOV DWORD PTR DS:[DEE018],EAX
00D240F2    E8 91FEFFFF     CALL SKINENGI.00D23F88
00D240F7    8B45 0C         MOV EAX,DWORD PTR SS:[EBP+C]
00D240FA    40              INC EAX
00D240FB    A2 60E6DE00     MOV BYTE PTR DS:[DEE660],AL
00D24100    48              DEC EAX
00D24101    59              POP ECX
00D24102    8B11            MOV EDX,DWORD PTR DS:[ECX]
00D24104    8915 5CE6DE00   MOV DWORD PTR DS:[DEE65C],EDX
00D2410A    74 07           JE SHORT SKINENGI.00D24113
00D2410C    3C 03           CMP AL,3
00D2410E    7D 03           JGE SHORT SKINENGI.00D24113
00D24110    FF1481          CALL DWORD PTR DS:[ECX+EAX*4]
00D24113    51              PUSH ECX
00D24114    8B4C24 08       MOV ECX,DWORD PTR SS:[ESP+8]
00D24118    85C9            TEST ECX,ECX
00D2411A    74 08           JE SHORT SKINENGI.00D24124
00D2411C    8B45 0C         MOV EAX,DWORD PTR SS:[EBP+C]
00D2411F    8B55 10         MOV EDX,DWORD PTR SS:[EBP+10]
00D24122    FFD1            CALL ECX
00D24124    59              POP ECX
00D24125    8B45 0C         MOV EAX,DWORD PTR SS:[EBP+C]
00D24128    3C 03           CMP AL,3
00D2412A    7C 03           JL SHORT SKINENGI.00D2412F
00D2412C    FF1481          CALL DWORD PTR DS:[ECX+EAX*4]
00D2412F    833D 30E0DE00 0>CMP DWORD PTR DS:[DEE030],0
00D24136    75 0D           JNZ SHORT SKINENGI.00D24145
00D24138    C605 38E0DE00 0>MOV BYTE PTR DS:[DEE038],1
00D2413F    D93D 24B0DE00   FSTCW WORD PTR DS:[DEB024]
00D24145    8B45 0C         MOV EAX,DWORD PTR SS:[EBP+C]
00D24148    48              DEC EAX
00D24149    0F85 91010000   JNZ SKINENGI.00D242E0         //***此处跳转成功!***
00D2414F    E8 DCFEFFFF     CALL SKINENGI.00D24030        //此调用NAG窗口的 Call 不再被运行了!
00D24154    C2 0400         RETN 4
00D24157    C3              RETN
。。。。。。


    由 JNZ SKINENGI.00D242E0 的跳转,来到如下的代码:

。。。。。。
00D242DB    000D 0A000053   ADD BYTE PTR DS:[5300000A],CL
00D242E1    56              PUSH ESI
00D242E2    57              PUSH EDI
00D242E3    55              PUSH EBP
00D242E4    BB 38E6DE00     MOV EBX,SKINENGI.00DEE638
00D242E9    BE 00B0DE00     MOV ESI,SKINENGI.00DEB000
00D242EE    BF 48E0DE00     MOV EDI,SKINENGI.00DEE048
00D242F3    807B 28 00      CMP BYTE PTR DS:[EBX+28],0
00D242F7    75 16           JNZ SHORT SKINENGI.00D2430F
00D242F9    833F 00         CMP DWORD PTR DS:[EDI],0
00D242FC    74 11           JE SHORT SKINENGI.00D2430F
00D242FE    8B17            MOV EDX,DWORD PTR DS:[EDI]
00D24300    89D0            MOV EAX,EDX
00D24302    33D2            XOR EDX,EDX
00D24304    8917            MOV DWORD PTR DS:[EDI],EDX
00D24306    8BE8            MOV EBP,EAX
00D24308    FFD5            CALL EBP
00D2430A    833F 00         CMP DWORD PTR DS:[EDI],0
00D2430D  ^ 75 EF           JNZ SHORT SKINENGI.00D242FE
00D2430F    833D 04B0DE00 0>CMP DWORD PTR DS:[DEB004],0
00D24316    74 11           JE SHORT SKINENGI.00D24329
00D24318    E8 ABFEFFFF     CALL SKINENGI.00D241C8
00D2431D    E8 32FFFFFF     CALL SKINENGI.00D24254
00D24322    33C0            XOR EAX,EAX
00D24324    A3 04B0DE00     MOV DWORD PTR DS:[DEB004],EAX
00D24329    807B 28 02      CMP BYTE PTR DS:[EBX+28],2
00D2432D    75 0A           JNZ SHORT SKINENGI.00D24339
00D2432F    833E 00         CMP DWORD PTR DS:[ESI],0
00D24332    75 05           JNZ SHORT SKINENGI.00D24339
00D24334    33C0            XOR EAX,EAX
00D24336    8943 0C         MOV DWORD PTR DS:[EBX+C],EAX
00D24339    E8 92FCFFFF     CALL SKINENGI.00D23FD0          //F8键运行此Call之后弹出NAG,因此,在之处需按F7键,进入此Call中
00D2433E    807B 28 01      CMP BYTE PTR DS:[EBX+28],1
。。。。。。


    进入 CALL SKINENGI.00D23FD0 后,来到如下的代码:

。。。。。。
00D23FD0    55              PUSH EBP
00D23FD1    8BEC            MOV EBP,ESP
00D23FD3    53              PUSH EBX
00D23FD4    56              PUSH ESI
00D23FD5    57              PUSH EDI
00D23FD6    BF 38E6DE00     MOV EDI,SKINENGI.00DEE638
00D23FDB    8B47 08         MOV EAX,DWORD PTR DS:[EDI+8]
00D23FDE    85C0            TEST EAX,EAX
00D23FE0    74 48           JE SHORT SKINENGI.00D2402A
00D23FE2    8B5F 0C         MOV EBX,DWORD PTR DS:[EDI+C]
00D23FE5    8B70 04         MOV ESI,DWORD PTR DS:[EAX+4]
00D23FE8    33D2            XOR EDX,EDX
00D23FEA    55              PUSH EBP
00D23FEB    68 1640D200     PUSH SKINENGI.00D24016
00D23FF0    64:FF32         PUSH DWORD PTR FS:[EDX]
00D23FF3    64:8922         MOV DWORD PTR FS:[EDX],ESP
00D23FF6    85DB            TEST EBX,EBX
00D23FF8    7E 12           JLE SHORT SKINENGI.00D2400C
00D23FFA    4B              DEC EBX                           //在此处按F2键下断点,然后按F9键,一直到 EBX=6C 时,弹出NAG窗口
00D23FFB    895F 0C         MOV DWORD PTR DS:[EDI+C],EBX
00D23FFE    8B44DE 04       MOV EAX,DWORD PTR DS:[ESI+EBX*8+4]
00D24002    85C0            TEST EAX,EAX
00D24004    74 02           JE SHORT SKINENGI.00D24008
00D24006    FFD0            CALL EAX                          //因此,在 EBX=6D 时,按F8键来到此处,按F7键进入此 Call EAX 中
00D24008    85DB            TEST EBX,EBX
00D2400A  ^ 7F EE           JG SHORT SKINENGI.00D23FFA        //开始循环递减
00D2400C    33C0            XOR EAX,EAX
00D2400E    5A              POP EDX
00D2400F    59              POP ECX
00D24010    59              POP ECX
00D24011    64:8910         MOV DWORD PTR FS:[EAX],EDX
00D24014    EB 14           JMP SHORT SKINENGI.00D2402A
00D24016  ^ E9 B9F9FFFF     JMP SKINENGI.00D239D4
00D2401B    E8 B0FFFFFF     CALL SKINENGI.00D23FD0
00D24020    E8 87FDFFFF     CALL SKINENGI.00D23DAC
00D24025    E8 D6FDFFFF     CALL SKINENGI.00D23E00
00D2402A    5F              POP EDI
00D2402B    5E              POP ESI
00D2402C    5B              POP EBX
00D2402D    5D              POP EBP
00D2402E    C3              RETN
。。。。。。


    在 EBX=6D 时进入 CALL EAX 后,来到如下的代码:

。。。。。。
00DBDBF0    55              PUSH EBP
00DBDBF1    8BEC            MOV EBP,ESP
00DBDBF3    33C0            XOR EAX,EAX
00DBDBF5    55              PUSH EBP
00DBDBF6    68 1CDCDB00     PUSH SKINENGI.00DBDC1C
00DBDBFB    64:FF30         PUSH DWORD PTR FS:[EAX]
00DBDBFE    64:8920         MOV DWORD PTR FS:[EAX],ESP
00DBDC01    FF05 E472E000   INC DWORD PTR DS:[E072E4]
00DBDC07    75 05           JNZ SHORT SKINENGI.00DBDC0E  //跳转不成功
00DBDC09    E8 6AB4FDFF     CALL SKINENGI.00D99078       //F8键运行此Call之后弹出NAG,故将此Call屏蔽 NOP 掉,便可!
00DBDC0E    33C0            XOR EAX,EAX
00DBDC10    5A              POP EDX
00DBDC11    59              POP ECX
00DBDC12    59              POP ECX
00DBDC13    64:8910         MOV DWORD PTR FS:[EAX],EDX
00DBDC16    68 23DCDB00     PUSH SKINENGI.00DBDC23
00DBDC1B    C3              RETN
00DBDC1C  ^ E9 6760F6FF     JMP SKINENGI.00D23C88
00DBDC21  ^ EB F8           JMP SHORT SKINENGI.00DBDC1B
00DBDC23    5D              POP EBP
00DBDC24    C3              RETN
。。。。。。


故,在skinengine.dll中,找到机器码 “E8 FDB3FDFF”    //程序开始的NAG窗口
                              用 “90 90909090”代替
                       找到机器码 “E8 6AB4FDFF”    //程序结束的NAG窗口
                              用 “90 90909090”代替
                                                     

最后,将破解了的skinengine.dll文件拷贝到Windows\system目录中覆盖掉先前被CC过的skinengine.dll文件,即可!


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