- UID
 - 53760
 
 注册时间2008-6-8
阅读权限20
最后登录1970-1-1
以武会友 
   
 
 
 
TA的每日心情  | 开心 2016-11-12 16:59 | 
|---|
 
  签到天数: 1 天 [LV.1]初来乍到  
 | 
 
【文章标题】: 彩影2008白金版不完全破解(去除试用显示限制) 
【文章作者】: JackyChou 
【作者邮箱】: [email protected] 
【软件名称】: 彩影2008白金版 
【下载地址】: 自己搜索下载 
【加壳方式】: 无壳 
【保护方式】: 无保护 
【编写语言】: VC 6.0 
【使用工具】: OD,PEID 
【操作平台】: XP SP3正版 
【软件介绍】: 彩影是一款图像处理软件,功能比较强大。 
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教! 
-------------------------------------------------------------------------------- 
【详细过程】 
    彩影2008白金版Demo版是真正的试用版,很多功能并没有增加,并且也是不能注册的,但是只要把未注册的图像显示限 
制去除了,那么我们可以把处理好的图像用其他好的截图软件截图即可。因为软件的保存功能并没有添加,感兴趣的朋友可 
以自行添加代码,增加其保存功能,这样应该也算Demo版的完美破解了。 
 
    进入正题,我们主要还是将怎么去找未注册的限制,很多牛人分析软件一下子就拿关键部分来分析,但很少分析他是如 
何找到这个关键部位的,可能很多时候我们想要知道的是如何找关键位置的过程,如果直接看关键代码感觉没有什么难度, 
自己动手却发现很难找关键位置(菜鸟观点)。 
    本文涉及内容:如何去除以下几个限制 
    ①启动软件,提示注册对话框(NAG窗口)。 
    ②软件关闭,提示注册对话框(NAG窗口)。 
    ③载入图片,在图像右上角显示一个较大的【未注册版本】图案。 
    ④载入图片,在图像左下角显示一个淡灰色字体较大的百分比数字。 
    其他说明:在软件中如果有未注册提示的,都是功能没有添加的(如保存图片,如将系列图片保存为GIF),如果你想 
需要该功能,那么可以把相应位置的代码全部NOP掉,然后尝试添加自己所想的代码。 
 
    下面针对上面几个限制点来分析如何进行去除。 
    ①启动软件,提示注册对话框(NAG窗口)的去除。 
    要去除该提示窗口,我先下断DestroyWindow比较容易找建立NAG窗口的位置,因为那个对话框应该是模态对话框。 
    bp DestroyWindow F9运行,断在下面位置: 
--------------------------------------------------------------------------------------------------- 
77D2B19C >  B8 63110000     mov     eax, 1163                                         ; 断在这里 
77D2B1A1    BA 0003FE7F     mov     edx, 7FFE0300 
77D2B1A6    FF12            call    dword ptr [edx] 
77D2B1A8    C2 0400         retn    4 
--------------------------------------------------------------------------------------------------- 
 
    可能你这个时候就要去除断点,Alt + F9返回程序领空了,但是我们再看下右下堆栈窗口 
--------------------------------------------------------------------------------------------------- 
0012ED9C   73D36C14  /CALL 到 DestroyWindow 来自 MFC42.73D36C0E 
0012EDA0   000C09C4  \hWnd = 000C09C4 (class='Afx:400000:0:10011:0:0',parent=001409D6) 
0012EDA4   005789AC  CaiYing.005789AC 
0012EDA8   77D2AEAB  USER32.UpdateWindow 
0012EDAC   00578978  CaiYing.00578978 
--------------------------------------------------------------------------------------------------- 
 
    class='Afx:400000:0:10011:0:0'从这个可以看出来,并不是NAG窗口的销毁,一般MFC建立的窗口class=#32770。我们 
继续F9,发现刚才那个窗口并没有销毁,继续点关闭窗口按钮。断在下面位置 
--------------------------------------------------------------------------------------------------- 
77D2B19C >  B8 63110000     mov     eax, 1163           ; 程序断在这里 
77D2B1A1    BA 0003FE7F     mov     edx, 7FFE0300 
77D2B1A6    FF12            call    dword ptr [edx] 
77D2B1A8    C2 0400         retn    4 
--------------------------------------------------------------------------------------------------- 
 
   这个时候我们看右下角的堆栈窗口: 
--------------------------------------------------------------------------------------------------- 
0012EDEC   73D36C14  /CALL 到 DestroyWindow 来自 MFC42.73D36C0E 
0012EDF0   000A0CFA  \hWnd = 000A0CFA ('欢迎使用彩影2008!',class='#32770',parent=001409D6) 
--------------------------------------------------------------------------------------------------- 
 
   对了,这次肯定是刚才建立的对话框进行销毁了,第一次断下的可能是其他东西的销毁,我后来又试了下,发现不点关 
