-
-
[原创]ColorPicker注册过程分析
-
发表于: 2006-8-3 15:22 6580
-
【文章标题】: ColorPicker注册过程分析
【文章作者】: HappyTown
【作者邮箱】: wxr277@163.com
【作者主页】: www.pediy.com
【软件名称】: ColorPicker 2.0.6
【软件大小】: 607K
【下载地址】: 附件内或网上搜索
【加壳方式】: ASPack 2.11 -> Alexey Solodovnikov
【保护方式】: 序列号
【编写语言】: Borland Delphi 6.0
【使用工具】: OllyDbg,PEiD,ResScope,DeDe,字符串计算器(我自己写的一个工具)
【操作平台】: WinAll?
【软件介绍】: 用于获取屏幕上各处颜色值的好软件
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
1.脱壳
安装后用PEiD察看,得知软件采用ASPack 2.11 -> Alexey Solodovnikov加壳,用PEiD插件轻松脱掉并选择重建IAT即可。
2.察看是否采用成熟加密算法
PEiD察看了一下,软件使用了BASE64、CAST-128/256和SHA1算法,心中一乐,呵呵,有点玩头。
随后令人大跌眼镜的是,虽然这个软件采用了成熟加密算法,却用在了不合适的地方,导致加密失败,更要命的是它还用的是明码比较。
3.用ResScope和DeDe察看相关信息
可得知点击注册"OK"按钮后的Click事件地址在004A02D4,就在这里下断点,同时导出map文件用于OllyDbg分析。
4.跟踪分析
OllyDbg载入脱壳后文件并加载map文件。
Name:happy
RegKey:7654321
点击注册的"OK"按钮,被断。
004A02D4 > 55 push ebp ; <-Tabout@FlatButton2Click
004A02D5 8BEC mov ebp,esp
004A02D7 B9 05000000 mov ecx,5
004A02DC 6A 00 push 0
004A02DE 6A 00 push 0
004A02E0 49 dec ecx
004A02E1 ^ 75 F9 jnz short colorpic.004A02DC
004A02E3 51 push ecx
004A02E4 53 push ebx
004A02E5 8945 FC mov dword ptr ss:[ebp-4],eax
004A02E8 33C0 xor eax,eax
004A02EA 55 push ebp
004A02EB 68 08054A00 push <colorpic.->System.@HandleFina>
004A02F0 64:FF30 push dword ptr fs:[eax]
004A02F3 64:8920 mov dword ptr fs:[eax],esp
004A02F6 8D55 E4 lea edx,dword ptr ss:[ebp-1C]
004A02F9 8B45 FC mov eax,dword ptr ss:[ebp-4]
004A02FC > 8B80 18030000 mov eax,dword ptr ds:[eax+318] ; *FlatEdit1:N.A.
004A0302 > E8 8D62F9FF call colorpic.00436594 ; ->Controls.TControl.GetText(TControl):TCaption;
004A0307 8B45 E4 mov eax,dword ptr ss:[ebp-1C]
004A030A 8D55 F8 lea edx,dword ptr ss:[ebp-8]
004A030D > E8 B685F6FF call colorpic.004088C8 ; ->SysUtils.Trim(AnsiString):AnsiString;overload;
004A0312 8D55 E0 lea edx,dword ptr ss:[ebp-20]
004A0315 8B45 FC mov eax,dword ptr ss:[ebp-4]
004A0318 > 8B80 1C030000 mov eax,dword ptr ds:[eax+31C] ; *FlatEdit2:N.A.
004A031E > E8 7162F9FF call colorpic.00436594 ; ->Controls.TControl.GetText(TControl):TCaption;
004A0323 8B45 E0 mov eax,dword ptr ss:[ebp-20]
004A0326 8D55 F4 lea edx,dword ptr ss:[ebp-C]
004A0329 > E8 9A85F6FF call colorpic.004088C8 ; ->SysUtils.Trim(AnsiString):AnsiString;overload;
004A032E 837D F8 00 cmp dword ptr ss:[ebp-8],0 ; 判断是否输入了name
004A0332 0F84 9B010000 je colorpic.004A04D3
004A0338 8D45 DC lea eax,dword ptr ss:[ebp-24]
004A033B 50 push eax
004A033C 8B4D F8 mov ecx,dword ptr ss:[ebp-8] ; happy
004A033F BA 2E391E00 mov edx,1E392E ; 用于计算的常量
004A0344 8B45 FC mov eax,dword ptr ss:[ebp-4]
004A0347 E8 8C020000 call colorpic.004A05D8 ; 关键call:算出注册码
004A034C 8B55 DC mov edx,dword ptr ss:[ebp-24] : 54036100-378098817-375258124
004A034F 8B45 F4 mov eax,dword ptr ss:[ebp-C]
004A0352 > E8 6945F6FF call colorpic.004048C0 ; ->System.@LStrCmp;比较假码和真码是否相等
004A0357 0F85 41010000 jnz colorpic.004A049E
004A035D 8D55 D4 lea edx,dword ptr ss:[ebp-2C]
004A0360 33C0 xor eax,eax
004A0362 > E8 A926F6FF call colorpic.00402A10 ; ->System.ParamStr(Integer):String;
004A0367 8B45 D4 mov eax,dword ptr ss:[ebp-2C]
004A036A 8D55 D8 lea edx,dword ptr ss:[ebp-28]
004A036D > E8 FA88F6FF call colorpic.00408C6C ; ->SysUtils.ExtractFilePath(AnsiString):AnsiString;
004A0372 8B55 D8 mov edx,dword ptr ss:[ebp-28]
004A0375 8D45 EC lea eax,dword ptr ss:[ebp-14]
004A0378 B9 1C054A00 mov ecx,colorpic.004A051C ; ASCII "ColorPicker.ini"
004A037D > E8 4644F6FF call colorpic.004047C8 ; ->System.@LStrCat3;
可以看出,在这里004A0352进行明码比较,004A034C保存的就是真正注册码,004A034F是我们输入的假码7654321。要做内存注册机,在004A0352下断,取edx的内存字符串即可。
当然,我们要做的还不止此,分析出其注册算法才是我们的目的。
跟进004A0347的call 004A05D8:
......
004A05EB 8955 FC mov dword ptr ss:[ebp-4],edx ; 1E392E
004A05EE 8B45 F8 mov eax,dword ptr ss:[ebp-8] ; happy
004A05F1 E8 6E43F6FF call colorpic.00404964
004A05F6 33C0 xor eax,eax
004A05F8 55 push ebp
004A05F9 68 67074A00 push colorpic.004A0767
004A05FE 64:FF30 push dword ptr fs:[eax]
004A0601 64:8920 mov dword ptr fs:[eax],esp
004A0604 8D45 F4 lea eax,dword ptr ss:[ebp-C]
004A0607 E8 B83EF6FF call colorpic.004044C4
004A060C 33F6 xor esi,esi
004A060E 837D FC 00 cmp dword ptr ss:[ebp-4],0
004A0612 0F84 29010000 je colorpic.004A0741
004A0618 837D F8 00 cmp dword ptr ss:[ebp-8],0
004A061C 0F84 1F010000 je colorpic.004A0741
004A0622 8B45 F8 mov eax,dword ptr ss:[ebp-8]
004A0625 E8 5241F6FF call colorpic.0040477C
004A062A 8BD8 mov ebx,eax
004A062C 85DB test ebx,ebx
004A062E 7E 26 jle short colorpic.004A0656
004A0630 BF 01000000 mov edi,1 ; 下面根据name长度循环计算得到一个数:esi(abs(十进制)即为Serial1)
004A0635 8B45 F8 mov eax,dword ptr ss:[ebp-8] ; //happy
004A0638 E8 3F41F6FF call colorpic.0040477C ; Len(happy)=5
004A063D F76D FC imul dword ptr ss:[ebp-4] ; eax=5*1E392E=971DE6;...
004A0640 03F0 add esi,eax ; esi=0+971DE6=971DE6;...
004A0642 8B45 F8 mov eax,dword ptr ss:[ebp-8] ; happy
004A0645 0FB64438 FF movzx eax,byte ptr ds:[eax+edi-1] ; 68(h)...
004A064A 69C0 53200000 imul eax,eax,2053 ; eax=name(i)*0x2053=D21B8;...
004A0650 03F0 add esi,eax ; esi+eax=A43F9E;...
004A0652 47 inc edi ; 2...
004A0653 4B dec ebx ; 4...
004A0654 ^ 75 DF jnz short colorpic.004A0635 ; \\
004A0656 8BC6 mov eax,esi
004A0658 99 cdq :取绝对值
004A0659 33C2 xor eax,edx
004A065B 2BC2 sub eax,edx
004A065D 8D55 F4 lea edx,dword ptr ss:[ebp-C]
004A0660 E8 1783F6FF call colorpic.0040897C ; serial1(把esi转化成10进制):54036100
004A0665 8D45 F4 lea eax,dword ptr ss:[ebp-C]
004A0668 50 push eax
004A0669 8B45 F4 mov eax,dword ptr ss:[ebp-C] ; 54036100
004A066C E8 0B41F6FF call colorpic.0040477C ; Len(54036100)=8
004A0671 8BD0 mov edx,eax ; 8
004A0673 83EA 0A sub edx,0A
004A0676 B9 0A000000 mov ecx,0A
004A067B 8B45 F4 mov eax,dword ptr ss:[ebp-C] ; 54036100
004A067E E8 5143F6FF call colorpic.004049D4
004A0683 8B45 F8 mov eax,dword ptr ss:[ebp-8] ; happy
004A0686 E8 F140F6FF call colorpic.0040477C
004A068B 8BD8 mov ebx,eax ; 5
004A068D 85DB test ebx,ebx
004A068F 7E 24 jle short colorpic.004A06B5
004A0691 BF 01000000 mov edi,1
004A0696 8B45 F8 mov eax,dword ptr ss:[ebp-8] ;// happy
004A0699 E8 DE40F6FF call colorpic.0040477C ; 取字符串长度的函数
004A069E 8B55 F8 mov edx,dword ptr ss:[ebp-8]
004A06A1 0FB6543A FF movzx edx,byte ptr ds:[edx+edi-1] ; 68(h)...
004A06A6 0FAF55 FC imul edx,dword ptr ss:[ebp-4] ; edx=68*1E392E=C473AB0;...
004A06AA 6BD2 53 imul edx,edx,53 ; edx*53=(3)FB180710;...A1AD2F9A
004A06AD 03F2 add esi,edx ; esi=3388684+FB180710=FE508D94...
004A06AF 2BF0 sub esi,eax ; esi-Len(happy)=FE508D8F...最后:E976AB7F
004A06B1 47 inc edi
004A06B2 4B dec ebx :\\
004A06B3 ^ 75 E1 jnz short colorpic.004A0696
004A06B5 FF75 F4 push dword ptr ss:[ebp-C]
004A06B8 68 80074A00 push colorpic.004A0780 ; /下面是取绝对值
004A06BD 8BC6 mov eax,esi ; /eax=E976AB7F;16895481=(not E976AB7F)+1
004A06BF 99 cdq ; edx(的每一位)=eax的符号位扩展(cdq:Convert Doubleword to
Quadword)
004A06C0 33C2 xor eax,edx
004A06C2 2BC2 sub eax,edx ; \serial2:16895481[十进制378098817]
004A06C4 8D55 F0 lea edx,dword ptr ss:[ebp-10]
004A06C7 E8 B082F6FF call colorpic.0040897C ; 注册码第二部分:378098817
004A06CC FF75 F0 push dword ptr ss:[ebp-10]
004A06CF 8D45 F4 lea eax,dword ptr ss:[ebp-C]
004A06D2 BA 03000000 mov edx,3
004A06D7 E8 6041F6FF call colorpic.0040483C
004A06DC 8B45 F8 mov eax,dword ptr ss:[ebp-8] ; happy
004A06DF E8 9840F6FF call colorpic.0040477C ; Len(happy)
004A06E4 8BD8 mov ebx,eax
004A06E6 85DB test ebx,ebx
004A06E8 7E 2D jle short colorpic.004A0717
004A06EA BF 01000000 mov edi,1
004A06EF 8B45 F8 mov eax,dword ptr ss:[ebp-8] ;//happy
004A06F2 E8 8540F6FF call colorpic.0040477C ; eax=Len(happy)
004A06F7 8B55 F8 mov edx,dword ptr ss:[ebp-8] ; happy
004A06FA 0FB6543A FF movzx edx,byte ptr ds:[edx+edi-1] ; 68(h),61(a)...
004A06FF F7EA imul edx ; eax*=68;*61
004A0701 69C0 3B010000 imul eax,eax,13B ; eax*=13B...
004A0707 03F0 add esi,eax ; E976AB7F+27FD8=E9792B57;...E983CAC6
004A0709 8B45 F8 mov eax,dword ptr ss:[ebp-8]
004A070C E8 6B40F6FF call colorpic.0040477C
004A0711 03F0 add esi,eax ;esi+Len(happy)
004A0713 47 inc edi
004A0714 4B dec ebx
004A0715 ^ 75 D8 jnz short colorpic.004A06EF ;\\
004A0717 0375 FC add esi,dword ptr ss:[ebp-4] ; esi=E983CAC6+1E392E=E9A203F4
004A071A FF75 F4 push dword ptr ss:[ebp-C] ; 54036100-378098817
004A071D 68 80074A00 push colorpic.004A0780
004A0722 8BC6 mov eax,esi ; /给E9A203F4取绝对值=serial3(十进制)
004A0724 99 cdq
004A0725 33C2 xor eax,edx
004A0727 2BC2 sub eax,edx ; \
004A0729 8D55 EC lea edx,dword ptr ss:[ebp-14]
004A072C E8 4B82F6FF call colorpic.0040897C ; 注册码第三部分:375258124
好了注册码的生成过程出来了,详见注册机源代码。
这里给出两组可用的Name和RegKey:
Name:happy
RegKey:54036100-378098817-375258124
注册文件:
[reginfo]
userinfo=qxUvU1s=
licence=9h1UF4GBUVD45Wr0nEZg4eyaHlhKxbMMinOBYw==
Name:HappyTown
RegKey:168200108-243803457-239163428
注册文件:
[reginfo]
userinfo=iwkpRXaw0kSm
licence=8gVR5zdgXmUFG7HSBo15KWhF3LLw6uV4bnu24jM=
--------------------------------------------------------------------------------
【加密Name和RegKey】
下面我简单说一下这个过程:
///////////////////////////////////
qxUvU1s=的形成过程:
密钥在00484600处,长度40h位。
cast256(name) //在00483CC0处
把结果和Name(happy)逐字符xor(在00483CCB处)生成Name长度个字节,然后把这几个字节通过移位等简单运算得到相应的数字序列(共Name长度个),最终根据数字序列查表(从004818C8开始的子程序)得到qxUvU1s=
///////////////////////////////////
9h1UF4GBUVD45Wr0nEZg4eyaHlhKxbMMinOBYw==的形成过程:
跟上面的qxUvU1s=的形成过程一模一样(因为调用的是同一个子程序,只是Name换成了RegKey),你可以跟进去看看,详细的跟进分析我就不贴了,仅贴出一部分,我实在太困了。
密钥:
00484600 AC 69 41 00 8C E5 41 00 C8 68 41 00 64 E6 41 00 ?A.?A.辱A.d媪.
00484610 30 E5 41 00 74 E6 41 00 6C E7 41 00 9C E9 41 00 0辶.t媪.l缌.?A.
00484620 84 E6 41 00 7C E6 41 00 A4 E9 41 00 80 41 48 00 ?A.|媪.らA.?H.
00484630 88 47 48 00 90 47 48 00 78 47 48 00 B4 47 48 00 ?H.?H.xGH.辞H.
表:
004A404C 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 ABCDEFGHIJKLMNOP
004A405C 51 52 53 54 55 56 57 58 59 5A 61 62 63 64 65 66 QRSTUVWXYZabcdef
004A406C 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 ghijklmnopqrstuv
004A407C 77 78 79 7A 30 31 32 33 34 35 36 37 38 39 2B 2F wxyz0123456789+/
004A0382 8B4D EC mov ecx,dword ptr ss:[ebp-14]
004A0385 B2 01 mov dl,1
004A0387 A1 C0904600 mov eax,dword ptr ds:[4690C0]
004A038C > E8 DF8DFCFF call colorpic.00469170 ; ->AxCtrls.TOleStream.Create(TOleStream;boolean;IStream);<+>
004A0391 8945 E8 mov dword ptr ss:[ebp-18],eax
004A0394 33C0 xor eax,eax
004A0396 55 push ebp
004A0397 68 97044A00 push <colorpic.->System.@HandleFina>
004A039C 64:FF30 push dword ptr fs:[eax]
004A039F 64:8920 mov dword ptr fs:[eax],esp
004A03A2 6A 00 push 0
004A03A4 BA 745A4A00 mov edx,colorpic.004A5A74
004A03A9 8B45 FC mov eax,dword ptr ss:[ebp-4]
004A03AC > 8B80 30030000 mov eax,dword ptr ds:[eax+330] ; *cast:N.A.//指向密钥地址:00484600
004A03B2 B9 40000000 mov ecx,40
004A03B7 8B18 mov ebx,dword ptr ds:[eax]
004A03B9 FF53 40 call dword ptr ds:[ebx+40] ; case256初始化
004A03BC 8B45 FC mov eax,dword ptr ss:[ebp-4]
004A03BF > 8B80 30030000 mov eax,dword ptr ds:[eax+330] ; *cast:N.A.
004A03C5 8B10 mov edx,dword ptr ds:[eax]
004A03C7 FF52 48 call dword ptr ds:[edx+48] ; 判断是否已经初始化
004A03CA 8D4D F0 lea ecx,dword ptr ss:[ebp-10]
004A03CD 8B45 FC mov eax,dword ptr ss:[ebp-4]
004A03D0 > 8B80 30030000 mov eax,dword ptr ds:[eax+330] ; *cast:N.A.
004A03D6 8B55 F8 mov edx,dword ptr ss:[ebp-8] ; happy
004A03D9 8B18 mov ebx,dword ptr ds:[eax] ; 指向密钥:00484600
004A03DB FF53 54 call dword ptr ds:[ebx+54] ; 形成qxUvU1s=
004A03DE 8B45 F0 mov eax,dword ptr ss:[ebp-10]
004A03E1 50 push eax
004A03E2 B9 34054A00 mov ecx,colorpic.004A0534 ; ASCII "userinfo"
004A03E7 BA 48054A00 mov edx,colorpic.004A0548 ; ASCII "reginfo"
004A03EC 8B45 E8 mov eax,dword ptr ss:[ebp-18]
004A03EF 8B18 mov ebx,dword ptr ds:[eax]
004A03F1 FF53 04 call dword ptr ds:[ebx+4]
004A03F4 8B45 FC mov eax,dword ptr ss:[ebp-4]
004A03F7 > 8B80 30030000 mov eax,dword ptr ds:[eax+330] ; *cast:N.A.
004A03FD 8B10 mov edx,dword ptr ds:[eax]
004A03FF FF52 48 call dword ptr ds:[edx+48]
004A0402 8D4D F0 lea ecx,dword ptr ss:[ebp-10]
004A0405 8B45 FC mov eax,dword ptr ss:[ebp-4]
004A0408 > 8B80 30030000 mov eax,dword ptr ds:[eax+330] ; *cast:N.A.
004A040E 8B55 F4 mov edx,dword ptr ss:[ebp-C] ; 54036100-378098817-375258124
004A0411 8B18 mov ebx,dword ptr ds:[eax]
004A0413 FF53 54 call dword ptr ds:[ebx+54] ; 同样是查表生成下面这串序列
004A0416 8B45 F0 mov eax,dword ptr ss:[ebp-10] ; 9h1UF4GBUVD45Wr0nEZg4eyaHlhKxbMMinOBYw==
004A0419 50 push eax
004A041A B9 58054A00 mov ecx,colorpic.004A0558 ; ASCII "licence"
004A041F BA 48054A00 mov edx,colorpic.004A0548 ; ASCII "reginfo"
004A0424 8B45 E8 mov eax,dword ptr ss:[ebp-18]
004A0427 8B18 mov ebx,dword ptr ds:[eax]
004A0429 FF53 04 call dword ptr ds:[ebx+4]
004A042C 33C0 xor eax,eax
004A042E 5A pop edx
004A042F 59 pop ecx
004A0430 59 pop ecx
004A0431 64:8910 mov dword ptr fs:[eax],edx
004A0434 68 D3044A00 push colorpic.004A04D3
004A0439 8B45 E8 mov eax,dword ptr ss:[ebp-18]
004A043C > E8 7332F6FF call colorpic.004036B4 ; ->System.TObject.Free(TObject);
004A0441 8B45 FC mov eax,dword ptr ss:[ebp-4]
004A0444 > 8B80 18030000 mov eax,dword ptr ds:[eax+318] ; *FlatEdit1:N.A.
004A044A 33D2 xor edx,edx
004A044C 8B08 mov ecx,dword ptr ds:[eax]
004A044E FF51 64 call dword ptr ds:[ecx+64]
004A0451 8B45 FC mov eax,dword ptr ss:[ebp-4]
004A0454 > 8B80 1C030000 mov eax,dword ptr ds:[eax+31C] ; *FlatEdit2:N.A.
004A045A 33D2 xor edx,edx
004A045C 8B08 mov ecx,dword ptr ds:[eax]
004A045E FF51 64 call dword ptr ds:[ecx+64]
004A0461 8B45 FC mov eax,dword ptr ss:[ebp-4]
004A0464 > 8B80 20030000 mov eax,dword ptr ds:[eax+320] ; *FlatButton2:N.A.
004A046A 33D2 xor edx,edx
004A046C 8B08 mov ecx,dword ptr ds:[eax]
004A046E FF51 64 call dword ptr ds:[ecx+64]
004A0471 8B45 FC mov eax,dword ptr ss:[ebp-4]
004A0474 > 8B80 08030000 mov eax,dword ptr ds:[eax+308] ; *Label24:N.A.
004A047A 33D2 xor edx,edx
004A047C > E8 4361F9FF call colorpic.004365C4 ; ->Controls.TControl.SetText(TControl;TCaption);
004A0481 6A 00 push 0
004A0483 66:8B0D 60054A0>mov cx,word ptr ds:[4A0560]
004A048A B2 02 mov dl,2
004A048C B8 6C054A00 mov eax,colorpic.004A056C ; ASCII "Register successfully."
004A0491 E8 E2FBF8FF call colorpic.00430078
004A0496 C3 retn
--------------------------------------------------------------------------------
【注册机源代码】
注意:该源代码在Dev-C++ 4.9.9.2 + WindowsXP SP2下编译运行通过,你如果使用VC++,可能还需添加"stdafx.h"头文件。
/*----------------------------------------------------*/
/* Software:[ColorPicker v2.06] KeyGen */
/* Author:HappyTown */
/* Date:2006-08-01 */
/*----------------------------------------------------*/
#include "math.h"
#include "string.h"
#include <stdio.h>
#include <stdlib.h>
#define MAXINPUTLEN 200
#define CONSTANT 0x1E392E
int main(int argc, char* argv[])
{
int intNameLen,i;
long lKey_1=0,lKey_2=0,lKey_3=0;
char szName[MAXINPUTLEN]={0};
printf("\n /*----------------------------------------------------*/\n");
printf(" /* */\n");
printf(" /* Software:[ColorPicker v2.06] KeyGen */\n");
printf(" /* Author:HappyTown */\n");
printf(" /* Date:2006-08-01 */\n");
printf(" /* */\n");
printf(" /*----------------------------------------------------*/\n\n\n");
//Get Ur name and its length.
printf(" Input your name: ");
scanf("%s",&szName);
intNameLen=strlen(szName);
//Get the first part of the Key
for (i=0;i<intNameLen;i++)
{
lKey_1+=intNameLen*CONSTANT;
lKey_1+=szName[i]*0x2053;
}
lKey_2=lKey_1; //Transport the value before abs.
lKey_1=abs(lKey_1);
//Get the second part of the Key
for (i=0;i<intNameLen;i++)
{
lKey_2+=szName[i]*CONSTANT*0x53;
lKey_2-=intNameLen;
}
lKey_3=lKey_2;
lKey_2=abs(lKey_2);
//Get the third part of the Key
for (i=0;i<intNameLen;i++)
{
lKey_3+=0x13B*intNameLen*szName[i]+intNameLen;
}
lKey_3=abs(lKey_3+CONSTANT);
printf("\n Registration key: %d-%d-%d\n\n\n\n\n",lKey_1,lKey_2,lKey_3);
system("PAUSE");
return 0;
}
--------------------------------------------------------------------------------
【经验总结】
太好笑了,居然有这种加密方法!还有,SHA1根本就没有用。
在实际中,的确有很多共享软件作者不懂加密算法,拿来别人的加密块不管三七二十一直接就用,连基本的使用知识都不知
道,加密岂能不失败。
还是那句话,劝这些作者们学习些基本的加密算法理论。只有知己知彼,才能百战不殆。
多说一句话,其实注册机我前几天就做好了,只是现在连忙带懒,才一拖再拖写出了这篇教程,唉...
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2006年08月03日 2:08:20
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
- [分享]一个开源的keygenme 10196
- [原创]uCF2000 keygenme 1.0分析 8156
- [原创]bundy's keygenme #1分析 6494