• 标 题:图像处理软件XFader的简要分析 
  • 作 者:ShenGe
  • 时 间:2003/04/09 07:31am
  • 链 接:http://bbs.pediy.com

破解软件:XFader
下载地址:www.21hh.net
破解难度:易
破解工具:TRW1.22
软件说明:方便的图像素材生成工具,可以从任意一个位图创建无穷多的纹理素材。只需执行XFader,打开一个
bitmap或jpeg文件然后按“渐变”按钮即可,注册用户可以及时预览效果。它本身并不具备太多图片的编修功
能,它对于制作不同风格的网页或是制作布景主题是蛮需要的。赶快试试吧,绝对让你大吃一惊。

任意输入用户名ShenGe和注册码12345678,下BPX HMEMCPY中断,点Register,程序被中断,按7下F12再按F10来到以下代码:
0167:00470BDD  LEA      EDX,[EBP-08]
0167:00470BE0  MOV      EAX,[0049EB50]
0167:00470BE5  MOV      EAX,[EAX+01F4]
0167:00470BEB  CALL     0041D25C
0167:00470BF0  MOV      EAX,[EBP-08]               <---程序中断于此,取输入的注册码到EAX中
0167:00470BF3  PUSH     EAX
0167:00470BF4  LEA      EDX,[EBP-0C]
0167:00470BF7  MOV      EAX,[0049EB50]
0167:00470BFC  MOV      EAX,[EAX+01F0]
0167:00470C02  CALL     0041D25C                  
0167:00470C07  MOV      EDX,[EBP-0C]               <---取输入的用户名到EDX中
0167:00470C0A  MOV      EAX,EBX
0167:00470C0C  POP      ECX                        <---ECX中为输入的注册码
0167:00470C0D  CALL     00470530                   <---关键的Call,跟进
0167:00470C12  TEST     AL,AL
0167:00470C14  JZ       NEAR 00470C9D              <---关键跳转,要爆破改为JNZ即可
0167:00470C1A  LEA      EDX,[EBP-08]
0167:00470C1D  MOV      EAX,[0049EB50]
0167:00470C22  MOV      EAX,[EAX+01F4]
0167:00470C28  CALL     0041D25C
0167:00470C2D  MOV      EAX,[EBP-08]
0167:00470C30  PUSH     EAX
跟进上面的那个Call,来到如下代码处:
0167:00470530  PUSH     EBP
0167:00470531  MOV      EBP,ESP
0167:00470533  PUSH     ECX
0167:00470534  MOV      ECX,04
0167:00470539  PUSH     BYTE +00
0167:0047053B  PUSH     BYTE +00
0167:0047053D  DEC      ECX
0167:0047053E  JNZ      00470539
。。。。。。。
0167:004705B3  LEA      ECX,[EBP-24]
0167:004705B6  MOV      EDX,ESI
0167:004705B8  MOV      EAX,[EBX+4C]
0167:004705BB  MOV      EDI,[EAX]
0167:004705BD  CALL     NEAR [EDI+0C]
0167:004705C0  MOV      EDX,[EBP-24]
0167:004705C3  MOV      ECX,08
0167:004705C8  MOV      EAX,EBX
0167:004705CA  CALL     00470674                    <---此Call将我们输入的用户名进行转换:小写全部转换成大写;
0167:004705CF  MOV      ECX,[EBP-20]                    若用户名不足8位,则不足部分依次从输入的用户名的第1位起
0167:004705D2  MOV      EDX,ESI                         取字符补齐,如我输入的为ShenGe,则转换后为SHENGESH
0167:004705D4  MOV      EAX,[EBX+4C]
0167:004705D7  MOV      EDI,[EAX]
0167:004705D9  CALL     NEAR [EDI+20]
0167:004705DC  INC      ESI
0167:004705DD  DEC      DWORD [EBP-1C]
0167:004705E0  JNZ      004705AD
0167:004705E2  MOV      EDX,[EBP-10]
0167:004705E5  MOV      EAX,[EBX+4C]
0167:004705E8  MOV      ECX,[EAX]
0167:004705EA  CALL     NEAR [ECX+50]
0167:004705ED  TEST     EAX,EAX
0167:004705EF  JNL      0047062B
0167:004705F1  MOV      EAX,[EBP-10]
0167:004705F4  CALL     00403BE4
0167:004705F9  TEST     EAX,EAX
0167:004705FB  JNG      0047062B
0167:004705FD  MOV      EAX,[EBP-14]
0167:00470600  CALL     00403BE4
0167:00470605  TEST     EAX,EAX
0167:00470607  JNG      0047062B
0167:00470609  LEA      EAX,[EBP-18]
0167:0047060C  PUSH     EAX
0167:0047060D  MOV      ECX,[EBP-10]                 <---D ECX可看到转换后的用户名
0167:00470610  MOV      EDX,[EBP-14]                 <---D EDX可看到固定字符串“PXF12OKT”
0167:00470613  MOV      EAX,EBX
0167:00470615  CALL     004707C0                     <---计算注册码的Call,跟进
0167:0047061A  MOV      EAX,[EBP-18]                 <--- D EAX可看到正确的注册码
0167:0047061D  MOV      EDX,[EBP-08]                 <--- D EDX可看到我们输的假的注册码  
0167:00470620  CALL     00403CF4                     <--- 进行比较的Call
0167:00470625  JNZ      0047062B                     <---关键跳转
0167:00470627  MOV      BYTE [EBP-09],01
0167:0047062B  XOR      EAX,EAX
0167:0047062D  POP      EDX
0167:0047062E  POP      ECX
0167:0047062F  POP      ECX
0167:00470630  MOV      [FS:EAX],EDX
0167:00470633  PUSH     DWORD 00470667
0167:00470638  LEA      EAX,[EBP-24]
0167:0047063B  MOV      EDX,02
0167:00470640  CALL     0040398C
0167:00470645  LEA      EAX,[EBP-18]
0167:00470648  MOV      EDX,03
0167:0047064D  CALL     0040398C
0167:00470652  LEA      EAX,[EBP-08]
0167:00470655  MOV      EDX,02
0167:0047065A  CALL     0040398C
0167:0047065F  RET  
由上可看到,只要在 0167:0047061A 处下D EAX即可看到正确的注册码,但我们的目的是找出算法,跟进上面的那个Call可看到以下代码:
0167:004707C0  PUSH     EBP
0167:004707C1  MOV      EBP,ESP
0167:004707C3  ADD      ESP,FFFFFEB4
0167:004707C9  PUSH     EBX
0167:004707CA  PUSH     ESI
0167:004707CB  PUSH     EDI
0167:004707CC  XOR      EBX,EBX
0167:004707CE  MOV      [EBP+FFFFFED8],EBX
0167:004707D4  MOV      [EBP+FFFFFED4],EBX
0167:004707DA  MOV      [EBP+FFFFFED0],EBX
。。。。。。。
0167:00470838  PUSH     EAX
0167:00470839  MOV      ECX,08
0167:0047083E  MOV      EDX,01
0167:00470843  MOV      EAX,[EBP-04]
0167:00470846  CALL     00403DE8
0167:0047084B  PUSH     DWORD [EBP+FFFFFED4]
0167:00470851  LEA      EAX,[EBP+FFFFFED0]
0167:00470857  PUSH     EAX
0167:00470858  MOV      ECX,08
0167:0047085D  MOV      EDX,01
0167:00470862  MOV      EAX,[EBP-08]
0167:00470865  CALL     00403DE8
0167:0047086A  PUSH     DWORD [EBP+FFFFFED0]       <---D *EBP+FFFFFED0可看到为转换后的用户名
0167:00470870  PUSH     DWORD 004709DC             <---D 004709DC可看到########
0167:00470875  LEA      EAX,[EBP+FFFFFED8]
0167:0047087B  MOV      EDX,03
0167:00470880  CALL     00403CA4                   <---这个Call将固定串“PXF12OKT”与转换后的用户名及"########"合并后存入[EBP+FFFFFED8]中
0167:00470885  MOV      EDX,[EBP+FFFFFED8]
0167:0047088B  LEA      EAX,[EBP+FFFFFEDC]
0167:00470891  MOV      ECX,FF
0167:00470896  CALL     00403BC0                  
0167:0047089B  LEA      EDX,[EBP+FFFFFEDC]
0167:004708A1  LEA      EAX,[EBP-21]
0167:004708A4  MOV      CL,18
0167:004708A6  CALL     004029AC
0167:004708AB  PUSH     BYTE +03                   <---置入口参数                  -----------|    
0167:004708AD  PUSH     BYTE +05                   <---置入口参数                             |
0167:004708AF  PUSH     BYTE +07                   <---置入口参数                             |
0167:004708B1  LEA      EDX,[EBP-21]                                                          |
0167:004708B4  MOV      CL,01                                                                 |
0167:004708B6  MOV      EAX,EBX                                                               |
0167:004708B8  CALL     00470784                   <---此Call是对上面合并后的字符串进行处理   |
0167:004708BD  MOV      [EBP-10],AL                <---运算后的结果存入[EBP-10]中  -----------|
0167:004708C0  PUSH     BYTE +04         -----------------------|
0167:004708C2  PUSH     BYTE +0A                                |                
0167:004708C4  PUSH     BYTE +0C                                |
0167:004708C6  LEA      EDX,[EBP-21]                            |
0167:004708C9  MOV      CL,02                                   |  
0167:004708CB  MOV      EAX,EBX                                 |    
0167:004708CD  CALL     00470784                                |
0167:004708D2  MOV      [EBP-0F],AL      -----------------------|                                  
0167:004708D5  PUSH     BYTE +0B                                |
0167:004708D7  PUSH     BYTE +0D                                |    
0167:004708D9  PUSH     BYTE +0F                                |
0167:004708DB  LEA      EDX,[EBP-21]                            |    
0167:004708DE  MOV      CL,09                                   |
0167:004708E0  MOV      EAX,EBX                                 |
0167:004708E2  CALL     00470784                                |
0167:004708E7  MOV      [EBP-0E],AL       ----------------------|
0167:004708EA  PUSH     BYTE +08                                |
0167:004708EC  PUSH     BYTE +0E                                |
0167:004708EE  PUSH     BYTE +10                                |
0167:004708F0  LEA      EDX,[EBP-21]                            |
0167:004708F3  MOV      CL,06                                   |
0167:004708F5  MOV      EAX,EBX                                 |
0167:004708F7  CALL     00470784                                |
0167:004708FC  MOV      [EBP-0D],AL       ----------------------|
0167:004708FF  PUSH     BYTE +10                                |
0167:00470901  PUSH     BYTE +02                                |
0167:00470903  PUSH     BYTE +0F                                |
0167:00470905  LEA      EDX,[EBP-21]                            |
0167:00470908  MOV      CL,01                                   |
0167:0047090A  MOV      EAX,EBX                                 |
0167:0047090C  CALL     00470784                                |
0167:00470911  MOV      [EBP-0C],AL       ----------------------|
0167:00470914  PUSH     BYTE +0E                                |
0167:00470916  PUSH     BYTE +04                                |
0167:00470918  PUSH     BYTE +0D                                |  
0167:0047091A  LEA      EDX,[EBP-21]                            |
0167:0047091D  MOV      CL,03                                   |
0167:0047091F  MOV      EAX,EBX                                 |
0167:00470921  CALL     00470784                                |
0167:00470926  MOV      [EBP-0B],AL       ----------------------|          
0167:00470929  PUSH     BYTE +0C                                |
0167:0047092B  PUSH     BYTE +06                                |
0167:0047092D  PUSH     BYTE +0B                                |
0167:0047092F  LEA      EDX,[EBP-21]                            |
0167:00470932  MOV      CL,05                                   |
0167:00470934  MOV      EAX,EBX                                 |
0167:00470936  CALL     00470784                                |
0167:0047093B  MOV      [EBP-0A],AL       ----------------------|  
0167:0047093E  PUSH     BYTE +0A                                |
0167:00470940  PUSH     BYTE +08                                |
0167:00470942  PUSH     BYTE +09                                |
0167:00470944  LEA      EDX,[EBP-21]                            |
0167:00470947  MOV      CL,07                                   |
0167:00470949  MOV      EAX,EBX                                 |
0167:0047094B  CALL     00470784                                |
0167:00470950  MOV      [EBP-09],AL      -----------------------|
0167:00470953  MOV      EBX,08
0167:00470958  LEA      ECX,[EBP-10]           <---取上面8次Call运算后的结果到[ECX]中
0167:0047095B  XOR      EAX,EAX                <---EAX清零
0167:0047095D  MOV      AL,[ECX]               <---按位取[ECX]中的值到EAX中
0167:0047095F  MOV      EDI,0A                 <---EDI中置为定值0AH
0167:00470964  CDQ                             <---EDX清零
0167:00470965  IDIV     EDI
0167:00470967  ADD      EDX,BYTE +30           <---将余数转化成十六进制数值(正确注册码)
0167:0047096A  MOV      [ECX],DL               <---十六进制值存入[ECX]中
0167:0047096C  INC      ECX
0167:0047096D  DEC      EBX
0167:0047096E  JNZ      0047095B               <---循环判断,是否取完
0167:00470970  LEA      EAX,[EBP+FFFFFEB4]
0167:00470976  PUSH     EAX
0167:00470977  MOV      ECX,08
0167:0047097C  MOV      EDX,11
0167:00470981  LEA      EAX,[EBP-21]
0167:00470984  CALL     00402794               <---此Call将上面的计算结果(即正确注册码)存入[EBP+FFFFFEB4]中
0167:00470989  LEA      EDX,[EBP+FFFFFEB4]
0167:0047098F  MOV      EAX,ESI
0167:00470991  CALL     00403B88
0167:00470996  XOR      EAX,EAX
0167:00470998  POP      EDX
0167:00470999  POP      ECX
0167:0047099A  POP      ECX
0167:0047099B  MOV      [FS:EAX],EDX
0167:0047099E  PUSH     DWORD 004709C8
0167:004709A3  LEA      EAX,[EBP+FFFFFED0]
0167:004709A9  MOV      EDX,03
0167:004709AE  CALL     0040398C
0167:004709B3  LEA      EAX,[EBP-08]
0167:004709B6  MOV      EDX,02
0167:004709BB  CALL     0040398C
0167:004709C0  RET    
0167:004709C1  JMP      00403388
0167:004709C6  JMP      SHORT 004709A3
0167:004709C8  POP      EDI
0167:004709C9  POP      ESI
0167:004709CA  POP      EBX
0167:004709CB  MOV      ESP,EBP
0167:004709CD  POP      EBP
0167:004709CE  RET      04
可看到上面调用8次CALL 00470784 ,然后根据此Call得到的结果再与0AH除得到注册码,我们不凡再跟进此Call看看它到底如何运算0167:00470784  PUSH     EBP
0167:00470785  MOV      EBP,ESP
0167:00470787  ADD      ESP,BYTE -08
0167:0047078A  MOV      [EBP-05],CL             <---CL的值存入[EBP-05]中
0167:0047078D  MOV      [EBP-04],EDX
0167:00470790  LEA      EDX,[EBP-06]
0167:00470793  MOV      EDI,[EBP-04]            <---下D EDI可看到合并后的字符串
0167:00470796  XOR      EBX,EBX                 <---EBX=0
0167:00470798  MOV      BL,[EBP-05]             <---取[EBP-05]中的值到EBX中,控制取第几位值
0167:0047079B  MOV      AL,[EDI+EBX]            <---取合并后字符串的第BL位到AL中
0167:0047079E  MOV      BL,[EBP+10]             <---[EBP+10]中为第1个入栈的参数值
0167:004707A1  XOR      AL,[EDI+EBX]            
0167:004707A4  MOV      BL,[EBP+0C]             <---[EBP+0C]中为第2个入栈的参数值
0167:004707A7  MOV      CL,[EDI+EBX]
0167:004707AA  ROL      AL,CL
0167:004707AC  MOV      BL,[EBP+08]             <---[EBP+08]中为第3个入栈的参数值
0167:004707AF  XOR      AL,[EDI+EBX]
0167:004707B2  MOV      [EBP-06],AL             <---结果存入[EBP-06]中
0167:004707B5  MOV      AL,[EDX]
0167:004707B7  POP      ECX
0167:004707B8  POP      ECX
0167:004707B9  POP      EBP
0167:004707BA  RET      0C
我们可大概得出此Call的计算方法,即根据CL值及入口参数确定取合并字符串的的第几位,然后参与运算。
该程序注册成功后将注册信息保存在注册表的
“HKEY_LOCAL_MACHINE/Software/Pegtop/Xfader”中
我得到的为
用户名:ShenGe
注册码:99835539

总会有一些简单的遗憾   简单的一如从前
总会有一些一些改变     随着这岁月变迁