【破文标题】kingftp 简体中文版 1.2注册算法
【破文作者】XXNB
【作者邮箱】支持PYG
【作者主页】binbinbin7456.ys168.com
【破解工具】OD
【破解平台】XPsp2
【软件名称】kingftp 简体中文版 1.2
【软件大小】85KB
【原版下载】http://www.newhua.com/soft/46446.htm
【保护方式】邮箱+码
【软件简介】1、 kingftp是一套操作简单、使用方便的FTP软件,只需点击一下按纽、拖动一下鼠标就可以完成上传下载的工作;  
  2、 是一个为顾客所想的FTP软件,其框架就如同把两个资源管理器合在一起,点点右键就可以完成所有工作;
  3、 kingftp支持windows 2000系列、windows xp、windows 2003系列、SunOS、AIX UNIX、Red Linux、Digital UNIX、FreeBSD等等操

作系统..   
【破解声明】菜鸟向高手学习!
------------------------------------------------------------------------
【破解过程】
------------------------------------------------------------------------
1、今天无聊中,发现了华军的这个软件,下载下来一看,居然是“kingftp 简体中文版 1.1”的我也搞不懂了。管他呢。

这软件图标都没有改,放眼看去就知道是VC。而且还没有任何壳。真是正合我等菜菜的意了,那我就looklook了。

经过我的分析这个软件连输入的东西都没有做检测。所以我输入邮箱:b   注册码:1    因为里面有循环,所以要尽量省

字符串查找“注册码错误,请重新注册!”。得到:

