吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

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

[转贴] PhotoFiltre Studio X 10.8.0版 注册算法分析及VB版KG源码

[复制链接]
jinbiao198 发表于 2014-8-25 17:04
PhotoFiltre Studio X 10.8.0版 注册算法分析及VB版KG源码
官网:
http://www.photofiltre.com/

软件简介:
       “PhotoFiltre Studio is a complete image retouching program. It allows you to do simple or advanced adjustments to an image and apply a vast range of filters on it. It is simple and intuitive to use, and has an easy learning curve. The toolbar, giving you access to the standard filters with just a few clicks, gives PhotoFiltre Studio a robust look. PhotoFiltre Studio also has layer manager (with Alpha channel), advanced brushes, nozzles (or tubes), red eye corrector, batch module and lot of other powerful tools.”
                                                                                                                                                            ——摘自其官网介绍



        KO这个软件,是因为我在远景上看到有人说这软件很好用,于是好奇去官网down了下。安装完毕扔进OD,顺手看了下它的算法,很简单,断点嘛,有一点点小难,也只是一点点小难而已。
   
直入主题:
       输入完用户名和注册信息,注册框里的OK按钮仍然是灰色的。很显然,这又是个实时验证类型的软件。注册信息在输入的时候,程序已经在偷偷的搞小动作了。当输入完毕的时候,程序也就验证完了注册信息的合法性了。注册信息通不过合法校验,OK按钮是不会发出胜利的光芒的~~~
    (目前该软件可用的断点有好几种,不过有效率高下之分。因为其还在群里作为考题的原因,具体的断点找法我在视频里详细讲一下,这里就不做讨论了。大家要是有兴趣,可以自己试试,看看能找出几种来?)




好吧,我们直接来看算法验证是如何实现的:
005CB8FC  /.  55              PUSH EBP                           ;  局部调用来自 005CB9CC, 005CBA5D
005CB8FD  |.  8BEC            MOV EBP,ESP
005CB8FF  |.  33C9            XOR ECX,ECX
005CB901  |.  51              PUSH ECX
005CB902  |.  51              PUSH ECX
005CB903  |.  51              PUSH ECX
005CB904  |.  51              PUSH ECX
005CB905  |.  51              PUSH ECX
005CB906  |.  53              PUSH EBX
005CB907  |.  8BD8            MOV EBX,EAX
005CB909  |.  33C0            XOR EAX,EAX
005CB90B  |.  55              PUSH EBP
005CB90C  |.  68 C0B95C00     PUSH pfstudio.005CB9C0
005CB911  |.  64:FF30         PUSH DWORD PTR FS:[EAX]
005CB914  |.  64:8920         MOV DWORD PTR FS:[EAX],ESP
005CB917  |.  8D55 FC         LEA EDX,DWORD PTR SS:[EBP-4]
005CB91A  |.  8BC3            MOV EAX,EBX
005CB91C  |.  E8 27FEFFFF     CALL pfstudio.005CB748             ;  读取我们输入的用户名(ASCII "GGLHY")
005CB921  |.  8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
005CB924  |.  E8 973CFBFF     CALL pfstudio.0057F5C0             ;  对用户名长度的检测!
005CB929  |.  84C0            TEST AL,AL
005CB92B  |.  74 4A           JE SHORT pfstudio.005CB977         ;  一失足成千古恨~~谁让你乱跳的?
005CB92D  |.  8D55 F8         LEA EDX,DWORD PTR SS:[EBP-8]
005CB930  |.  8BC3            MOV EAX,EBX
005CB932  |.  E8 01FFFFFF     CALL pfstudio.005CB838               ;  算法核心之处就在这里面哦
005CB937  |.  8B45 F8         MOV EAX,DWORD PTR SS:[EBP-8]         ;  注册码运算的结果
005CB93A  |.  50              PUSH EAX
005CB93B  |.  8D55 F4         LEA EDX,DWORD PTR SS:[EBP-C]
005CB93E  |.  8BC3            MOV EAX,EBX
005CB940  |.  E8 03FEFFFF     CALL pfstudio.005CB748
005CB945  |.  8B45 F4         MOV EAX,DWORD PTR SS:[EBP-C]       ;  用户名(ASCII "GGLHY")
005CB948  |.  5A              POP EDX
005CB949  |.  E8 F63CFBFF     CALL pfstudio.0057F644             ; 进去吧,好好看看
005CB94E  |.  84C0            TEST AL,AL
005CB950  |.  75 29           JNZ SHORT pfstudio.005CB97B        ;  跳上黑木崖,勇闯光明顶!
(省略部分代码)
005CB965  |.  E8 32FEFFFF     CALL pfstudio.005CB79C
005CB96A  |.  8B45 EC         MOV EAX,DWORD PTR SS:[EBP-14]      ;  转小写的用户名!
005CB96D  |.  5A              POP EDX
005CB96E  |.  E8 D13CFBFF     CALL pfstudio.0057F644             ;  用户名转小写的验证
005CB973  |.  84C0            TEST AL,AL
005CB975  |.  75 04           JNZ SHORT pfstudio.005CB97B        ;  跳跳更健康,OK更闪亮~
005CB977  |>  33D2            XOR EDX,EDX                        ;  不跳就用强,上C4!
005CB979  |.  EB 02           JMP SHORT pfstudio.005CB97D
005CB97B  |>  B2 01           MOV DL,1                           ;  千年等“1”回!
005CB97D  |>  8B83 1C030000   MOV EAX,DWORD PTR DS:[EBX+31C]
005CB983  |.  8B08            MOV ECX,DWORD PTR DS:[EAX]
(省略部分代码)
005CB9A5  |>  33C0            XOR EAX,EAX
005CB9A7  |.  5A              POP EDX
005CB9A8  |.  59              POP ECX
005CB9A9  |.  59              POP ECX
005CB9AA  |.  64:8910         MOV DWORD PTR FS:[EAX],EDX
005CB9AD  |.  68 C7B95C00     PUSH pfstudio.005CB9C7
005CB9B2  |>  8D45 EC         LEA EAX,DWORD PTR SS:[EBP-14]
005CB9B5  |.  BA 05000000     MOV EDX,5
005CB9BA  |.  E8 4D90E3FF     CALL pfstudio.00404A0C
005CB9BF  \.  C3              RETN
005CB9C0   .^ E9 8389E3FF     JMP pfstudio.00404348
005CB9C5   .^ EB EB           JMP SHORT pfstudio.005CB9B2
005CB9C7   .  5B              POP EBX
005CB9C8   .  8BE5            MOV ESP,EBP
005CB9CA   .  5D              POP EBP
005CB9CB   .  C3              RETN
005CB9CC   .  E8 2BFFFFFF     CALL pfstudio.005CB8FC
005CB9D1   .  C3              RETN
复制代码



