Hmily 发表于 2008-5-15 12:19

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


【软件介绍】: 彩影是一款图像处理软件,功能比较强大。
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
彩影2008白金版Demo版是真正的试用版,很多功能并没有增加,并且也是不能注册的,但是只要把未注册的图像显示限
制去除了,那么我们可以把处理好的图像用其他好的截图软件截图即可。因为软件的保存功能并没有添加,感兴趣的朋友可
以自行添加代码,增加其保存功能,这样应该也算Demo版的完美破解了。

进入正题,我们主要还是将怎么去找未注册的限制,很多牛人分析软件一下子就拿关键部分来分析,但很少分析他是如
何找到这个关键部位的,可能很多时候我们想要知道的是如何找关键位置的过程,如果直接看关键代码感觉没有什么难度,
自己动手却发现很难找关键位置(菜鸟观点)。
本文涉及内容:如何去除以下几个限制
①启动软件,提示注册对话框(NAG窗口)。
②软件关闭,提示注册对话框(NAG窗口)。
③载入图片,在图像右上角显示一个较大的【未注册版本】图案。
④载入图片,在图像左下角显示一个淡灰色字体较大的百分比数字。
其他说明:在软件中如果有未注册提示的,都是功能没有添加的(如保存图片,如将系列图片保存为GIF),如果你想
需要该功能,那么可以把相应位置的代码全部NOP掉,然后尝试添加自己所想的代码。

下面针对上面几个限制点来分析如何进行去除。
①启动软件,提示注册对话框(NAG窗口)的去除。
要去除该提示窗口,我先下断DestroyWindow比较容易找建立NAG窗口的位置,因为那个对话框应该是模态对话框。
bp DestroyWindow F9运行,断在下面位置:
---------------------------------------------------------------------------------------------------
77D2B19C > B8 63110000   mov   eax, 1163                     ; 断在这里
77D2B1A1BA 0003FE7F   mov   edx, 7FFE0300
77D2B1A6FF12      calldword ptr
77D2B1A8C2 0400   retn4
---------------------------------------------------------------------------------------------------

可能你这个时候就要去除断点,Alt + F9返回程序领空了,但是我们再看下右下堆栈窗口
---------------------------------------------------------------------------------------------------
0012ED9C73D36C14 /CALL 到 DestroyWindow 来自 MFC42.73D36C0E
0012EDA0000C09C4 \hWnd = 000C09C4 (class='Afx:400000:0:10011:0:0',parent=001409D6)
0012EDA4005789AC CaiYing.005789AC
0012EDA877D2AEAB USER32.UpdateWindow
0012EDAC00578978 CaiYing.00578978
---------------------------------------------------------------------------------------------------

class='Afx:400000:0:10011:0:0'从这个可以看出来,并不是NAG窗口的销毁,一般MFC建立的窗口class=#32770。我们
继续F9,发现刚才那个窗口并没有销毁,继续点关闭窗口按钮。断在下面位置
---------------------------------------------------------------------------------------------------
77D2B19C > B8 63110000   mov   eax, 1163      ; 程序断在这里
77D2B1A1BA 0003FE7F   mov   edx, 7FFE0300
77D2B1A6FF12      calldword ptr
77D2B1A8C2 0400   retn4
---------------------------------------------------------------------------------------------------

这个时候我们看右下角的堆栈窗口:
---------------------------------------------------------------------------------------------------
0012EDEC73D36C14 /CALL 到 DestroyWindow 来自 MFC42.73D36C0E
0012EDF0000A0CFA \hWnd = 000A0CFA ('欢迎使用彩影2008!',class='#32770',parent=001409D6)
---------------------------------------------------------------------------------------------------