00414C80   .  6A FF         push    -1
00414C82   .  68 30F84100   push    0041F830                     ;  SE 处理程序安装
00414C87   .  64:A1 0000000>mov     eax, dword ptr fs:[0]
00414C8D   .  50            push    eax
00414C8E   .  64:8925 00000>mov     dword ptr fs:[0], esp
00414C95   .  83EC 20       sub     esp, 20
00414C98   .  56            push    esi
00414C99   .  8BF1          mov     esi, ecx
00414C9B   .  8D4C24 0C     lea     ecx, dword ptr [esp+C]
00414C9F   .  E8 CC730000   call    <jmp.&MFC42.#540>
00414CA4   .  8D4C24 08     lea     ecx, dword ptr [esp+8]
00414CA8   .  C74424 2C 000>mov     dword ptr [esp+2C], 0
00414CB0   .  E8 BB730000   call    <jmp.&MFC42.#540>
00414CB5   .  8D4C24 04     lea     ecx, dword ptr [esp+4]
00414CB9   .  C64424 2C 01  mov     byte ptr [esp+2C], 1
00414CBE   .  E8 AD730000   call    <jmp.&MFC42.#540>
00414CC3   .  8D4424 08     lea     eax, dword ptr [esp+8]
00414CC7   .  8BCE          mov     ecx, esi
00414CC9   .  50            push    eax
00414CCA   .  68 FC030000   push    3FC
00414CCF   .  C64424 34 02  mov     byte ptr [esp+34], 2
00414CD4   .  E8 197C0000   call    <jmp.&MFC42.#3097>
00414CD9   .  8D4C24 0C     lea     ecx, dword ptr [esp+C]       ;  得到机器码
00414CDD   .  51            push    ecx
00414CDE   .  68 FB030000   push    3FB
00414CE3   .  8BCE          mov     ecx, esi
00414CE5   .  E8 087C0000   call    <jmp.&MFC42.#3097>           ;  得到邮箱
00414CEA   .  8D5424 04     lea     edx, dword ptr [esp+4]
00414CEE   .  8BCE          mov     ecx, esi
00414CF0   .  52            push    edx
00414CF1   .  68 FD030000   push    3FD
00414CF6   .  E8 F77B0000   call    <jmp.&MFC42.#3097>           ;  得到假的注册码。看见没有都是对称的
00414CFB   .  68 ED000000   push    0ED
00414D00   .  51            push    ecx
00414D01   .  8D4C24 14     lea     ecx, dword ptr [esp+14]
00414D05   .  8BC4          mov     eax, esp
00414D07   .  896424 1C     mov     dword ptr [esp+1C], esp
00414D0B   .  8D5424 10     lea     edx, dword ptr [esp+10]
00414D0F   .  51            push    ecx
00414D10   .  52            push    edx
00414D11   .  50            push    eax
00414D12   .  E8 63750000   call    <jmp.&MFC42.#922>            ;  这个call跟进去看的话会看到一个连接函数的,看堆栈数据
00414D17   .  8D4424 18     lea     eax, dword ptr [esp+18]         上面的call后将机器码和邮箱连接起来了。
00414D1B   .  50            push    eax
00414D1C   .  E8 1FC3FEFF   call    00401040                     ;  这个应该就是算法call了,进入看看《《《《《《《《《《《《
00414D21   .  8B4C24 1C     mov     ecx, dword ptr [esp+1C]      ;  这里不会就是真码了吧,那上面那个call不就是!!
00414D25   .  8B5424 10     mov     edx, dword ptr [esp+10]      ;  (initial cpu selection)
00414D29   .  51            push    ecx                          ; /真码入栈
00414D2A   .  52            push    edx                          ; |假码入栈
00414D2B   .  C64424 40 03  mov     byte ptr [esp+40], 3         ; |
00414D30   .  FF15 A4194200 call    dword ptr [<&MSVCRT._mbscmp>>; \_mbscmp
00414D36   .  83C4 14       add     esp, 14                      ;  上面这比较函数是逐位比较,从头开始,只要有一位不同就结束
00414D39   .  85C0          test    eax, eax
00414D3B   .  0F85 93000000 jnz     00414DD4
00414D41   .  68 02000080   push    80000002
00414D46   .  8D4C24 1C     lea     ecx, dword ptr [esp+1C]
00414D4A   .  E8 41FAFFFF   call    00414790
00414D4F   .  8D4C24 14     lea     ecx, dword ptr [esp+14]
00414D53   .  C64424 2C 04  mov     byte ptr [esp+2C], 4         ;写注册表
00414D58   .  E8 13730000   call    <jmp.&MFC42.#540>
00414D5D   .  68 E4944200   push    004294E4                     ;  software\kingftp\register
00414D62   .  8D4C24 1C     lea     ecx, dword ptr [esp+1C]
00414D66   .  C64424 30 05  mov     byte ptr [esp+30], 5
00414D6B   .  E8 B0FAFFFF   call    00414820
00414D70   .  85C0          test    eax, eax
00414D72   .  75 21         jnz     short 00414D95
00414D74   .  68 E4944200   push    004294E4                     ;  software\kingftp\register
00414D79   .  8D4C24 1C     lea     ecx, dword ptr [esp+1C]
00414D7D   .  E8 EEFAFFFF   call    00414870
00414D82   .  68 78904200   push    00429078                     ;  1
00414D87   .  68 D8944200   push    004294D8                     ;  register
00414D8C   .  8D4C24 20     lea     ecx, dword ptr [esp+20]
00414D90   .  E8 0BFBFFFF   call    004148A0
00414D95   >  68 78904200   push    00429078                     ;  1
00414D9A   .  68 D8944200   push    004294D8                     ;  register
00414D9F   .  8D4C24 20     lea     ecx, dword ptr [esp+20]
00414DA3   .  E8 F8FAFFFF   call    004148A0
00414DA8   .  6A 00         push    0
00414DAA   .  6A 00         push    0
00414DAC   .  68 20954200   push    00429520                     ;  谢谢您的使用,你的软件已注册!
00414DB1   .  E8 36750000   call    <jmp.&MFC42.#1200>
00414DB6   .  8D4C24 14     lea     ecx, dword ptr [esp+14]
00414DBA   .  C64424 2C 04  mov     byte ptr [esp+2C], 4
00414DBF   .  E8 82720000   call    <jmp.&MFC42.#800>
00414DC4   .  8D4C24 18     lea     ecx, dword ptr [esp+18]
00414DC8   .  C64424 2C 03  mov     byte ptr [esp+2C], 3
00414DCD   .  E8 FEF9FFFF   call    004147D0
00414DD2   .  EB 0E         jmp     short 00414DE2
00414DD4   >  6A 00         push    0
00414DD6   .  6A 00         push    0
00414DD8   .  68 08954200   push    00429508                     ;  注册码错误,请重新注册!
00414DDD   .  E8 0A750000   call    <jmp.&MFC42.#1200>
00414DE2   >  8D4C24 10     lea     ecx, dword ptr [esp+10]

-----------------------------------------------------------------------
2、跟进00414D1C   .  E8 1FC3FEFF   call    00401040 得到:


00401040  /$  6A FF         push    -1
00401042  |.  68 9FD04100   push    0041D09F                     ;  SE 处理程序安装
00401047  |.  64:A1 0000000>mov     eax, dword ptr fs:[0]
0040104D  |.  50            push    eax
0040104E  |.  64:8925 00000>mov     dword ptr fs:[0], esp
00401055  |.  83EC 10       sub     esp, 10
00401058  |.  56            push    esi
00401059  |.  57            push    edi
0040105A  |.  C74424 14 000>mov     dword ptr [esp+14], 0
00401062  |.  8D4C24 08     lea     ecx, dword ptr [esp+8]
00401066  |.  C74424 20 010>mov     dword ptr [esp+20], 1
0040106E  |.  E8 FDAF0100   call    <jmp.&MFC42.#540>
00401073  |.  8D4C24 0C     lea     ecx, dword ptr [esp+C]
00401077  |.  C64424 20 02  mov     byte ptr [esp+20], 2
0040107C  |.  E8 EFAF0100   call    <jmp.&MFC42.#540>
00401081  |.  8D4424 2C     lea     eax, dword ptr [esp+2C]
00401085  |.  8D4C24 08     lea     ecx, dword ptr [esp+8]
00401089  |.  50            push    eax
0040108A  |.  C64424 24 03  mov     byte ptr [esp+24], 3
0040108F  |.  33F6          xor     esi, esi
00401091  |.  E8 D4AF0100   call    <jmp.&MFC42.#858>
00401096  |.  8B4424 2C     mov     eax, dword ptr [esp+2C]      ;  这里将连接后的字符串给eax
0040109A  |.  33FF          xor     edi, edi                     ;  清空edi
0040109C  |.  8B48 F8       mov     ecx, dword ptr [eax-8]       ;  将连接字符串的位数给ecx
0040109F  |.  85C9          test    ecx, ecx                     ;  准备循环了。循环比较位置
004010A1  |.  7E 30         jle     short 004010D3
004010A3  |>  8A0407        /mov     al, byte ptr [edi+eax]      ;  逐个取出ascii到al
004010A6  |.  8A8E 70904200 |mov     cl, byte ptr [esi+429070]   ;  循环取“01 2E 6E 6D”这四个(跟进429070后发现的)。取完四

次又从头开始取
004010AC  |.  02C8          |add     cl, al                      ;  相加
004010AE  |.  884C24 10     |mov     byte ptr [esp+10], cl       ;  加后的数存储到【esp+10】。这里得到的cl将成为下一次循环的

初始值
004010B2  |.  8D4C24 08     |lea     ecx, dword ptr [esp+8]      ;  上面存储后将替换掉原来相应位置的字符
004010B6  |.  8B5424 10     |mov     edx, dword ptr [esp+10]
004010BA  |.  52            |push    edx
004010BB  |.  57            |push    edi
004010BC  |.  E8 A3AF0100   |call    <jmp.&MFC42.#5856>          ;  加后查Ascii表如果得到字符的话就 替换相应位置字符,继续循


004010C1  |.  46            |inc     esi                         ;  计数器
004010C2  |.  83FE 04       |cmp     esi, 4                      ;  和4比较,循环4次查表
004010C5  |.  7C 02         |jl      short 004010C9
004010C7  |.  33F6          |xor     esi, esi
004010C9  |>  8B4424 2C     |mov     eax, dword ptr [esp+2C]     ;  得到原字符串到eax
004010CD  |.  47            |inc     edi
004010CE  |.  3B78 F8       |cmp     edi, dword ptr [eax-8]      ;  比较计数器
004010D1  |.^ 7C D0         \jl      short 004010A3              ;  返回循环
004010D3  |>  8D4424 08     lea     eax, dword ptr [esp+8]       ;  “0D7”
004010D7  |.  8D4C24 2C     lea     ecx, dword ptr [esp+2C]
004010DB  |.  50            push    eax
004010DC  |.  E8 89AF0100   call    <jmp.&MFC42.#858>
004010E1  |.  8D4C24 08     lea     ecx, dword ptr [esp+8]
004010E5  |.  E8 74AF0100   call    <jmp.&MFC42.#2614>
004010EA  |.  8B4424 2C     mov     eax, dword ptr [esp+2C]
004010EE  |.  33FF          xor     edi, edi
004010F0  |.  8B48 F8       mov     ecx, dword ptr [eax-8]
004010F3  |.  85C9          test    ecx, ecx
004010F5  |.  7E 70         jle     short 00401167
004010F7  |>  8A0C07        /mov     cl, byte ptr [edi+eax]      ;  这个取得上面循环里的cl。
004010FA  |.  68 74904200   |push    00429074                    ;  11
004010FF  |.  884C24 14     |mov     byte ptr [esp+14], cl
00401103  |.  8D4C24 10     |lea     ecx, dword ptr [esp+10]
00401107  |.  8B7424 14     |mov     esi, dword ptr [esp+14]
0040110B  |.  81E6 FF000000 |and     esi, 0FF                    ;  与0FF。这里变来变去都结果还是上面的cl
00401111  |.  E8 42AF0100   |call    <jmp.&MFC42.#860>
00401116      B8 4FECC44E   mov     eax, 4EC4EC4F                ;  常量4EC4EC4F
0040111B  |.  8D4C24 0C     |lea     ecx, dword ptr [esp+C]
0040111F  |.  F7EE          |imul    esi                         ;  乘以esi      整数乘法.
00401121  |.  C1FA 03       |sar     edx, 3                      ;  高位放到这个edx里面,然后算术右移.(=SHR)    3位
00401124  |.  8BC2          |mov     eax, edx
00401126  |.  C1E8 1F       |shr     eax, 1F                     ;   逻辑右移.   1F
00401129  |.  03D0          |add     edx, eax                    ;  加
0040112B  |.  80C2 41       |add     dl, 41                      ;  又加
0040112E  |.  52            |push    edx
0040112F  |.  6A 00         |push    0
00401131  |.  E8 2EAF0100   |call    <jmp.&MFC42.#5856>          ;  和上面那个循环里一样的。转成字符
00401136  |.  8BC6          |mov     eax, esi
00401138  |.  B9 1A000000   |mov     ecx, 1A                     ;  常量
0040113D  |.  99            |cdq
0040113E  |.  F7F9          |idiv    ecx
00401140  |.  8D4C24 0C     |lea     ecx, dword ptr [esp+C]
00401144  |.  80C2 41       |add     dl, 41                      ;  余数+41H
00401147  |.  52            |push    edx
00401148  |.  6A 01         |push    1
0040114A  |.  E8 15AF0100   |call    <jmp.&MFC42.#5856>          ;  和上面那个循环里一样的。转成字符
0040114F  |.  8D5424 0C     |lea     edx, dword ptr [esp+C]      ;  右边的寄存器窗口看见了
00401153  |.  8D4C24 08     |lea     ecx, dword ptr [esp+8]
00401157  |.  52            |push    edx
00401158  |.  E8 F5AE0100   |call    <jmp.&MFC42.#939>
0040115D  |.  8B4424 2C     |mov     eax, dword ptr [esp+2C]     ;  得到地址
00401161  |.  47            |inc     edi
00401162  |.  3B78 F8       |cmp     edi, dword ptr [eax-8]      ;  机器码位数+邮箱位数。要循环这么多次
00401165  |.^ 7C 90         \jl      short 004010F7              ;  上面每次循环得到两位字符。连接在一起就是注册码了
00401167  |>  8B7424 28     mov     esi, dword ptr [esp+28]      ;  执行到这句的时候,在堆栈能看到注册码了
0040116B  |.  8D4424 08     lea     eax, dword ptr [esp+8]
0040116F  |.  50            push    eax
00401170  |.  8BCE          mov     ecx, esi
00401172  |.  E8 D5AE0100   call    <jmp.&MFC42.#535>


【破解总结】
------------------------------------------------------------------------
1、首先得到机器码和邮箱的连接字符串。邮箱的格式没有限制。

2、逐个取连接后字符串的ascii码值到al,然后循环取“01 2E 6E 6D”这四个值到cl(不管字符串有多长都从01取到6D,取完又从01取到6D..

),然后cl+al,结果放在cl。这个加后得到的数将作为下一次循环的初始值。总共应该有“机器码位数+邮箱位数”个

3、循环取上面的“机器码位数+邮箱位数”个cl。用一个常量4EC4EC4F(这个数好大)乘以cl。结果的高位放到edx,对edx右移3位,再右移

1F(31)位。基本上右移了这么多位后就变成0了。所以其实后面的运算就是右移3位后得到的值。然后加41H。转成字符。得到一个真码的字符

。然后又用cl除以常量1A。余数加41H。转成字符。得到下一个真码的字符。    后面的依此类推。

4、这个算法我觉得我学到的一点就是用一个大数(4EC4EC4F)乘以另一个数,得到的高位放在edx。就像除法中的整数部分放在eax,余数放在

edx。除法的我见多了。乘法的高位还是第一次接触。

5、写得较乱,自己下载来玩吧