好吧,咱先简化下。上面这一大段,咱其实可以把它变成这样:
A.
005CB924  |.  E8 973CFBFF     CALL pfstudio.0057F5C0             ;  对用户名长度的检测!
005CB929  |.  84C0            TEST AL,AL
005CB92B  |.  74 4A           JE SHORT pfstudio.005CB977         ;  一失足成千古恨~~谁让你乱跳的?
(省略部分代码)
B.
005CB932  |.  E8 01FFFFFF     CALL pfstudio.005CB838               ;  算法核心之处就在这里面哦
005CB937  |.  8B45 F8         MOV EAX,DWORD PTR SS:[EBP-8]         ;  注册码运算的结果
(省略部分代码)
C.
005CB945  |.  8B45 F4         MOV EAX,DWORD PTR SS:[EBP-C]         ;  用户名(ASCII "GGLHY")
005CB948  |.  5A              POP EDX                              ;  数据窗口,看看庐山真面目吧
005CB949  |.  E8 F63CFBFF     CALL pfstudio.0057F644
005CB94E  |.  84C0            TEST AL,AL
005CB950  |.  75 29           JNZ SHORT pfstudio.005CB97B          ;  跳上黑木崖,勇闯光明顶!
(省略部分代码)
D.
005CB96E  |.  E8 D13CFBFF     CALL pfstudio.0057F644             ;  用户名转小写的验证
005CB973  |.  84C0            TEST AL,AL
005CB975  |.  75 04           JNZ SHORT pfstudio.005CB97B        ;  跳跳更健康,OK更闪亮~
005CB977  |>  33D2            XOR EDX,EDX                        ;  不跳就用强,上C4!
005CB979  |.  EB 02           JMP SHORT pfstudio.005CB97D
005CB97B  |>  B2 01           MOV DL,1                           ;  千年等“1”回!
复制代码


换言之,一个JE不能实现,且2个JNZ必须有一处实现。算法的核心更不能就轻易放过哈
    用户名转小写的注册验证流程与用户名未转小写的一样,为节约篇幅我就略去了。同时为保证大家对算法核心的理解,我会把它发在最后边。
    现在,我们分别来看看:

                                                                                       一、对用户名的检测
0057F5C0  /.  55              PUSH EBP
0057F5C1  |.  8BEC            MOV EBP,ESP
0057F5C3  |.  83C4 F8         ADD ESP,-8
(省略部分代码)
0057F5E2  |.  8B45 F8         MOV EAX,DWORD PTR SS:[EBP-8]       ;  输入的用户名(ASCII "GGLHY")
0057F5E5  |.  E8 BE56E8FF     CALL pfstudio.00404CA8
0057F5EA  |.  8945 FC         MOV DWORD PTR SS:[EBP-4],EAX       ;  得到用户名的长度!
0057F5ED  |.  8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
0057F5F0  |.  83C0 FB         ADD EAX,-5                         ;  长度值 -5
0057F5F3  |.  83E8 1C         SUB EAX,1C                         ;  再减32
0057F5F6  |.  0F92C3          SETB BL                            ;  我的爱对你说,真爱才是爱
0057F5F9  |.  84DB            TEST BL,BL
0057F5FB  |.  74 21           JE SHORT pfstudio.0057F61E         ;  跳来跳去不是好孩子哦~
0057F5FD  |.  8B7D FC         MOV EDI,DWORD PTR SS:[EBP-4]       ;  用户名的长度!
0057F600  |.  85FF            TEST EDI,EDI
0057F602  |.  7E 1A           JLE SHORT pfstudio.0057F61E
0057F604  |.  BE 01000000     MOV ESI,1
0057F609  |>  55              /PUSH EBP                          ; /Arg1
0057F60A  |.  8BC6            |MOV EAX,ESI                       ; |
0057F60C  |.  E8 7FFFFFFF     |CALL pfstudio.0057F590            ; \pfstudio.0057F590
0057F611  |.  59              |POP ECX
0057F612  |.  84C0            |TEST AL,AL
0057F614  |.  75 04           |JNZ SHORT pfstudio.0057F61A
0057F616  |.  33DB            |XOR EBX,EBX
0057F618  |.  EB 04           |JMP SHORT pfstudio.0057F61E
0057F61A  |>  46              |INC ESI
0057F61B  |.  4F              |DEC EDI
0057F61C  |.^ 75 EB           \JNZ SHORT pfstudio.0057F609
(省略部分代码)
0057F63B   .  8BC3            MOV EAX,EBX                         ;EBX,爱要怎么说出口?
0057F63D   .  5F              POP EDI
0057F63E   .  5E              POP ESI
0057F63F   .  5B              POP EBX
0057F640   .  59              POP ECX
0057F641   .  59              POP ECX
0057F642   .  5D              POP EBP
0057F643   .  C3              RETN
复制代码
     嗯,聪明的你一定马上就发现了程序对用户名的长度做了限制:不得小于5。
     是的,你真的很聪明~~
     但是,但是,但是.....我真的不想说这个“但是”,但是,我还是要说:但是,对用户名的限制真的就只有这么一条吗?
