【破文标题】速填助手Quickfill 2.41不同于elance大侠的算法分析【破文作者】XXNB
【作者邮箱】
【作者主页】
【破解工具】OD
【破解平台】xpsp2
【软件名称】速填助手Quickfill 2.41
【软件大小】1514KB
【原版下载】http://www.newhua.com/soft/9719.htm
【保护方式】用户名注册码
【软件简介】速填助手Quickfill 是一款帮助您更轻松的实现键盘输入的软件。
主要功能:
热键速填功能:通过预设热键快速填写网页或其它应用程序表格;
拖动快速填表功能:直接将保存在 Quickfill 中的项拖动到输入窗口中进行填写。 适应于各种类型的字符输入,包括网页、Windows窗体、输

入框等的填写。

【破解声明】向大侠们学习!!!
------------------------------------------------------------------------
【破解过程】

刚才看了elance大侠关于Quickfill 2.4的算法分析。结果我去下载了源程序,分析了下。我发现很难通过elance大侠的算法分析得到注册码。

于是自己就跟了下。发现不同于他的另一种算法(难道他下的和我下载的不同??)。于是写下文章顺便用易语言写下注册机。请大家帮看看

是不是我错了??!!谢谢指教。

1、字符串查找可以找到:
004EC216  |.  E8 0148F7FF   call    00460A1C                         ;  计算位数函数
004EC21B  |.  8B45 F8       mov     eax, [ebp-8]                     ;  用户名
004EC21E  |.  E8 D58AF1FF   call    00404CF8
004EC223  |.  8BF0          mov     esi, eax                         ;  计算用户名位数
004EC225  |.  8D55 F4       lea     edx, [ebp-C]
004EC228  |.  8B83 10030000 mov     eax, [ebx+310]
004EC22E  |.  E8 E947F7FF   call    00460A1C                         ;  计算位数函数
004EC233  |.  8B45 F4       mov     eax, [ebp-C]                     ;  假码
004EC236  |.  E8 BD8AF1FF   call    00404CF8
004EC23B  |.  0FAFF0        imul    esi, eax
004EC23E  |.  85F6          test    esi, esi
004EC240  |.  0F84 CF010000 je      004EC415                         ;  看看是否为0
004EC246  |.  8D55 E8       lea     edx, [ebp-18]
004EC249  |.  8B83 0C030000 mov     eax, [ebx+30C]
004EC24F  |.  E8 C847F7FF   call    00460A1C
004EC254  |.  8B45 E8       mov     eax, [ebp-18]
004EC257  |.  8D55 EC       lea     edx, [ebp-14]
004EC25A  |.  E8 71CCF1FF   call    00408ED0                         ;  变成大写
004EC25F  |.  8B45 EC       mov     eax, [ebp-14]
004EC262  |.  8D4D F0       lea     ecx, [ebp-10]
004EC265  |.  66:BA 3E03    mov     dx, 33E
004EC269  |.  E8 92D0FDFF   call    004C9300                         ;关键Call(1)
004EC26E  |.  8B45 F0       mov     eax, [ebp-10]
004EC271  |.  8D55 FC       lea     edx, [ebp-4]
004EC274  |.  E8 FFD0FDFF   call    004C9378                         ;关键Call(2)
004EC279  |.  8D55 E4       lea     edx, [ebp-1C]
004EC27C  |.  8B83 10030000 mov     eax, [ebx+310]
004EC282  |.  E8 9547F7FF   call    00460A1C                         ;  
004EC287  |.  8B55 E4       mov     edx, [ebp-1C]                    ;  假码
004EC28A  |.  8B45 FC       mov     eax, [ebp-4]                     ;  我靠!明码比较
004EC28D  |.  E8 B28BF1FF   call    00404E44
004EC292  |.  0F85 7D010000 jnz     004EC415                         ;  关键跳
004EC298  |.  A1 40F74E00   mov     eax, [4EF740]
004EC29D  |.  C600 00       mov     byte ptr [eax], 0
004EC2A0  |.  6A 40         push    40
004EC2A2  |.  68 84C44E00   push    004EC484                         ;  注册:
004EC2A7  |.  68 8CC44E00   push    004EC48C                         ;  注册成功!\n真诚感谢您注册,好运永远伴随您。