对了,这次肯定是刚才建立的对话框进行销毁了,第一次断下的可能是其他东西的销毁,我后来又试了下,发现不点关
闭按钮也会断下的,继续F9运行,再点关闭,就断在上面位置了。好了,这个时候可以去除断点,可以Alt + F9返回程序领
空了。返回到下面位置:
---------------------------------------------------------------------------------------------------
00467BFA. E8 61790400call<jmp.&MFC42.#2514_CDialog::DoModal>    ; 这边是建立模态对话框
00467BFF. 53      pushebx                  ; Alt+F9程序返回到这里
00467C00. 8BCE   mov   ecx, esi
00467C02. E8 2F850400call<jmp.&MFC42.#1768_CWnd::CenterWindow>
00467C07. 6A 03   push3
00467C09. 8BCE   mov   ecx, esi
00467C0B. E8 CA7A0400call<jmp.&MFC42.#6215_CWnd::ShowWindow>
00467C10. 8D8C24 7C0100>lea   ecx, dword ptr
00467C17. C78424 C40100>mov   dword ptr , 3
00467C22. E8 357A0400call<jmp.&MFC42.#609_CButton::~CButton>
00467C27. 8D8C24 3C0100>lea   ecx, dword ptr
00467C2E. C68424 C40100>mov   byte ptr , 2
00467C36. E8 217A0400call<jmp.&MFC42.#609_CButton::~CButton>
00467C3B. 8D4C24 70   lea   ecx, dword ptr
00467C3F. C68424 C40100>mov   byte ptr , 1
00467C47. E8 C432FFFFcall0045AF10
00467C4C. 8D4C24 10   lea   ecx, dword ptr
00467C50. C78424 C40100>mov   dword ptr , -1
00467C5B. E8 0E7A0400call<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
00467C6E. 5F      pop   edi
00467C6F. 5E      pop   esi
00467C70. 5D      pop   ebp
00467C71. 64:890D 00000>mov   dword ptr fs:, ecx
00467C78. 5B      pop   ebx
00467C79. 81C4 B8010000 add   esp, 1B8
00467C7F. C2 0400    retn4
---------------------------------------------------------------------------------------------------
这下我们就很容易知道,00467BFA这个地址是建立那个烦人的NAG窗口(注册提示窗口),我们只要NOP掉即可。这样第一个
问题解决,下面我们继续第二个点。

②软件关闭,提示注册对话框(NAG窗口)。
由于这个和第一个限制点相似,所以这里不再仔细介绍,这里注意下断DestroyWindow函数的时候,应该在关闭程序后
再下断,不然程序关闭你就断下了,在程序关闭后,显示NAG窗口时再下断,这样返回的位置就是建立NAG窗口的地方了。
我这里就简单把位置说下:
---------------------------------------------------------------------------------------------------
00417BB1. E8 AA790900call<jmp.&MFC42.#2514_CDialog::DoModal>         ; NAG窗口建立
00417BB6. 66:A1 5487570>mov   ax, word ptr                 ; 返回到这里
00417BBC. B9 40000000mov   ecx, 40
00417BC1. 66:8985 E0FEF>mov   word ptr , ax
00417BC8. 33C0   xor   eax, eax
---------------------------------------------------------------------------------------------------

这样把00417BB1地址的代码NOP掉就可以了。好了,前面2点很简单,本来不想写,但是我初学的时候走了很多弯路,所以
还是想写下来给初学者看看,少走点弯路,很多初学者都是用查找字符串的方法来找位置,但我还是推荐大家根据程序的
运行情况来下断找位置,可以理解程序大概的思路,另外提醒喜欢破解的初学者最好更喜欢编程,这样你分析别人程序的
时候更加能得心应手。继续正题,下面开始说第三点。

③载入图片,在图像右上角显示一个较大的【未注册版本】图案。
找这个位置,其实我也花了点时间找,因为有时候即使看到那个关键点你也不一定能知道这个点就是添加
【未注册版本】图案的。我汇编一点都不好,所以分析算法什么的就比较差了,继续和大家一起努力学习。关于这个点的
解决,我们首先分析下程序执行过程,图片载入后会显示那个图案,那么我们可以在载入图片前,下断CreateFileA试试,
看看程序后面的执行(这里还是想说下多学学编程就可以知道这里可以先试试这个API了,不然也没有经验啊)。
bp CreateFileA 载入图片,断在下面位置:
---------------------------------------------------------------------------------------------------
7C801A28 > 8BFF      mov   edi, edi                   ; 断下位置
7C801A2A55       pushebp
7C801A2B8BEC      mov   ebp, esp
7C801A2DFF75 08   pushdword ptr
7C801A30E8 CFC60000   call7C80E104
7C801A3585C0      testeax, eax
7C801A3774 1E      je   short 7C801A57
7C801A39FF75 20   pushdword ptr
7C801A3CFF75 1C   pushdword ptr
7C801A3FFF75 18   pushdword ptr
7C801A42FF75 14   pushdword ptr
7C801A45FF75 10   pushdword ptr
7C801A48FF75 0C   pushdword ptr
7C801A4BFF70 04   pushdword ptr
7C801A4EE8 9DED0000   callCreateFileW
7C801A535D       pop   ebp
7C801A54C2 1C00   retn1C
---------------------------------------------------------------------------------------------------

