首页
社区
课程
招聘
[原创]彩影2008白金版分析,不完全破解(去除试用显示限制)
发表于: 2008-5-14 20:32 13393

[原创]彩影2008白金版分析,不完全破解(去除试用显示限制)

2008-5-14 20:32
13393
【文章标题】: 彩影2008白金版不完全破解(去除试用显示限制)
【文章作者】: JackyChou
【作者邮箱】: [email]jiaqicx@163.com[/email]
【软件名称】: 彩影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

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 381
活跃值: (140)
能力值: ( LV13,RANK:330 )
在线值:
发帖
回帖
粉丝
2
下来看看,有空也接着再来整这个软件
LZ也对这个软件感兴趣。 我以前也试图搞定这个,可惜文件保护功能一直没法突破,估计是使用版里根本没有相应功能代码,后来也只好是个不完全破解版,就放弃了。 该软件不加壳,似乎对防破解很有信心啊。
2008-5-14 20:45
0
雪    币: 216
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
试用版本里面我觉得没有实现代码,应该需要自己添代码实现。
2008-5-14 20:58
0
雪    币: 381
活跃值: (140)
能力值: ( LV13,RANK:330 )
在线值:
发帖
回帖
粉丝
4
原来我没猜错,看来还真的自己添加代码了。可我很懒,每次总是用SnagIt把图截下来保存完事。。。 这软件对图片的傻瓜式操作,对我使用来说是再合适不过了,用他处理些图片很方便。
2008-5-15 10:25
0
雪    币: 1481
活跃值: (874)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
MFC的看着就头痛,学习!!!
2008-5-15 12:18
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
楼主 你用的是哪一版的 我的10.3的代码和你的不同 只有关机窗口处一样?
2008-5-24 10:02
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
MFC的看着就头痛,学习!!!
2008-5-24 22:29
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
根据楼主的指导 试着练习了一下 修改417BB1 搞定了关闭提示 修改42B594 搞定了未注册提示
修改42B347搞定了百分号提示 后来觉得都没有太大价值 抓的图分辨率降低了 发现还有一个好方法 采用复制 然后再粘到画图板上 分辨率不变 但未注册提示又出来了 没法 请楼主再看看 另外
百分号其实不用处理 复制以后的图片上没有
2008-5-25 10:16
0
雪    币: 280
活跃值: (281)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
9
确实抓图的分辨率太低,即使自动滚屏也抓不完(不能横向滚屏),而且速度很慢,完全不可取。

我用的是另一个版本,解决Copy出现未注册提示方法如下:

bp OpenClipboard

返回后到如下代码:
00419476  CALL DWORD PTR DS:[<&USER32.OpenClipboar>; \OpenClipboard
--返回到这!!!

向上看:
004193E1  MOV EDX,ECX
004193E3  CMP EDX,1F4
004193E9  JB SHORT CaiYing.00419429
004193EB  MOV ECX,DWORD PTR DS:[ESI+111EC]
004193F1  JMP SHORT CaiYing.00419408
004193F3  CMP EAX,0C8
004193F8  JB SHORT CaiYing.00419429
004193FA  CMP ECX,0C8
00419400  JB SHORT CaiYing.00419429
00419402  MOV ECX,DWORD PTR DS:[ESI+111F0]
00419408  MOV EDI,DWORD PTR DS:[ECX+10]
0041940B  MOV ESI,DWORD PTR DS:[ECX+C]
0041940E  LEA EDX,DWORD PTR SS:[ESP+14]
00419412  PUSH 0                                   ; /Arg6 = 00000000
00419414  NEG EDX                                  ; |
00419416  SBB EDX,EDX                              ; |
00419418  PUSH EDI                                 ; |Arg5
00419419  AND EDX,DWORD PTR SS:[ESP+20]            ; |
0041941D  PUSH ESI                                 ; |Arg4
0041941E  SUB EAX,ESI                              ; |
00419420  PUSH 0                                   ; |Arg3 = 00000000
00419422  PUSH EAX                                 ; |Arg2
00419423  PUSH EDX                                 ; |Arg1
00419424  CALL CaiYing.?Draw@CxImage@@QAEJPAUHDC__>; \?Draw@CxImage@@QAEJPAUHDC__@@JJJJPAUtagRECT@@@Z
00419429  PUSH 0                                   ; /Arg2 = 00000000
0041942B  PUSH EBP                                 ; |Arg1
0041942C  MOV ECX,EBX                              ; |
0041942E  CALL CaiYing.?CreateFromHBITMAP@CxImage@>; \?CreateFromHBITMAP@CxImage@@QAEXPAUHBITMAP__@@PAUHPALETTE__@@@Z
00419433  LEA ECX,DWORD PTR SS:[ESP+14]
00419437  CALL <JMP.&MFC42.#2450_?Detach@CDC@@QAEP>
0041943C  TEST EBP,EBP
0041943E  JE SHORT CaiYing.00419447
00419440  PUSH EBP                                 ; /hObject
00419441  CALL DWORD PTR DS:[<&GDI32.DeleteObject>>; \DeleteObject
00419447  LEA ECX,DWORD PTR SS:[ESP+14]
0041944B  MOV DWORD PTR SS:[ESP+54],-1
00419453  CALL <JMP.&MFC42.#640_??1CDC@@UAE@XZ>
00419458  MOV ECX,EBX
0041945A  CALL CaiYing.?CopyToHandle@CxImage@@QAEP>
0041945F  MOV ESI,EAX
00419461  CALL <JMP.&MFC42.#1168_?AfxGetModuleStat>
00419466  MOV EAX,DWORD PTR DS:[EAX+4]
00419469  POP EDI
0041946A  POP EBP
0041946B  MOV EAX,DWORD PTR DS:[EAX+20]
0041946E  TEST EAX,EAX
00419470  JE SHORT CaiYing.00419475
00419472  MOV EAX,DWORD PTR DS:[EAX+20]
00419475  PUSH EAX                                 ; /hWnd
00419476  CALL DWORD PTR DS:[<&USER32.OpenClipboar>; \OpenClipboard

根据楼主的提示,明显这句是关键:
00419424   CALL CaiYing.?Draw@CxImage@@QAEJPAUHDC__>; \?Draw@CxImage@@QAEJPAUHDC__@@JJJJPAUtagRECT@@@Z    --未注册提示,跳过即可

看看在哪里可以跳过:
004193E3  CMP EDX,1F4
004193E9  JB SHORT CaiYing.00419429    --改jmp可跳过
原来程序比较图像是否大于500×200像素,大于则显示未注册,小于则不显示。让判断结果总是小于就行了。^_^

感谢楼主写出的文章,可以让我们继续研究下去。
2008-5-26 11:22
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
根据楼上提示 发现10.3版跳转地址要改4193C1和4193C8两处。问题已解决 。
再次感谢 楼上 楼主 楼...... 及。。。。
2008-5-26 13:50
0
游客
登录 | 注册 方可回帖
返回
//