闭按钮也会断下的,继续F9运行,再点关闭,就断在上面位置了。好了,这个时候可以去除断点,可以Alt + F9返回程序领 
空了。返回到下面位置: 
--------------------------------------------------------------------------------------------------- 
00467BFA   .  E8 61790400   call    <jmp.&MFC42.#2514_CDialog::DoModal>        ;  这边是建立模态对话框 
00467BFF   .  53            push    ebx                                        ;  Alt+F9程序返回到这里 
00467C00   .  8BCE          mov     ecx, esi 
00467C02   .  E8 2F850400   call    <jmp.&MFC42.#1768_CWnd::CenterWindow> 
00467C07   .  6A 03         push    3 
00467C09   .  8BCE          mov     ecx, esi 
00467C0B   .  E8 CA7A0400   call    <jmp.&MFC42.#6215_CWnd::ShowWindow> 
00467C10   .  8D8C24 7C0100>lea     ecx, dword ptr [esp+17C] 
00467C17   .  C78424 C40100>mov     dword ptr [esp+1C4], 3 
00467C22   .  E8 357A0400   call    <jmp.&MFC42.#609_CButton::~CButton> 
00467C27   .  8D8C24 3C0100>lea     ecx, dword ptr [esp+13C] 
00467C2E   .  C68424 C40100>mov     byte ptr [esp+1C4], 2 
00467C36   .  E8 217A0400   call    <jmp.&MFC42.#609_CButton::~CButton> 
00467C3B   .  8D4C24 70     lea     ecx, dword ptr [esp+70] 
00467C3F   .  C68424 C40100>mov     byte ptr [esp+1C4], 1 
00467C47   .  E8 C432FFFF   call    0045AF10 
00467C4C   .  8D4C24 10     lea     ecx, dword ptr [esp+10] 
00467C50   .  C78424 C40100>mov     dword ptr [esp+1C4], -1 
00467C5B   .  E8 0E7A0400   call    <jmp.&MFC42.#641_CDialog::~CDialog> 
00467C60   .  33C0          xor     eax, eax 
00467C62   .  EB 03         jmp     short 00467C67 
00467C64   >  83C8 FF       or      eax, FFFFFFFF 
00467C67   >  8B8C24 BC0100>mov     ecx, dword ptr [esp+1BC] 
00467C6E   .  5F            pop     edi 
00467C6F   .  5E            pop     esi 
00467C70   .  5D            pop     ebp 
00467C71   .  64:890D 00000>mov     dword ptr fs:[0], ecx 
00467C78   .  5B            pop     ebx 
00467C79   .  81C4 B8010000 add     esp, 1B8 
00467C7F   .  C2 0400       retn    4 
--------------------------------------------------------------------------------------------------- 
这下我们就很容易知道,00467BFA这个地址是建立那个烦人的NAG窗口(注册提示窗口),我们只要NOP掉即可。这样第一个 
问题解决,下面我们继续第二个点。 
 
    ②软件关闭,提示注册对话框(NAG窗口)。 
    由于这个和第一个限制点相似,所以这里不再仔细介绍,这里注意下断DestroyWindow函数的时候,应该在关闭程序后 
再下断,不然程序关闭你就断下了,在程序关闭后,显示NAG窗口时再下断,这样返回的位置就是建立NAG窗口的地方了。 
我这里就简单把位置说下: 
--------------------------------------------------------------------------------------------------- 
00417BB1   .  E8 AA790900   call    <jmp.&MFC42.#2514_CDialog::DoModal>                 ;  NAG窗口建立 
00417BB6   .  66:A1 5487570>mov     ax, word ptr [578754]                               ;  返回到这里 
00417BBC   .  B9 40000000   mov     ecx, 40 
00417BC1   .  66:8985 E0FEF>mov     word ptr [ebp-120], ax 
00417BC8   .  33C0          xor     eax, eax 
--------------------------------------------------------------------------------------------------- 
 
这样把00417BB1地址的代码NOP掉就可以了。好了,前面2点很简单,本来不想写,但是我初学的时候走了很多弯路,所以 
还是想写下来给初学者看看,少走点弯路,很多初学者都是用查找字符串的方法来找位置,但我还是推荐大家根据程序的 
运行情况来下断找位置,可以理解程序大概的思路,另外提醒喜欢破解的初学者最好更喜欢编程,这样你分析别人程序的 
时候更加能得心应手。继续正题,下面开始说第三点。 
 
    ③载入图片,在图像右上角显示一个较大的【未注册版本】图案。 
    找这个位置,其实我也花了点时间找,因为有时候即使看到那个关键点你也不一定能知道这个点就是添加 
【未注册版本】图案的。我汇编一点都不好,所以分析算法什么的就比较差了,继续和大家一起努力学习。关于这个点的 
解决,我们首先分析下程序执行过程,图片载入后会显示那个图案,那么我们可以在载入图片前,下断CreateFileA试试, 
看看程序后面的执行(这里还是想说下多学学编程就可以知道这里可以先试试这个API了,不然也没有经验啊)。 
    bp CreateFileA 载入图片,断在下面位置: 
--------------------------------------------------------------------------------------------------- 
7C801A28 >  8BFF            mov     edi, edi                                      ; 断下位置 
7C801A2A    55              push    ebp 
7C801A2B    8BEC            mov     ebp, esp 
7C801A2D    FF75 08         push    dword ptr [ebp+8] 
7C801A30    E8 CFC60000     call    7C80E104 
7C801A35    85C0            test    eax, eax 
7C801A37    74 1E           je      short 7C801A57 
7C801A39    FF75 20         push    dword ptr [ebp+20] 
7C801A3C    FF75 1C         push    dword ptr [ebp+1C] 
7C801A3F    FF75 18         push    dword ptr [ebp+18] 
7C801A42    FF75 14         push    dword ptr [ebp+14] 
7C801A45    FF75 10         push    dword ptr [ebp+10] 
7C801A48    FF75 0C         push    dword ptr [ebp+C] 
7C801A4B    FF70 04         push    dword ptr [eax+4] 
7C801A4E    E8 9DED0000     call    CreateFileW 
7C801A53    5D              pop     ebp 
7C801A54    C2 1C00         retn    1C 
--------------------------------------------------------------------------------------------------- 
 
