吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 10908|回复: 4
收起左侧

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

[复制链接]
Hmily 发表于 2008-5-15 12:19

【软件介绍】: 彩影是一款图像处理软件,功能比较强大。
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  彩影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

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| Hmily 发表于 2008-5-15 12:19
很好的去限制教程,学习MFC~
hua2616499 发表于 2008-5-15 14:08
头像被屏蔽
ppiaeuiz9 发表于 2008-5-24 05:31
无知无罪 发表于 2013-11-9 23:44
支持一下,谢谢楼主的辛苦。学习一下
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 14:20

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表