去除断点,Alt + F9返回程序领空。
---------------------------------------------------------------------------------------------------
00499030 >/$ 81EC 04010000 sub   esp, 104
00499036 |. 53      pushebx
00499037 |. 55      pushebp
00499038 |. 56      pushesi
00499039 |. 57      pushedi
0049903A |. 8BBC24 1C0100>mov   edi, dword ptr
00499041 |. 8BE9   mov   ebp, ecx
00499043 |. 85FF   testedi, 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
00499053 |. 68 40935600push00569340                   ; /rb
00499058 |. 50      pusheax                      ; |path
00499059 |. FF15 DC5E5200 calldword ptr [<&MSVCRT.fopen>]          ; \fopen
0049905F |. 8BF0   mov   esi, eax                   ; Alt + F9程序返回到这里
00499061 |. 83C4 08    add   esp, 8
00499064 |. 85F6   testesi, 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    retn8
00499077 |> 57      pushedi
00499078 |. 56      pushesi
00499079 |. 8BCD   mov   ecx, ebp
0049907B |. E8 B0040000callCxImage::Decode                ; 这边应该是图像解析
00499080 |. 56      pushesi                      ; /stream
00499081 |. 8AD8   mov   bl, al                  ; |
00499083 |. FF15 E05E5200 calldword ptr [<&MSVCRT.fclose>]         ; \fclose
00499089 |. 83C4 04    add   esp, 4
0049908C |. 84DB   testbl, 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    retn8                     ; 程序返回
---------------------------------------------------------------------------------------------------
下面开始进行单步走了,走着走着,进行消息循环了,死翘翘,看来需要另辟路径,水平太菜。

这时不要灰心,更不要随便去找,我们再想想,发现左下角显示一个淡灰色字体较大的百分比数字。也就是我们要解决
的第④点,一开始我以为一直是显示100%,所以可能是固定的,后来发现是会变化的,有时会显示94%,机会应该来了,这个
点可以找到突破口,这里肯定是格式化字符串了,那么可以下断API sprintf来找,试了下,不是关键位置,所以代码就不贴
了,后来一想,现在一般都是用宽字节了,所以应该下断API swprintf来找,先载入图片,下断bp swprintf,切换到显示
窗口,断在下面位置:
---------------------------------------------------------------------------------------------------
77C0F9C8 > 8BFF      mov   edi, edi         ; 断在这里
77C0F9CA55       pushebp
77C0F9CB8BEC      mov   ebp, esp
77C0F9CD83EC 20   sub   esp, 20
77C0F9D08B45 08   mov   eax, dword ptr
77C0F9D38945 E8   mov   dword ptr , eax
77C0F9D68945 E0   mov   dword ptr , eax
77C0F9D956       pushesi
77C0F9DA8D45 10   lea   eax, dword ptr
77C0F9DD50       pusheax
77C0F9DEFF75 0C   pushdword ptr
77C0F9E18D45 E0   lea   eax, dword ptr
77C0F9E450       pusheax
77C0F9E5C745 EC 4200000>mov   dword ptr , 42
77C0F9ECC745 E4 FFFFFF7>mov   dword ptr , 7FFFFFFF
77C0F9F3E8 DC370000   call77C131D4
77C0F9F883C4 0C   add   esp, 0C
77C0F9FBFF4D E4   dec   dword ptr
77C0F9FE8BF0      mov   esi, eax
77C0FA0078 0B      js   short 77C0FA0D
77C0FA028B45 E0   mov   eax, dword ptr
77C0FA05C600 00   mov   byte ptr , 0
77C0FA08FF45 E0   inc   dword ptr
77C0FA0BEB 0D      jmp   short 77C0FA1A
77C0FA0D8D45 E0   lea   eax, dword ptr
77C0FA1050       pusheax
77C0FA116A 00      push0
77C0FA13E8 45F2FFFF   call_flsbuf
77C0FA1859       pop   ecx
77C0FA1959       pop   ecx
77C0FA1AFF4D E4   dec   dword ptr
77C0FA1D78 08      js   short 77C0FA27
77C0FA1F8B45 E0   mov   eax, dword ptr
77C0FA22C600 00   mov   byte ptr , 0
77C0FA25EB 0D      jmp   short 77C0FA34
77C0FA278D45 E0   lea   eax, dword ptr
77C0FA2A50       pusheax
77C0FA2B6A 00      push0
77C0FA2DE8 2BF2FFFF   call_flsbuf
77C0FA3259       pop   ecx
77C0FA3359       pop   ecx
77C0FA348BC6      mov   eax, esi
77C0FA365E       pop   esi
77C0FA37C9       leave
77C0FA38C3       retn
---------------------------------------------------------------------------------------------------

