PhotoFiltre Studio X 10.8.0版 注册算法分析及VB版KG源码
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进入:
jinbiao911,如果您要查看本帖隐藏内容请回复
让我们把目光紧紧盯着它:
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渣吧
哎,写了好几个小时,累死了!破它比写破文简单多了~~~~
附上没优化、没美化又没说话的很烂的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:
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
复制代码
LZ乃文抄公是也:
http://bbs.chinapyg.com/thread-72337-1-1.html 楼主你觉得脸红不?{:1_922:}
页:
[1]