2、跟进call    004C9300:

004C9331  |> /8BC5          /mov     eax, ebp                        ;  循环
004C9333  |. |E8 18BCF3FF   |call    00404F50
004C9338  |. |8BFB          |mov     edi, ebx
004C933A  |. |81E7 FF000000 |and     edi, 0FF
004C9340  |. |8B1424        |mov     edx, [esp]
004C9343  |. |8A543A FF     |mov     dl, [edx+edi-1]                 ;  一个个的取字母
004C9347  |. |0FB7CE        |movzx   ecx, si                         ;  首次是定值33E。以后是上一个字母的运算的结果
004C934A  |. |C1E9 08       |shr     ecx, 8                          ;  33E右移8
004C934D  |. |32D1          |xor     dl, cl                          ;  结果和第一个字母xor,得A    《-------这里
004C934F  |. |885438 FF     |mov     [eax+edi-1], dl
004C9353  |. |8B45 00       |mov     eax, [ebp]
004C9356  |. |0FB64438 FF   |movzx   eax, byte ptr [eax+edi-1]
004C935B  |. |66:03F0       |add     si, ax                          ;  xor结果+33E,得si
004C935E  |. |66:69C6 D500  |imul    ax, si, 0D5                     ;  si=si×D5,只取后面4位,就是低4位
004C9363  |. |66:05 9805    |add     ax, 598
004C9367  |. |8BF0          |mov     esi, eax                        ;  放到esi。
004C9369  |. |43            |inc     ebx
004C936A  |. |FE4C24 04     |dec     byte ptr [esp+4]
004C936E  |.^\75 C1         \jnz     short 004C9331                 ;继续循环

其实这个循环最重要的结果就是A那个地方,每个用户名的字母对应一个结果(A,B...),后面那个si只是中间用到的数。

3、上个循环结束后,每个用户名字母变成了另一个数值,然后就进入下一个算法call    004C9378 :

