【文章标题】: 彩影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
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!