GGLHY 发表于 2014-1-27 19:38:39

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

本帖最后由 GGLHY 于 2014-1-27 19:40 编辑

                                 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:
005CB914|.64:8920         MOV DWORD PTR FS:,ESP
005CB917|.8D55 FC         LEA EDX,DWORD PTR SS:
005CB91A|.8BC3            MOV EAX,EBX
005CB91C|.E8 27FEFFFF   CALL pfstudio.005CB748             ;读取我们输入的用户名(ASCII "GGLHY")
005CB921|.8B45 FC         MOV EAX,DWORD PTR SS:
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:
005CB930|.8BC3            MOV EAX,EBX
005CB932|.E8 01FFFFFF   CALL pfstudio.005CB838               ;算法核心之处就在这里面哦
005CB937|.8B45 F8         MOV EAX,DWORD PTR SS:         ;注册码运算的结果
005CB93A|.50            PUSH EAX
005CB93B|.8D55 F4         LEA EDX,DWORD PTR SS:
005CB93E|.8BC3            MOV EAX,EBX
005CB940|.E8 03FEFFFF   CALL pfstudio.005CB748
005CB945|.8B45 F4         MOV EAX,DWORD PTR SS:       ;用户名(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:      ;转小写的用户名!
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:
005CB983|.8B08            MOV ECX,DWORD PTR DS:
(省略部分代码)
005CB9A5|>33C0            XOR EAX,EAX
005CB9A7|.5A            POP EDX
005CB9A8|.59            POP ECX
005CB9A9|.59            POP ECX
005CB9AA|.64:8910         MOV DWORD PTR FS:,EDX
005CB9AD|.68 C7B95C00   PUSH pfstudio.005CB9C7
005CB9B2|>8D45 EC         LEA EAX,DWORD PTR SS:
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:         ;注册码运算的结果
(省略部分代码)
C.
005CB945|.8B45 F4         MOV EAX,DWORD PTR SS:         ;用户名(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:       ;输入的用户名(ASCII "GGLHY")
0057F5E5|.E8 BE56E8FF   CALL pfstudio.00404CA8
0057F5EA|.8945 FC         MOV DWORD PTR SS:,EAX       ;得到用户名的长度!
0057F5ED|.8B45 FC         MOV EAX,DWORD PTR SS:
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:       ;用户名的长度!
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:
0057F677|.8B45 FC         MOV EAX,DWORD PTR SS:       ;用户名(ASCII "GGLHY")
0057F67A|.E8 29FEFFFF   CALL pfstudio.0057F4A8             ;用户名的运算得到的字符串。本例“36405”
0057F67F|.8B45 F4         MOV EAX,DWORD PTR SS:
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:
0057F6B7|.E8 EC55E8FF   CALL pfstudio.00404CA8
0057F6BC|.8D53 05         LEA EDX,DWORD PTR DS:
0057F6BF|.3BC2            CMP EAX,EDX
0057F6C1|.75 30         JNZ SHORT pfstudio.0057F6F3
0057F6C3|.8D45 EC         LEA EAX,DWORD PTR SS:
0057F6C6|.50            PUSH EAX
0057F6C7|.8BCB            MOV ECX,EBX
0057F6C9|.BA 01000000   MOV EDX,1
0057F6CE|.8B45 F8         MOV EAX,DWORD PTR SS:
0057F6D1|.E8 3258E8FF   CALL pfstudio.00404F08
0057F6D6|.8B45 EC         MOV EAX,DWORD PTR SS:      ;注意这里,数据窗口的内容
0057F6D9|.8B55 F4         MOV EDX,DWORD PTR SS:       ;用户名的运算得到的字符串。本例“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:
0057F677|.8B45 FC         MOV EAX,DWORD PTR SS:         ;用户名(ASCII "GGLHY")
0057F67A|.E8 29FEFFFF   CALL pfstudio.0057F4A8               ;用户名的运算结果“36405”
0057F67F|.8B45 F4         MOV EAX,DWORD PTR SS:         ;用户名的运算得到的字符串。本例“36405”
F7进入:
0057F4B7|.8945 FC         MOV DWORD PTR SS:,EAX
0057F4BA|.8B45 FC         MOV EAX,DWORD PTR SS:         ;用户名(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:
0057F4CD|.64:8920         MOV DWORD PTR FS:,ESP
0057F4D0|.33DB            XOR EBX,EBX
0057F4D2|.8B45 FC         MOV EAX,DWORD PTR SS:
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:      ; 用户名(ASCII "GGLHY")
0057F4E2|.0FB65402 FF   |MOVZX EDX,BYTE PTR DS:   ;依次倒取用户名每一位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:,EDX         ; |
0057F4FE|.C645 F8 00      MOV BYTE PTR SS:,0            ; |
0057F502|.8D55 F4         LEA EDX,DWORD PTR SS:         ; |
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:      ;余数转化为3位数的字符形式,本例=“364”
0057F514|.50            PUSH EAX
0057F515|.8B45 FC         MOV EAX,DWORD PTR SS:         ;用户名(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:,EDX         ; |
0057F528|.C645 F8 00      MOV BYTE PTR SS:,0            ; |
0057F52C|.8D55 F4         LEA EDX,DWORD PTR SS:         ; |
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:      ;余数转为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:         ;全世界无产者,联合起来!(ASCII "12345678901357924680")
005CB8AC|.E8 9B53EEFF   CALL pfstudio.004B0C4C
005CB8B1|.8B45 E8         MOV EAX,DWORD PTR SS:
005CB8B4|.8D55 EC         LEA EDX,DWORD PTR SS:
005CB8B7|.E8 E836FBFF   CALL pfstudio.0057EFA4               ; 打 倒日本帝国主义!还我们真xiang
005CB8BC|.8B55 EC         MOV EDX,DWORD PTR SS:      ; “西经”已出现,悟空来取吧
005CB8BF|.8BC6            MOV EAX,ESI
005CB8C1|.E8 7691E3FF   CALL pfstudio.00404A3C
(省略部分代码)看看数据窗口:
00ED47A05F B2 18 1B D5 AF 2C DF_?寨,
00ED47A8C0 CE                  牢.
整理下:
5F B2 18 1B D5 AF 2C DF C0 CE
    哈哈,一二三四五,快来数一数。正好20位!如果您的大脑在劳累之余还能想得起注册码的总长20位的话,我要恭喜你一下了。不过不是“You win”,而是“你已经很接近真xiang了”。
让我们把视线拉回到这里来:
0057F6D6|.8B45 EC         MOV EAX,DWORD PTR SS:      ;注意这里,数据窗口的内容
0057F6D9|.8B55 F4         MOV EDX,DWORD PTR SS:       ;用户名的运算得到的字符串。本例“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:      ; “西经”已出现,悟空来取吧
F7进入:**** Hidden Message *****
让我们把目光紧紧盯着它:

0057EFF3|.8A82 C4FA6700   |MOV AL,BYTE PTR DS:   ;查表~~~
右键跟随到数据窗口,看到如下内容:
0067FABD                     7B         {
0067FAC54D 86 4E 63 45 BC 90 5FM哊cE紣_
0067FACD8D 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:   ;查表~~~
这里是导致取值不同的原因~~~
恩,别告诉我你没看懂啊~~~~

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

大家可以去OD里实地考察一下,看看我们的神秘人的真面目。
00EC82845F B2 18 1B D5 AF 2C DF_?寨,
00EC828CC0 CE                  牢.
眼熟吧,这不就是我们前面第二部分里看到的那一张张熟悉的面孔?

所以,用户名运算的结果生成的字符串“36405”,每一位的ASC码,必须是注册码前10位(5组)分别与表中前5组XOR的结果相等。
举例如下:
( 3   6   4   0   5 )            <------字符串
    3336343035            <------对应的ASC码
XOR
    4D864E6345            <------所查的表
---------------------------------
    7EB07A5370            <------结果
       将结果连接起来,就是注册码的前10位了。
       大家去这里看看:
0057F6D6|.8B45 EC         MOV EAX,DWORD PTR SS:      ;与下面的一样了吗?哈哈
0057F6D9|.8B55 F4         MOV EDX,DWORD PTR SS:       ;用户名的运算得到的字符串。本例“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:,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:            ; 注册码查表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:
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:         ; 看懂了这循环的作用了吗
004035CD|.01C0            |ADD EAX,EAX
004035CF|.01D8            |ADD EAX,EBX
004035D1|.8A1E            |MOV BL,BYTE PTR DS:
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:
004035F4|.46            INC ESI
004035F5|.^ EB 9C         JMP SHORT pfstudio.00403593
004035F7|>BF FFFFFF0F   MOV EDI,0FFFFFFF
004035FC|.8A1E            MOV BL,BYTE PTR DS:
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:
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:,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:         ; 看懂了这循环的作用了吗
004035CD|.01C0            |ADD EAX,EAX
004035CF|.01D8            |ADD EAX,EBX
004035D1|.8A1E            |MOV BL,BYTE PTR DS:
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进制字符形式
3031323334               <----- 对应的ASC值
XOR
BC7B4D864E               <---- 查表的后5组 !(还记得有个参数7吗?)
-----------------------------
8C4A7FB57A
那么,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渣吧{:tongue:}


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

**** Hidden Message *****



这里是不太重要的内容,大家可以略过了~~~
下面是用户名与注册码前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:
00409005|.85DB            TEST EBX,EBX
00409007|.74 15         JE SHORT pfstudio.0040901E
00409009|>8A02            /MOV AL,BYTE PTR DS:          ;用户名(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:,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




cxj98 发表于 2014-3-6 20:43:38

瞅瞅算法分析过程。

飞天 发表于 2014-3-8 19:08:53

看看,学习一下。

montana 发表于 2014-3-9 10:42:30

继续翻旧帖学习

pendan2001 发表于 2014-7-29 21:34:04

看看先。。。

DaShanRen 发表于 2014-9-2 19:17:22

被文抄:
http://www.52pojie.cn/forum.php?mod=viewthread&tid=287191&extra=page%3D1%26filter%3Dlastpost%26orderby%3Dlastpost

GGLHY 发表于 2014-9-2 20:32:31

DaShanRen 发表于 2014-9-2 19:17
被文抄:
http://www.52pojie.cn/forum.php?mod=viewthread&tid=287191&extra=page%3D1%26filter%3Dlastpo ...

果然~~~

一字不落的复制、粘贴的。。。

这叫人情何以堪~~~




谢谢兄弟了~~~

gujin162 发表于 2014-9-4 21:16:21

大神依然是大神,支持!!

cnpeng 发表于 2014-11-7 02:53:03

支持下,非常不错的文

xz00311 发表于 2014-11-13 22:40:01

看看先哈哈
页: [1] 2 3
查看完整版本: PhotoFiltre Studio X 10.8.0版 注册算法分析及VB版KG源码