004C93AF  |.  BB 01000000   mov     ebx, 1
004C93B4  |>  8B45 FC       /mov     eax, [ebp-4]                    ;  又一个循环
004C93B7  |.  8A4418 FF     |mov     al, [eax+ebx-1]                 ;  一个个的取上次的结果(A,B..    《----
004C93BB  |.  3C 7A         |cmp     al, 7A
004C93BD  |.  73 04         |jnb     short 004C93C3                  ;  大于或等于7A(122)  “z”
004C93BF  |.  3C 61         |cmp     al, 61
004C93C1  |.  77 11         |ja      short 004C93D4                  ;  不小于61(97)     “a”
004C93C3  |>  8B45 FC       |mov     eax, [ebp-4]
004C93C6  |.  8A5418 FF     |mov     dl, [eax+ebx-1]
004C93CA  |.  80FA 5A       |cmp     dl, 5A
004C93CD  |.  73 21         |jnb     short 004C93F0                  ;  大于或等于5a(90)  “Z”
004C93CF  |.  80FA 41       |cmp     dl, 41
004C93D2  |.  76 1C         |jbe     short 004C93F0                  ;  小于等于41(65)   “A”
004C93D4  |>  8D45 EC       |lea     eax, [ebp-14]
004C93D7  |.  8B55 FC       |mov     edx, [ebp-4]
004C93DA  |.  8A541A FF     |mov     dl, [edx+ebx-1]
004C93DE  |.  E8 3DB8F3FF   |call    00404C20
004C93E3  |.  8B55 EC       |mov     edx, [ebp-14]
004C93E6  |.  8D45 F4       |lea     eax, [ebp-C]
004C93E9  |.  E8 12B9F3FF   |call    00404D00                        
004C93EE  |.  EB 2E         |jmp     short 004C941E    ;  就是这个小鬼
004C93F0  |>  8D45 F0       |lea     eax, [ebp-10]
004C93F3  |.  50            |push    eax
004C93F4  |.  8D55 E8       |lea     edx, [ebp-18]
004C93F7  |.  8B45 FC       |mov     eax, [ebp-4]
004C93FA  |.  0FB64418 FF   |movzx   eax, byte ptr [eax+ebx-1]
004C93FF  |.  E8 8400F4FF   |call    00409488                        ;下面的几个call把(A,B..)16进制转成10进制函数
004C9404  |.  8B45 E8       |mov     eax, [ebp-18]                   ;转成的10进制连接后就是真正的注册码了。
004C9407  |.  B9 02000000   |mov     ecx, 2
004C940C  |.  33D2          |xor     edx, edx
004C940E  |.  E8 45BBF3FF   |call    00404F58
004C9413  |.  8D45 F4       |lea     eax, [ebp-C]
004C9416  |.  8B55 F0       |mov     edx, [ebp-10]
004C9419  |.  E8 E2B8F3FF   |call    00404D00
004C941E  |>  43            |inc     ebx
004C941F  |.  4E            |dec     esi
004C9420  |.^ 75 92         \jnz     short 004C93B4               ;循环返回
上面jmp     short 004C941E    ;这个跳转很关键。如果上面计算用户名得到的数值(A,B..)满足:小于5a(90)“Z”或者大于41(65)“A

”的时候就会跳,就是说上次计算用户名的结果将不会变成10进制,而是变成字符。具体请看我的易语言注册机源代码。

4、易语言注册机(还有漏洞,但已经能处理大部分了。嘻嘻):


.版本 2

.局部变量 si, 长整数型
.局部变量 ecx, 长整数型
.局部变量 A, 长整数型
.局部变量 zimu, 长整数型
.局部变量 name, 文本型
.局部变量 len, 整数型
.局部变量 i, 整数型
.局部变量 daname, 文本型
.局部变量 lensi, 整数型
.局部变量 j, 整数型
.局部变量 xiaosi, 整数型
.局部变量 shiliu, 文本型
.局部变量 si2, 文本型
.局部变量 s3, 文本型
.局部变量 code, 文本型
.局部变量 CODE1, 文本型


i = 1
j = 1
si = 830
name = 编辑框1.内容
len = 取文本长度 (name)
lensi = 取文本长度 (取十六进制文本 (si))

daname = 到大写 (name)
.计次循环首 (len, i)
    ecx = 右移 (si, 8)
    zimu = 取代码 (daname, i)

    A = 位异或 (zimu, ecx)
    si = si + A
    si = si × 213
    si = si + 1432
    s3 = 取十六进制文本 (si)
    si2 = 取文本右边 (取十六进制文本 (si), 4)
    si = 十六进制到十进制 (si2)

    .如果 (A < 90 且 A > 65)
        CODE1 = 字符 (A)


    .否则
        CODE1 = 取文本左边 (到文本 (A), 2)

    .如果结束
    code = code + CODE1
    
.计次循环尾 ()
编辑框2.内容 = 取十六进制文本 (A)
编辑框3.内容 = code





.子程序 十六进制到十进制, 整数型
.参数 十六进制文本, 文本型
.局部变量 文本, 文本型
.局部变量 最终值, 整数型
.局部变量 i, 整数型, , , 中间循环变量
.局部变量 临时数值, 文本型, , , 每一位上的值

文本 = 到小写 (十六进制文本)
.变量循环首 (1, 取文本长度 (文本), 1, i)
    临时数值 = 取文本中间 (文本, i, 1)
    .如果 (取代码 (临时数值, ) ≥ 取代码 (“a”, ) 且 取代码 (临时数值, ) ≤ 取代码 (“f”, ))
        最终值 = 最终值 + (取代码 (临时数值, ) - 取代码 (“a”, ) + 10) × 求次方 (16, 取文本长度 (文本) - i)
    .否则
        最终值 = 最终值 + 到数值 (临时数值) × 求次方 (16, 取文本长度 (文本) - i)
    .如果结束

.变量循环尾 ()
返回 (最终值)


------------------------------------------------------------------------
【破解总结】
1、只跟用户名有关系,注册码没参与计算。
2、用户名经过计算,一一对应一个变化后的数值A
3、通过判断数值A。来决定是否把A转换为10进制数。
4、上面的10进制(或者字符)连接起来就是注册码。

------------------------------------------------------------------------

由于论坛上传空间有限,如果不能运行下面的易语言注册机的请到:下载完整文件的注册机。谢谢
http://free.ys168.com/?binbinbin7456