让我们在程序中输入用户名试试,看看会发生什么,随便按下键盘上的神马字母啊、数字啊、标点符号键不松,你会在不久的将来听见不断的“咚咚”声,而用户名框里却再也没有变化了。
     好吧,皇上,还记得大明湖畔的夏雨荷吗?oh,no,错了。是大家还记得0057F5F3处的 SUB EAX,1C 吗?
“1C”啊,你是电,你是光,你是唯一的神话~~~

小结:用户名长度大于4而小于33。



                                                             二、用户名与注册码前半部分的恩怨情仇

005CB949  |.  E8 F63CFBFF     CALL pfstudio.0057F644             ; 进去吧,好好看看
005CB94E  |.  84C0            TEST AL,AL
005CB950  |.  75 29           JNZ SHORT pfstudio.005CB97B        ;  跳上黑木崖,勇闯光明顶!
复制代码

F7进入:
0057F644  /.  55              PUSH EBP
0057F645  |.  8BEC            MOV EBP,ESP
0057F647  |.  33C9            XOR ECX,ECX
(省略部分代码)
0057F674  |.  8D55 F4         LEA EDX,DWORD PTR SS:[EBP-C]
0057F677  |.  8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]       ;  用户名(ASCII "GGLHY")
0057F67A  |.  E8 29FEFFFF     CALL pfstudio.0057F4A8             ;  用户名的运算得到的字符串。本例“36405”
0057F67F  |.  8B45 F4         MOV EAX,DWORD PTR SS:[EBP-C]
0057F682  |.  E8 2156E8FF     CALL pfstudio.00404CA8
(省略部分代码)
0057F6AD  |.  E8 5A9FE8FF     CALL pfstudio.0040960C               ;  !!!
0057F6B2  |.  8BF0            MOV ESI,EAX
0057F6B4  |.  8B45 F8         MOV EAX,DWORD PTR SS:[EBP-8]
0057F6B7  |.  E8 EC55E8FF     CALL pfstudio.00404CA8
0057F6BC  |.  8D53 05         LEA EDX,DWORD PTR DS:[EBX+5]
0057F6BF  |.  3BC2            CMP EAX,EDX
0057F6C1  |.  75 30           JNZ SHORT pfstudio.0057F6F3
0057F6C3  |.  8D45 EC         LEA EAX,DWORD PTR SS:[EBP-14]
0057F6C6  |.  50              PUSH EAX
0057F6C7  |.  8BCB            MOV ECX,EBX
0057F6C9  |.  BA 01000000     MOV EDX,1
0057F6CE  |.  8B45 F8         MOV EAX,DWORD PTR SS:[EBP-8]
0057F6D1  |.  E8 3258E8FF     CALL pfstudio.00404F08
0057F6D6  |.  8B45 EC         MOV EAX,DWORD PTR SS:[EBP-14]      ;  注意这里,数据窗口的内容
0057F6D9  |.  8B55 F4         MOV EDX,DWORD PTR SS:[EBP-C]       ;  用户名的运算得到的字符串。本例“36405”
0057F6DC  |.  E8 1357E8FF     CALL pfstudio.00404DF4             ;  我不说,你能猜到它要干嘛了吗?
0057F6E1  |.  75 10           JNZ SHORT pfstudio.0057F6F3
0057F6E3  |.  81FE D2040000   CMP ESI,4D2                        ;  注意这常数
0057F6E9  |.  74 0C           JE SHORT pfstudio.0057F6F7
0057F6EB  |.  81FE D1040000   CMP ESI,4D1                        ;  还有这个常数
0057F6F1  |.  74 04           JE SHORT pfstudio.0057F6F7
0057F6F3  |>  33C0            XOR EAX,EAX                        ;  出卖我的爱,让0跑回来,最后知道**的我,眼泪掉下来
0057F6F5  |.  EB 02           JMP SHORT pfstudio.0057F6F9
0057F6F7  |>  B0 01           MOV AL,1                           ;  在爱与不爱间 来回千万遍!
0057F6F9  |> \8BD8            MOV EBX,EAX                        ;  是爱心传递使者还是冷血连环杀手?
(省略部分代码)
0057F71B   .^ EB EB           JMP SHORT pfstudio.0057F708
0057F71D   .  8BC3            MOV EAX,EBX                          ;  EBX,你亦真亦幻~~是正是邪?
0057F71F   .  5E              POP ESI
0057F720   .  5B              POP EBX
0057F721   .  8BE5            MOV ESP,EBP
0057F723   .  5D              POP EBP
0057F724   .  C3              RETN
复制代码

恩,我们先停下按F8的手,端起一杯清茶或香浓的咖啡,整理下思绪:
    用户名运算后,得到了一个5位数的字符串“36405”,路要一步一步走,饭要一口一口的吃。我们必须弄清楚这个5位数的字符串是何方神圣。我们先看下它的来历:
0057F674  |.  8D55 F4         LEA EDX,DWORD PTR SS:[EBP-C]
0057F677  |.  8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]         ;  用户名(ASCII "GGLHY")
0057F67A  |.  E8 29FEFFFF     CALL pfstudio.0057F4A8               ;  用户名的运算结果“36405”
0057F67F  |.  8B45 F4         MOV EAX,DWORD PTR SS:[EBP-C]         ;  用户名的运算得到的字符串。本例“36405”
复制代码