再看下堆栈窗口:
---------------------------------------------------------------------------------------------------
0012F69C0042B509 /CALL 到 swprintf 来自 CaiYing_.0042B503
0012F6A00012F98C |wstr = 0012F98C
0012F6A40056A648 |format = "%3.0f%%"
0012F6A800000000 \<%3.0f> = 0.0
0012F6AC40590000
0012F6B073D4497A MFC42.#4874_CView::OnPaint
---------------------------------------------------------------------------------------------------
应该肯定是这里了,而且是在OnPaint函数下,我对MFC比较熟悉,所以肯定就是这里了。去除断点,Alt + F9返回到下面

==========================================================================================
上面还有很多代码,不贴了,感兴趣的自己下载个分析分析
==========================================================================================
0042B4F3. 8D8424 E40200>lea   eax, dword ptr          ; |
0042B4FA. DD1C24    fstpqword ptr                ; |
0042B4FD. 68 48A65600push0056A648                   ; |%
0042B502. 50      pusheax                     ; |wstr
0042B503. FF15 905E5200 calldword ptr [<&MSVCRT.swprintf>]      ; \swprintf
0042B509. 8B4C24 4C   mov   ecx, dword ptr          ; Alt + F9程序返回在这里
0042B50D. 83C4 10    add   esp, 10
0042B510   E9 E6030000jmp   0042B8FB                   ; 这边就可以把下面的全部跳过了。
0042B515   90      nop
0042B516   90      nop
0042B517   90      nop
0042B518. 85C0   testeax, eax
0042B51A. 74 04   je   short 0042B520
0042B51C. 894424 40   mov   dword ptr , eax
0042B520> 8D9424 DC0200>lea   edx, dword ptr
0042B527. 52      pushedx                     ; /s
0042B528. FF15 945E5200 calldword ptr [<&MSVCRT.wcslen>] ; \计算字符长度,我们下断这个函数也是可以找到的
0042B52E. D94424 30   fld   dword ptr
0042B532. 8B4C24 18   mov   ecx, dword ptr
0042B536. 83C4 04    add   esp, 4
0042B539. D95C24 50   fstpdword ptr
0042B53D. D94424 48   fld   dword ptr
0042B541. D95C24 54   fstpdword ptr
0042B545. 85C9   testecx, ecx
0042B547. C74424 58 000>mov   dword ptr , 0
0042B54F. C74424 5C 000>mov   dword ptr , 0
0042B557. 74 05   je   short 0042B55E
0042B559. 8B51 04    mov   edx, dword ptr
0042B55C. EB 02   jmp   short 0042B560
0042B55E> 33D2   xor   edx, edx
0042B560> 8D4C24 24   lea   ecx, dword ptr
0042B564. 52      pushedx
0042B565. F7D9   neg   ecx
0042B567. 1BC9   sbb   ecx, ecx
0042B569. 8D5424 54   lea   edx, dword ptr
0042B56D. 234C24 38   and   ecx, dword ptr
0042B571. 6A 00   push0
0042B573. 52      pushedx
0042B574. 51      pushecx
0042B575. 8B4C24 4C   mov   ecx, dword ptr
0042B579. 50      pusheax
0042B57A. 8D8424 F00200>lea   eax, dword ptr
0042B581. 50      pusheax
0042B582. 51      pushecx
0042B583. E8 463E0800call<jmp.&gdiplus.GdipDrawString>      ; 这边就是描绘字符串了,跳过这里即可
0042B588. 85C0   testeax, eax
0042B58A. 74 04   je   short 0042B590
0042B58C. 894424 40   mov   dword ptr , eax
0042B590> 8B9424 8C0000>mov   edx, dword ptr
0042B597. 68 FFFFFF80push80FFFFFF
0042B59C. 52      pushedx
0042B59D. E8 443E0800call<jmp.&gdiplus.GdipSetSolidFillColor>
0042B5A2. 85C0   testeax, eax
0042B5A4. 74 07   je   short 0042B5AD
0042B5A6. 898424 900000>mov   dword ptr , eax
0042B5AD> 8B8C24 8C0000>mov   ecx, dword ptr
0042B5B4. 8D4424 10   lea   eax, dword ptr
0042B5B8. 50      pusheax
0042B5B9. 51      pushecx
0042B5BA. C74424 18 000>mov   dword ptr , 0
0042B5C2. E8 193E0800call<jmp.&gdiplus.GdipCloneBrush>
0042B5C7. 85C0   testeax, eax
0042B5C9. 74 07   je   short 0042B5D2
0042B5CB. 898424 900000>mov   dword ptr , eax
0042B5D2> 6A 0C   push0C
0042B5D4. E8 013E0800call<jmp.&gdiplus.GdipAlloc>
0042B5D9. 85C0   testeax, eax
0042B5DB. 74 1D   je   short 0042B5FA
0042B5DD. 8B8C24 900000>mov   ecx, dword ptr
0042B5E4. 8B5424 10   mov   edx, dword ptr
0042B5E8. C700 40AD5200 mov   dword ptr , 0052AD40
0042B5EE. 8948 08    mov   dword ptr , ecx
0042B5F1. 8950 04    mov   dword ptr , edx
0042B5F4. 894424 14   mov   dword ptr , eax
0042B5F8. EB 12   jmp   short 0042B60C
0042B5FA> 8B5424 10   mov   edx, dword ptr
0042B5FE. C74424 14 000>mov   dword ptr , 0
0042B606. 52      pushedx
0042B607. E8 C83D0800call<jmp.&gdiplus.GdipDeleteBrush>
0042B60C> 8D8424 DC0200>lea   eax, dword ptr
0042B613. 50      pusheax                     ; /s
0042B614. FF15 945E5200 calldword ptr [<&MSVCRT.wcslen>]         ; \wcslen
0042B61A. D94424 74   fld   dword ptr
0042B61E. 8B4C24 18   mov   ecx, dword ptr
0042B622. 83C4 04    add   esp, 4
0042B625. D95C24 50   fstpdword ptr
0042B629. D94424 18   fld   dword ptr
0042B62D. D95C24 54   fstpdword ptr
0042B631. 85C9   testecx, ecx
0042B633. C74424 58 000>mov   dword ptr , 0
0042B63B. C74424 5C 000>mov   dword ptr , 0
0042B643. 74 05   je   short 0042B64A
0042B645. 8B51 04    mov   edx, dword ptr
0042B648. EB 02   jmp   short 0042B64C
0042B64A> 33D2   xor   edx, edx
0042B64C> 8D4C24 24   lea   ecx, dword ptr
0042B650. 52      pushedx
0042B651. F7D9   neg   ecx
0042B653. 1BC9   sbb   ecx, ecx
0042B655. 8D5424 54   lea   edx, dword ptr
0042B659. 234C24 38   and   ecx, dword ptr
0042B65D. 6A 00   push0
0042B65F. 52      pushedx
0042B660. 51      pushecx
0042B661. 8B4C24 4C   mov   ecx, dword ptr
0042B665. 50      pusheax
0042B666. 8D8424 F00200>lea   eax, dword ptr
0042B66D. 50      pusheax
0042B66E. 51      pushecx
0042B66F. E8 5A3D0800call<jmp.&gdiplus.GdipDrawString> ; 这边还是描绘,那个百分数是描绘2次,叠加的效果
0042B674. 85C0   testeax, eax
0042B676. 74 04   je   short 0042B67C
0042B678. 894424 40   mov   dword ptr , eax
0042B67C> 8B4C24 44   mov   ecx, dword ptr
0042B680. 8B41 0C    mov   eax, dword ptr
0042B683. 8B49 10    mov   ecx, dword ptr
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
0042B6B4. 8B48 0C    mov   ecx, dword ptr
0042B6B7. 8B50 10    mov   edx, dword ptr
0042B6BA. 8B8424 940000>mov   eax, dword ptr
0042B6C1. 894C24 70   mov   dword ptr , ecx
0042B6C5. 2BF8   sub   edi, eax
0042B6C7. 8B8424 9C0000>mov   eax, dword ptr
0042B6CE. 03F8   add   edi, eax
0042B6D0. 895424 2C   mov   dword ptr , edx
0042B6D4. 897C24 18   mov   dword ptr , edi
0042B6D8. 33FF   xor   edi, edi
0042B6DA. DB4424 18   filddword ptr
0042B6DE. DB86 F4000000 filddword ptr
0042B6E4. 894C24 18   mov   dword ptr , ecx
0042B6E8. 897C24 1C   mov   dword ptr , edi
0042B6EC. D95C24 14   fstpdword ptr
0042B6F0. DF6C24 18   fildqword ptr
0042B6F4. 895424 18   mov   dword ptr , edx
0042B6F8. 897C24 1C   mov   dword ptr , edi
0042B6FC. D84C24 20   fmuldword ptr
0042B700. D8E9   fsubrst, st(1)
0042B702. DF6C24 18   fildqword ptr
0042B706. D84C24 20   fmuldword ptr
0042B70A. D86C24 14   fsubrdword ptr
0042B70E. DED9   fcompp
0042B710. DFE0   fstswax
0042B712. F6C4 41    testah, 41
0042B715. 75 14   jnz   short 0042B72B
0042B717. 894C24 18   mov   dword ptr , ecx
0042B71B. 897C24 1C   mov   dword ptr , edi
0042B71F. DF6C24 18   fildqword ptr
0042B723. D84C24 20   fmuldword ptr
0042B727. DEE9   fsubpst(1), st
0042B729. EB 16   jmp   short 0042B741
0042B72B> DDD8   fstpst
0042B72D. 895424 18   mov   dword ptr , edx
0042B731. 897C24 1C   mov   dword ptr , edi
0042B735. DF6C24 18   fildqword ptr
0042B739. D84C24 20   fmuldword ptr
0042B73D. D86C24 14   fsubrdword ptr
0042B741> E8 0A4F0800call<jmp.&MSVCRT._ftol>
0042B746. 8B5424 70   mov   edx, dword ptr
0042B74A. C74424 1C 000>mov   dword ptr , 0
0042B752. 895424 18   mov   dword ptr , edx
0042B756. 894424 50   mov   dword ptr , eax
0042B75A. DF6C24 18   fildqword ptr
0042B75E. D84C24 20   fmuldword ptr
0042B762. DA4424 50   fiadddword ptr
0042B766. E8 E54E0800call<jmp.&MSVCRT._ftol>
0042B76B. 8BB6 F0000000 mov   esi, dword ptr
0042B771. 8BF8   mov   edi, eax
0042B773. 8B4424 7C   mov   eax, dword ptr
0042B777. 3BC6   cmp   eax, esi
0042B779. 7E 02   jle   short 0042B77D
0042B77B. 8BF0   mov   esi, eax
0042B77D> 8B4424 2C   mov   eax, dword ptr
0042B781. C74424 1C 000>mov   dword ptr , 0
0042B789. 894424 18   mov   dword ptr , eax
0042B78D. 897424 54   mov   dword ptr , esi
0042B791. DF6C24 18   fildqword ptr
0042B795. D84C24 20   fmuldword ptr
0042B799. DA4424 54   fiadddword ptr
0042B79D. E8 AE4E0800call<jmp.&MSVCRT._ftol>
0042B7A2. 85DB   testebx, 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
0042B7AD> 2BC6   sub   eax, esi
0042B7AF. 6A 00   push0
0042B7B1. 50      pusheax
0042B7B2. 8B4424 58   mov   eax, dword ptr
0042B7B6. 2BF8   sub   edi, eax
0042B7B8. 57      pushedi
0042B7B9. 56      pushesi
0042B7BA. 50      pusheax
0042B7BB. 51      pushecx
0042B7BC. 8B8D EC110100 mov   ecx, dword ptr
0042B7C2. E9 2B010000jmp   0042B8F2
0042B7C7> 3D C8000000cmp   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
0042B7E4. 8B48 0C    mov   ecx, dword ptr
0042B7E7. 8B50 10    mov   edx, dword ptr
0042B7EA. 8B8424 940000>mov   eax, dword ptr
0042B7F1. 894C24 70   mov   dword ptr , ecx
0042B7F5. 2BF8   sub   edi, eax
0042B7F7. 8B8424 9C0000>mov   eax, dword ptr
0042B7FE. 03F8   add   edi, eax
0042B800. 895424 2C   mov   dword ptr , edx
0042B804. 897C24 18   mov   dword ptr , edi
0042B808. 33FF   xor   edi, edi
0042B80A. DB4424 18   filddword ptr
0042B80E. DB86 F4000000 filddword ptr
0042B814. 894C24 18   mov   dword ptr , ecx
0042B818. 897C24 1C   mov   dword ptr , edi
0042B81C. D95C24 14   fstpdword ptr
0042B820. DF6C24 18   fildqword ptr
0042B824. 895424 18   mov   dword ptr , edx
0042B828. 897C24 1C   mov   dword ptr , edi
0042B82C. D84C24 20   fmuldword ptr
0042B830. D8E9   fsubrst, st(1)
0042B832. DF6C24 18   fildqword ptr
0042B836. D84C24 20   fmuldword ptr
0042B83A. D86C24 14   fsubrdword ptr
0042B83E. DED9   fcompp
0042B840. DFE0   fstswax
0042B842. F6C4 41    testah, 41
0042B845. 75 14   jnz   short 0042B85B
0042B847. 894C24 18   mov   dword ptr , ecx
0042B84B. 897C24 1C   mov   dword ptr , edi
0042B84F. DF6C24 18   fildqword ptr
0042B853. D84C24 20   fmuldword ptr
0042B857. DEE9   fsubpst(1), st
0042B859. EB 16   jmp   short 0042B871
0042B85B> DDD8   fstpst
0042B85D. 895424 18   mov   dword ptr , edx
0042B861. 897C24 1C   mov   dword ptr , edi
0042B865. DF6C24 18   fildqword ptr
0042B869. D84C24 20   fmuldword ptr
0042B86D. D86C24 14   fsubrdword ptr
0042B871> E8 DA4D0800call<jmp.&MSVCRT._ftol>
0042B876. 8B4C24 70   mov   ecx, dword ptr
0042B87A. C74424 1C 000>mov   dword ptr , 0
0042B882. 894C24 18   mov   dword ptr , ecx
0042B886. 894424 50   mov   dword ptr , eax
0042B88A. DF6C24 18   fildqword ptr
0042B88E. D84C24 20   fmuldword ptr
0042B892. DA4424 50   fiadddword ptr
0042B896. E8 B54D0800call<jmp.&MSVCRT._ftol>
0042B89B. 8BB6 F0000000 mov   esi, dword ptr
0042B8A1. 8BF8   mov   edi, eax
0042B8A3. 8B4424 7C   mov   eax, dword ptr
0042B8A7. 3BC6   cmp   eax, esi
0042B8A9. 7E 02   jle   short 0042B8AD
0042B8AB. 8BF0   mov   esi, eax
0042B8AD> 8B5424 2C   mov   edx, dword ptr
0042B8B1. C74424 7C 000>mov   dword ptr , 0
0042B8B9. 895424 78   mov   dword ptr , edx
0042B8BD. 897424 54   mov   dword ptr , esi
0042B8C1. DF6C24 78   fildqword ptr
0042B8C5. D84C24 20   fmuldword ptr
0042B8C9. DA4424 54   fiadddword ptr
0042B8CD. E8 7E4D0800call<jmp.&MSVCRT._ftol>
0042B8D2. 85DB   testebx, 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
0042B8DD> 2BC6   sub   eax, esi
0042B8DF. 6A 00   push0
0042B8E1. 50      pusheax
0042B8E2. 8B4424 58   mov   eax, dword ptr
0042B8E6. 2BF8   sub   edi, eax
0042B8E8. 57      pushedi
0042B8E9. 56      pushesi
0042B8EA. 50      pusheax
0042B8EB. 51      pushecx
0042B8EC. 8B8D F0110100 mov   ecx, dword ptr
0042B8F2> E8 396E0600callCxImage::Draw                ; 这边可以肯定是未注册大图案的描绘了
0042B8F7> 85DB   testebx, ebx                   ; 因为只有在最后画才会显示在最上面啊
0042B8F9. 74 09   je   short 0042B904
0042B8FB. 8B03   mov   eax, dword ptr              ; 上面的JMP到这里,一定要到这里
0042B8FD. 6A 01   push1
0042B8FF. 8BCB   mov   ecx, ebx
0042B901. FF50 04    calldword ptr             ; 这个调用可能很有用
0042B904> 8B85 F4110100 mov   eax, dword ptr           ; 不要直接跳到这里
0042B90A. 5B      pop   ebx
0042B90B. 83F8 01    cmp   eax, 1
0042B90E. 75 63   jnz   short 0042B973
0042B910. 8B8D 9C110100 mov   ecx, dword ptr
0042B916. 85C9   testecx, ecx
0042B918. 75 40   jnz   short 0042B95A
0042B91A. 68 A8010000push1A8
0042B91F. E8 303F0800call<jmp.&MFC42.#823_operator new>
0042B924. 83C4 04    add   esp, 4
0042B927. 894424 14   mov   dword ptr , eax
0042B92B. 85C0   testeax, eax
0042B92D. C68424 E00400>mov   byte ptr , 0D
0042B935. 74 19   je   short 0042B950
0042B937. 8B4D 54    mov   ecx, dword ptr
0042B93A. 6A 01   push1
0042B93C. 6A 01   push1
0042B93E. 6A 01   push1
0042B940. 51      pushecx
0042B941. 8BC8   mov   ecx, eax
0042B943. E8 C85F0600callCxImage::CxImage
0042B948. 8985 9C110100 mov   dword ptr , eax
0042B94E. EB 19   jmp   short 0042B969
0042B950> 33C0   xor   eax, eax
0042B952. 8985 9C110100 mov   dword ptr , eax
0042B958. EB 0F   jmp   short 0042B969
0042B95A> 8B55 54    mov   edx, dword ptr
0042B95D. 6A 01   push1
0042B95F. 6A 01   push1
0042B961. 6A 01   push1
0042B963. 52      pushedx
0042B964. E8 E75F0600callCxImage::Copy
0042B969> C785 F4110100>mov   dword ptr , 0
0042B973> 8B8424 880000>mov   eax, dword ptr
0042B97A. C78424 840000>mov   dword ptr , 0052AD40
0042B985. 50      pusheax
0042B986. E8 493A0800call<jmp.&gdiplus.GdipDeleteBrush>      ; 下面开始就是一些GDI的画刷等的释放
0042B98B. 8B4C24 30   mov   ecx, dword ptr
0042B98F. 51      pushecx
0042B990. E8 333A0800call<jmp.&gdiplus.GdipDeleteFont>
0042B995. 8B9424 B00000>mov   edx, dword ptr
0042B99C. 52      pushedx
0042B99D. E8 203A0800call<jmp.&gdiplus.GdipDeleteFontFamily>
0042B9A2. 8B4424 38   mov   eax, dword ptr
0042B9A6. 50      pusheax
0042B9A7. E8 103A0800call<jmp.&gdiplus.GdipDeleteGraphics>
0042B9AC> 8B8C24 D80400>mov   ecx, dword ptr
0042B9B3. 5F      pop   edi
0042B9B4. 5E      pop   esi
0042B9B5. 5D      pop   ebp
0042B9B6. 64:890D 00000>mov   dword ptr fs:, ecx
0042B9BD. 81C4 D8040000 add   esp, 4D8
0042B9C3. C2 0400    retn4
=============================================================================================
说下,为什么一定要跳到0042B8FB这个地址,我们可以看到在call CxImage::Draw,判断了返回值,所以调用返回真
的画,会执行下面的一个Call,应该有用,如果跳过这几段小代码,直接到0042B904这个地址,我们会发现什么都不描
绘了。这边可能就是检查下未注册图案是否被描绘了,否则就把显示的全部去除了。

好了,到这里③④的限制全部去除了,虽然没有保存功能,但可以把处理好的图片用SnagIt捕获就可以了,而且效果还
不错的。就到这里,感谢您有这个耐心把我的菜鸟文章看完!!!

--------------------------------------------------------------------------------
【经验总结】
分析程序根据程序的运行情况来进行调试,不要漫无目的的进行随便搜索,虽然最后可能找到位置,但是花的时间很多,而
且不巧的话会自信心狂受打击。

--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                            2008年05月14日 19:55:52

Hmily 发表于 2008-5-15 12:19

很好的去限制教程,学习MFC~

hua2616499 发表于 2008-5-15 14:08

太强悍了。。。学习下。 。。。。

ppiaeuiz9 发表于 2008-5-24 05:31

无知无罪 发表于 2013-11-9 23:44

支持一下,谢谢楼主的辛苦。学习一下
页: [1]
查看完整版本: 彩影2008白金版分析,不完全破解(去除试用显示限制)