去除断点,Alt + F9返回程序领空。 
--------------------------------------------------------------------------------------------------- 
00499030 >/$  81EC 04010000 sub     esp, 104 
00499036  |.  53            push    ebx 
00499037  |.  55            push    ebp 
00499038  |.  56            push    esi 
00499039  |.  57            push    edi 
0049903A  |.  8BBC24 1C0100>mov     edi, dword ptr [esp+11C] 
00499041  |.  8BE9          mov     ebp, ecx 
00499043  |.  85FF          test    edi, edi 
00499045  |.  76 58         jbe     short 0049909F 
00499047  |.  83FF 10       cmp     edi, 10 
0049904A  |.  73 53         jnb     short 0049909F 
0049904C  |.  8B8424 180100>mov     eax, dword ptr [esp+118] 
00499053  |.  68 40935600   push    00569340                                      ; /rb 
00499058  |.  50            push    eax                                           ; |path 
00499059  |.  FF15 DC5E5200 call    dword ptr [<&MSVCRT.fopen>]                   ; \fopen 
0049905F  |.  8BF0          mov     esi, eax                                      ;  Alt + F9程序返回到这里 
00499061  |.  83C4 08       add     esp, 8 
00499064  |.  85F6          test    esi, esi 
00499066  |.  75 0F         jnz     short 00499077                                ;  这边是跳转的 
00499068  |.  5F            pop     edi 
00499069  |.  5E            pop     esi 
0049906A  |.  5D            pop     ebp 
0049906B  |.  32C0          xor     al, al 
0049906D  |.  5B            pop     ebx 
0049906E  |.  81C4 04010000 add     esp, 104 
00499074  |.  C2 0800       retn    8 
00499077  |>  57            push    edi 
00499078  |.  56            push    esi 
00499079  |.  8BCD          mov     ecx, ebp 
0049907B  |.  E8 B0040000   call    CxImage::Decode                               ;  这边应该是图像解析 
00499080  |.  56            push    esi                                           ; /stream 
00499081  |.  8AD8          mov     bl, al                                        ; | 
00499083  |.  FF15 E05E5200 call    dword ptr [<&MSVCRT.fclose>]                  ; \fclose 
00499089  |.  83C4 04       add     esp, 4 
0049908C  |.  84DB          test    bl, bl 
0049908E  |.  74 0F         je      short 0049909F                                ;  这边没有跳 
00499090  |.  5F            pop     edi 
00499091  |.  5E            pop     esi 
00499092  |.  8AC3          mov     al, bl 
00499094  |.  5D            pop     ebp 
00499095  |.  5B            pop     ebx 
00499096  |.  81C4 04010000 add     esp, 104 
0049909C  |.  C2 0800       retn    8                                             ;  程序返回 
--------------------------------------------------------------------------------------------------- 
下面开始进行单步走了,走着走着,进行消息循环了,死翘翘,看来需要另辟路径,水平太菜。 
 
    这时不要灰心,更不要随便去找,我们再想想,发现左下角显示一个淡灰色字体较大的百分比数字。也就是我们要解决 
的第④点,一开始我以为一直是显示100%,所以可能是固定的,后来发现是会变化的,有时会显示94%,机会应该来了,这个 
点可以找到突破口,这里肯定是格式化字符串了,那么可以下断API sprintf来找,试了下,不是关键位置,所以代码就不贴 
了,后来一想,现在一般都是用宽字节了,所以应该下断API swprintf来找,先载入图片,下断bp swprintf,切换到显示 
窗口,断在下面位置: 
--------------------------------------------------------------------------------------------------- 
77C0F9C8 >  8BFF            mov     edi, edi                     ; 断在这里 
77C0F9CA    55              push    ebp 
77C0F9CB    8BEC            mov     ebp, esp 
77C0F9CD    83EC 20         sub     esp, 20 
77C0F9D0    8B45 08         mov     eax, dword ptr [ebp+8] 
77C0F9D3    8945 E8         mov     dword ptr [ebp-18], eax 
77C0F9D6    8945 E0         mov     dword ptr [ebp-20], eax 
77C0F9D9    56              push    esi 
77C0F9DA    8D45 10         lea     eax, dword ptr [ebp+10] 
77C0F9DD    50              push    eax 
77C0F9DE    FF75 0C         push    dword ptr [ebp+C] 
77C0F9E1    8D45 E0         lea     eax, dword ptr [ebp-20] 
77C0F9E4    50              push    eax 
77C0F9E5    C745 EC 4200000>mov     dword ptr [ebp-14], 42 
77C0F9EC    C745 E4 FFFFFF7>mov     dword ptr [ebp-1C], 7FFFFFFF 
77C0F9F3    E8 DC370000     call    77C131D4 
77C0F9F8    83C4 0C         add     esp, 0C 
77C0F9FB    FF4D E4         dec     dword ptr [ebp-1C] 
77C0F9FE    8BF0            mov     esi, eax 
77C0FA00    78 0B           js      short 77C0FA0D 
77C0FA02    8B45 E0         mov     eax, dword ptr [ebp-20] 
77C0FA05    C600 00         mov     byte ptr [eax], 0 
77C0FA08    FF45 E0         inc     dword ptr [ebp-20] 
77C0FA0B    EB 0D           jmp     short 77C0FA1A 
77C0FA0D    8D45 E0         lea     eax, dword ptr [ebp-20] 
77C0FA10    50              push    eax 
77C0FA11    6A 00           push    0 
77C0FA13    E8 45F2FFFF     call    _flsbuf 
77C0FA18    59              pop     ecx 
77C0FA19    59              pop     ecx 
77C0FA1A    FF4D E4         dec     dword ptr [ebp-1C] 
77C0FA1D    78 08           js      short 77C0FA27 
77C0FA1F    8B45 E0         mov     eax, dword ptr [ebp-20] 
77C0FA22    C600 00         mov     byte ptr [eax], 0 
77C0FA25    EB 0D           jmp     short 77C0FA34 
77C0FA27    8D45 E0         lea     eax, dword ptr [ebp-20] 
77C0FA2A    50              push    eax 
77C0FA2B    6A 00           push    0 
77C0FA2D    E8 2BF2FFFF     call    _flsbuf 
77C0FA32    59              pop     ecx 
77C0FA33    59              pop     ecx 
77C0FA34    8BC6            mov     eax, esi 
77C0FA36    5E              pop     esi 
77C0FA37    C9              leave 
77C0FA38    C3              retn 
--------------------------------------------------------------------------------------------------- 
 
