• 标 题:精灵画笔之大天使V3.82
  • 作 者:胖大兵  
  • 时 间:2002/08/28 10:50pm
  • 链 接:http://bbs.pediy.com

精灵画笔之大天使---破文

软件名称:精灵画笔之大天使V3.82
发布公司:珠海优软电脑有限公司
软件分类:图形图像
发布日期:2002.07.16
文件大小:14,356K
版本:V3.82
语言:中文简体
应用平台:Win 95/98/NT/2000
软件简介:精灵画笔系列软件拥有功能卓越的各种绘画工具,不仅可以创作出与常规画法一样的作品,最有用的就是可以制作出常规情况下无法实现的作品,比如同时使用油画和水彩画的技巧,在油画中实现透明技巧等。由于随时可以Undo,并且可以使用橡皮擦,创作国画更加得心应手,完全改变国画需要一气呵成的创作方法。优软对自己产品的要求近乎苛求,绝不好大喜功,我们在细节的地方体现对您的服务:风格独特操作方便的用户界面,第一等流畅平滑自然的绘画线条,对压力感应绘图板,立体声卡,扫描仪,数码相机等设备的出色支持,让您充分享受现代化绘画创作的乐趣。精灵画笔之大天使提供了包括铅笔,油画笔,水彩笔,素描碳棒,粉笔,喷绘笔等多种自然效果绘画工具。可提供多达 20 步的回溯返回功能,所以不用再害怕犯错。中英合一版自适应同时支持中文简体,中文繁体,英文操作系统。更新的教学文件格式,制作出的教学文件尺寸更加精简,功能更强大,性能更加稳定,向下兼容 2.0格式。新增对再次创作功能的支持,大作品可以分多次录制完成,摆脱原来制作绘画教学课程要求一气呵成的噩梦。教学录制功能跟多步 Undo/Redo 配合,制作完美教程。自定义画纸尺寸。提供作品缩放,裁减功能。支持视图缩放,帮你精雕细刻,缩微图观察视窗让你随时把握全局。基于优软 Zero GDI 4.0 的用户界面提供风格与众不同的 3D 视窗界面,同时又保留标准视窗界面的便捷操作方式,如鼠标右键菜单,浮动工具窗口等。一如既往支持国际手写绘画笔标准 WINTAB,轻松支持压力感应手写笔,新版本更可以自由设定压感方式风格。特色笔尖风格设定,任意定制需要的笔尖大小,圆率,倾斜角度,边缘模糊度,步长。读入输出支持多种常用图像文件格式画册图片。支持文字,语音注释.新增幻灯制作演示功能 ,不用打印也可以轻松展示作品。
下载网址:http://www.eusoftware.com
注册金额:

pj人:胖大兵[DFCG]
使用工具:侦测壳类:fi2.5,PEid0.8中文版
 反编译:w32dasm黄金版中文版
 动态调试:trw2000 for win98 ,Ollydbg中文版v1.04
 特殊工具:笔和纸   :-)

过程:首先安装软件,安装程序是一个文件,正常安装。
首先执行程序,程序执行后会跳出一个注册窗口,有一个8位的机器码和一个有四段,每段填4个字符的文本框,填写注册号码的。随便填写以后点确定,出现“注册码错误,请重新输入”的对话框!(呵呵,还好有提示)点==》帮助==》关于,里面的信息有序列号:未注册的显示。基本情况就是这些了。
晚上的心情不好,女友叶子今天生日,可是打电话,她不接。呵呵!就拿你开刀了。
先用侦测壳的软件,看是否加壳。使用fi2.5,PEid0.8中文版两种软件发现,没有加密,加壳。哈哈。不会吧,对我这么好。软件是用Microsoft Visual C++ 6.0写的!怎么这两天pj的程序都是用这个写的啊。
没有加密的话,用反编译看看,用w32dasm黄金版中文版加载程序,点串式参考,有很多的字符串,可就是没有提示注册失败和成功的串式,看来程序中出现的对话框是动态生成的。可是我找到了这样的字符串
"PP"
"Prev_File"
"ProductId"
"projectrc"
"Question"
"r"
"RECORD QUALITY"
"REDEYE_PRESS_STYLUS_EXPOSE"
"REDEYE_PRESS_STYLUS_SIZE"
"refresh_screen_event"
"Register"《=====================找到的。
"res\album\album.img"
"res\album\cover.img"
"res\album\downdown.pcx"
"res\album\downup.pcx"
"res\album\leftdown.pcx"
"res\album\leftup.pcx"
双击来到
:00451982 6A00                    push 00000000
:00451984 6800154500              push 00451500
:00451989 50                      push eax

