【破文标题】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、写得较乱,自己下载来玩吧