再看下堆栈窗口: 
--------------------------------------------------------------------------------------------------- 
0012F69C   0042B509  /CALL 到 swprintf 来自 CaiYing_.0042B503 
0012F6A0   0012F98C  |wstr = 0012F98C 
0012F6A4   0056A648  |format = "%3.0f%%" 
0012F6A8   00000000  \<%3.0f> = 0.0 
0012F6AC   40590000 
0012F6B0   73D4497A  MFC42.#4874_CView::OnPaint 
--------------------------------------------------------------------------------------------------- 
应该肯定是这里了,而且是在OnPaint函数下,我对MFC比较熟悉,所以肯定就是这里了。去除断点,Alt + F9返回到下面 
 
========================================================================================== 
上面还有很多代码,不贴了,感兴趣的自己下载个分析分析 
========================================================================================== 
0042B4F3   .  8D8424 E40200>lea     eax, dword ptr [esp+2E4]                     ; | 
0042B4FA   .  DD1C24        fstp    qword ptr [esp]                              ; | 
0042B4FD   .  68 48A65600   push    0056A648                                     ; |% 
0042B502   .  50            push    eax                                          ; |wstr 
0042B503   .  FF15 905E5200 call    dword ptr [<&MSVCRT.swprintf>]               ; \swprintf 
0042B509   .  8B4C24 4C     mov     ecx, dword ptr [esp+4C]                      ;  Alt + F9程序返回在这里 
0042B50D   .  83C4 10       add     esp, 10 
0042B510      E9 E6030000   jmp     0042B8FB                                     ;  这边就可以把下面的全部跳过了。 
0042B515      90            nop 
0042B516      90            nop 
0042B517      90            nop 
0042B518   .  85C0          test    eax, eax 
0042B51A   .  74 04         je      short 0042B520 
0042B51C   .  894424 40     mov     dword ptr [esp+40], eax 
0042B520   >  8D9424 DC0200>lea     edx, dword ptr [esp+2DC] 
0042B527   .  52            push    edx                                          ; /s 
0042B528   .  FF15 945E5200 call    dword ptr [<&MSVCRT.wcslen>]  ; \计算字符长度,我们下断这个函数也是可以找到的 
0042B52E   .  D94424 30     fld     dword ptr [esp+30] 
0042B532   .  8B4C24 18     mov     ecx, dword ptr [esp+18] 
0042B536   .  83C4 04       add     esp, 4 
0042B539   .  D95C24 50     fstp    dword ptr [esp+50] 
0042B53D   .  D94424 48     fld     dword ptr [esp+48] 
0042B541   .  D95C24 54     fstp    dword ptr [esp+54] 
0042B545   .  85C9          test    ecx, ecx 
0042B547   .  C74424 58 000>mov     dword ptr [esp+58], 0 
0042B54F   .  C74424 5C 000>mov     dword ptr [esp+5C], 0 
0042B557   .  74 05         je      short 0042B55E 
0042B559   .  8B51 04       mov     edx, dword ptr [ecx+4] 
0042B55C   .  EB 02         jmp     short 0042B560 
0042B55E   >  33D2          xor     edx, edx 
0042B560   >  8D4C24 24     lea     ecx, dword ptr [esp+24] 
0042B564   .  52            push    edx 
0042B565   .  F7D9          neg     ecx 
0042B567   .  1BC9          sbb     ecx, ecx 
0042B569   .  8D5424 54     lea     edx, dword ptr [esp+54] 
0042B56D   .  234C24 38     and     ecx, dword ptr [esp+38] 
0042B571   .  6A 00         push    0 
0042B573   .  52            push    edx 
0042B574   .  51            push    ecx 
0042B575   .  8B4C24 4C     mov     ecx, dword ptr [esp+4C] 
0042B579   .  50            push    eax 
0042B57A   .  8D8424 F00200>lea     eax, dword ptr [esp+2F0] 
0042B581   .  50            push    eax 
0042B582   .  51            push    ecx 
0042B583   .  E8 463E0800   call    <jmp.&gdiplus.GdipDrawString>                ;  这边就是描绘字符串了,跳过这里即可 
0042B588   .  85C0          test    eax, eax 
0042B58A   .  74 04         je      short 0042B590 
0042B58C   .  894424 40     mov     dword ptr [esp+40], eax 
0042B590   >  8B9424 8C0000>mov     edx, dword ptr [esp+8C] 
0042B597   .  68 FFFFFF80   push    80FFFFFF 
0042B59C   .  52            push    edx 
0042B59D   .  E8 443E0800   call    <jmp.&gdiplus.GdipSetSolidFillColor> 
0042B5A2   .  85C0          test    eax, eax 
0042B5A4   .  74 07         je      short 0042B5AD 
0042B5A6   .  898424 900000>mov     dword ptr [esp+90], eax 
0042B5AD   >  8B8C24 8C0000>mov     ecx, dword ptr [esp+8C] 
0042B5B4   .  8D4424 10     lea     eax, dword ptr [esp+10] 
0042B5B8   .  50            push    eax 
0042B5B9   .  51            push    ecx 
0042B5BA   .  C74424 18 000>mov     dword ptr [esp+18], 0 
0042B5C2   .  E8 193E0800   call    <jmp.&gdiplus.GdipCloneBrush> 
0042B5C7   .  85C0          test    eax, eax 
0042B5C9   .  74 07         je      short 0042B5D2 
0042B5CB   .  898424 900000>mov     dword ptr [esp+90], eax 
0042B5D2   >  6A 0C         push    0C 
0042B5D4   .  E8 013E0800   call    <jmp.&gdiplus.GdipAlloc> 
0042B5D9   .  85C0          test    eax, eax 
0042B5DB   .  74 1D         je      short 0042B5FA 
0042B5DD   .  8B8C24 900000>mov     ecx, dword ptr [esp+90] 
0042B5E4   .  8B5424 10     mov     edx, dword ptr [esp+10] 
0042B5E8   .  C700 40AD5200 mov     dword ptr [eax], 0052AD40  
0042B5EE   .  8948 08       mov     dword ptr [eax+8], ecx 
0042B5F1   .  8950 04       mov     dword ptr [eax+4], edx 
0042B5F4   .  894424 14     mov     dword ptr [esp+14], eax 
0042B5F8   .  EB 12         jmp     short 0042B60C 
0042B5FA   >  8B5424 10     mov     edx, dword ptr [esp+10] 
0042B5FE   .  C74424 14 000>mov     dword ptr [esp+14], 0 
0042B606   .  52            push    edx 
0042B607   .  E8 C83D0800   call    <jmp.&gdiplus.GdipDeleteBrush> 
0042B60C   >  8D8424 DC0200>lea     eax, dword ptr [esp+2DC] 
0042B613   .  50            push    eax                                          ; /s 
0042B614   .  FF15 945E5200 call    dword ptr [<&MSVCRT.wcslen>]                 ; \wcslen 
0042B61A   .  D94424 74     fld     dword ptr [esp+74] 
0042B61E   .  8B4C24 18     mov     ecx, dword ptr [esp+18] 
0042B622   .  83C4 04       add     esp, 4 
0042B625   .  D95C24 50     fstp    dword ptr [esp+50] 
0042B629   .  D94424 18     fld     dword ptr [esp+18] 
0042B62D   .  D95C24 54     fstp    dword ptr [esp+54] 
0042B631   .  85C9          test    ecx, ecx 
0042B633   .  C74424 58 000>mov     dword ptr [esp+58], 0 
0042B63B   .  C74424 5C 000>mov     dword ptr [esp+5C], 0 
0042B643   .  74 05         je      short 0042B64A 
0042B645   .  8B51 04       mov     edx, dword ptr [ecx+4] 
0042B648   .  EB 02         jmp     short 0042B64C 
0042B64A   >  33D2          xor     edx, edx 
0042B64C   >  8D4C24 24     lea     ecx, dword ptr [esp+24] 
0042B650   .  52            push    edx 
0042B651   .  F7D9          neg     ecx 
0042B653   .  1BC9          sbb     ecx, ecx 
0042B655   .  8D5424 54     lea     edx, dword ptr [esp+54] 
0042B659   .  234C24 38     and     ecx, dword ptr [esp+38] 
0042B65D   .  6A 00         push    0 
0042B65F   .  52            push    edx 
0042B660   .  51            push    ecx 
0042B661   .  8B4C24 4C     mov     ecx, dword ptr [esp+4C] 
0042B665   .  50            push    eax 
0042B666   .  8D8424 F00200>lea     eax, dword ptr [esp+2F0] 
0042B66D   .  50            push    eax 
0042B66E   .  51            push    ecx 
0042B66F   .  E8 5A3D0800   call    <jmp.&gdiplus.GdipDrawString> ;  这边还是描绘,那个百分数是描绘2次,叠加的效果 
0042B674   .  85C0          test    eax, eax 
0042B676   .  74 04         je      short 0042B67C 
0042B678   .  894424 40     mov     dword ptr [esp+40], eax 
0042B67C   >  8B4C24 44     mov     ecx, dword ptr [esp+44] 
0042B680   .  8B41 0C       mov     eax, dword ptr [ecx+C] 
0042B683   .  8B49 10       mov     ecx, dword ptr [ecx+10] 
0042B686   .  3BC1          cmp     eax, ecx 
0042B688   .  8BD0          mov     edx, eax 
0042B68A   .  77 02         ja      short 0042B68E 
0042B68C   .  8BD1          mov     edx, ecx 
0042B68E   >  81FA 20030000 cmp     edx, 320 
0042B694   .  0F82 2D010000 jb      0042B7C7 
0042B69A   .  3BC1          cmp     eax, ecx 
0042B69C   .  8BD0          mov     edx, eax 
0042B69E   .  72 02         jb      short 0042B6A2 
0042B6A0   .  8BD1          mov     edx, ecx 
0042B6A2   >  81FA F4010000 cmp     edx, 1F4 
0042B6A8   .  0F82 19010000 jb      0042B7C7 
0042B6AE   .  8B85 EC110100 mov     eax, dword ptr [ebp+111EC] 
0042B6B4   .  8B48 0C       mov     ecx, dword ptr [eax+C] 
0042B6B7   .  8B50 10       mov     edx, dword ptr [eax+10] 
0042B6BA   .  8B8424 940000>mov     eax, dword ptr [esp+94] 
0042B6C1   .  894C24 70     mov     dword ptr [esp+70], ecx 
0042B6C5   .  2BF8          sub     edi, eax 
0042B6C7   .  8B8424 9C0000>mov     eax, dword ptr [esp+9C] 
0042B6CE   .  03F8          add     edi, eax 
0042B6D0   .  895424 2C     mov     dword ptr [esp+2C], edx 
0042B6D4   .  897C24 18     mov     dword ptr [esp+18], edi 
0042B6D8   .  33FF          xor     edi, edi 
0042B6DA   .  DB4424 18     fild    dword ptr [esp+18] 
0042B6DE   .  DB86 F4000000 fild    dword ptr [esi+F4] 
0042B6E4   .  894C24 18     mov     dword ptr [esp+18], ecx 
0042B6E8   .  897C24 1C     mov     dword ptr [esp+1C], edi 
0042B6EC   .  D95C24 14     fstp    dword ptr [esp+14] 
0042B6F0   .  DF6C24 18     fild    qword ptr [esp+18] 
0042B6F4   .  895424 18     mov     dword ptr [esp+18], edx 
0042B6F8   .  897C24 1C     mov     dword ptr [esp+1C], edi 
0042B6FC   .  D84C24 20     fmul    dword ptr [esp+20] 
0042B700   .  D8E9          fsubr   st, st(1) 
0042B702   .  DF6C24 18     fild    qword ptr [esp+18] 
0042B706   .  D84C24 20     fmul    dword ptr [esp+20] 
0042B70A   .  D86C24 14     fsubr   dword ptr [esp+14] 
0042B70E   .  DED9          fcompp 
0042B710   .  DFE0          fstsw   ax 
0042B712   .  F6C4 41       test    ah, 41 
0042B715   .  75 14         jnz     short 0042B72B 
0042B717   .  894C24 18     mov     dword ptr [esp+18], ecx 
0042B71B   .  897C24 1C     mov     dword ptr [esp+1C], edi 
0042B71F   .  DF6C24 18     fild    qword ptr [esp+18] 
0042B723   .  D84C24 20     fmul    dword ptr [esp+20] 
0042B727   .  DEE9          fsubp   st(1), st 
0042B729   .  EB 16         jmp     short 0042B741 
0042B72B   >  DDD8          fstp    st 
0042B72D   .  895424 18     mov     dword ptr [esp+18], edx 
0042B731   .  897C24 1C     mov     dword ptr [esp+1C], edi 
0042B735   .  DF6C24 18     fild    qword ptr [esp+18] 
0042B739   .  D84C24 20     fmul    dword ptr [esp+20] 
0042B73D   .  D86C24 14     fsubr   dword ptr [esp+14] 
0042B741   >  E8 0A4F0800   call    <jmp.&MSVCRT._ftol> 
0042B746   .  8B5424 70     mov     edx, dword ptr [esp+70] 
0042B74A   .  C74424 1C 000>mov     dword ptr [esp+1C], 0 
0042B752   .  895424 18     mov     dword ptr [esp+18], edx 
0042B756   .  894424 50     mov     dword ptr [esp+50], eax 
0042B75A   .  DF6C24 18     fild    qword ptr [esp+18] 
0042B75E   .  D84C24 20     fmul    dword ptr [esp+20] 
0042B762   .  DA4424 50     fiadd   dword ptr [esp+50] 
0042B766   .  E8 E54E0800   call    <jmp.&MSVCRT._ftol> 
0042B76B   .  8BB6 F0000000 mov     esi, dword ptr [esi+F0] 
0042B771   .  8BF8          mov     edi, eax 
0042B773   .  8B4424 7C     mov     eax, dword ptr [esp+7C] 
0042B777   .  3BC6          cmp     eax, esi 
0042B779   .  7E 02         jle     short 0042B77D 
0042B77B   .  8BF0          mov     esi, eax 
0042B77D   >  8B4424 2C     mov     eax, dword ptr [esp+2C] 
0042B781   .  C74424 1C 000>mov     dword ptr [esp+1C], 0 
0042B789   .  894424 18     mov     dword ptr [esp+18], eax 
0042B78D   .  897424 54     mov     dword ptr [esp+54], esi 
0042B791   .  DF6C24 18     fild    qword ptr [esp+18] 
0042B795   .  D84C24 20     fmul    dword ptr [esp+20] 
0042B799   .  DA4424 54     fiadd   dword ptr [esp+54] 
0042B79D   .  E8 AE4E0800   call    <jmp.&MSVCRT._ftol> 
0042B7A2   .  85DB          test    ebx, ebx 
0042B7A4   .  75 04         jnz     short 0042B7AA 
0042B7A6   .  33C9          xor     ecx, ecx 
0042B7A8   .  EB 03         jmp     short 0042B7AD 
0042B7AA   >  8B4B 04       mov     ecx, dword ptr [ebx+4] 
0042B7AD   >  2BC6          sub     eax, esi 
0042B7AF   .  6A 00         push    0 
0042B7B1   .  50            push    eax 
0042B7B2   .  8B4424 58     mov     eax, dword ptr [esp+58] 
0042B7B6   .  2BF8          sub     edi, eax 
0042B7B8   .  57            push    edi 
0042B7B9   .  56            push    esi 
0042B7BA   .  50            push    eax 
0042B7BB   .  51            push    ecx 
0042B7BC   .  8B8D EC110100 mov     ecx, dword ptr [ebp+111EC] 
0042B7C2   .  E9 2B010000   jmp     0042B8F2 
0042B7C7   >  3D C8000000   cmp     eax, 0C8 
0042B7CC   .  0F82 25010000 jb      0042B8F7 
0042B7D2   .  81F9 C8000000 cmp     ecx, 0C8 
0042B7D8   .  0F82 19010000 jb      0042B8F7 
0042B7DE   .  8B85 F0110100 mov     eax, dword ptr [ebp+111F0] 
0042B7E4   .  8B48 0C       mov     ecx, dword ptr [eax+C] 
0042B7E7   .  8B50 10       mov     edx, dword ptr [eax+10] 
0042B7EA   .  8B8424 940000>mov     eax, dword ptr [esp+94] 
0042B7F1   .  894C24 70     mov     dword ptr [esp+70], ecx 
0042B7F5   .  2BF8          sub     edi, eax 
0042B7F7   .  8B8424 9C0000>mov     eax, dword ptr [esp+9C] 
0042B7FE   .  03F8          add     edi, eax 
0042B800   .  895424 2C     mov     dword ptr [esp+2C], edx 
0042B804   .  897C24 18     mov     dword ptr [esp+18], edi 
0042B808   .  33FF          xor     edi, edi 
0042B80A   .  DB4424 18     fild    dword ptr [esp+18] 
0042B80E   .  DB86 F4000000 fild    dword ptr [esi+F4] 
0042B814   .  894C24 18     mov     dword ptr [esp+18], ecx 
0042B818   .  897C24 1C     mov     dword ptr [esp+1C], edi 
0042B81C   .  D95C24 14     fstp    dword ptr [esp+14] 
0042B820   .  DF6C24 18     fild    qword ptr [esp+18] 
0042B824   .  895424 18     mov     dword ptr [esp+18], edx 
0042B828   .  897C24 1C     mov     dword ptr [esp+1C], edi 
0042B82C   .  D84C24 20     fmul    dword ptr [esp+20] 
0042B830   .  D8E9          fsubr   st, st(1) 
0042B832   .  DF6C24 18     fild    qword ptr [esp+18] 
0042B836   .  D84C24 20     fmul    dword ptr [esp+20] 
0042B83A   .  D86C24 14     fsubr   dword ptr [esp+14] 
0042B83E   .  DED9          fcompp 
0042B840   .  DFE0          fstsw   ax 
0042B842   .  F6C4 41       test    ah, 41 
0042B845   .  75 14         jnz     short 0042B85B 
0042B847   .  894C24 18     mov     dword ptr [esp+18], ecx 
0042B84B   .  897C24 1C     mov     dword ptr [esp+1C], edi 
0042B84F   .  DF6C24 18     fild    qword ptr [esp+18] 
0042B853   .  D84C24 20     fmul    dword ptr [esp+20] 
0042B857   .  DEE9          fsubp   st(1), st 
0042B859   .  EB 16         jmp     short 0042B871 
0042B85B   >  DDD8          fstp    st 
0042B85D   .  895424 18     mov     dword ptr [esp+18], edx 
0042B861   .  897C24 1C     mov     dword ptr [esp+1C], edi 
0042B865   .  DF6C24 18     fild    qword ptr [esp+18] 
0042B869   .  D84C24 20     fmul    dword ptr [esp+20] 
0042B86D   .  D86C24 14     fsubr   dword ptr [esp+14] 
0042B871   >  E8 DA4D0800   call    <jmp.&MSVCRT._ftol> 
0042B876   .  8B4C24 70     mov     ecx, dword ptr [esp+70] 
0042B87A   .  C74424 1C 000>mov     dword ptr [esp+1C], 0 
0042B882   .  894C24 18     mov     dword ptr [esp+18], ecx 
0042B886   .  894424 50     mov     dword ptr [esp+50], eax 
0042B88A   .  DF6C24 18     fild    qword ptr [esp+18] 
0042B88E   .  D84C24 20     fmul    dword ptr [esp+20] 
0042B892   .  DA4424 50     fiadd   dword ptr [esp+50] 
0042B896   .  E8 B54D0800   call    <jmp.&MSVCRT._ftol> 
0042B89B   .  8BB6 F0000000 mov     esi, dword ptr [esi+F0] 
0042B8A1   .  8BF8          mov     edi, eax 
0042B8A3   .  8B4424 7C     mov     eax, dword ptr [esp+7C] 
0042B8A7   .  3BC6          cmp     eax, esi 
0042B8A9   .  7E 02         jle     short 0042B8AD 
0042B8AB   .  8BF0          mov     esi, eax 
0042B8AD   >  8B5424 2C     mov     edx, dword ptr [esp+2C] 
0042B8B1   .  C74424 7C 000>mov     dword ptr [esp+7C], 0 
0042B8B9   .  895424 78     mov     dword ptr [esp+78], edx 
0042B8BD   .  897424 54     mov     dword ptr [esp+54], esi 
0042B8C1   .  DF6C24 78     fild    qword ptr [esp+78] 
0042B8C5   .  D84C24 20     fmul    dword ptr [esp+20] 
0042B8C9   .  DA4424 54     fiadd   dword ptr [esp+54] 
0042B8CD   .  E8 7E4D0800   call    <jmp.&MSVCRT._ftol> 
0042B8D2   .  85DB          test    ebx, ebx 
0042B8D4   .  75 04         jnz     short 0042B8DA 
0042B8D6   .  33C9          xor     ecx, ecx 
0042B8D8   .  EB 03         jmp     short 0042B8DD 
0042B8DA   >  8B4B 04       mov     ecx, dword ptr [ebx+4] 
0042B8DD   >  2BC6          sub     eax, esi 
0042B8DF   .  6A 00         push    0 
0042B8E1   .  50            push    eax 
0042B8E2   .  8B4424 58     mov     eax, dword ptr [esp+58] 
0042B8E6   .  2BF8          sub     edi, eax 
0042B8E8   .  57            push    edi 
0042B8E9   .  56            push    esi 
0042B8EA   .  50            push    eax 
0042B8EB   .  51            push    ecx 
0042B8EC   .  8B8D F0110100 mov     ecx, dword ptr [ebp+111F0] 
0042B8F2   >  E8 396E0600   call    CxImage::Draw                                ;  这边可以肯定是未注册大图案的描绘了 
0042B8F7   >  85DB          test    ebx, ebx                                     ;  因为只有在最后画才会显示在最上面啊 
0042B8F9   .  74 09         je      short 0042B904 
0042B8FB   .  8B03          mov     eax, dword ptr [ebx]                         ;  上面的JMP到这里,一定要到这里 
0042B8FD   .  6A 01         push    1 
0042B8FF   .  8BCB          mov     ecx, ebx 
0042B901   .  FF50 04       call    dword ptr [eax+4]                            ;  这个调用可能很有用 
0042B904   >  8B85 F4110100 mov     eax, dword ptr [ebp+111F4]                   ;  不要直接跳到这里 
0042B90A   .  5B            pop     ebx 
0042B90B   .  83F8 01       cmp     eax, 1 
0042B90E   .  75 63         jnz     short 0042B973 
0042B910   .  8B8D 9C110100 mov     ecx, dword ptr [ebp+1119C] 
0042B916   .  85C9          test    ecx, ecx 
0042B918   .  75 40         jnz     short 0042B95A 
0042B91A   .  68 A8010000   push    1A8 
0042B91F   .  E8 303F0800   call    <jmp.&MFC42.#823_operator new> 
0042B924   .  83C4 04       add     esp, 4 
0042B927   .  894424 14     mov     dword ptr [esp+14], eax 
0042B92B   .  85C0          test    eax, eax 
0042B92D   .  C68424 E00400>mov     byte ptr [esp+4E0], 0D 
0042B935   .  74 19         je      short 0042B950 
0042B937   .  8B4D 54       mov     ecx, dword ptr [ebp+54] 
0042B93A   .  6A 01         push    1 
0042B93C   .  6A 01         push    1 
0042B93E   .  6A 01         push    1 
0042B940   .  51            push    ecx 
0042B941   .  8BC8          mov     ecx, eax 
0042B943   .  E8 C85F0600   call    CxImage::CxImage 
0042B948   .  8985 9C110100 mov     dword ptr [ebp+1119C], eax 
0042B94E   .  EB 19         jmp     short 0042B969 
0042B950   >  33C0          xor     eax, eax 
0042B952   .  8985 9C110100 mov     dword ptr [ebp+1119C], eax 
0042B958   .  EB 0F         jmp     short 0042B969 
0042B95A   >  8B55 54       mov     edx, dword ptr [ebp+54] 
0042B95D   .  6A 01         push    1 
0042B95F   .  6A 01         push    1 
0042B961   .  6A 01         push    1 
0042B963   .  52            push    edx 
0042B964   .  E8 E75F0600   call    CxImage::Copy 
0042B969   >  C785 F4110100>mov     dword ptr [ebp+111F4], 0 
0042B973   >  8B8424 880000>mov     eax, dword ptr [esp+88] 
0042B97A   .  C78424 840000>mov     dword ptr [esp+84], 0052AD40 
0042B985   .  50            push    eax 
0042B986   .  E8 493A0800   call    <jmp.&gdiplus.GdipDeleteBrush>               ;  下面开始就是一些GDI的画刷等的释放 
0042B98B   .  8B4C24 30     mov     ecx, dword ptr [esp+30] 
0042B98F   .  51            push    ecx 
0042B990   .  E8 333A0800   call    <jmp.&gdiplus.GdipDeleteFont> 
0042B995   .  8B9424 B00000>mov     edx, dword ptr [esp+B0] 
0042B99C   .  52            push    edx 
0042B99D   .  E8 203A0800   call    <jmp.&gdiplus.GdipDeleteFontFamily> 
0042B9A2   .  8B4424 38     mov     eax, dword ptr [esp+38] 
0042B9A6   .  50            push    eax 
0042B9A7   .  E8 103A0800   call    <jmp.&gdiplus.GdipDeleteGraphics> 
0042B9AC   >  8B8C24 D80400>mov     ecx, dword ptr [esp+4D8] 
0042B9B3   .  5F            pop     edi 
0042B9B4   .  5E            pop     esi 
0042B9B5   .  5D            pop     ebp 
0042B9B6   .  64:890D 00000>mov     dword ptr fs:[0], ecx 
0042B9BD   .  81C4 D8040000 add     esp, 4D8 
0042B9C3   .  C2 0400       retn    4 
============================================================================================= 
说下,为什么一定要跳到0042B8FB这个地址,我们可以看到在call CxImage::Draw,判断了返回值,所以调用返回真 
的画,会执行下面的一个Call,应该有用,如果跳过这几段小代码,直接到0042B904这个地址,我们会发现什么都不描 
绘了。这边可能就是检查下未注册图案是否被描绘了,否则就把显示的全部去除了。 
 
好了,到这里③④的限制全部去除了,虽然没有保存功能,但可以把处理好的图片用SnagIt捕获就可以了,而且效果还 
不错的。就到这里,感谢您有这个耐心把我的菜鸟文章看完!!! 
 
-------------------------------------------------------------------------------- 
【经验总结】 
  分析程序根据程序的运行情况来进行调试,不要漫无目的的进行随便搜索,虽然最后可能找到位置,但是花的时间很多,而 
  且不巧的话会自信心狂受打击。 
   
-------------------------------------------------------------------------------- 
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢! 
 
                                                       2008年05月14日 19:55:52 |   
 
 
 
 |