* Possible StringData Ref from Data Obj ->"Register"〈==================来到这里
                                 |
:0045198A 6828B54900              push 0049B528
:0045198F 51                      push ecx

* Reference To: USER32.DialogBoxParamA, Ord:0093h
                                 |
:00451990 FF1510144900            Call dword ptr [00491410]
:00451996 85C0                    test eax, eax
:00451998 56                      push esi
:00451999 740F                    je 004519AA
:0045199B E8E01DFFFF              call 00443780
:004519A0 83C404                  add esp, 00000004
然后继续使用我拿手的Ollydbg中文版v1.04,加载,下断点,发现这个是生成注册对话框的部分,并不是我需要的,也不是比较注册码的地方。
既然不能通过静态编译看到关键的部分,难道就没有办法了吗。当然不是,于是我重新启动计算机,来到win98下面,刚才所有的操作都是在win2000下。
执行trw2000 for win98,然后执行精灵画笔之大天使,填好假的注册码,然后Ctrl+N,呼出trw,现在程序的当前领空并不是精灵画笔,老步骤。bc *,pmodule,点F12一次以后就出现了注册错误的对话框。重新重复上面的步骤,pmodule以后不点f12了。点f10,记下这个时候的代码地址。程序没有几步,就执行到了注册失败的地方!
好现在我们换工具,换回Ollydbg中文版v1.04。
可能有朋友会问,为什么要换呢。可以用trw跟的啊。我也知道可以,但是我一直不喜欢使用trw,要频繁的键入命令行,所有的寄存器都不明显。而Ollydbg中文版v1.04我就比较喜欢了!
Ollydbg中文版v1.04加载程序以后,刚才我们用TRW得到的代码地址就可以用到了!转到刚才的地址,执行程序,填好加注册码,点确定,程序就被Ollydbg中文版v1.04中断了。
中断的地址,当然不是我们在TRW中得到的,我想前移动了十几行,为什么呢。因为在Ollydbg的代码的显示区域的右边,有一些提示,比如
004515B0     . 53         PUSH EBX                        ; ||hWnd
004515B1     . FFD5       CALL EBP                        ; |\GetDlgItem
004515B3     . 8B35 64144>MOV ESI,DWORD PTR DS:[<&USER32.>; |
004515B9     . 50         PUSH EAX                        ; |hWnd
004515BA     . FFD6       CALL ESI                        ; \GetWindowTextA
004515BC     . 8D4424 10  LEA EAX,DWORD PTR SS:[ESP+10]    
004515C0     . 6A 05      PUSH 5                          ; /Count = 5
004515C2     . 50         PUSH EAX                        ; |Buffer
004515C3     . 68 EF03000>PUSH 3EF                        ; |/ControlID = 3EF (1007.)
004515C8     . 53         PUSH EBX                        ; ||hWnd
004515C9     . FFD5       CALL EBP                        ; |\GetDlgItem
004515CB     . 50         PUSH EAX                        ; |hWnd
004515CC     . FFD6       CALL ESI                        ; \GetWindowTextA
004515CE     . 8D7C24 10  LEA EDI,DWORD PTR SS:[ESP+10]
004515D2     . 83C9 FF    OR ECX,FFFFFFFF
004515D5     . 33C0       XOR EAX,EAX
004515D7     . 8D5424 18  LEA EDX,DWORD PTR SS:[ESP+18]
上面代码右边的部分,熟悉编程的人,可以看出,这是冲某个句柄为什么的某个控件上getwindowtexta,这个大家应该很熟悉,是从文本框得到文本。上面还有很多。那我们在输入注册号码的时候是一个四段的信息,所以我们想应该有四个,所以我向上面移动了一些。
从中断的地方,到下面程序依次把输入的信息读入,然后连在一起
我输入的是1234-5678-abcd-eftg
004516A2     . 8BF7       MOV ESI,EDI
004516A4     . 8BE9       MOV EBP,ECX
004516A6     . 8BFA       MOV EDI,EDX
004516A8     . 83C9 FF    OR ECX,FFFFFFFF
004516AB     . F2:AE      REPNE SCAS BYTE PTR ES:[EDI]
004516AD     . 8BCD       MOV ECX,EBP
004516AF     . 4F         DEC EDI
004516B0     . C1E9 02    SHR ECX,2
004516B3     . F3:A5      REP MOVS DWORD PTR ES:[EDI],DWO>
004516B5     . 8BCD       MOV ECX,EBP
004516B7     . 8D8424 A40>LEA EAX,DWORD PTR SS:[ESP+A4]
004516BE     . 83E1 03    AND ECX,3
004516C1     . 50         PUSH EAX
004516C2     . F3:A4      REP MOVS BYTE PTR ES:[EDI],BYTE>
004516C4     . 8D4C24 1C  LEA ECX,DWORD PTR SS:[ESP+1C]<=========到这里我们可以看到寄存器edx中是“12345678abcdeftg”

继续    
004516C9     . E8 12AFFEF>CALL NUPAINT4.0043C5E0〈=============关键call,计算真正注册码!
004516CE     . 83C4 08    ADD ESP,8
004516D1     . 85C0       TEST EAX,EAX
004516D3     . 5D         POP EBP
004516D4     . 75 50      JNZ SHORT NUPAINT4.00451726
004516D6     . A1 5C524A0>MOV EAX,DWORD PTR DS:[4A525C]
004516DB     . 8B35 78144>MOV ESI,DWORD PTR DS:[<&USER32.>

跟进关键CALL
0043C5E0    /$ 83EC 28    SUB ESP,28
0043C5E3    |. 33C0       XOR EAX,EAX
0043C5E5    |. 53         PUSH EBX
0043C5E6    |. 894424 04  MOV DWORD PTR SS:[ESP+4],EAX
0043C5EA    |. 56         PUSH ESI
0043C5EB    |. 894424 0C  MOV DWORD PTR SS:[ESP+C],EAX
0043C5EF    |. 57         PUSH EDI
0043C5F0    |. 8B7C24 3C  MOV EDI,DWORD PTR SS:[ESP+3C]
0043C5F4    |. 894424 14  MOV DWORD PTR SS:[ESP+14],EAX
0043C5F8    |. 894424 18  MOV DWORD PTR SS:[ESP+18],EAX
0043C5FC    |. 83C9 FF    OR ECX,FFFFFFFF
0043C5FF    |. F2:AE      REPNE SCAS BYTE PTR ES:[EDI]
0043C601    |. F7D1       NOT ECX
0043C603    |. 2BF9       SUB EDI,ECX
0043C605    |. 884424 1C  MOV BYTE PTR SS:[ESP+1C],AL
0043C609    |. 8D5424 0C  LEA EDX,DWORD PTR SS:[ESP+C]
0043C60D    |. 8BC1       MOV EAX,ECX
0043C60F    |. 8BF7       MOV ESI,EDI
0043C611    |. 8BFA       MOV EDI,EDX
0043C613    |. C1E9 02    SHR ECX,2
0043C616    |. F3:A5      REP MOVS DWORD PTR ES:[EDI],DWO>
0043C618    |. 8BC8       MOV ECX,EAX
0043C61A    |. 33C0       XOR EAX,EAX
0043C61C    |. 83E1 03    AND ECX,3
0043C61F    |. F3:A4      REP MOVS BYTE PTR ES:[EDI],BYTE>
0043C621    |. 8D7C24 0C  LEA EDI,DWORD PTR SS:[ESP+C]
0043C625    |. 83C9 FF    OR ECX,FFFFFFFF
0043C628    |. F2:AE      REPNE SCAS BYTE PTR ES:[EDI]
0043C62A    |. F7D1       NOT ECX
0043C62C    |. 49         DEC ECX
0043C62D    |. 8BD1       MOV EDX,ECX
0043C62F    |. 83FA 0C    CMP EDX,C
0043C632    |. 7E 05      JLE SHORT NUPAINT4.0043C639
0043C634    |. BA 0C00000>MOV EDX,C
0043C639    |> 33C0       XOR EAX,EAX
0043C63B    |. 85D2       TEST EDX,EDX
0043C63D    |. 7E 1C      JLE SHORT NUPAINT4.0043C65B
0043C63F    |> 33C9       XOR ECX,ECX*
0043C641    |. 8A4C04 0C  MOV CL,BYTE PTR SS:[ESP+EAX+C]*
0043C645    |. 81E1 07000>AND ECX,80000007*
0043C64B    |. 79 05      JNS SHORT NUPAINT4.0043C652*
0043C64D    |. 49         DEC ECX*
0043C64E    |. 83C9 F8    OR ECX,FFFFFFF8*
0043C651    |. 41         INC ECX*
0043C652    |> 884C04 0C  MOV BYTE PTR SS:[ESP+EAX+C],CL*
0043C656    |. 40         INC EAX*
0043C657    |. 3BC2       CMP EAX,EDX*
0043C659    |.^7C E4      JL SHORT NUPAINT4.0043C63F*
0043C65B    |> BF 1CB1490>MOV EDI,NUPAINT4.0049B11C       ;  ASCII "WIZBKI01AAE1G1AL"
0043C660    |. 83C9 FF    OR ECX,FFFFFFFF

在打*号的地方,程序依次取机器码进行运算,最后得到中间号码"WIZBKI01AAE1G1AL",开始以为是真的注册码,后面发现并不是,所以继续跟踪。向下。
0043C675    |. C1E9 02    SHR ECX,2
0043C678    |. F3:A5      REP MOVS DWORD PTR ES:[EDI],DWO>
0043C67A    |. 8BC8       MOV ECX,EAX
0043C67C    |. 33C0       XOR EAX,EAX
0043C67E    |. 83E1 03    AND ECX,3
0043C681    |. 85D2       TEST EDX,EDX
0043C683    |. F3:A4      REP MOVS BYTE PTR ES:[EDI],BYTE>
0043C685    |. 7E 15      JLE SHORT NUPAINT4.0043C69C
0043C687    |> 8A88 20B14>MOV CL,BYTE PTR DS:[EAX+49B120]
0043C68D    |. 8A5C04 0C  MOV BL,BYTE PTR SS:[ESP+EAX+C]
0043C691    |. 02CB       ADD CL,BL
0043C693    |. 884C04 24  MOV BYTE PTR SS:[ESP+EAX+24],CL
0043C697    |. 40         INC EAX
0043C698    |. 3BC2       CMP EAX,EDX
0043C69A    |.^7C EB      JL SHORT NUPAINT4.0043C687
0043C69C    |> 8D5424 20  LEA EDX,DWORD PTR SS:[ESP+20]〈======程序在在这里有所调整,真正的注册码。
到此程序pj.


小结:程序使用明码比较。比较简单。

注册:使用keymake173制作注册j
点f8 制作另类注册j,在0043C6D1中断,中断1次,第一个代码为8A,长度为2,内存模式EAX.