F7进入:
0057F4B7  |.  8945 FC         MOV DWORD PTR SS:[EBP-4],EAX
0057F4BA  |.  8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]         ;  用户名(ASCII "GGLHY")
0057F4BD  |.  E8 D659E8FF     CALL pfstudio.00404E98
0057F4C2  |.  33C0            XOR EAX,EAX
0057F4C4  |.  55              PUSH EBP
0057F4C5  |.  68 63F55700     PUSH pfstudio.0057F563
0057F4CA  |.  64:FF30         PUSH DWORD PTR FS:[EAX]
0057F4CD  |.  64:8920         MOV DWORD PTR FS:[EAX],ESP
0057F4D0  |.  33DB            XOR EBX,EBX
0057F4D2  |.  8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
0057F4D5  |.  E8 CE57E8FF     CALL pfstudio.00404CA8
0057F4DA  |.  83F8 01         CMP EAX,1                            ;  用户名长度,本例=5
0057F4DD  |.  7C 11           JL SHORT pfstudio.0057F4F0
0057F4DF  |>  8B55 FC         /MOV EDX,DWORD PTR SS:[EBP-4]        ; 用户名(ASCII "GGLHY")
0057F4E2  |.  0FB65402 FF     |MOVZX EDX,BYTE PTR DS:[EDX+EAX-1]   ;  依次倒取用户名每一位ASC
0057F4E7  |.  03DA            |ADD EBX,EDX                         ;  累加(EBX初始=0)
0057F4E9  |.  2BD8            |SUB EBX,EAX                         ;  累加和 - 该字符在用户名中的位置值!
0057F4EB  |.  48              |DEC EAX
0057F4EC  |.  85C0            |TEST EAX,EAX
0057F4EE  |.^ 75 EF           \JNZ SHORT pfstudio.0057F4DF         ;  用户名运算完毕,结果保存到EBX
0057F4F0  |>  56              PUSH ESI                             ; /Arg1
0057F4F1  |.  8BC3            MOV EAX,EBX                          ; |用户名运算的结果,本例=16C
0057F4F3  |.  B9 E8030000     MOV ECX,3E8                          ; |
0057F4F8  |.  99              CDQ                                  ; |
0057F4F9  |.  F7F9            IDIV ECX                             ; |mod 3E8H(1000)
0057F4FB  |.  8955 F4         MOV DWORD PTR SS:[EBP-C],EDX         ; |
0057F4FE  |.  C645 F8 00      MOV BYTE PTR SS:[EBP-8],0            ; |
0057F502  |.  8D55 F4         LEA EDX,DWORD PTR SS:[EBP-C]         ; |
0057F505  |.  33C9            XOR ECX,ECX                          ; |
0057F507  |.  B8 78F55700     MOV EAX,pfstudio.0057F578            ; |ASCII "%.3d"
0057F50C  |.  E8 EFB1E8FF     CALL pfstudio.0040A700               ; \pfstudio.0040A700
0057F511  |.  8D45 F0         LEA EAX,DWORD PTR SS:[EBP-10]        ;  余数转化为3位数的字符形式,本例=“364”
0057F514  |.  50              PUSH EAX
0057F515  |.  8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]         ;  用户名(ASCII "GGLHY")
0057F518  |.  E8 8B57E8FF     CALL pfstudio.00404CA8               ;  取用户名长度,准备进行计算
0057F51D  |.  B9 64000000     MOV ECX,64                           ; |
0057F522  |.  99              CDQ                                  ; |
0057F523  |.  F7F9            IDIV ECX                             ; |mod 64H(100)
0057F525  |.  8955 F4         MOV DWORD PTR SS:[EBP-C],EDX         ; |
0057F528  |.  C645 F8 00      MOV BYTE PTR SS:[EBP-8],0            ; |
0057F52C  |.  8D55 F4         LEA EDX,DWORD PTR SS:[EBP-C]         ; |
0057F52F  |.  33C9            XOR ECX,ECX                          ; |
0057F531  |.  B8 88F55700     MOV EAX,pfstudio.0057F588            ; |ASCII "%.2d"
0057F536  |.  E8 C5B1E8FF     CALL pfstudio.0040A700               ; \pfstudio.0040A700
0057F53B  |.  8B55 F0         MOV EDX,DWORD PTR SS:[EBP-10]        ;  余数转为2位数的字符形式,本例=“05”
0057F53E  |.  8BC6            MOV EAX,ESI
0057F540  |.  E8 6B57E8FF     CALL pfstudio.00404CB0
0057F545  |.  33C0            XOR EAX,EAX
复制代码
      大致看下流程,我们就知道了,这个5位数分别是个3位数和一个2位数相连的结果。
详情如下:
3位数的来历:
       用户名每一位的ASC 减去 该位在用户名中的位置 的差值 累加起来,然后再MOD 3E8(1000),余数转换成3位数的形式。
       比如用户名123,则是(31 -1) + (32-2) + (33 -3) = 90H
       90H =144
      144 mod 1000(3E8) =144 从而得到一个3位数的字符串“144”(不足3位则前面补0)
2位数的来历:
        很简单,用户名的长度 mod 100 ,余数转为2位数的字符串形式。(不足2位前面补0)

      OK,我们解开了字符串“36405”的身世之谜,接下来就是用户名运算得到字符串“36405”,与某个地址的值进行比较,不一样就挂了。所以嘛,那个地址里不是蒙面佐罗就是侠盗罗宾汉吗?我们得去找找他从哪里来。
    很显然,在我们看到所有注册码都联合起来后一路F8下来,我们是不是忽略了什么东西呢?
    好吧,回到罪案现场,咱去调查下:
(省略部分代码)
005CB8AA  |.  8B06            MOV EAX,DWORD PTR DS:[ESI]           ;  全世界无产者,联合起来!(ASCII "12345678901357924680")
005CB8AC  |.  E8 9B53EEFF     CALL pfstudio.004B0C4C
005CB8B1  |.  8B45 E8         MOV EAX,DWORD PTR SS:[EBP-18]
005CB8B4  |.  8D55 EC         LEA EDX,DWORD PTR SS:[EBP-14]
005CB8B7  |.  E8 E836FBFF     CALL pfstudio.0057EFA4               ; 打 倒日本帝国主义!还我们真xiang
005CB8BC  |.  8B55 EC         MOV EDX,DWORD PTR SS:[EBP-14]        ; “西经”已出现,悟空来取吧
005CB8BF  |.  8BC6            MOV EAX,ESI
005CB8C1  |.  E8 7691E3FF     CALL pfstudio.00404A3C
(省略部分代码)
复制代码
看看数据窗口:
00ED47A0  5F B2 18 1B D5 AF 2C DF  _?寨,
00ED47A8  C0 CE                    牢.
复制代码

整理下:
5F B2 18 1B D5 AF 2C DF C0 CE  
复制代码

    哈哈,一二三四五,快来数一数。正好20位!如果您的大脑在劳累之余还能想得起注册码的总长20位的话,我要恭喜你一下了。不过不是“You win”,而是“你已经很接近真xiang了”。
让我们把视线拉回到这里来:
0057F6D6  |.  8B45 EC         MOV EAX,DWORD PTR SS:[EBP-14]      ;  注意这里,数据窗口的内容
0057F6D9  |.  8B55 F4         MOV EDX,DWORD PTR SS:[EBP-C]       ;  用户名的运算得到的字符串。本例“36405”
0057F6DC  |.  E8 1357E8FF     CALL pfstudio.00404DF4             ;  我不说,你能猜到它要干嘛了吗?
0057F6E1  |.  75 10           JNZ SHORT pfstudio.0057F6F3
复制代码

    在程序运行到0057F6D6 处的时候,我们偷偷看下数据窗口,你看到了什么?啥~~~看透了爱情看透了你?哦,我听错了,你说看到的是这里:
5F B2 18 1B D5
复制代码

    哈哈,显然,用户名运算得到的字符串与“36405”与上面这5组(10)对应的5位字符相比较,如果不对就会“挥一挥衣袖,不带走一片西天的云彩”~~
    明白这一点就好办了,咱去看看这5组“数值”的来历(PS:不是李连杰演的新少林五祖啦,哈哈)。
    让我们紧跟全世界无产者的脚步,看看他们是如何利用批判的武器来解释“新少林五祖”的出身的?



                                                                           三.如梦亦如幻,应作如是观

    让我们拿起摄像机,和无产者们一起来见证这奇迹的时刻吧!(Sorry,阿狸先生,借用了你的“见证奇迹的时刻”这一词,你不要找我要版权哦)
005CB8B7  |.  E8 E836FBFF     CALL pfstudio.0057EFA4               ;  打 倒日本帝国主义!还我们真xiang
005CB8BC  |.  8B55 EC         MOV EDX,DWORD PTR SS:[EBP-14]        ; “西经”已出现,悟空来取吧
复制代码

F7进入:
jinbiao911,如果您要查看本帖隐藏内容请回复

让我们把目光紧紧盯着它:

0057EFF3  |.  8A82 C4FA6700   |MOV AL,BYTE PTR DS:[EDX+67FAC4]     ;  查表~~~
复制代码

