好友
阅读权限 10
听众
最后登录 1970-1-1
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
复制代码