右键跟随到数据窗口,看到如下内容:
0067FABD                       7B         {
0067FAC5  4D 86 4E 63 45 BC 90 5F  M哊cE紣_
0067FACD  8D 40                    岪.
复制代码

好,咱看看看看10次循环完毕后,表中分别取得是哪些内容:
4D 86 4E 63 45 BC 7B 4D 86 4E
复制代码

很明显不一样哈,显然
0057EFEB  |.  B9 07000000     |MOV ECX,7                           ;  注意参数7
0057EFF0  |.  99              |CDQ
0057EFF1  |.  F7F9            |IDIV ECX
0057EFF3  |.  8A82 C4FA6700   |MOV AL,BYTE PTR DS:[EDX+67FAC4]     ;  查表~~~
复制代码

这里是导致取值不同的原因~~~
恩,别告诉我你没看懂啊~~~~

很好,看明白这个循环,我们基本上可以说是离成功只有一步之遥了~~
注册码20位,每2位为一组作为数值,分别与查表的数值 XO人头马,我擦,错了,是XOR,得到的结果就保存在:
005CB8BC  |.  8B55 EC         MOV EDX,DWORD PTR SS:[EBP-14]        ; “西经”已出现,悟空来取吧
复制代码


大家可以去OD里实地考察一下,看看我们的神秘人的真面目。
00EC8284  5F B2 18 1B D5 AF 2C DF  _?寨,
00EC828C  C0 CE                    牢.
复制代码

眼熟吧,这不就是我们前面第二部分里看到的那一张张熟悉的面孔?

所以,用户名运算的结果生成的字符串“36405”,每一位的ASC码,必须是注册码前10位(5组)分别与表中前5组XOR的结果相等。
举例如下:
  ( 3   6   4   0   5 )            <------  字符串
    33  36  34  30  35            <------  对应的ASC码
XOR
    4D  86  4E  63  45            <------  所查的表
---------------------------------
    7E  B0  7A  53  70            <------  结果
复制代码

       将结果连接起来,就是注册码的前10位了。
       大家去这里看看:
0057F6D6  |.  8B45 EC         MOV EAX,DWORD PTR SS:[EBP-14]      ;  与下面的一样了吗?哈哈
0057F6D9  |.  8B55 F4         MOV EDX,DWORD PTR SS:[EBP-C]       ;  用户名的运算得到的字符串。本例“36405”
复制代码

很好!

        你说啥?
        还有后面10位?
        问得好,这证明了你是个头脑很清醒的人,没有被眼前的胜利冲昏头脑,还记得有潜藏的特务~~~
        不过,我要告诉大家的是,这个软件,我们只要记住前10位注册码(少林5组)分别与表中的前5组来XOR就行了,因为,注册码的后10位,其实是可以有固定的。对,你没听错,也没看错,后10位真的可以是有固定的~~~(当然,前提是你和我一样想简单点的话)


                                                                                           四、不是尾声的尾声

不相信?好吧,尊驾请移步,看看这再也明白不过的内容吧:
0057F6E3  |.  81FE D2040000   CMP ESI,4D2                        ;  注意这常数
0057F6E9  |.  74 0C           JE SHORT pfstudio.0057F6F7
0057F6EB  |.  81FE D1040000   CMP ESI,4D1                        ;  还有这个常数
0057F6F1  |.  74 04           JE SHORT pfstudio.0057F6F7
0057F6F3  |>  33C0            XOR EAX,EAX                        ;  出卖我的爱,让0跑回来,最后知道真 相的我,眼泪掉下来
0057F6F5  |.  EB 02           JMP SHORT pfstudio.0057F6F9
0057F6F7  |>  B0 01           MOV AL,1                           ;  在爱与不爱间 来回千万遍!
复制代码


        我们现在将疑犯锁定在ESI上,如果ESI的值=4D1或4D2,那么他就是我党成功打入敌特内部的优秀特工“深海”,否则他就是潜伏在我党内的特务“佛龛”。。。Got it?
       我让们看看ESI的来历,在这里:
0057F6AD  |.  E8 5A9FE8FF     CALL pfstudio.0040960C               ;  !!!
0057F6B2  |.  8BF0            MOV ESI,EAX
复制代码

       谁说不想进去?学大禹治水三过家门而不入?
       兄弟,我只能说“I服了U”。

F7进去后:
0040960C  /.  53              PUSH EBX
0040960D  |.  51              PUSH ECX
0040960E  |.  8BDA            MOV EBX,EDX
00409610  |.  8BD4            MOV EDX,ESP
00409612  |.  E8 559FFFFF     CALL pfstudio.0040356C               ;  再F7
00409617  |.  833C24 00       CMP DWORD PTR SS:[ESP],0
0040961B  |.  74 02           JE SHORT pfstudio.0040961F
0040961D  |.  8BC3            MOV EAX,EBX
0040961F  |>  5A              POP EDX
00409620  |.  5B              POP EBX
00409621  \.  C3              RETN
复制代码

再F7进入:
0040356C  /.  53              PUSH EBX
0040356D  |.  56              PUSH ESI
0040356E  |.  57              PUSH EDI
0040356F  |.  89C6            MOV ESI,EAX
00403571  |.  50              PUSH EAX
00403572  |.  85C0            TEST EAX,EAX
00403574  |.  74 6C           JE SHORT pfstudio.004035E2
00403576  |.  31C0            XOR EAX,EAX
00403578  |.  31DB            XOR EBX,EBX
0040357A  |.  BF CCCCCC0C     MOV EDI,0CCCCCCC
0040357F  |>  8A1E            /MOV BL,BYTE PTR DS:[ESI]              ; 注册码查表XOR后10位,每2位1组
00403581  |.  46              |INC ESI
00403582  |.  80FB 20         |CMP BL,20
00403585  |.^ 74 F8           \JE SHORT pfstudio.0040357F
00403587  |.  B5 00           MOV CH,0
00403589  |.  80FB 2D         CMP BL,2D                               ; 开始检测!下同
0040358C  |.  74 62           JE SHORT pfstudio.004035F0
0040358E  |.  80FB 2B         CMP BL,2B
00403591  |.  74 5F           JE SHORT pfstudio.004035F2
00403593  |>  80FB 24         CMP BL,24
00403596  |.  74 5F           JE SHORT pfstudio.004035F7
00403598  |.  80FB 78         CMP BL,78
0040359B  |.  74 5A           JE SHORT pfstudio.004035F7
0040359D  |.  80FB 58         CMP BL,58
004035A0  |.  74 55           JE SHORT pfstudio.004035F7
004035A2  |.  80FB 30         CMP BL,30
004035A5  |.  75 13           JNZ SHORT pfstudio.004035BA
004035A7  |.  8A1E            MOV BL,BYTE PTR DS:[ESI]
004035A9  |.  46              INC ESI
004035AA  |.  80FB 78         CMP BL,78
004035AD  |.  74 48           JE SHORT pfstudio.004035F7
004035AF  |.  80FB 58         CMP BL,58
004035B2  |.  74 43           JE SHORT pfstudio.004035F7
004035B4  |.  84DB            TEST BL,BL
004035B6  |.  74 20           JE SHORT pfstudio.004035D8
004035B8  |.  EB 04           JMP SHORT pfstudio.004035BE
004035BA  |>  84DB            TEST BL,BL
004035BC  |.  74 2D           JE SHORT pfstudio.004035EB
004035BE  |>  80EB 30         /SUB BL,30
004035C1  |.  80FB 09         |CMP BL,9
004035C4  |.  77 25           |JA SHORT pfstudio.004035EB                 ; 后5组只能是数字哦!
004035C6  |.  39F8            |CMP EAX,EDI
004035C8  |.  77 21           |JA SHORT pfstudio.004035EB
004035CA  |.  8D0480          |LEA EAX,DWORD PTR DS:[EAX+EAX*4]           ; 看懂了这循环的作用了吗
004035CD  |.  01C0            |ADD EAX,EAX
004035CF  |.  01D8            |ADD EAX,EBX
004035D1  |.  8A1E            |MOV BL,BYTE PTR DS:[ESI]
004035D3  |.  46              |INC ESI
004035D4  |.  84DB            |TEST BL,BL
004035D6  |.^ 75 E6           \JNZ SHORT pfstudio.004035BE
004035D8  |>  FECD            DEC CH
004035DA  |.  74 09           JE SHORT pfstudio.004035E5
004035DC  |.  85C0            TEST EAX,EAX
004035DE  |.  7D 54           JGE SHORT pfstudio.00403634
004035E0  |.  EB 09           JMP SHORT pfstudio.004035EB
004035E2  |>  46              INC ESI
004035E3  |.  EB 06           JMP SHORT pfstudio.004035EB
004035E5  |>  F7D8            NEG EAX
004035E7  |.  7E 4B           JLE SHORT pfstudio.00403634
004035E9  |.  78 49           JS SHORT pfstudio.00403634
004035EB  |>  5B              POP EBX                              ;  Default case of switch 0040360B
004035EC  |.  29DE            SUB ESI,EBX
004035EE  |.  EB 47           JMP SHORT pfstudio.00403637
004035F0  |>  FEC5            INC CH
004035F2  |>  8A1E            MOV BL,BYTE PTR DS:[ESI]
004035F4  |.  46              INC ESI
004035F5  |.^ EB 9C           JMP SHORT pfstudio.00403593
004035F7  |>  BF FFFFFF0F     MOV EDI,0FFFFFFF
004035FC  |.  8A1E            MOV BL,BYTE PTR DS:[ESI]
004035FE  |.  46              INC ESI
004035FF  |.  84DB            TEST BL,BL
00403601  |.^ 74 DF           JE SHORT pfstudio.004035E2
00403603  |>  80FB 61         /CMP BL,61
00403606  |.  72 03           |JB SHORT pfstudio.0040360B
00403608  |.  80EB 20         |SUB BL,20
0040360B  |>  80EB 30         |SUB BL,30                           ;  Switch (cases 30..46)
0040360E  |.  80FB 09         |CMP BL,9
00403611  |.  76 0B           |JBE SHORT pfstudio.0040361E
00403613  |.  80EB 11         |SUB BL,11
00403616  |.  80FB 05         |CMP BL,5
00403619  |.^ 77 D0           |JA SHORT pfstudio.004035EB
0040361B  |.  80C3 0A         |ADD BL,0A                           ;  Cases 41 ('A'),42 ('B'),43 ('C'),44 ('D'),45 ('E'),46 ('F') of switch 0040360B
0040361E  |>  39F8            |CMP EAX,EDI                         ;  Cases 30 ('0'),31 ('1'),32 ('2'),33 ('3'),34 ('4'),35 ('5'),36 ('6'),37 ('7'),38 ('8'),39 ('9') of switch 0040360B
00403620  |.^ 77 C9           |JA SHORT pfstudio.004035EB
00403622  |.  C1E0 04         |SHL EAX,4
00403625  |.  01D8            |ADD EAX,EBX
00403627  |.  8A1E            |MOV BL,BYTE PTR DS:[ESI]
00403629  |.  46              |INC ESI
0040362A  |.  84DB            |TEST BL,BL
0040362C  |.^ 75 D5           \JNZ SHORT pfstudio.00403603
0040362E  |.  FECD            DEC CH
00403630  |.  75 02           JNZ SHORT pfstudio.00403634
00403632  |.  F7D8            NEG EAX
00403634  |>  59              POP ECX
00403635  |.  31F6            XOR ESI,ESI
00403637  |>  8932            MOV DWORD PTR DS:[EDX],ESI
00403639  |.  5F              POP EDI
0040363A  |.  5E              POP ESI
0040363B  |.  5B              POP EBX
0040363C  \.  C3              RETN
复制代码

         Oh my God!这多分支,好吓人哈~~
         不过,大家稍微有点信心好不好。我前面说了,如果我们想简单的话,那我们看把注册码最后10位是固定的情形,这里面的大部分内容都是纸老虎~~
         其实真正有用的,有这里(情形一):
004035BE  |>  80EB 30         /SUB BL,30
004035C1  |.  80FB 09         |CMP BL,9
004035C4  |.  77 25           |JA SHORT pfstudio.004035EB                 ; 后5组只能是数字哦!
004035C6  |.  39F8            |CMP EAX,EDI
004035C8  |.  77 21           |JA SHORT pfstudio.004035EB
004035CA  |.  8D0480          |LEA EAX,DWORD PTR DS:[EAX+EAX*4]           ; 看懂了这循环的作用了吗
004035CD  |.  01C0            |ADD EAX,EAX
004035CF  |.  01D8            |ADD EAX,EBX
004035D1  |.  8A1E            |MOV BL,BYTE PTR DS:[ESI]
004035D3  |.  46              |INC ESI
004035D4  |.  84DB            |TEST BL,BL
004035D6  |.^ 75 E6           \JNZ SHORT pfstudio.004035BE
复制代码

换句话说,我们就看最简单的情形,也就是这5组全是数字的话,则 条件一:
       输入的注册码后10位查表XOR的结果,(也是5组),每组作为ASC,只能不小于30且不大于39(换句话说,只能为数字)。
       不满足该条件,则ESI的值为FFFFFFFF。
                条件二:
       这5组,每组作为的ASC - 30 后 的数值作如下运算:

假设这5组分别是:

33 34 35 36 37
则  (33-30)* 10000
    (34-30)* 1000
    (35-30)* 100
    (36-30)* 10
    (37-30)* 1
复制代码

     然后把这5个积加起来,其实就是一个简单的5位数而已~~,这里就是34567。


复杂一点的情形二,就是注册码后10位查表XOR得到的5组结果中不仅有数字,还有字母。这就是下面那长长的循环中含有的N多分支的情形。在这里会将每组数值进行对应的运算,比如
00403608  |.  80EB 20         |SUB BL,20
0040360B  |>  80EB 30         |SUB BL,30                           ;  Switch (cases 30..46)
0040360E  |.  80FB 09         |CMP BL,9
00403611  |.  76 0B           |JBE SHORT pfstudio.0040361E
00403613  |.  80EB 11         |SUB BL,11
00403616  |.  80FB 05         |CMP BL,5
复制代码

这里的情况复杂了些,大家有兴趣可以自己跟踪一下。我嘛,呵呵,稍微偷下懒啊哈!



好吧,既然这里的主要内容都搞清楚了,那我们看看,ESI的值应该是多少?
请出这2个常数:4D1、4D2
4D1 =1233
4D2 =1234
           OK,这2个数怎么那么符合前面内容的要求呢?既是纯数字,又可看做各个乘积的累加和~~~
不会这么巧吧?

       让我们简单化点,就看看情形一这种纯数字的条件下,注册码最后10位是什么。

       你说啥?1233或1234才4位,注册码要5组,配不上?
我的大哥啊,从某种意义上来说,1234 是等价于 01234的啊!
好吧,我们假设ESI的值=4D2=1234  =》01234,那么注册码后10位(5组)可以看做:

( 0   1   2   3   4 )               <----- ESI的值对应的10进制字符形式
  30  31  32  33  34                 <----- 对应的ASC值
XOR
  BC  7B  4D  86  4E                 <---- 查表的后5组 !(还记得有个参数7吗?)
-----------------------------
  8C  4A  7F  B5  7A
复制代码

那么,ESI要等于固定数值4D2(1234),则注册码后10位必须为:8C4A7FB57A
同理,ESI要等于固定数值4D1(1233),则注册码后10位必须为:8C4A7FB57D

   好了。我们重新组合下前10位和后10位,可理解成前10位链接后面的固定字符串要“8C4A7FB57A”(或“8C4A7FB57D”)
现在,我们在注册信息框中输入:
User:GGLHY
Reg key:7EB07A53708C4A7FB57D
看看,OK是不是已经 OK 了啊?{:4_307:}






怎么样,算法也是个战5渣吧


哎,写了好几个小时,累死了!破它比写破文简单多了~~~~
附上没优化、没美化又没说话的很烂的VB源码,有助于大家对该软件注册算法的理解:

jinbiao911,如果您要查看本帖隐藏内容请回复




这里是不太重要的内容,大家可以略过了~~~
下面是用户名与注册码前10位运算的结果不匹配的话,程序会将用户名转小写再次运算来验证。
因为流程一样,这里就不写了,列出用户名“乔装”的证据:


005CB7F0  |.  E8 F3D7E3FF     CALL pfstudio.00408FE8             ;  用户名大写转小写
005CB7F5  |.  33C0            XOR EAX,EAX
005CB7F7  |.  5A              POP EDX
复制代码

f7进入:
00408FEF  |.  8BC6            MOV EAX,ESI
00408FF1  |.  E8 B2BCFFFF     CALL pfstudio.00404CA8
00408FF6  |.  8BD8            MOV EBX,EAX                        ;  用户名长度
00408FF8  |.  8BC7            MOV EAX,EDI
00408FFA  |.  8BD3            MOV EDX,EBX
00408FFC  |.  E8 33C0FFFF     CALL pfstudio.00405034
00409001  |.  8BD6            MOV EDX,ESI                        ;  用户名(ASCII "GGLHY")
00409003  |.  8B37            MOV ESI,DWORD PTR DS:[EDI]
00409005  |.  85DB            TEST EBX,EBX
00409007  |.  74 15           JE SHORT pfstudio.0040901E
00409009  |>  8A02            /MOV AL,BYTE PTR DS:[EDX]          ;  用户名(ASCII "GGLHY")每一位
0040900B  |.  3C 41           |CMP AL,41
0040900D  |.  72 06           |JB SHORT pfstudio.00409015
0040900F  |.  3C 5A           |CMP AL,5A
00409011  |.  77 02           |JA SHORT pfstudio.00409015
00409013  |.  04 20           |ADD AL,20                             ; 证据在此,休得抵赖~~~~
00409015  |>  8806            |MOV BYTE PTR DS:[ESI],AL
00409017  |.  42              |INC EDX
00409018  |.  46              |INC ESI
00409019  |.  4B              |DEC EBX
0040901A  |.  85DB            |TEST EBX,EBX
0040901C  |.^ 75 EB           \JNZ SHORT pfstudio.00409009       ;  大写转小写~~~
0040901E  |>  5F              POP EDI
0040901F  |.  5E              POP ESI
00409020  |.  5B              POP EBX
00409021  \.  C3              RETN
复制代码

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

野生的沫沫 发表于 2014-8-25 17:19
360截图20140825171902328.jpg
NanQiao 发表于 2014-9-2 19:15
LZ乃文抄公是也:

http://bbs.chinapyg.com/thread-72337-1-1.html
头像被屏蔽
wanxia 发表于 2014-9-4 21:17
pentium450 发表于 2014-12-4 21:49
楼主你觉得脸红不?{:1_922:}
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

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

GMT+8, 2024-4-30 04:22

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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